Phalcon

Phalconのコントローラ

更新日:

今日は、Phalconのコントローラについて調べてみます。phalconの公式サイトのコントローラの項目はまだ日本語に訳されていませんので、Google先生のお力をお借りしながら、私なりに訳してみます。只、私は英語が堪能な方ではありませんで、疑問があったら、公式サイトで確認してください。お願いします。

コントローラの使用

コントローラはアクションと呼ばれる多くのメソッドを提供します。アクションは、リクエストを処理するコントローラのメソッドです。デフォルトでは、アクションにはコントローラーマップ上のすべてのパブリックメソッドとURLでアクセス可能です。アクションは、リクエストを解釈してレスポンスを作成する責任があります。通常のレスポンスは、レンダリングされたビューのフォームですが、同様のレスポンスを作成するための他の方法もあります。

あなたがこのようなURL(http://localhot/blog/posts/show/2012/the-post-title)にアクセスすると、デフォルトでファルコンはこのような各部分に分解します。

  • palcon Directory → blog
  • Controller → posts
  • Action → show
  • Parameter → 2012
  • Parameter → the-post-title

この場合、PostsControllerはこのリクエストを処理します。アプリケーション内のコントローラを置くための特別な場所は必要ありません。彼らはオートローダーを使用してロードすることができます。あなたは必要としているコントローラを自由に整理することができます。

コントローラは、接尾辞「Controller」を付与し、アクションには接尾辞「Action」を付与する必要があります。コントローラのサンプルは、次のとおりです。

<?php
class PostsController extends \Phalcon\Mvc\Controller
 {
public function indexAction()
 {
}
public function showAction($year, $postTitle)
 {
}
}

追加のURIパラメータは、簡単にローカル変数を使用してアクセスできるように、アクションのパラメータとして定義されています。コントローラは、必要に応じてPhalcon\Mvc\Controllerコンポーネントを拡張することができます。これにより、コントローラは、アプリケーションサービスへの容易なアクセスを有することができる。

必要に応じて、デフォルト値のないパラメータが処理されます。パラメータのオプションの値を設定することはPHPでいつものように行われます。

<?php
class PostsController extends \Phalcon\Mvc\Controller
 {
public function indexAction()
 {
}
public function showAction($year=2012, $postTitle='some default title')
 {
}
}

パラメータは、それらがルートに渡されたのと同じ順序で割り当てられます。あなたは、下記のような方法でその名前から任意のパラメータを取得することができます。

<?php
class PostsController extends \Phalcon\Mvc\Controller
 {
public function indexAction ()
 {
}
public function showAction ()
 {
 $year=$this->dispatcher ->getParam ( 'year' );
 $postTitle=$this->dispatcher->getParam ( 'postTitle' );
 }
}

ディスパッチループ

いかなるアクションも実行することがなくなるまでディスパッチループはディスパッチャ内で実行されます。上の例では唯一のアクションが実行されました。今、私たちは「前方」は、異なるcontroller/actionに実行を転送することによって、ディスパッチループにおける動作のより複雑な流れを提供する方法を説明します。

<?php
class PostsController extends \Phalcon\Mvc\Controller
 {
public function indexAction()
 {
}
public function showAction($year, $postTitle)
 {
 $this->flash->error("You don't have permission to access this area");
// 別のアクションへ転送する
 $this->dispatcher->forward(array(
 "controller" => "users",
 "action" => "signin"
 ));
 }
}

ユーザーが特定のアクションにアクセスする権限を持っていない場合は、下記のUsersコントローラのsigninアクションに転送されます。

<?php
class UsersController extends \Phalcon\Mvc\Controller
 {
public function indexAction()
 {
}
public function signinAction()
 {
}
}

転送が無限ループにならない限り、あなたは、アプリケーションの中で持つことができる「転送」に制限はありません。無限ループになった時点で、あなたのアプリケーションは止まります。ディスパッチループによってディスパッチすべき他のアクションがない場合、ディスパッチャは自動的にPhalcon\Mvc\Viewコンポーネントによって管理されているMVCのビューレイヤーを呼び出します。

コントローラの初期化

何らかのアクションがコントローラ上で実行される前に、Phalcon\Mvc\Viewコンポーネントは、最初に実行されるinitialize()メソッドを提供しています。__construct "メソッドの使用は推奨されません。

<?php
class PostsController extends \Phalcon\Mvc\Controller
 {
public $settings;
public function initialize()
 {
 $this->settings = array(
 "mySetting" => "value"
 );
 }
public function saveAction()
 {
 if ($this->settings["mySetting"] == "value") {
 //...
 }
 }
}

「beforeExecuteRoute」イベントが成功して実行された場合には、initialize()メソッドは呼び出されるだけで、実行されません。これは、initialize()メソッド内のアプリケーションロジックが許可なしに実行できないようにするための回避です。

あなたが、コントローラオブジェクトの構築後に、いくつかの初期化ロジックを実行したい場合は、『onConstruct()』メソッドを実装することができます。

<?php
class PostsController extends \Phalcon\Mvc\Controller
 {
public function onConstruct()
 {
 //...
 }
 }

(開発者が提供するカスタム·コントロール·アクセスに応じて)「onConstruct」メソッドは、実行されたアクションが、それへのアクセス権を持っていないコントローラまたはユーザが存在していない場合でも実行されることに注意してください。

サービスの注入

コントローラがPhalcon\Mvc\Controller拡張する場合、それはアプリケーション内のサービスコンテナへの容易なアクセスを持っています。例として、下記のようなサービスを登録している場合があります。

<?php
$di = new Phalcon\DI();
$di->set('storage', function() {
 return new Storage('/some/directory');
 }, true);

それから、下記のようにいくつかの方法でそのサービスにアクセスすることができます。

<?php
class FilesController extends \Phalcon\Mvc\Controller
 {
public function saveAction()
 {
//Injecting the service by just accessing the property with the same name
 $this->storage->save('/some/file');
//Accessing the service from the DI
 $this->di->get('storage')->save('/some/file');
//Another way to access the service using the magic getter
 $this->di->getStorage()->save('/some/file');
//Another way to access the service using the magic getter
 $this->getDi()->getStorage()->save('/some/file');
//Using the array-syntax
 $this->di['storage']->save('/some/file');
 }
}

フルスタックフレームワークとしてPhalconを使用している場合は、あなたはフレームワークのデフォルトで提供されるサービスを読み込むことができます。

リクエストとレスポンス

フレームワークは、予め登録されたサービスのセットを提供するものと見なします。私たちは、HTTP環境と対話する方法について説明します。「リクエスト」サービスには、Phalcon\Http\Requestコンポーネントのインスタンスが含まれいて、「response」には、クライアントに返信するために何が起こっているかを表すPhalcon\Http\Responseコンポーネントが含まれています。

<?php
class PostsController extends Phalcon\Mvc\Controller
 {
public function indexAction()
 {
}
public function saveAction()
 {
 // リクエストがPOSTで作られているかどうかをチェック
 if ($this->request->isPost() == true) {
 // POSTデータにアクセス
 $customerName = $this->request->getPost("name");
 $customerBorn = $this->request->getPost("born");
 }
 }
}

afterDispatchイベントのように、responseオブジェクトは時々、通常直接使用するのではなく、アクションの実行前に構築され、それが直接的なレスポンスにアクセスに使用するのに役立ちます。

<?php
class PostsController extends Phalcon\Mvc\Controller
 {
public function indexAction()
 {
}
public function notFoundAction()
 {
 // HTTP 404 レスポンスヘッダーの送信
 $this->response->setStatusCode(404, "Not Found");
 }
}

requestとresponseの専用の記事の中で、HTTP環境の詳細情報を学んでください。

セッションデータ

セッションは、リクエスト間の永続データを維持するのに役立ちます。永続的に必要なデータをカプセル化しますので、あなたはどんなコントローラからでもPhalcon\Session\Bagにアクセスすることができます。

<?php
class UserController extends Phalcon\Mvc\Controller
 {
public function indexAction()
 {
 $this->persistent->name = "Michael";
 }
public function welcomeAction()
 {
 echo "Welcome, ", $this->persistent->name;
 }
}

コントローラとしてサービスを使用

サービスは、常にサービス·コンテナから要求されているコントローラクラスとして機能することができます。したがって、その名前で登録された他のクラスは、簡単にコントローラを交換することができます。

<?php
//サービスとしてコントローラを登録します
 $di->set('IndexController', function() {
 $component = new Component();
 return $component;
 });
//サービスとして名前空間のコントローラを登録します
 $di->set('Backend\Controllers\IndexController', function() {
 $component = new Component();
 return $component;
 });

ベースコントローラの作成

いくつかのアプリケーションのアクセスコントローラリスト、トランスレーション、キャッシュ、テンプレートエンジンのような機能は、多くの場合、多くのコントローラに共通しています。このような場合には「ベースコントローラ」の作成 ​​は、あなたのコードは同じ事を繰り返さない事(DRY)を確認することが推奨されています。ベースコントローラは、単純Phalcon\Mvc\Controllerを拡張するクラスですし、すべてのコントローラに必要な共通の機能をカプセル化します。順番に、あなたのコントローラは、「ベースコントローラ」を拡張し、一般的な機能にアクセスできます。

このクラスは、任意の場所に配置することができますが、組織的な規則のために、我々はコントローラのフォルダ(app/controllers/ControllerBase.php)に配置することをお勧めします。私たちは、ブートストラップファイルで直接このファイルを要求するか、または任意のオートローダを使用してロードされる場合があります。

<?php
require "../app/controllers/ControllerBase.php";

共通コンポーネントの実装(アクション、メソッド、プロパティなど)は、このファイルに格納されています。

<?php
class ControllerBase extends \Phalcon\Mvc\Controller
 {
/**
 * This action is available for multiple controllers
 */
 public function someAction()
 {
}
}
他のコントローラが自動的に共通のコンポーネント(前述)へのアクセスを得る、ControllerBaseを継承します。
<?php
class UsersController extends ControllerBase
 {
}

コントローラのイベント

コントローラは自動的にディスパッチャーイベントのリスナーとして行動します。そして、実行されたアクションがbefore/afterにフックポイントを実装することができ、これらのイベント名を持つメソッドを実装します。

<?php
class PostsController extends \Phalcon\Mvc\Controller
 {
public function beforeExecuteRoute($dispatcher)
 {
 // これは、あらゆるアクションの前に実行されます。
 if ($dispatcher->getActionName() == 'save') {
$this->flash->error("You don't have permission to save posts");
$this->dispatcher->forward(array(
 'controller' => 'home',
 'action' => 'index'
 ));
return false;
 }
 }
public function afterExecuteRoute($dispatcher)
 {
 // あらゆるアクションごとに実行されます
 }
}

本日のまとめ

  1. URLは、『http://phalconディレクトリ/コントローラ/アクション/パラメーター』と解析されます。
  2. コントローラは、デフォルトでは、app/controllersフォルダ(ディレクトリ)内に作成する
  3. コントローラ名は、コントローラ名+Controllerと接尾辞「Controller」を付与する
    • indexController、postsController
  4. アクション名は、アクション名+Actionのように接尾語「Action」を付与する
    • indexAction()、showAction()
  5. パラメータは、getParam()メソッドで取得することができる。
    • $year=$this->dispacher->getParam('year')
  6. dispacher->forward()メソッドで複雑な、dispatcherを作成できる
  7. コントローラの初期化には、initialize()メソッドを使う
  8. onConStruct()メソッドで、初期化ロジックを後から構築することができる。
  9. リクエストのHTTPアクセスは、isPost()でPOST通信を確認できる
    • $this->request->isPost()は真偽値を返す
    • $this->request->getPost()でPOSTデータにアクセスできる
  10. コントローラの共通ロジックは、BaseControllerに記述して、それを継承してControllerを作成する事を推奨
  11. コントローラのイベントは、フックポイントを実装することができる

本日は、以上です。

-Phalcon

Copyright© WinRoad徒然草 , 2018 All Rights Reserved Powered by AFFINGER5.