App クラスはパスの管理、クラスのロケーション、そしてクラスのローディングの責務を担っています。 念のため ファイルとクラス名の規約 に従っていることを確認して下さい。
CakePHP はパッケージの考え方を中心に編成され、それぞれのクラスは他のクラスが存在するパッケージや
フォルダに属します。それぞれのクラスをどの場所でロードするべきなのかをフレームワークに通知するため、
App::build('APackage/SubPackage', $paths)
を使用して各パッケージの場所を設定することができます。
CakePHP のフレームワークのほぼすべてのクラスは、あなた独自の互換性のある実装と入れ替えることができます。
フレームワークが提供するクラスの代わりに独自のクラスを使用したい場合は、ただ単に、CakePHP の探索が
期待できるディレクトリの配置を模倣した libs フォルダにクラスを追加するだけです。
例えば、あなた独自の HttpSocket クラスを用いたいなら以下のように配置します:
app/Lib/Network/Http/HttpSocket.php
一度このようにやりさえすれば、 App は CakePHP 内部のファイルの代わりにあなたが再定義したファイルを ロードします。
void
CakePHP ではクラスは遅延ロードされますが、オートローダがクラスを発見出来るためには、 どこでファイルを見つけられるのかをまず App に伝えなくてはなりません。 どのパッケージでクラスを発見できるのかを App に伝えることで、あるクラスを初めて使用するときに 適切にファイルを見つけることができるのです。
一般的なクラスの例をいくつか挙げます:
App::uses('AppShell', 'Console/Command');
App::uses('BakeTask', 'Console/Command/Task');
App::uses('PostsController', 'Controller');
App::uses('AuthComponent', 'Controller/Component');
App::uses('MyModel', 'Model');
App::uses('TreeBehavior', 'Model/Behavior');
App::uses('ThemeView', 'View');
App::uses('HtmlHelper', 'View/Helper');
App::uses('PaymentProcessor', 'Lib');
App::uses('Textile', 'Vendor');
App::uses('CakeText', 'Utility');
つまり基本的に、第二パラメータは、コアまたはアプリ内のクラスファイルのフォルダパスと単純に 一致させなくてはなりません。
注釈
ベンダーのローディングは通常、規則に従わないパッケージのローディングを意味します。
多くのベンダーのパッケージに対しては App::import()
の使用が推奨されます。
プラグインからのクラスのローディングは、ロード元になるプラグインを指定する以外は、app や core のクラスのローディングとまったく同じように動作します:
// app/Plugin/PluginName/Model/Comment.php にある Comment クラスをロードする
App::uses('Comment', 'PluginName.Model');
// app/Plugin/PluginName/Controller/Component/CommentComponent.php にある
// CommentComponent クラスをロードする
App::uses('CommentComponent', 'PluginName.Controller/Component');
array
保存されたパス情報を読み込むために用いる:
// アプリケーション内のモデルのパスが返る
App::path('Model');
アプリケーション内のすべてのパッケージに対してこれを実行できます。 プラグインに対するパスを取得することもできます:
// DebugKit 内のコンポーネントのパスが返る
App::path('Component', 'DebugKit');
array
現在読み込まれているすべてのパスを App から取得します。
App が把握している全てのパスを調べたり記憶したりするのに便利です。
特定のパッケージのパスを扱う場合は App::path()
を使用します。
array
CakePHP 内部のパッケージのパスを見つけるために用いられます:
// Cache エンジンへのパスを取得する
App::core('Cache/Engine');
string
クラスが定義された場所のパッケージ名を返します。
void
ファイルシステム上の各パッケージの場所を設定します。パッケージごとに複数の探索パスを設定することができ、 それらは、ファイルがあるフォルダを一度だけ探すために指定された順序で使用されます。 すべてのパスはディレクトリセパレータで終了する必要があります。
例えばコントローラのパスを追加すると、CakePHP がコントローラを探すパスを置き換えることになるでしょう。 この仕組みが、アプリケーションをファイルシステムから分離させてくれます。
使い方:
//Model パッケージのための新しい探索パスがセットアップされます
App::build(array('Model' => array('/a/full/path/to/models/')));
//このパスはモデルを探索するための唯一正しいパスとしてセットアップされます
App::build(array('Model' => array('/path/to/models/')), App::RESET);
//ヘルパーの複数の探索パスがセットアップされます
App::build(array(
'View/Helper' => array('/path/to/helpers/', '/another/path/')
));
reset が true に設定されている場合、ロードされたすべてのプラグインは忘れ去られ、 それらは再びロードされる必要があります。
例:
App::build(array('controllers' => array('/full/path/to/controllers/')));
//このようになりました
App::build(array('Controller' => array('/full/path/to/Controller/')));
App::build(array('helpers' => array('/full/path/to/views/helpers/')));
//このようになりました
App::build(array('View/Helper' => array('/full/path/to/View/Helper/')));
バージョン 2.0 で変更: App::build()
はもはや app のパスと core のパスをマージしません
App::build()
は新しいパッケージの場所を追加するために用いられます。
アプリケーションに新しいトップレベルのパッケージや、サブパッケージを追加したい場合に便利です:
App::build(array(
'Service' => array('%s' . 'Service' . DS)
), App::REGISTER);
新しく登録されたパッケージの %s
は、 APP
パスに置き換えられます。
登録されるパッケージの末尾には /
を含める必要があります。いったんパッケージを登録すれば、
App::build()
を他のパッケージのように、パスの 後方追加/前方追加/リセットのために使用することができます。
バージョン 2.1 で変更: パッケージの登録は 2.1 で追加されました
mixed 与えられた型のオブジェクトの配列か、不正な場合は false を返します。
App::objects('Controller')
を用いて、Appが把握しているオブジェクト、例えば
App が把握しているアプリケーションのコントローラ、を見出せます。
使用例:
//returns array('DebugKit', 'Blog', 'User');
App::objects('plugin');
//returns array('PagesController', 'BlogController');
App::objects('Controller');
プラグインドット記法を用いることで、そのプラグイン内においてのオブジェクトを探すこともできます:
// returns array('MyPluginPost', 'MyPluginComment');
App::objects('MyPlugin.Model');
バージョン 2.0 で変更.
結果が空の場合や型が不正な場合に false の代わりに array()
を返します
App::objects('core')
は、もはやコアオブジェクトを返さずに array()
を返します
完全なクラス名を返します
string
プラグインも同じように App で配置できます。例えば App::pluginPath('DebugKit');
を用いることで DebugKit プラグインへのフルパスをあなたに与えます:
$path = App::pluginPath('DebugKit');
string
App::themePath('purple');
のように呼ぶと、 purple テーマのフルパスを取得することができます。
boolean
一見すると App::import
は複雑に見えます。
しかしながら、ほとんどのケースではただ二つの引数が要求されるのみです。
注釈
このメソッドはファイルを require
することと同じです。
その後、クラスの初期化が必要だと理解しておくことは重要です。
// require('Controller/UsersController.php'); と同じ
App::import('Controller', 'Users');
// クラスのロードが必要
$Users = new UsersController();
// モデル連携やコンポーネントなどがロードされるようにしたい場合
$Users->constructClasses();
かつて App::import('Core', $class) を用いてロードされたすべてのクラスは、 App::uses() を用いた、正しいパッケージを参照したロードが必要になりました。 この変更は、フレームワークに大きなパフォーマンスの向上をもたらしました。
バージョン 2.0 で変更.
このメソッドはもはや再帰的にクラスを検索しなくなり、 App::build()
に定義されているパスの値を厳格に使用します
クラスをロードするための App::import('Component', 'Component')
は使用不可になる予定。
App::uses('Component', 'Controller');
を用いて下さい。
コアクラスをロードするためには App::import('Lib', 'CoreClass');
はもはや使用不可です。
存在しないファイルのインポート、あるいは $name
および $file
のパラメータとして誤った型や
パッケージ名や NULL値を渡すと、戻り値は false になります。
App::import('Core', 'CoreClass')
はもはやサポートされません。 App::uses()
を用い、残りの部分はクラスのオートローディングにやらせます。
ベンダーファイルのローディングはベンダーフォルダを再帰的に探索しません。かつてのようにファイル名を アンダースコアに変換することも、もうありません。
フレームワークのほぼすべてのクラスはオーバーライドすることができます。例外は App
と
Configure
クラスです。そのようにオーバーライドを実行したいならばどんな場合であれ、
フレームワークの内部構造を真似て app/Lib
フォルダにクラスを追加する、ただそれだけです。
いくつかの例を挙げます:
Dispatcher
クラスをオーバーライドするためには app/Lib/Routing/Dispatcher.php
を作成します
CakeRoute
クラスをオーバーライドするためには app/Lib/Routing/Route/CakeRoute.php
を作成します
Model
クラスをオーバーライドするためには app/Lib/Model/Model.php
を作成します
置き換えたファイルをロードすると、 app/Lib
のファイルが組み込みのコアクラスの代わりにロードされます。
App::uses()
をベンダーのディレクトリ内のクラスをロードするのに使うことが出来ます。
これは他のファイルを読み込むのと同じ規則に従います:
// app/Vendor/Geshi.php 内の Geshi クラスをロードする
App::uses('Geshi', 'Vendor');
サブディレクトリ内のクラスをロードするには、それらのパスを App::build()
で追加する必要があります:
// app/Vendor/SomePackage/ClassInSomePackage.php 内の
// ClassInSomePackage クラスをロードする
App::build(array('Vendor' => array(APP . 'Vendor' . DS . 'SomePackage' . DS)));
App::uses('ClassInSomePackage', 'Vendor');
ベンダーのファイルは、規則に従っていなかったり、ファイル名と異なるクラスを持っていたり、
クラスを含んでないかもしれません。それらのファイルは App::import()
を使用して読み込むことができます。
次の例では、いくつかのパス構造からベンダーファイルをロードする方法を示しています。
これらのベンダーファイルは、ベンダーのフォルダのいずれかに配置することができます。
app/Vendor/geshi.php をロードする:
App::import('Vendor', 'geshi');
注釈
CakePHP が他のファイルを見出してしまわないために、geshi のファイル名は、小文字でなくてはなりません。
app/Vendor/flickr/flickr.php をロードする:
App::import('Vendor', 'flickr', array('file' => 'flickr/flickr.php'));
app/Vendor/some.name.php をロードする:
App::import('Vendor', 'SomeName', array('file' => 'some.name.php'));
app/Vendor/services/well.named.php をロードする:
App::import(
'Vendor',
'WellNamed',
array('file' => 'services' . DS . 'well.named.php')
);
app/Plugin/Awesome/Vendor/services/well.named.php をロードする:
App::import(
'Vendor',
'Awesome.WellNamed',
array('file' => 'services' . DS . 'well.named.php')
);
app/Plugin/Awesome/Vendor/Folder/Foo.php をロードする:
App::import(
'Vendor',
'Awesome.Foo',
array('file' => 'Folder' . DS . 'Foo.php'));
ベンダーファイルが /vendors ディレクトリ内にあるかどうかに違いはありません。 CakePHP は自動的にそれを見出します。
vendors/vendorName/libFile.php をロードする:
App::import(
'Vendor',
'aUniqueIdentifier',
array('file' => 'vendorName' . DS . 'libFile.php')
);
void
App のキャッシュを初期化し、シャットダウン関数を登録します。
boolean
自動的なクラスローディングを処理するメソッド。これは、App::uses()
を使用して定義された各クラスのパッケージを探し出し、その情報を元に、クラスをロードするための
フルパスとしてパッケージ名を解決します。各クラスのファイル名はクラス名に従ってください。
たとえばクラス名が MyCustomClass
である場合、ファイル名は MyCustomClass.php
でなければなりません。
void
オブジェクトのデストラクタ。
$_map
に変更が加えられている場合にキャッシュファイルに書き込みます。