Zend Frameworkリソースオートローダー

標準的なモデルの扱い方を調べていたら、Zend_Application_Module_Autoloaderなんてものを発見してしまった。Zend_Application配下ではなくZend_Loader配下のドキュメントとして書かれていたせいで見逃していた。というわけで、続いてはそこを読みながら翻訳していく。

Zend Frameworkリソースオートローダーの原文はこちら

30.3. リソースオートローダー

リソースオートローダーは、Zend Framework標準コーディング規約に基づきつつも、クラス名とディレクトリ構造が1対1で対応していないようなネームスペースを使ったライブラリコードを扱うためのものだ。その目的は、ある特定のアプリケーション向けに作られたモデル・フォーム・ACL(アクセス制御リスト)クラスのようなコードを、オートロードできるようにすることだ。

リソースオートローダーは、対象となるネームスペース設定とともに生成され、Zend_Loader_Autoloaderに登録される。これによって、特定のディレクトリとネームスペースを結びつけることが簡単にでき、それをオートロードすることもできる。

30.3.1. リソースオートローダーの使い方

以下のようなディレクトリ構造を想定して欲しい。


path/to/some/directory/
acls/
Site.php
forms/
Login.php
models/
User.php

このディレクトリのコードには、すべて"My_"というネームスペースがつけられている。その中の"acls"ディレクトリに置かれるコンポーネントは"Acl_"というプレフィックスがつけられ、最終的には"My_Acl_Site"というクラス名になる。同様に"forms"ディレクトリは"Form_"に対応し、"My_Form_Login"クラスとなる。"models"ディレクトリではコンポーネント用のネームスペースは使われず、"My_User"クラスとなる。

このようなクラスをオートロードするのに、リソースオートローダーが使える。リソースオートローダーを生成する際に、最低限リソースのベースとなるパスおよびネームスペースの情報を渡す必要がある。つまり、以下のようになる。


$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => 'path/to/some/directory',
'namespace' => 'My',
));

ベースネームスペースについて

Zend_Loader_Autoloaderでは、ネームスペースの後ろにアンダースコアがつけられていることが期待されている。Zend_Loader_Autoloader_Resourceは、ネームスペース、コンポーネント、クラス名の間がアンダースコアでつなげられるようなコードがオートロードされることを前提としている。だから、リソースオートローダーに登録する際には(ベースネームスペースに)アンダースコアは必要はない。

ベースとなるリソースオートローダーの準備はできたので、続いてはaddResourceType()メソッドを使って、いくつかオートロードするコンポーネントを追加してみよう。このメソッドは3つのパラメータを持つ。内部での参照名となる"リソース種別(type)"。ベースパス配下で実際にリソースが置かれる"サブディレクトリパス"。ベースネームスペースの後ろに追加される"コンポーネントネームスペース"。それでは独自のリソース種別を追加してみよう。


$resourceLoader->addResourceType('acl', 'acls/', 'Acl')
->addResourceType('form', 'forms/', 'Form')
->addResourceType('model', 'models/');

このように書く代わりに、addResourceTypes()を使って配列を渡すこともできる。上記に相当するコードは以下になる。


$resourceLoader->addResourceTypes(array(
'acl' => array(
'path' => 'acls/',
'namespace' => 'Acl',
),
'form' => array(
'path' => 'forms/',
'namespace' => 'Form',
),
'model' => array(
'path' => 'models/',
),
));

最終的に、(Zend_Loader_Autoloader_Resource)オブジェクトを生成する際のオプションで"resourceTypes"キーとして指定することによって、これらすべての設定を指定してしまうこともできる。具体的には以下のような(オプション配列の)構造となる。


$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => 'path/to/some/directory',
'namespace' => 'My',
'resourceTypes' => array(
'acl' => array(
'path' => 'acls/',
'namespace' => 'Acl',
),
'form' => array(
'path' => 'forms/',
'namespace' => 'Form',
),
'model' => array(
'path' => 'models/',
),
),
));

30.3.2. モジュールリソースオートローダー

Zend Frameworkには、そのMVCアプリケーションで推奨するディレクトリ構造があり、それに対応するマッピング設定を持つZend_Loader_Autoloader_Resourceクラスの具体的な実装が同梱されている。その具体的な実装であるZend_Application_Module_Autoloaderというローダーは、以下のようなマッピング情報を持っている。


api/ => Api
forms/ => Form
models/ => Model
DbTable/ => Model_DbTable
plugins/ => Plugin

たとえば、"Blog_"というプレフィックスを持つモジュールがあり、そこで"Blog_Form_Entry"クラスが使いたい場合、"forms/"ディレクトリ内に"Entry.php"というファイルが置かれることになる。

Zend_Applicationをモジュールブートストラップと一緒に使う場合、Zend_Application_Module_Autoloaderがそれぞれのモジュールごとに生成され、モジュールリソースをオートロードできるようにしてくれる。

30.3.3. リソースオートローダーをオブジェクトファクトリーとして使う場合*1
30.3.3. リソースオートローダーリファレンス*2

*1:$loader->load($resource, $type)の使い方だろうな。オブジェクトを使い回せるファクトリーになるみたいだ

*2:新しいクラスはマニュアル内にAPIリファレンスを置いている場合が多いな