[Zend Framework] Zend_Loader: 独自ライブラリをオートロードする
独自に作成したフィルターやバリデートをオートロードしてみます。
例えば、このような形で配置されているとします。
./library
├── My
│ ├── Filter
│ │ └── AllowTag.php
│ ├── Form
│ │ └── Element
│ │ └── Date.php
│ └── Validate
│ ├── CompareDate.php
│ ├── Date.php
│ ├── DateCompare.php
│ ├── GreaterThan.php
│ └── LessThan.php
コントローラでこのように require_once されていました。
<?php
require_once 'My/Filter/AllowTag.php';
require_once 'My/Form/Element/Date.php';
require_once 'My/Validate/CompareDate.php';
require_once 'My/Validate/DateCompare.php';
class IndexController extends Zend_Controller_Action
{
コントローラ内で new My_Form_Element_Date と使われています。
設定
application.ini に設定を加えればOKでした。
autoloadernamespaces[] = My_
Zend_Loader_Autoloader に関する設定になるのだと思います。
標準のマッピング
ちなみに推奨ディレクトリ構造に従って、このようにマッピングされているそうです。
forms/ => Form
models/ => Model
DbTable/ => Model_DbTable
mappers/ => Model_Mapper
plugins/ => Plugin
services/ => Service
views/
helpers => View_Helper
filters => View_Filter
この設定に沿って、下記を探してくれたのだと思います。
補遺
require_once がコントローラに含まれていると、zf.sh 利用時に下記のようなエラーにより実行されませんでした。
% zf create action tableText Index
Note: PHPUnit is required in order to generate controller test stubs.
Creating an action named tableText inside controller at /Users/***/projects/sample/application/controllers/IndexController.php
PHP Warning: require_once(My/Filter/AllowTag.php): failed to open stream: No such file or directory in /Users/***/projects/sample/application/controllers/IndexController.php on line 3
Warning: require_once(My/Filter/AllowTag.php): failed to open stream: No such file or directory in /Users/***/projects/sample/application/controllers/IndexController.php on line 3
PHP Fatal error: require_once(): Failed opening required 'My/Filter/AllowTag.php' (include_path='/Users/***/bin/:/Applications/NetBeans/NetBeans 7.3.1.app/Contents/Resources/NetBeans/php/zend:.:/usr/local/zend/share/ZendFramework/library:/usr/local/zend/share/pear') in /Users/***/projects/sample/application/controllers/IndexController.php on line 3
Fatal error: require_once(): Failed opening required 'My/Filter/AllowTag.php' (include_path='/Users/***/bin/:/Applications/NetBeans/NetBeans 7.3.1.app/Contents/Resources/NetBeans/php/zend:.:/usr/local/zend/share/ZendFramework/library:/usr/local/zend/share/pear') in /Users/***/projects/sample/application/controllers/IndexController.php on line 3
autoload することによって、require_once を削除できるので、問題なく実行することができました。
% zf create action textTable Index
Note: PHPUnit is required in order to generate controller test stubs.
Creating an action named textTable inside controller at /Users/***/projects/sample/application/controllers/IndexController.php
Updating project profile '/Users/***/projects/sample/.zfproject.xml'
Creating a view script for the textTable action method at /Users/***/projects/sample/application/views/scripts/index/text-table.phtml
Updating project profile '/Users/***/projects/sample/.zfproject.xml'