2012-06-02 6 views
3

Я использую Doctrine в моем проекте без явного ввода имен в один из моих классов. Это привело к некоторым проблемам с попыткой организовать мой код в отдельные подкаталоги (или, по крайней мере, это казалось). Поэтому я попытался реализовать пространства имен в своем коде, но я боюсь и пробовал многочисленные решения здесь безрезультатно, мне нужно спросить.Zend Framework 1.11 с Doctrine 2 и пространствами имен

Я получил стандартную структуру проекта:

application/ 
--models/ 
--services/ 
--controllers/ 
..etc 

В моем Bootstrap я получил следующее (без пространств имен в моем коде, который работает отлично):

/** 
* Initialize Doctrine 
* @return Doctrine_Manager 
*/ 
public function _initDoctrine() { 
    // include and register Doctrine's class loader 
    require_once('doctrine/Doctrine/Common/ClassLoader.php'); 

    $autoloader = \Zend_Loader_Autoloader::getInstance(); 

    require_once('doctrine/Doctrine/Common/ClassLoader.php'); 
    $commonLoader = new \Doctrine\Common\ClassLoader('Doctrine\Common', 'doctrine'); 
    $autoloader->pushAutoloader(array($commonLoader, 'loadClass'), 'Doctrine\Common'); 

    $dbalLoader = new \Doctrine\Common\ClassLoader('Doctrine\DBAL', 'doctrine'); 
    $autoloader->pushAutoloader(array($dbalLoader, 'loadClass'), 'Doctrine\DBAL'); 

    $ormLoader = new \Doctrine\Common\ClassLoader('Doctrine\ORM', 'doctrine'); 
    $autoloader->pushAutoloader(array($ormLoader, 'loadClass'), 'Doctrine\ORM'); 

    $modelLoader = new \Doctrine\Common\ClassLoader(NULL, APPLICATION_PATH . "/models"); 
    $autoloader->pushAutoloader(array($modelLoader, 'loadClass'), ''); 

    // create the Doctrine configuration 
    $config = new \Doctrine\ORM\Configuration(); 

    // setting the cache (to ArrayCache. Take a look at 
    // the Doctrine manual for different options !) 
    $cache = new \Doctrine\Common\Cache\ArrayCache; 
    $config->setMetadataCacheImpl($cache); 
    $config->setQueryCacheImpl($cache); 

    // choosing the driver for our database schema 
    // we'll use annotations 
    $driver = $config->newDefaultAnnotationDriver(
     APPLICATION_PATH . '/models' 
     ); 
    $config->setMetadataDriverImpl($driver); 

    // set the proxy dir and set some options 
    $config->setProxyDir(APPLICATION_PATH . '/models/Proxies'); 
    $config->setAutoGenerateProxyClasses(true); 
    //$config->setAutoGenerateProxyClasses(false); 
    $config->setProxyNamespace('App\Proxies'); 

    // now create the entity manager and use the connection 
    // settings we defined in our application.ini 
    $connectionSettings = $this->getOption('doctrine'); 
    $conn = array(
    'driver' => $connectionSettings['conn']['driv'], 
    'user'  => $connectionSettings['conn']['user'], 
    'password' => $connectionSettings['conn']['pass'], 
    'dbname' => $connectionSettings['conn']['dbname'], 
    'host'  => $connectionSettings['conn']['host'] 
    ); 
    $entityManager = \Doctrine\ORM\EntityManager::create($conn, $config); 

    // push the entity manager into our registry for later use 
    $registry = Zend_Registry::getInstance(); 
    $registry->entitymanager = $entityManager; 

    return $entityManager; 
} 

Когда я добавляю

namespace models; 

для каждого из моих классов моделей и обновления Bootstrap, чтобы быть следующим. Я получаю Ex ception «Применение класса не существует» (Приложение один из моих моделей):

$modelLoader = new \Doctrine\Common\ClassLoader('models', APPLICATION_PATH . "/models"); 
$autoloader->pushAutoloader(array($modelLoader, 'loadClass'), 'models'); 

Просто для полноты картины, я ссылаться на эту модель в моем контроллере следующим образом:

public function indexAction() 
{ 
    $this->_helper->layout()->title = "Your applications"; 
    $this->_helper->layout()->description = "Create, edit and view all applications you have registered with us."; 
    $this->view->applicationList = $this->entityManager->getRepository("Application")->findAll(); 
} 

Что мне не хватает? Я уверен, что это очевидно, но сейчас я вытягиваю свои волосы.

ответ

1

После долгих поисков я наткнулся на this video (требуется логин).

В принципе, способ, которым я решил (согласно вебинару), состоял в том, чтобы пронумеровать мои объекты и сохранить их в каталоге/library. Затем, когда мне нужно использовать их из реального приложения, я получаю доступ через их пространство имен.

Смежные вопросы