PHPフレームワーク入門
Zend Framework 2
アジェンダ
フレームワークとは
◦
MVCとは
Zend Framework 2 入門
◦
Zend Framework 2 のインストールと動作確認
◦
Zend Framework 2 を使用したシンプルな例題
フレームワークとは
開発効率の追求(基本)
フレームワーク
ライブラリ
サブルーチン/関数
独自開発
開発効率の追求(極限)
パッケージソフト
(半完成品)
フレームワーク
テンプレートエンジン
隠蔽化/抽象化
フレームワークの効果
開発工数の圧縮
◦
コーディング工数
◦
テスト工数
大規模開発における標準化と効率化
◦
チーム開発
読みやすいコード化
コード量の圧縮
品質の均一化
メンテナンス性の向上
コンピュータの5大機能
入力
Web
ブラウザ
からの入力
出力
Web
ブラウザ
への出力
記憶
データベース
ファイル
演算
データ加工
アプリケーションの共通機能
汎用的な処理の共通化
◦
ページ遷移とロジック
◦
MVCによる役割の明確化
◦
デザインとロジックの分離
◦
入力処理(サニタイズ)
◦
データベース処理
◦
隠蔽化
◦
認証処理/アクセス制御
Zend Framework 2 の特徴
ビジネスで利用可能なフレームワーク
◦
Zendをはじめとした企業がコミュニティに参加
シンプルな構造
◦
モジュール単位に利用可能
明確なライセンス体系
◦
ビジネスで部分的に使用しても問題ない
PHP 5.3 を採用
代表的な
PHPフレームワークの比較
小規模
←→
大規模
単機能
Laravel
CodeIgniter
FuelPHP
Yii
↑
↓
CakePHP
Zend Framework 2
MVCとは
MVC
基礎知識
MVCとは
…
◦
ソフトウェアの開発手法の一つ
◦
Model(モデル),View(ビュー),Controller(コントローラ)の
頭文字を合わせたもの
◦
プログラムを上記三つのパターンに分割して,それぞれの
役割ごとに処理を実装する手法
MVC
基礎知識
それぞれの役割
◦
つまりシステムはデータを扱うものであり、データ
パターン
役割
Model(モデル)
データの出し入れと加工を行う
View(ビュー)
データの表示を行う
Controller(コントローラ)
ユーザから命令を受け付け,モデ
ルやビューを繋げて処理を完成さ
せる
MVC
基礎知識
デザイン図
モデル
ビュー
コントローラ
ユーザ側
リクエスト
レスポンス
処理要求
表示要求
参照
データ
MVC
基礎知識
MVCの利点
◦
画面デザインと内部ロジックの分割
◦
デザイナとプログラマの分業化
◦
デザイン変更の容易化
◦
ビュー作成を楽にするテンプレートエンジンの採用
◦
同じデータのI/Oをモデルに集約することでオブジェクト指向
的な実装が可能
役割分担による見やすいコーディング
Zend Framework 2 のMVC
入口はすべてindex.php
◦
エントリーポイントという考え方
公開するのはindex.phpのみ
◦
設定ファイルやライブラリは直接アクセス禁止
◦
ただし画像とかCSSとかJavaScriptは別
指定されたURLにしたがって処理決定
◦
モジュール/コントローラー/アクション
ビュー
◦
HTMLなどをレンダリングする
◦
全ての処理が完了してからレンダリング開始
MVC
テンプレートエンジン
PHPテンプレートエンジンとは?
◦
ビューを担うPHPのライブラリ
◦
ビューファイルに相当するHTMLライクのものをテンプ
レートと呼ぶ
◦
書式は簡単だが独自のもの
◦
変数や、簡単な条件文(if)、ループなどの制御をサポート
◦
表示に特化しているので、HTMLエスケープや数値や日付の書式
変換が得意
MVC
テンプレートエンジン
テンプレートエンジンの目的
◦
プログラマとデザイナの作業分担を明確化
◦
デザイン変更に対する柔軟性を高める
◦
ロジックをよりシンプルに
◦
余計な処理を挟まない分、すっきりしたものに
リライト処理
リライトエンジン
◦
URLで指定された内容を目的に応じて書き換える機能
◦
1つのWebページ(アプリ:コントローラ)が受け取って処理
Zend Framework 2
Z E N D F R A M E W O R K 1
と ZEND
ZF1とZF2の違い
PHP 5.3ベース
◦
ZF1はPHP 5.1ベース
NameSpaceを意識
イベント駆動タイプ
デザインタイプにDI(Dependency Injection)を採用
Zend Server が提供する ZF
Zendと提供企業が提供する企業向けの新たなWebシステム環境
企業ユーザが望むプロ仕様のPHP環境を提供
–
高信頼性と高速性を両立したPHP環境の提供
–
Webアプリ単位の監視機能を提供
–
稼動後の運用管理の容易さ
–
開発効率の向上
–
モバイル環境への対応
サーバ管理GUI
Zend Framework 1 & 2
データベースドライバ
拡張モジュール
PHP実行環境
Apache(IHS)
MySQL/DB2
デプロイ機能
高速化
デバッグ
JVM
との連携
モニタリング
ジョブキュー
コードトレーシング
XML Tool Kit
Zend Framework 2
インストールと動作確認
ベース環境の構築
Zend Framework 2 の必要条件
◦
Webサーバ
◦
リライトエンジン(mod_rewriteなど)
◦
PHP 5.3.x
◦
HTML5対応ブラウザ
インストール手順①
WebサーバとPHP 5.3環境を用意
◦
Zend Server 6 以上の場合
◦
Zend Framework と Zend Framework 2 インストール済
◦
手順③へ
◦
XAMPPなどの場合
インストール手順②
Zend Framework 2を入手
◦
http://framework.zend.com/downloads/latest
◦
ZendFramework-2.3.3.zip *10/10現在
インストール手順③
スケルトンプロジェクトの入手
◦
https://github.com/zendframework/ZendSkeletonApplication
◦
ZendSkeletonApplication-master.zip
インストール手順④
スケルトンプロジェクトの配置
◦
適当に展開します
◦
publicディレクトリをドキュメントルートへ
◦
ディレクトリ名を ZendSkeleton に変更
◦
残りを適当に配置します
◦
ディレクトリ名を ZendSkeleton に変更
具体例を次ページで解説します
インストール手順④ 補完
圧縮ファイル内部 ¥ ├─config │ └─autoload ├─data │ └─cache ├─module │ └─Applicaon │ ├─config │ ├─language │ ├─src │ │ └─Applicaon │ │ └─Controller │ └─view │ ├─applicaon │ │ └─index エントリーポイントの配置(Webサーバのドキュメントルート)◦
XAMPPの場合
◦
c:¥xampp¥htdocs¥ZendSkeleton
アプリ実態の配置(Webサーバのドキュメントルート以外)◦
XAMPPの場合
◦
c:¥xampp¥ZendSkeleton
Zend Framework 2 の配置(Webサーバのライブラリ置き場)
◦
XAMPPの場合
◦
C:¥xampp¥Library
インストール手順⑤
エントリーポイントindex.phpの設定
◦
ディレクトリ C:¥xampp¥htdocs¥ZendSkeleton
◦
ファイル名 index.php
◦
場所 6行目と8行目付近
◦
Zend Framework 2 へのパス設定
◦
カレントディレクトリをアプリ実態へ
◦
index.phpの内容(XAMPPの例)
◦
putenv("ZF2_PATH=" . 'C:¥xampp¥Library¥ZendFramework-2.3.3¥library');
◦
chdir('c:¥xampp¥ZendSkeleton');
インストール手順⑥
スケルトンプロジェクトの動作確認
◦
URL http://127.0.0.1/ZendSkeleton/
Zend Framework 2
基本概念
ZEND FRAMEWORK 2 の基本的な概念
を説明します。
リクエストURLとデフォルト
◦
http://ドメイン/モジュール/コントローラ/アクション
◦
http://127.0.0.1/ZendSkeleton/
モジュール概念
アプリケーション
モジュール
Model
View
Controller
Action
Action
モジュール
Model
View
Controller
Action
Action
モジュール
Model
View
Controller
Action
Action
スケルトンプロジェクトで確認
圧縮ファイル内部
¥ ├─config │ └─autoload ├─data │ └─cache ├─module │ └─Application モジュール │ ├─config │ ├─language │ ├─src │ │ └─Application │ │ └─Controller コントローラー │ └─view │ ├─applicationZend Framework 2
例題による入門
簡単な例題を通して ZEND FRAMEWORK 2
Zend Framework 2 例題
コントローラーおよびアクションの作成
アクションからビューで値の受け渡し
FORMから値を取得
例題1
コントローラー/アクションの作成
◦
コントローラーおよびアクションを作成
◦
C:¥xampp¥ZendSkeleton¥module¥Application¥src¥Application¥ControllerにUserController.phpをコピー
◦
コントロールを登録
C:¥xampp¥ZendSkeleton¥module¥Application¥configのmodule.config.phpを修正
◦
ビューを配置
C:¥xampp¥ZendSkeleton¥module¥Application¥view¥application¥userにtokyo.phtmlをコ
ピー
◦
以下のURLにアクセスして出力結果を確認しましょう。
◦
http://127.0.0.1/ZendSkeleton/application/user/tokyo
例題1
コントローラー/アクションの作成
例題2
値の受け渡し
◦
ビューを配置
C:¥xampp¥ZendSkeleton¥module¥Application¥view¥application¥userにosaka.phtmlを
コピー
◦
以下のURLにアクセスして出力結果を確認しましょう。
◦
http://127.0.0.1/ZendSkeleton/application/user/osaka
例題2
値の受け渡し
例題3
FORMから値を取得
◦
フォームを配置
◦
C:¥xampp¥htdocs¥ZendSkeleton¥にform.htmlをコピー
◦
ビューを配置
C:¥xampp¥ZendSkeleton¥module¥Application¥view¥application¥userにkyoto.phtmlを
コピー
◦
以下のURLにアクセスして出力結果を確認しましょう。
◦
http://127.0.0.1/ZendSkeleton/application/user/kyoto
例題3
FORMから値を取得
例題コースコード
簡単な例題を通してZEND FRAMEWORK 2
エントリーポイント
Index.php
◦<?php
◦/**
◦* This makes our life easier when dealing with paths. Everything is relative
◦* to the application root now.
◦*/
◦putenv("ZF2_PATH=" . 'C:¥xampp¥Library¥ZendFramework-2.3.3¥library');
◦
◦//chdir(dirname(__DIR__));
◦chdir('c:¥xampp¥ZendSkeleton');
◦// Decline static file requests back to the PHP built-in webserver
◦if (php_sapi_name() === 'cli-server' && is_file(__DIR__ . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))) {
◦ return false;
コントローラーの登録
module.config.phpの76行目
◦'controllers' => array( ◦ 'invokables' => array( ◦ 'Application¥Controller¥Index' => 'Application¥Controller¥IndexController', ◦ 'Application¥Controller¥User' => 'Application¥Controller¥UserController', ◦ ), ◦ ),コントローラーとアクション
IndexController.php
◦<?php◦/**
◦* Zend Framework (http://framework.zend.com/)
◦*
◦* @link http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository
◦* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
◦* @license http://framework.zend.com/license/new-bsd New BSD License
◦*/
◦namespace Application¥Controller;
◦use Zend¥Mvc¥Controller¥AbstractActionController;
コントローラーとアクション
◦class UserController extends AbstractActionController◦{
◦ public function tokyoAction() ◦ {
◦ return new ViewModel(); ◦ }
◦
◦ public function osakaAction() ◦ {
◦ $data = array( ◦ 'key1' => 'あいうえお', ◦ 'key2' => 'いろは' ◦ );
◦ return new ViewModel($data); ◦ }
◦
◦ public function kyotoAction() ◦ {
◦ $data = array(
◦ 'name' => $this->params()->fromPost( 'name' ), ◦ 'year' => $this->params()->fromPost( 'year' ), ◦ 'month' => $this->params()->fromPost( 'month' ), ◦ 'day' => $this->params()->fromPost( 'day' ) ◦ );
◦ return new ViewModel($data); ◦ }
FORM
form.html
◦<html>
◦ <head>
◦ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
◦ <title>Zend_Controllerサンプル</title>
◦ </head>
◦ <body>
◦ フォームからの値入力<br>
◦ <form action="http://127.0.0.1/ZendSkeleton/application/user/kyoto" method="POST">
◦ 名前:<input type="text" name="name" value="お名前">
◦ 年:<input type="text" name="year" value="2000">
◦ 月:<input type="text" name="month" value="12">
ビューファイル
tokyo.phtml
<p> モジュール名:Application<br> コントローラ名:User<br> アクション名:tokyo<br> </p>osaka.phtml
<p> モジュール名:Application<br> コントローラ名:User<br> アクション名:osaka<br> データ:<?php echo $key1; ?> <br> データ:<?php echo $key2; ?> <br> </p>kyoto.phtml
<p> モジュール名:Application<br> コントローラ名:User<br> アクション名:kyoto<br> <?php echo $name; ?>さんの誕生日は、<br> <?php echo $year."年".$month."月".$day."日"; ?> です。<br> </p>参考資料
書籍
◦
Zend Framework 2徹底解説
◦
著者:濱田優
◦
定価:3,600円(税別)
◦
ISBN978-4-7980-4011-0
Captcha機能による認証
簡単なコードで、CAPTCHA機能を実現で
きます。
コントローラー 先頭部分抜粋
<?php /**
* Zend Framework (http://framework.zend.com/) *
* @link http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License */
namespace Application¥Controller;
use Zend¥Mvc¥Controller¥AbstractActionController; use Zend¥View¥Model¥ViewModel;
use Zend¥Captcha;
class CaptchaController extends AbstractActionController {
//画像の保存先 $captcha->setImgDir( 'c:/xampp/htdocs' ); //画像へのURL $captcha->setImgUrl('/'); //キャプチャの作成とID取得 $id = $captcha->generate(); public function setimageAction()
{
//インスタンスを生成
$captcha = new Captcha¥Image(); //識別名を設定 $captcha->setName('foo'); //文字数 $captcha->setWordLen(6); //タイムアウト $captcha->setTimeout(500); //画像保存期間 $captcha->setExpiration(500); //フォントファイルおよびサイズ $captcha->setFont('C:¥WINDOWS¥Fonts¥ARIAL.TTF'); $captcha->setFontSize(80); //作成する画像サイズ $captcha->setWidth(800); $captcha->setheight(300);
アクション①
public function getnumberAction() {
//フォームの入力値取得
$id = $this->params()->fromPost( 'id' );
$number = $this->params()->fromPost( 'number' ); //インスタンス生成
$auth = new Captcha¥Image();
//表示時にセットした名前と同じもの $auth->setName('foo');
//認証(判定)処理
if( $auth->isValid( array('id' => $id, 'input' => $number) ) ){ $msg = "認証成功"; }else{ $msg = "認証失敗"; } //結果データ作成 $data = array( 'msg' => $msg, 'input' => $number, 'id' => $id,
'imgurl' => $this->params()->fromPost( 'url' ) );
$view = new ViewModel($data); //再認証用テンプレート選択
if( $msg == "認証失敗" ) $view->setTemplate('application/captcha/revalid.phtml'); return $view;
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Captcha入力フォーム</title>
</head>
<img src="<?php echo $url; ?>"><br> <body>
フォームからの値入力<br>
<form action="http://127.0.0.1/ZendSkeleton/application/captcha/getnumber" method="POST"> ID:<input type="text" name="id" value="<?php echo $id; ?>">
Input:<input type="text" name="number" value="?">
Url:<input type="text" name="url" value="<?php echo $url; ?>"> <input type="submit" value="送信">
</form>
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Captcha出力フォームフォーム</title>
</head> <p>
認証結果:<?php echo $msg; ?> <br> ID:<?php echo $id; ?> <br>
入力値:<?php echo $input; ?> <br><br> <img src="<?php echo $imgurl; ?>"><br><br> </p>
<a href="http://127.0.0.1/ZendSkeleton/application/captcha/setimage">再表示</a> </html>
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Captcha出力フォームフォーム(最認証用)</title>
</head> <p>
認証結果:<?php echo $msg; ?> <br> ID:<?php echo $id; ?> <br>
入力値:<?php echo $input; ?> <br><br> <img src="<?php echo $imgurl; ?>"><br><br> </p>
<p>
再認証<br>
<form action="http://127.0.0.1/ZendSkeleton/application/captcha/getnumber" method="POST"> ID:<input type="text" name="id" value="<?php echo $id; ?>">
Input:<input type="text" name="number" value="?">