Phalconに触れながらMVCプロジェクトの構成と構造を理解しよう

2014年8月8日(金)
廣瀬 一海

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を使って、基本的な構文やフィルタ・ビューの継承、フィルタ、パーシャル機能などをご紹介します。

アイレット株式会社 cloudpack事業部 シニアソリューションアーキテクト

生業はインフラエンジニア。小規模から大規模なまで日々様々なインフラを構成しています。好きなクラウドはMicrosoft Azure、日頃の業務はAmazon Web Services、という感じにクラウド漬けの毎日を過ごしています。​
仕事の傍ら、勉強会やコミュニティ(日本Azureユーザー会)コアメンバとして活動しています、マイクロソフトのオープンソース戦略にとても共感し、Microsoft MVPとして情報発信や交流を行っています。
Microsoft MVP Microsoft Azure

cloudpack公式サイト:http://cloudpack.jp

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています