phalconのcontroller


コントローラってそもそも

MVCモデルにて、コントローラは送られてきたリクエストに対して制御を行う。
データベースを取り扱うmodelに必要な情報頂戴とか、データ更新または削除しておいてとかお願いしたり、
実際に画面に表示させるviewにこのデータを表示するのに利用してとか、読んで字のごとくプログラムを「コントロールする」ことです。

phalconのコントローラ

公式 phalcon controller
リクエストを処理する際に重要なルールがあります。
IndexController.phpというファイル名で作成した際

<?php
use Phalcon\Mvc\Controller;
class IndexController extends Controller{
    public function indexAction(){
    }
}
  • Phalconの内部ライブラリーのControllerをuse使って読み込むこと
  • extends Controllerのようにextendsを利用し継承すること
  • indexActionのように○○Actionとして、Action名を記述すること

Actionはリクエストをphalconが解析し、コントローラの選択及びアクションを決めます。実際に処理したい内容をアクション内に書きます。

コントローラは、処理したい内容(Action)をまとめるといいでしょう。

例えば、ユーザ情報に関して。
ユーザ情報を、表示、作成、編集するページを作成する場合、URLを以下のようにします。

表示:(ドメイン)/user/
作成:(ドメイン)/user/add
編集:(ドメイン)/user/edit

コントローラのファイル名はUserController.phpで作成し、

<?php
use Phalcon\Mvc\Controller;

class UserController extends Controller{
    public function indexAction(){
         //処理内容
    }

    public function addAction(){
         //処理内容
    }

    public function editAction(){
         //処理内容
    }
}

上記のようになります。URL名にaction名がない場合は、自動的にindexActionが表示されます。
ちなみに、リクエストがドメインのみの場合、特に指定が無ければIndexControllerのindexActionがコールされま

以上が、phalconによりwebアプリケーションを動かす際の重要なルールです。

複数アクションに対して共通処理を行う

同一コントローラ内で、全てのアクションに共通処理をさせたいときには、

基本的には「initialize」です。

<?php
use Phalcon\Mvc\Controller;

class UserController extends Controller{

    public function initialize(){
        //このコントローラがロードされた際に、actionが処理される直前に呼ばれる
    }
    public function indexAction(){
         //処理内容
    }

    public function addAction(){
         //処理内容
    }

    public function editAction(){
         //処理内容
    }
}

ここでは、initializeを利用しましたが、共通処理は下のように複数ありますが、これについては後日記載します。
Dispatch Loop Events

複数のコントローラが必要なとき

様々な処理(action)をひとつのコントローラに詰め込むのはやめましょう。
phalcon内部で必要なコントローラファイルを一度読み込むわけですから、ぶくぶく太らせるのは良くないですし、他の人が開発に加わった際に、見づらくて萎えることになってしまいます。

処理の内容の意味合いごとに分けましょう。そしたら、URLも意味のあるものに必然的になると思います。

しかし、複数のコントローラを作成した際に全てのコントローラに対して共通的にinitialize処理をさせたい場合。

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

ControllerBase.phpというファイルを作成し、


<?php
use Phalcon\Mvc\Controller;

class ControllerBase extends Controller{

protected function initialize(){
    //全てのコントローラに対しての共通initialize処理
}

protected function common(){
    //共通処理
}
}

共通コントローラを作成したら、コントローラは以下のように変更しましょう

<?php
class UserController extends ControllerBase {
    public function initialize(){
        parents::initialize();
        //このコントローラがロードされた際に、actionが処理される直前に呼ばれる
    }
    public function indexAction(){
        parents::common();
        //処理内容
    }
    public function addAction(){
        //処理内容
    }
    public function editAction(){
        parents::common();
        //処理内容
    }
}

共通的な処理は可能な限りまとめる

リクエストやパラメータの取得について

公式 リクエストについて
公式 riquest API

Phalcon\Http\Request

<?php

use Phalcon\Http\Request;

// Getting a request instance
$request = new Request();

// Check whether the request was made with method POST
if ($request->isPost()) {
    // Check whether the request was made with Ajax
    if ($request->isAjax()) {
        echo "Request was made using POST and AJAX";
    }
}

上記が基本形です。Phalcon\Http\Requestを読み込み、new してインスタンスを作成する必要がありますが、Controller内で利用する際にはnewする必要はありません。以下のようにして利用できます。

$this->request->isPost()

よく利用するメソッドを紹介します。

パラメータの取得

例えば、
http://localhost/posts/show/2015/the-post-title
のように

http://(ドメイン)/(コントローラ)/(アクション)/(パラメータ)/(パラメータ)

の場合は、

 public function showAction($year, $postTitle)

のようにして取得できます。
但し、http://localhost/posts/show/?year=2015&postTitle=the-post-title
のような場合はaction内で、

$year=$this->request->getQuery("year");
$postTitle=$this->request->getQuery("postTitle");

にして取得します。

Phalcon\Mvc\Router機能を利用することでurlの解析を独自の物にできますが、urlをどのようにするかはあらかじめ決めておいたほうがよさそうです。

ポストデータの取得は以下のようになります。

$customerName = $this->request->getPost("name");

 


投稿日: 2015年10月23日
カテゴリー: phalcon|php | 投稿者: