2011-11-06 4 views
3

ZF2에서 발을 짚으 려하고 첫 번째 문제를 발견했습니다.젠드 프레임 워크 2 라이브러리 경로

namespace Dummy\Model; 

use Shanty\Mongo\Document; 

class Dummy extends Shanty_Mongo_Document { 
    public function setConnections($connections) { 
    Shanty_Mongo::addConnections($connections); 
    } 
} 

합니다 (: 나는

그래서 나는 도서관에 전체 오두막 디렉토리를 복사하여 새로운 모델 클래스를 만들었습니다 (MongoDB를 연결하는 외부 라이브러리) Shanty_Mongo을 사용하려면 모듈에 말 내가 잘 이해한다면 DI가 setConnections()를 사용할 것입니다.

Shanty_Mongo_Document를 찾지 못하는 것 같습니다. 추가 라이브러리를 가리 키기 위해 application.config.php에 뭔가를 추가해야합니까?

+0

Shanty \ Mongo \ Document를 Document로 사용하고 Class Dummy extends Document를 사용해보십시오. 나는 그 네임 스페이스와 너무 확고하지 않다. 그러나 나는 그것을 올바르게 이해하면 제대로 작동해야한다. – Sam

+0

불행히도 그것은 작동하지 않았다. 사실 Shanty_Mongo는 젠드 (Zend)가 라이브러리에 대해 시행하는 디렉토리 네이밍 변환을 따르지만 네임 스페이스를 지원하지 않기 때문에 작동하지 않는다고 생각합니다. 정확히 어떻게 작동하는지 알아 내려고 노력 중입니다. (http://packages.zendframework.com/docs/latest/manual/en/zend.loader.html#zend.loader.load) – mobius

답변

4

라이브러리 Shanty_Mongo은 네임 스페이스를 사용하지 않고 "오래된"밑줄로 구분 된 라이브러리입니다. ZF2에서 스타일은 PSR-0 표준과 동일하지만 네임 스페이스가 있습니다 (따라서 Shanty_MongoShanty\Mongo입니다). 그러나 예를 들어 클래스 맵을 사용하여 이러한 오래된 스타일 벌금을로드 할 수 있습니다. 그런 다음 ZF2 프로젝트에서 밑줄로 구분 된 클래스를 사용할 수 있습니다.

이 라이브러리의 모듈을 만들고 해당 모듈을 ./vendor ("제 3 자 기능을 제공하는 모듈")에 넣는 것이 좋습니다. 이 모듈에서는 다음과 같은 디렉토리 구조를 만들 수 있습니다 (I 모듈의 이름 ShantyMongo 가정) :

./vendor/ShantyMongo/ 
    library/ 
    Module.php 
    autoload_classmap.php 
    autoload_function.php 
    autoload_register.php 

라이브러리는 ShantyMongo의 자식 저장소에 서브 모듈이다. 파일 autoload_classmap.php은 ZF2 저장소의 bin 디렉토리 안에있는 PHP 스크립트 classmap_generator.php에 의해 생성 된 클래스 맵입니다. 그런 다음 autoload_function.php이 같은 간단한 될 수 있습니다

<?php 
return function ($class) { 
    static $map; 
    if (!$map) { 
     $map = include __DIR__ . '/autoload_classmap.php'; 
    } 

    if (!isset($map[$class])) { 
     return false; 
    } 
    return include $map[$class]; 
}; 

그리고이 같은 autoload_register.php :

<?php 
spl_autoload_register(include __DIR__ . '/autoload_function.php'); 

이하자하려면 ZF2 응용 프로그램을 사용하면, 당신은을 채우기 위해이 모듈이 필요한 것을 알고있다 module.php는 ShantyMongo\Module 클래스입니다. 이런 식으로 뭔가 충분합니다 :

<?php 

namespace ShantyMongo; 

use Zend\Module\Consumer\AutoloaderProvider; 

class Module implements AutoloaderProvider 
{ 
    public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\ClassMapAutoloader' => array(
       __DIR__ . '/autoload_classmap.php', 
      ) 
     ); 
    } 
} 

당신이 지금 ZF2 안쪽이 제 3 자 라이브러리의 자동 로더를 설정 한 application.config.php에 모듈 어레이에 "ShantyMongo"를 추가합니다. 다음과 같이 다음 모델을 사용할 수 있습니다 ShantyMongo 네임 스페이스를 사용하지 않기 때문에

<?php 

namespace Dummy\Model; 

class Dummy extends Shanty_Mongo_Document { 
    public function setConnections ($connections) { 
    Shanty_Mongo::addConnections($connections); 
    } 
} 

, 당신은 더 이상이 사용하는 문이 없습니다.