技術日記
Zend FrameworkリソースオートローダーEdit

標準的なモデルの扱い方を調べていたら、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/',
),
));
最終的に、(ZendLoaderAutoloaderResource)オブジェクトを生成する際のオプションで"resourceTypes"キーとして指定することによって、これらすべての設定を指定してしまうこともできる。具体的には以下のような(オプション配列の)構造となる。
$resourceLoader = new ZendLoaderAutoloaderResource(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アプリケーションで推奨するディレクトリ構造があり、それに対応するマッピング設定を持つZendLoaderAutoloaderResourceクラスの具体的な実装が同梱されている。その具体的な実装であるZendApplicationModuleAutoloaderというローダーは、以下のようなマッピング情報を持っている。
api/         => Api
forms/       => Form
models/      => Model
DbTable/ => ModelDbTable
plugins/     => Plugin
たとえば、"Blog"というプレフィックスを持つモジュールがあり、そこで"BlogFormEntry"クラスが使いたい場合、"forms/"ディレクトリ内に"Entry.php"というファイルが置かれることになる。

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

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

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

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

Published At2009-07-01 09:00Updated At2019-12-30 23:54