[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 されていました。

application/controllers/IndexController.php
<?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でした。

application/configs/application.ini
autoloadernamespaces[] = My_

標準のマッピング

ちなみに推奨ディレクトリ構造に従って、このようにマッピングされているそうです。

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'