Phalconに触れながらMVCプロジェクトの構成と構造を理解しよう
Phalconの動作と処理の流れ
web/index.php config.php loader.php services.phpはとても重要なファイルです、それぞれがどのような処理を行っているかを詳しく紹介します。
public/index.php
Phalconフレームワークのすべてのエントリポイントになります、index.phpでは、以下の順序で処理を行っています。
- config.php アプリケーション全体の設定の読み込み
- loader.php クラスオートローダーの読み込み
- services.php Dependency Injectionコンテナに対する設定の読み込み
- $diを引数に\Phalcon\Mvc\Applicationクラスをインスタンス化
<?php ini_set( 'display_errors', 1 ); error_reporting(E_ALL); try { /** * Read the configuration */ $config = include __DIR__ . "/../app/config/config.php"; /** * Read auto-loader */ include __DIR__ . "/../app/config/loader.php"; /** * Read services */ include __DIR__ . "/../app/config/services.php"; /** * Handle the request */ $application = new \Phalcon\Mvc\Application($di); echo $application->handle()->getContent(); } catch (\Exception $e) { echo $e->getMessage(); }
app/config/config.php
config.phpファイルでは、\Phalcon\Configクラスのインスタンスを返却しアプリケーション全体の設定を記述しています。
連想配列として、アプリケーション全体の設定をここに記述することができます。
上記のindex.phpでは、このインスタンスを$configに格納し後述するservices.phpで各機能の設定を行っています。
<?php return new \Phalcon\Config(array( 'database' => array( 'adapter' => 'Mysql', 'host' => 'localhost', 'username' => 'dbuser', 'password' => 'dbpass', 'dbname' => 'dbname', ), 'application' => array( 'controllersDir' => __DIR__ . '/../../app/controllers/', 'modelsDir' => __DIR__ . '/../../app/models/', 'viewsDir' => __DIR__ . '/../../app/views/', 'pluginsDir' => __DIR__ . '/../../app/plugins/', 'libraryDir' => __DIR__ . '/../../app/library/', 'cacheDir' => __DIR__ . '/../../app/cache/', 'baseUri' => '/', ) ));
Dependency Injectionコンテナ
Phalconでは、Dependency Injectionコンテナ(以後DIコンテナ)が提供されています、ソフトウェアデザインパターンとしてのDIの解説は今回は割愛をしますが、DIコンテナによって、サービス名を定義し、クラスライブラリ同士の依存関係をコンテナ内部で予め解決したり、アプリケーションのどこからでも任意のライブラリやインスタンス化したクラスを取り出せるようになります。
CakephpやCodeigniterでも、同じようにプロジェクト全体から呼び出すことができるコアになるシングルトンクラスが提供されていました。
乱暴な言い方をすれば、これらのシングルトンが設定可能になったくらいで捉えておいてください。
services.phpの要所だけを記載します。
app/config/services.php
<?php use Phalcon\DI\FactoryDefault; use Phalcon\Mvc\View; use Phalcon\Mvc\Url as UrlResolver; use Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter; use Phalcon\Mvc\View\Engine\Volt as VoltEngine; use Phalcon\Mvc\Model\Metadata\Memory as MetaDataAdapter; use Phalcon\Session\Adapter\Files as SessionAdapter; /** * The FactoryDefault Dependency Injector automatically register the right services providing a full stack framework */ $di = new FactoryDefault(); // フレームワーク動作に最低限必要な設定 Factory defaultをインスタンス化 /** * The URL component is used to generate all kind of urls in the application */ $di->set('url', function () use ($config) { $url = new UrlResolver(); $url->setBaseUri($config->application->baseUri); return $url; }, true);
DIコンテナの呼び出し
以下はサービス名をurlにURLReslverクラスをセットする例ですが、クロージャ(無名関数)に慣れていない人には読みづらいかもしれません。
クロージャで定義することによって、呼び出し時に初めてライブラリをインスタンス化するコードとなっています。
function() use ($config)で、親のスコープにある$config変数をクロージャ中に参照を引き継いで使える状態で定義しています。
クロージャ内部では、UrlResolverクラスをインスタンス化して、setBaseUriメソッドをコールしています、その際の引数は$configから参照したbaseUriをセットしていることがわかります。
$di->setの最後にtrueを引数で渡していますが、trueを渡すとSharedインスタンス(シングルトン)となり、二度目以降のコールの場合はインスタンスが生成されず1回目のアクセスで生成されたインスタンスが返却されます。
$di->set('url', function () use ($config) { $url = new UrlResolver(); $url->setBaseUri($config->application->baseUri); return $url; }, true);
ユニバーサルクラスローダー
プロジェクトのクラスのローディングを行います。
LoaderクラスregisterClasses、registerDirs、registerNamespacesメソッドを使いクラスのローディングを行っています。
app/config/loader.php
<?php $loader = new \Phalcon\Loader(); /** * We're a registering a set of directories taken from the configuration file */ $loader->registerDirs( array( $config->application->controllersDir, $config->application->modelsDir ) )->register();
次回は
Phalconのテンプレートエンジンvoltを使って、基本的な構文やフィルタ・ビューの継承、フィルタ、パーシャル機能などをご紹介します。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Phalcon Devtoolsを使ったMVCプロジェクト作成からHelloWorldまで
- Phalconを使う前に知っておきたい、各機能とインストール方法
- Worker RoleでWebアプリケーションを動かしてみよう
- ES2015のモジュール管理
- APIを利用したownCloudの活用方法
- Oracle Cloud Hangout Cafe Season6 #4「Pythonで作るAPIサーバー」(2022年12月7日開催)
- WS2008 R2と最新OS Azureでのサーバー構築
- 「TAURI」で「簡易RSSリーダー」を開発してみよう
- オブジェクト指向言語のPHPが備えるコンストラクタとデストラクタ
- 外部API(Flickr)を試す!