2011-12-19 6 views
9

Мне нужно использовать автозагрузку для моих пользовательских классов в Zend Framework 2.0. Моя пользовательская библиотека расположена в /vendor/Garvey/library/Garvey. У меня есть простой расширенный AbstractTable класс в /vendor/Garvey/library/Garvey/Db/Table/AbstractTable.php:Автозагрузка пользовательской библиотеки в Zend Framework 2.0

<?php 

namespace Garvey\Db\Table; 

use Zend\Db\Table\AbstractTable; 

abstract class AbstractTable extends AbstractTable 
{ 
    public function getItemById($id) 
    { 

    } 
} 

В index.php У меня есть следующий код:

require_once 'vendor/ZendFramework/library/Zend/Loader/AutoloaderFactory.php'; 
Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
    'prefixes' => array(
     'Garvey' => 'vendor/Garvey/library/Garvey', 
    ) 
))); 

Но у меня есть следующее сообщение об ошибке. Что я пропустил?

Fatal error: Class 'Garvey\Db\Table\AbstractTable' not found 

Заранее спасибо.

+0

что? это неправильно посмотреть на [manual] (http://framework.zend.com/manual/en/zend.loader.autoloader.html) – noob

+0

Это Zend Framework 2. Beta1. – pltvs

+0

Почему вы используете более старую версию ... (2мин) – noob

ответ

11

Ваш оригинальный index.php будет также работать, если вы изменили клавишу «префиксы» к «пространств имен» и указать путь, как показано ниже:

Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
    'namespaces' => array(
     'Garvey' => dirname(__DIR__) . '/vendor/Garvey', 
    ) 
))); 
+2

Хороший ответ, небольшая поправка для этого конкретного вопроса: ''Garvey' => dirname (__ DIR__). '/ vendor/Garvey/library/Garvey'' – Hegemon

+0

плутов, вам не нужно: require_once' vendor/ZendFramework/library/Zend/Loader/AutoloaderFactory.php '; –

2

Я нашел ответ. Поместите это в index.php:

require_once 'vendor/ZendFramework/library/Zend/Loader/StandardAutoloader.php'; 
$loader = new Zend\Loader\StandardAutoloader(); 
$loader->registerNamespace('Garvey', realpath('vendor/Garvey/library/Garvey')); 
$loader->register(); 
+0

Это правильный способ. –

+0

ммм немного расстраивает. Возможно, вы новичок, но я еще новее! Куда все это идет? Я думаю public/index.php –

+0

Да, вы правильно. index.php – pltvs

11

Или вы может применяться в модуле.php

public function getAutoloaderConfig() 
{ 
    $return = array(
     'Zend\Loader\ClassMapAutoloader' => array(
      __DIR__ . '/autoload_classmap.php' 
     ), 
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       'Garvey' => __DIR__ . '/../../vendor/Garvey/library/Garvey', 
      ) 
     ) 
    ); 
} 

Но я бы не рекомендовал его. Поскольку цель ZF2, ориентированная на скорость автозагрузки, лучше всего использовать стиль class_map для загрузки ваших классов. Он будет работать намного быстрее в конце, но потребует дополнительной работы. Вы можете зарегистрировать каждый класс в вашем файле class_map.

Вы можете создать class_map.php в корне вашей библиотеки и разместить там

<?php 
return array(
    'Garvey\Db\Table\AbstractTable' => __DIR__ . '/Garvey/Db/Table/AbstractTable.php', 
); 

И добавить туда столько классов, сколько вы используете. И в getAutoloaderConfig() вы можете добавить вы classmap

public function getAutoloaderConfig() 
{ 
    $return = array(
     'Zend\Loader\ClassMapAutoloader' => array(
      __DIR__ . '/autoload_classmap.php', 
      __DIR__ . '/../../vendor/Garvey/library/Garvey/class_map.php', 
     ), 
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
      ) 
     ) 
    ); 
} 
+0

По-моему, это лучший ответ. Использование карты классов - это быстрый (если не самый быстрый) способ загрузки классов и поэтому рекомендуется Zend. Это также понятно и легко прослеживается. Хорошая работа, очистка этого метода, спасибо! –

3

Мэтью Вейер O'Phinney объясняет this video, что в настоящее время существует 3 способа автозагрузки:

  • ZF1 стиле include_path автозагрузчик (старого метод ZF1 , не рекомендуется)
  • Пер-имена/префикс самозарядного (нового метода ZF2, лучше)
  • Class-map autoloading (рекомендуется и быстро)

class-map generator утилита упоминается в документации, которая будет заботиться о написании /vendor/vendor_name/library/autoload_classmap.php для вас.

Решение, которое вы нашли, аналогично тому, как упоминает Мэтью в видео для автозагрузки Per-namespace/prefix. Следуя структуре кода в ZendSkeletonApplication, этот код будет в файле /init_autoloader.php, а не в файле /public/index.php.

2

Ищите краткое описание this post.

Теперь следующий шаг добавляет некоторый код в нашу пользовательскую библиотеку.

Прежде всего открыть файл ./vendor/Garvey/autoload_classmap.php

return array(

    'Garvey\Module' => __DIR__ . '/Module.php', 

    'Garvey\Db\Table' => __DIR__ . '/library/Garvey/Db/Table/AbstractTable.php', 

) 

Следующая является ./vendor/Garvey/Module.php

namespace Garvey; 

use Zend\ModuleManager\Feature\AutoloaderProviderInterface; 

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

      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/library/' . __NAMESPACE__, 
       ), 
      ), 
     ); 
    } 
} 

Теперь внутри вашей библиотеки создать файл в папке:

./vendor/Kdecom/library/Kdecom/Db/Table/AbstractTable.php

Один окончательного что нам нужно делать ich добавляет эту библиотеку в ваш файл application.config.php.

Так что ваш application.config.php файл будет выглядеть примерно таким образом ...

return array(
    'modules' => array(
     'Application', 
     'Garvey' 
    ), 

    'module_listener_options' => array(
     'config_glob_paths' => array(
      'config/autoload/{,*.}{global,local}.php', 
     ), 

     'module_paths' => array(
      './module', 
      './vendor', 
     ), 
    ), 
); 
+0

Почтовая ссылка возвращает 404 –