2011-08-25 2 views
0

방법 - 매우 간단합니다 ->추가 사용자 정의 클래스/테이블에 일부 CSV 파일의로드 것을 내가 심포니 1.4에서 작업을 만든

protected function execute($arguments = array(), $options = array()) 
{ 
    $databaseManager = new sfDatabaseManager($this->configuration); 
    $connection = $databaseManager->getDatabase($options['connection'])->getConnection(); 

    ...... 

    $query = "LOAD DATA INFILE '" . $cdrfile . "' 
     INTO TABLE .... 

    etc 

    $connection->execute($query); 
} 

는하지만 난 코드 다른 곳의이 부분을 재사용 할 - 그래서 새로운 PHP 클래스를 만들고 loadDataFromCSV이라는 새로운 정적 메서드를 만들었습니다.

내가

나에게 몇 가지 문제를했다 ... 그 방법으로 모든 코드를 넣고 class::loadDataFromCSV라고 - 첫 번째 방법에서 $this 키워드가 아닌 객체 클래스와 유효하지 않은 (즉,하지 인스턴스 생성) - 클래스를 인스턴스화 한 다음 메서드를 호출 할 수 있습니다. class->loadDataFromCSV - 다음 문제는 첫 번째 줄의 $this->configuration입니다. 구성을 작동시키기 위해 구성에 전달해야합니까?

많은 변수를 전달하지 않고 간단한 코드를 실행하는 간단한 방법을 만드는 가장 간단한 방법은 무엇입니까?

답변

2

간단한 대답 : DI 컨테이너를 사용하십시오.

답 : 기본적으로 구성 객체에 따라 클래스가 개체 종속성을 설정하는 방법을 묻습니다. 이 작업에는 두 가지 방법이 있습니다. 클래스의 하드 코드 의존성. 예 : Registry::getInstance()->get('config'); 및 종속성 주입을 사용합니다. Dependency Injection은 모든 config 인스턴스를 전달할 수있는 한 더 나은 솔루션입니다. 기존 객체, 새 객체, 단위 테스트 용 모의 객체 또는 기타 구성 구현. 종속성 삽입에는 두 가지 유형이 있습니다. (생성자를 통해 의존성을 주입 예를 들어 new Object(new Dependency())) 또는 세터를 통해.

$o = new Object(); 
$o->setDependency($dependency); 

을 개체가 많은 의존성 코드는 두 가지 거의 읽을 될 수있는 경우.이 솔루션은 당신을 위해 자동으로 모든 종속성을 주입 의존성 삽입 컨테이너를 사용하는 것입니다 . 모든 종속성을 주입, 방법은 클래스의 인스턴스를 만들고 만들기 DIContainer::create('object');와 객체를 반환

+1

나는 의존성 주입을 살펴볼 것이다. - 감사합니다. – ManseUK

0

당신이해야 정적 방법으로 당신의 접근 방식을 사용하기 위해 :. 클라이언트 코드는 여전히 하나 개의 간단한 라인입니다.

  1. 모든 this-> keywords를 self로 바꾸기 ::
  2. 모든 파일 설정을 하나의 파일로 옮기고 패턴 Singleton을 구현하는 Config 클래스로로드하십시오.
  3. 호출은 Config :: getInstance() -> getSection ('your_section')과 비슷하게 보입니다. DB 초기화에 관한

:

  1. 는 부트 스트랩 파일에 DB 객체를 생성 취득/설정이 정적 방법과 레지스트리 클래스를 만듭니다.
  2. $ connection = Registry :: get ('db') -> getConnection();을 사용하십시오.
관련 문제