Как загрузить пользовательскую библиотеку в Zend Framework 2?
Я следил за этим руководством (http://socialsemanticweb.blogspot.com.au/2012/11/zend-framework-2-create-custom-library.html), но я не могу заставить Zend увидеть мою библиотеку (сообщение об ошибке ниже).
Любые идеи, что может быть неправильным? спасибо
структура моей папки
![http://imgur.com/Uhhm3uk]()
my MyLibraryController.php
<?php
namespace MyLibrary\Mvc\Controller;
use Zend\Mvc\Controller\AbstractActionController;
class MyLibraryController extends AbstractActionController {
public function __construct() {
}
public function doSomething() {
//instantiate your model here and return result
$result = "test";
return $result;
}
}
мой autoload_namespaces.php (внутри вендора\композитор)
<?php
// autoload_namespaces.php generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
'Zend\\' => $vendorDir . '/zendframework/zendframework/library/',
'ZendTest\\' => $vendorDir . '/zendframework/zendframework/tests/',
'Symfony\\Component\\Console\\' => $vendorDir . '/symfony/console/',
'Doctrine\\ORM' => $vendorDir . '/doctrine/orm/lib/',
'Doctrine\\DBAL' => $vendorDir . '/doctrine/dbal/lib/',
'Doctrine\\Common' => $vendorDir . '/doctrine/common/lib/',
'DoctrineORMModule\\' => $vendorDir . '/doctrine/doctrine-orm-module/src/',
'DoctrineORMModuleTest\\' => $vendorDir . '/doctrine/doctrine-orm-module/tests/',
'DoctrineModule\\' => $vendorDir . '/doctrine/doctrine-module/src/',
'DoctrineModuleTest\\' => $vendorDir . '/doctrine/doctrine-module/tests/',
'MyLibrary\\' => $vendorDir . '/MyLibrary/library/',
);
my application.config.php (я только добавил запись MyLibrary. Я пробовал с ней и без нее)
<?php
return array(
// This should be an array of module namespaces used in the application.
'modules' => array(
'Application',
'DoctrineModule',
'DoctrineORMModule',
'Directory',
'Helpers',
'MyLibrary',
сообщение об ошибке без добавления модуля MyLibrary в application.config.php
Fatal error: Class 'Directory\Controller\MyLibaryController' not found in D:\work\eclipse\htdocs\directory\module\Directory\src\Directory\Controller\DirectoryController.php on line 17
сообщение с сообщением модуля MyLibrary в файле application.config.php
Fatal error: Uncaught exception 'Zend\ModuleManager\Exception\RuntimeException' with message 'Module (MyLibrary) could not be initialized.' in D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php:175 Stack trace: #0 D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(149): Zend\ModuleManager\ModuleManager->loadModuleByName(Object(Zend\ModuleManager\ModuleEvent)) #1 D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(90): Zend\ModuleManager\ModuleManager->loadModule('MyLibrary') #2 [internal function]: Zend\ModuleManager\ModuleManager->onLoadModules(Object(Zend\ModuleManager\ModuleEvent)) #3 D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468): call_user_func(Array, Object(Zend\ModuleManager\ModuleEvent)) #4 D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library in D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php on line 175
Ответы
Ответ 1
Во-первых, это не модуль, поэтому вы можете получить сообщение об ошибке, добавив его в массив модулей конфигурации приложения.
Редактирование autoload_namespaces.php
для добавления вашей библиотеки (как вы уже знаете) должно работать.
Тем не менее, более правильным способом является добавить ключ autoload
в ваш корневой файл composer.json и сделать там отображение
{
"require": {
"php": ">=5.3.3",
"zendframework/zendframework": ">2.2.0rc1"
},
"autoload": {
"psr-0": {"MyLibrary\\": "vendor/MyLibrary/library/"}
}
}
После этого из командной строки запустите composer.phar update
, и она автоматически добавит вашу библиотеку в файл autoload_namespaces для вас. Выполнение этого способа означает, что вам не нужно вручную редактировать файл каждый раз, когда вы обновляете другие библиотеки композитором.
К самой ошибке
Неустранимая ошибка: Class 'Directory\Controller\MyLibaryController' не найден в D:\work\eclipse\htdocs\directory\module\Directory\src\Directory\Controller\DirectoryController.php в строке 17
Я предполагаю, что с помощью автоматической загрузки вам просто не хватает инструкции use
в классе DirectoryController
<?php
namespace Directory\Controller;
// be sure to use your library controller
use MyLibrary\Mvc\Controller\MyLibraryController;
class DirectoryController extends MyLibraryController
{
//..
}