SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend Framework入門

Zend Framework入門(2):Hello World!アプリケーションの作成

Zend Frameworkによる実践的なPHPアプリケーション開発


  • X ポスト
  • このエントリーをはてなブックマークに追加

「Hello World!」アプリケーションの作成(作成)

ファイル作成

 実際にMVCを用いたごく簡単なアプリケーションを作成していきましょう。フォームから名前を入力すると「~さん、こんにちは!」と返すというものです。

完成したアプリケーション
完成したアプリケーション
名前を入力したところ
名前を入力したところ

フロントコントローラ「index.php」

 公開フォルダに置かれるフロントコントローラの役割を担う「index.php」には、以下のような記述をします。

index.php
<?php
require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('../zendapps/controllers');

 2行目で、フロントコントローラ用のコンポーネントZend/Controller/Front.phpを呼び出しています。すべてのリクエストはフロントコントローラがまず受けつけ、その内容によってフロントコントローラが該当するアクションコントローラとアクションに処理を受け渡します(ディスパッチ)。3行目では、フロントコントローラのインスタンスの取得/コントローラのフォルダ指定('../zendapps/controllers')/ディスパッチを一気に行っています。

 デフォルトでは「ErrorHandler」プラグインと「ViewRenderer」アクションヘルパーが有効になっており、ビューやエラーの処理が簡潔に行えるようになっています。これらは必要に応じて以下のような記述をディスパッチ処理の前(上記では3行目の前)に加えることで無効にすることができます。これらプラグインとアクションヘルパーについては、次回以降解説する予定です。

ErrorHandlerを無効にする
<?php
Zend_Controller_Front::getInstance()->setParam('noErrorHandler', true);
ViewRendererを無効にする
<?php
Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true);

 また上記でも用いていますが、setParam($name, $value)では、フロントコントローラに任意のパラメータをセットすることもできます。パラメータはルーティング/ディスパッチ/アクションコントローラの過程を通して使うことができます。以下にメソッドをまとめておきます。

フロントコントローラでパラメータを扱うためのメソッド
メソッド内容
setParam($name, $value)パラメータ$nameの値を$valueに設定する
getParam($name)パラメータ$nameの値を得る
setParams(array $params)連想配列$paramsにより複数のパラメータを設定する
getParams()すべてのパラメータの一覧を得る
clearParams($name)$nameを消去する

アクションコントローラ「IndexController.php」

 フロントコントローラから、リクエストに従ってコントローラフォルダの該当するアクションコントローラファイルが呼び出されます。

アクションコントローラファイルの各要素と命名規則

 アクションコントローラファイルの中には、さらに個々の処理単位である「アクション」メソッドが記述されています。アクションコントローラファイル/クラス/アクションメソッドの各々には以下のような命名規則があります。

アクションコントローラ要素の命名規則
要素命名規則
ファイル名<コントローラ名(最初のみ大文字)>Controller.php
クラス名<コントローラ名(最初のみ大文字)>Controller
アクションメソッド名<アクション名(すべて小文字)>Action
呼び出し時のURLパターン

 以下は、特定のコントローラとアクションを呼び出すためのデフォルトのURL表記です。

http://mywebsite/<コントローラ名>/<アクション名>/<パラメータ1>
/<パラメータ1の値>/<パラメータ2>/<パラメータ2の値>/…

 例えば

http://mywebsite/bbs/edit/id/2

 は、bbsコントローラのeditアクションに「id=2」でアクセスします。

「Hello World!」アプリケーションにおけるリクエスト処理と各要素間の関係

 上記命名規則とURLパターンを踏まえて、各要素間の関係を見てみましょう。下図のようになっています。

Hello World!アプリケーションにおける各要素間の関係
Hello World!アプリケーションにおける各要素間の関係
  1. ブラウザから送られたリクエストをフロントコントローラ「index.php」が受け取る
  2. 対応するアクションコントローラ「IndexController.php」に以後の処理が引き渡される(ディスパッチ)
  3. 「IndexController.php」中のアクションである「indexAction()」「helloAction()」は呼び出されるとそれぞれ対応するビューとなるファイル「index.phtml」「hello.phtml」に表示を依頼
  4. これら一連の処理の結果がレスポンスとしてフロントコントローラに取得される
  5. ブラウザに4の内容が送られる

 アクション「index」と「hello」はそれぞれフォーム画面と「こんにちは!」を返す画面に対応しています。最初のリクエスト(フォームを表示する)に際してはまず「index」アクションへディスパッチがなされ、ここで名前が入力され、送信されることで名前を処理するための「hello」アクションへのディスパッチがなされます。

「IndexController.php」ファイルの作成

 ここから実際のアクションコントローラファイルの内容について、説明していきます。

 こちらはデフォルトのアクションコントローラの例です。

application/controllers/IndexController.php
<?php
require_once 'Zend/Controller/Action.php';    //コンポーネントの呼び出し

class IndexController extends Zend_Controller_Action
{
    public function indexAction()    //デフォルトのアクションメソッド
    {
    }
}

 デフォルト名はコントローラが「Index」、アクションが「index」です。呼び出し時にコントローラやアクションの指定がない場合に、これらが呼び出されます。

 そして、今回は次のようにしました。

application/controllers/IndexController.php(今回使うもの)
<?php
require_once 'Zend/Controller/Action.php';

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
    }  //不要な場合は、メソッドの中は空でも構いません
    public function helloAction()  //helloアクションメソッド
    {
      $req = $this->getRequest();
      $this->view->assign('name', $req->getPost('yourname'));
    }

}

 アクションメソッドhelloAction()で使われているメソッドを表に示します。

helloAction()で使われているメソッド
メソッド内容
$this->view->assign('name',$value)$nameに$valueを代入してビューで使えるようにする
getRequest()リクエストオブジェクトを取得する
getPost('yourname')フォームから受け取った「yourname」パラメータ($_POST)を取得する

 helloAction()メソッド内の$this->view->assign('name', $req->getPost('yourname'));では、フォームから受け取った「yourname」パラメータを取得して、nameという変数に代入し、helloアクションに対応するビューで使えるようにしています(ビュースクリプト内で$this->nameとして使えます)。

 getRequest()で取得される「リクエストオブジェクト」は、リクエスト処理の一連の流れの中でやりとりされるもので、コントローラ/アクション/その他パラメータの内容が中にまとまっています。具体的には、ルーティングの過程で、送られてきたリクエストの処理に該当するコントローラ/アクション/リクエストパラメータがリクエストオブジェクトに設定されます。それがディスパッチの過程でリクエストオブジェクトから取り出され、実際のコントローラとアクションメソッドに対応が行われ、受渡されることになります。

 上記ではgetPost()によりスーパーグローバル変数の内容にアクセスしましたが、それもリクエストオブジェクトを通して取得しています。その他、Zend Frameworkではスーパーグローバル変数の内容を取得するためのメソッドが以下のように用意されています。

スーパーグローバル変数を取得するためのメソッド
メソッド取得されるスーパーグローバル変数
getQuery()$_GET
getPost()$_POST
getCookie()$_COOKIE
getServer()$_SERVER
getEnv()$_ENV

ビューの作成

 コントローラ/アクションごとに、対応するビューである「views/scripts/<コントローラ名>/<アクション名>.phtml」というファイルを作成します。今回はIndexコントローラ内の2つのアクション、indexとhelloについてそれぞれビューを作成します。

 indexアクションのビューでは、名前を入力するフォームを作成します。

index.phtml
<html>
<head>
<title>Hello World!</title>
</head>
<body>
こんにちは!<br />
お名前をどうぞ。<br />

<form action="Index/hello" method="post">
<?php echo $this->formText('yourname','your name')?>
<?php echo $this->formSubmit('','Go')?>
</form>

</body>
</html>

 ここではZend Frameworkで用意されている「ビューヘルパー」という、複雑になりがちなHTML記述を簡単に記述できる関数を利用します。これらは自動的に適切なエスケープ処理も行ってくれます。 以下に、ビューヘルパーをいくつか挙げておきます。

ビューヘルパーの例
ビューヘルパー作成される要素
formFile($name, $value, $attribs)<input type="file" />
formSubmit($name, $value, $attribs)<input type="submit" />
formText($name, $value, $attribs)<input type="text" />

 helloアクションのビューでは、helloアクションから受け取った$nameを使い、「こんにちは、~さん!」と表示します。

hello.phtml
<html>
<head>
<title>Hello World!</title>
</head>
<body>

こんにちは、
<?php echo $this->escape($this->name);?>
さん!
<br />

</body>
</html>

 8行目の$this->escape($this->name)では、$this->nameのエスケープ処理を行っています。具体的にはhtmlspecialchars()関数と同様の処理を行っていますが、カスタマイズすることも可能です(後の回で解説する予定です)。

 ここまでで、「Hello World!」アプリケーションが完成しました。

http://localhost/

 にアクセスしてみてください。

今回のまとめ

 今回は、Zend FrameworkのMVCを活用して「Hello World!」アプリケーションを作ってみました。ごく簡単ではありますが、Zend Frameworkを使ったアプリケーション作成の雰囲気がつかめたのではないでしょうか。

 次回はZend Frameworkの中核とも言えるZend_Controllerについて、もう少し詳しく解説していきたいと思います。

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Zend Framework入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 川北 季(カワキタ ミノル)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1961 2008/02/06 19:08

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング