2011-12-18 8 views
2

나는 미래의 소규모 프로젝트에서 반복되는 평범한 것들에 사용할 수있는 작은 프레임 워크를 만들고 있습니다.컨트롤러 내부의 라이브러리에 액세스하는 방법은 무엇입니까?

컨트롤러 내부에서 라이브러리에 액세스하는 가장 좋은 방법을 고수하고 있습니다. 나는 원래 CodeIgniter와 비슷한 시스템을 구현했다. 따라서 메인 컨트롤러 클래스는 기본적으로 슈퍼 오브젝트이고, 모든 클래스를 클래스 변수로로드한다. 컨트롤러를 확장하여 같은 작업을 수행한다. $this->class->method()

. 그래서 각 컨트롤러 메서드에서 사용별로 각 클래스를 개별적으로로드하는 방법을 생각했습니다.

가장 좋은 (가장 깨끗한) 방법은 무엇입니까?

답변

2

각 클래스의 인스턴스가 하나만 있으면 간단한 서비스 컨테이너를 만들 수 있습니다.

class ServiceContainer 
{ 
    protected $services; 

    public function get($className) 
    { 
     if (!array_key_exists($className, $this->services)) { 
      $this->services[$className] = new $className; 
     } 

     return $this->services[$className] 
    } 
} 

그런 다음 응용 프로그램마다 하나의 ServiceContainer 인스턴스를 만듭니다. 모든 컨트롤러에 컨테이너를 주입하고

public function someAction() 
{ 
    $this->container->get('Mailer')->send($email_data); 
} 

간단한 예제를 사용하고, 분명히 추가 사용의 용이성, 또는 더 쉬운 방법에 대한 파일 경로를 필요로 자동 로딩 예를 들어 작업의 많은 사용 가능한 수 있도록 (및 취급이 필요합니다 서비스를받지 못하는 등).

+0

이것은 일종의 제가 일을 끝내는 것입니다. 하지만 구문이 너무 길어서 정적 배열을 사용하는 절차 함수를 사용했습니다. – CrazeD

2

나는 CodeIgniter가하는 방식을 좋아하지 않습니다. 그게 내게 맞는 것 같지는 않았어. 자동로드 클래스가 spl_autoload 스택에 푸시됩니다. 그리고 단지 정상 등 클래스를 호출 :

$class = new SomeClass();

+0

하지만 다른 곳에서 동시에 클래스를 사용해야하고 두 번 인스턴스화하지 않으려면 어떻게해야합니까? 나는 모든 도서관 싱글 톤을 만들어야 할까? 또는 정적 배열을 객체에 할당 한 클래스를로드하고 객체가 이미로드 된 경우 객체를 반환하는 함수를 만들어야합니까 (CodeIgniter의 방법)? – CrazeD

+1

@CrazeD 필요한 경우 싱글 톤을 구현하는 데는 아무 문제가 없습니다. – kba

2

PHP는 SPLspl_autoload (및 관련 기능)과 자동로드 기능을 제공합니다. 라이브러리 코드에 대한 사용자 정의 오토로더를 등록 할 수 있습니다.

응용 프로그램에서 처리하는 공유 기능에 대해서는 Front Controller design pattern을 고려 했습니까?

관련 문제