Пытаясь намочить ноги на ZF2, и я наткнулся на свою первую проблему. Скажем, в модуле я хочу использовать Shanty_Mongo (внешнюю библиотеку для подключения к MongoDb)
Поэтому я скопировал весь каталог Shanty в библиотеке и создал новый класс Model:
namespace Dummy\Model; use Shanty\Mongo\Document; class Dummy extends Shanty_Mongo_Document { public function setConnections( $connections ) { Shanty_Mongo::addConnections($connections); } }
(SetConnections () должен использоваться DI, если я это хорошо понял)
Кажется, что он не нашел Shanty_Mongo_Document. Должен ли я добавить что-то в application.config.php, чтобы указать на дополнительную библиотеку?
Библиотека Shanty_Mongo
является «старой» разделительной библиотекой без использования пространств имен. В ZF2 стиль является тем же самым стандартом PSR-0, но с пространствами имен (так что Shanty_Mongo
будет Shanty\Mongo
). Тем не менее, вы можете загрузить этот старый стиль с помощью classmap, например. Затем вы можете использовать выделенные классы подчеркивания внутри вашего проекта ZF2.
Я предлагаю вам создать модуль для этой библиотеки и поместить этот модуль под ./vendor
(для «модулей, предоставляющих сторонние функции»). В этом модуле вы можете создать следующую структуру каталогов (я предполагаю, что имя модуля ShantyMongo):
./vendor/ShantyMongo/ library/ Module.php autoload_classmap.php autoload_function.php autoload_register.php
Библиотека является подмодулем в хранилище git Shanty-Mongo. Файл autoload_classmap.php – это карта классов, созданная скриптом php classmap_generator.php
внутри каталога bin
в хранилище ZF2. Тогда 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', ) ); } }
Если вы добавите «ShantyMongo» в ваш массив модулей в application.config.php
, теперь вы установили автозагрузчик для этой сторонней библиотеки внутри ZF2. Затем вы можете использовать свою модель следующим образом:
<?php namespace Dummy\Model; class Dummy extends Shanty_Mongo_Document { public function setConnections ($connections) { Shanty_Mongo::addConnections($connections); } }
Поскольку ShantyMongo не использует пространства имен, у вас больше нет этого оператора использования.