phpフレームワーク入門 zendframework2 · zendframework2のmvc 入口はすべてindex.php...

66
PHPフレームワーク入門 Zend Framework 2 コネクト株式会社

Upload: others

Post on 02-Sep-2019

5 views

Category:

Documents


0 download

TRANSCRIPT

PHPフレームワーク入門Zend Framework 2コネクト株式会社

アジェンダフレームワークとは◦ MVCとは

Zend Framework 2入門◦ Zend Framework 2のインストールと動作確認

◦ Zend Framework 2を使用したシンプルな例題

# 2Copyright 2014 konekto, Inc

フレームワークとはフレームワークを使用すると、高品質で均一なのWEBアプリケーションを短期間に構築できます。

開発効率の追求(基本)

フレームワーク

ライブラリ

サブルーチン/関数

独自開発

# 4Copyright 2014 konekto, Inc

開発効率の追求(極限)

パッケージソフト(半完成品)

フレームワーク

テンプレートエンジン

隠蔽化/抽象化

プログラム言語

# 5Copyright 2014 konekto, Inc

フレームワークの効果開発工数の圧縮◦ コーディング工数

◦テスト工数

大規模開発における標準化と効率化◦チーム開発

読みやすいコード化

コード量の圧縮

品質の均一化

メンテナンス性の向上

# 6Copyright 2014 konekto, Inc

コンピュータの5大機能

入力Webブラウザからの入力

出力Webブラウザへの出力

記憶データベースファイル

演算データ加工

制御プログラムロジック

# 7Copyright 2014 konekto, Inc

アプリケーションの共通機能汎用的な処理の共通化◦ページ遷移とロジック◦ MVCによる役割の明確化

◦ デザインとロジックの分離

◦入力処理(サニタイズ)

◦データベース処理◦ 隠蔽化

◦認証処理/アクセス制御

# 8Copyright 2014 konekto, Inc

Zend Framework 2の特徴ビジネスで利用可能なフレームワーク◦ Zendをはじめとした企業がコミュニティに参加

シンプルな構造◦モジュール単位に利用可能

明確なライセンス体系◦ビジネスで部分的に使用しても問題ない

PHP 5.3を採用

# 9Copyright 2014 konekto, Inc

代表的なPHPフレームワークの比較

小規模 ←→ 大規模

単機能

Laravel

CodeIgniter

FuelPHP

Yii

↓CakePHP Zend Framework 2

高機能 Symfony

# 10Copyright 2014 konekto, Inc

PHPフレームワークシェア

# 11Copyright 2014 konekto, Inc

話題性:Google トレンド

# 12Copyright 2014 konekto, Inc

MVCとはWEBプログラミングの手法として、スタンダードになったMVCついて学習します。

フレームワークやオブジェクト指向のベースとなる考え方ですので、把握することはステップアップに不可欠です。

MVC基礎知識

MVCとは…

◦ ソフトウェアの開発手法の一つ

◦ Model(モデル),View(ビュー),Controller(コントローラ)の頭文字を合わせたもの

◦プログラムを上記三つのパターンに分割して,それぞれの役割ごとに処理を実装する手法

# 14Copyright 2014 konekto, Inc

MVC基礎知識

それぞれの役割

◦つまりシステムはデータを扱うものであり、データ

パターン 役割

Model(モデル) データの出し入れと加工を行う

View(ビュー) データの表示を行う

Controller(コントローラ) ユーザから命令を受け付け,モデ

ルやビューを繋げて処理を完成さ

せる

# 15Copyright 2014 konekto, Inc

MVC基礎知識

デザイン図

モデル

ビューコントローラ

ユーザ側

リクエスト レスポンス

処理要求

表示要求

参照

データ

# 16Copyright 2014 konekto, Inc

MVC基礎知識

MVCの利点◦画面デザインと内部ロジックの分割◦ デザイナとプログラマの分業化

◦ デザイン変更の容易化

◦ ビュー作成を楽にするテンプレートエンジンの採用

◦同じデータのI/Oをモデルに集約することでオブジェクト指向的な実装が可能

◦役割分担による見やすいコーディング

# 17Copyright 2014 konekto, Inc

Zend Framework 2のMVC

入口はすべてindex.php◦エントリーポイントという考え方

公開するのはindex.phpのみ◦設定ファイルやライブラリは直接アクセス禁止◦ただし画像とかCSSとかJavaScriptは別

指定されたURLにしたがって処理決定◦モジュール/コントローラー/アクション

ビュー◦ HTMLなどをレンダリングする◦ 全ての処理が完了してからレンダリング開始

# 18Copyright 2014 konekto, Inc

MVCテンプレートエンジン

PHPテンプレートエンジンとは?◦ビューを担うPHPのライブラリ

◦ビューファイルに相当するHTMLライクのものをテンプレートと呼ぶ

◦書式は簡単だが独自のもの◦ 変数や、簡単な条件文(if)、ループなどの制御をサポート

◦ 表示に特化しているので、HTMLエスケープや数値や日付の書式変換が得意

# 19Copyright 2014 konekto, Inc

MVCテンプレートエンジン

テンプレートエンジンの目的◦プログラマとデザイナの作業分担を明確化

◦デザイン変更に対する柔軟性を高める

◦ロジックをよりシンプルに◦ 余計な処理を挟まない分、すっきりしたものに

# 20Copyright 2014 konekto, Inc

リライト処理リライトエンジン◦ URLで指定された内容を目的に応じて書き換える機能

◦ 1つのWebページ(アプリ:コントローラ)が受け取って処理を分岐する

# 21Copyright 2014 konekto, Inc

Zend Framework 2ZEND FRAMEWORK 1 と ZEND

FRAMEWORK 2 の違いとは

ZF1とZF2の違いPHP 5.3ベース◦ ZF1はPHP 5.1ベース

NameSpaceを意識

イベント駆動タイプ

デザインタイプにDI(Dependency Injection)を採用

# 23Copyright 2014 konekto, Inc

Zend Server が提供する ZFZendと提供企業が提供する企業向けの新たなWebシステム環境

企業ユーザが望むプロ仕様のPHP環境を提供– 高信頼性と高速性を両立したPHP環境の提供

– Webアプリ単位の監視機能を提供

– 稼動後の運用管理の容易さ

– 開発効率の向上

– モバイル環境への対応

サーバ管理GUI

Zend Framework 1 & 2

データベースドライバ

拡張モジュール

PHP実行環境

Apache(IHS)

MySQL/DB2

デプロイ機能

高速化

デバッグ

JVMとの連携

モニタリング

ジョブキュー

コードトレーシング

XML Tool Kit

# 24Copyright 2014 konekto, Inc

Zend Server 6.1

# 25Copyright 2014 konekto, Inc

Zend Server 7.0

# 26Copyright 2014 konekto, Inc

Zend Framework 2インストールと動作確認

ZEND FRAMEWORK 2 の配置と動作確認ようにスケルトンプロジェクトの配置を行います。

ベース環境の構築Zend Framework 2の必要条件◦ Webサーバ◦ リライトエンジン(mod_rewriteなど)

◦ PHP 5.3.x

◦ HTML5対応ブラウザ

# 28Copyright 2014 konekto, Inc

インストール手順①WebサーバとPHP 5.3環境を用意◦ Zend Server 6以上の場合◦ Zend Frameworkと Zend Framework 2インストール済

◦ 手順③へ

◦ XAMPPなどの場合◦ Zend Framework 2独自にインストール

# 29Copyright 2014 konekto, Inc

インストール手順②

Zend Framework 2を入手◦ http://framework.zend.com/downloads/latest

◦ ZendFramework-2.3.3.zip *10/10現在

◦適当に展開(別途説明)

# 30Copyright 2014 konekto, Inc

インストール手順③

スケルトンプロジェクトの入手◦ https://github.com/zendframework/ZendSkeletonApplication

◦ ZendSkeletonApplication-master.zip

# 31Copyright 2014 konekto, Inc

インストール手順④スケルトンプロジェクトの配置◦適当に展開します

◦ publicディレクトリをドキュメントルートへ◦ ディレクトリ名を ZendSkeletonに変更

◦残りを適当に配置します◦ ディレクトリ名を ZendSkeletonに変更

具体例を次ページで解説します

# 32Copyright 2014 konekto, Inc

インストール手順④補完

圧縮ファイル内部¥

├─config

│ └─autoload

├─data

│ └─cache

├─module

│ └─Applica�on

│ ├─config

│ ├─language

│ ├─src

│ │ └─Applica�on

│ │ └─Controller

│ └─view

│ ├─applica�on

│ │ └─index

│ ├─error

│ └─layout

├─public

│ ├─css

│ ├─fonts

│ ├─img

│ └─js

└─vendor

エントリーポイントの配置(Webサーバのドキュメントルート)

◦ XAMPPの場合

◦ c:¥xampp¥htdocs¥ZendSkeleton

アプリ実態の配置(Webサーバのドキュメントルート以外)

◦ XAMPPの場合

◦ c:¥xampp¥ZendSkeleton

Zend Framework 2の配置(Webサーバのライブラリ置き場)

◦ XAMPPの場合

◦ C:¥xampp¥Library

# 33COPYRIGHT 2014 KONEKTO, INC

インストール手順⑤

エントリーポイント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');

# 34Copyright 2014 konekto, Inc

インストール手順⑥スケルトンプロジェクトの動作確認◦ URL http://127.0.0.1/ZendSkeleton/

OK NG

# 35Copyright 2014 konekto, Inc

Zend Framework 2基本概念

ZEND FRAMEWORK 2 の基本的な概念を説明します。

リクエストURLとデフォルト◦ http://ドメイン/モジュール/コントローラ/アクション

◦ http://127.0.0.1/ZendSkeleton/

◦ http://127.0.0.1/ZendSkeleton/application/index/index

# 37Copyright 2014 konekto, Inc

モジュール概念

アプリケーション

モジュール

Model

View

Controller

Action

Action

モジュール

Model

View

Controller

Action

Action

モジュール

Model

View

Controller

Action

Action

# 38Copyright 2014 konekto, Inc

スケルトンプロジェクトで確認圧縮ファイル内部

¥

├─config

│ └─autoload

├─data

│ └─cache

├─module

│ └─Application モジュール

│ ├─config

│ ├─language

│ ├─src

│ │ └─Application

│ │ └─Controller コントローラー

│ └─view

│ ├─application

│ │ ├─index indexコントローラのビューファイル

│ │ └─user userコントローラのビューファイル

│ ├─error

│ └─layout

└─vendor

└─ZF2

# 39Copyright 2014 konekto, Inc

Zend Framework 2

例題による入門

簡単な例題を通して ZEND FRAMEWORK 2

の基本動作を説明します

Zend Framework 2例題コントローラーおよびアクションの作成

アクションからビューで値の受け渡し

FORMから値を取得

Captchaによる認証処理

# 41Copyright 2014 konekto, Inc

例題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

# 42Copyright 2014 konekto, Inc

例題1コントローラー/アクションの作成

◦ http://127.0.0.1/ZendSkeleton/application/user/tokyo

# 43Copyright 2014 konekto, Inc

例題2値の受け渡し

◦ ビューを配置C:¥xampp¥ZendSkeleton¥module¥Application¥view¥application¥userにosaka.phtmlをコピー

◦ 以下のURLにアクセスして出力結果を確認しましょう。

◦ http://127.0.0.1/ZendSkeleton/application/user/osaka

# 44Copyright 2014 konekto, Inc

例題2値の受け渡し

◦ http://127.0.0.1/ZendSkeleton/application/user/osaka

# 45Copyright 2014 konekto, Inc

例題3FORMから値を取得

◦ フォームを配置

◦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

# 46Copyright 2014 konekto, Inc

例題3FORMから値を取得

◦ http://127.0.0.1/ZendSkeleton/form.html

# 47Copyright 2014 konekto, Inc

例題コースコード

簡単な例題を通して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;

◦}

◦// Setup autoloading

◦require 'init_autoloader.php';

◦// Run the application!

◦Zend¥Mvc¥Application::init(require 'config/application.config.php')->run();

# 49Copyright 2014 konekto, Inc

コントローラーの登録

module.config.phpの76行目

◦ 'controllers' => array(

◦ 'invokables' => array(

◦ 'Application¥Controller¥Index' => 'Application¥Controller¥IndexController',

◦ 'Application¥Controller¥User' => 'Application¥Controller¥UserController',

◦ ),

◦ ),

# 50Copyright 2014 konekto, Inc

コントローラーとアクション

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;

◦use Zend¥View¥Model¥ViewModel;

◦class IndexController extends AbstractActionController

◦{

◦ public function indexAction()

◦ {

◦ return new ViewModel();

◦ }

◦}

# 51Copyright 2014 konekto, Inc

コントローラーとアクション◦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);

◦ }

◦}

# 52Copyright 2014 konekto, Inc

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">

◦ 日:<input type="text" name="day" value="31">

◦ <input type="submit" value="送信">

◦ </form>

◦ <br>

◦ </body>

◦</html>

# 53Copyright 2014 konekto, Inc

ビューファイル

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>

COPYRIGHT 2014 KONEKTO, INC # 54

参考資料書籍◦ Zend Framework 2徹底解説◦ 著者:濱田優

◦ 定価:3,600円(税別)

◦ ISBN978-4-7980-4011-0

# 55

Captcha機能による認証

簡単なコードで、CAPTCHA機能を実現できます。

入力画面

# 57

認証失敗

# 58

認証成功

# 59

コントローラー先頭部分抜粋<?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

{

# 60Copyright 2014 konekto, Inc

# 61

//画像の保存先

$captcha->setImgDir( 'c:/xampp/htdocs' );

//画像へのURL

$captcha->setImgUrl('/');

//キャプチャの作成とID取得

$id = $captcha->generate();

//画像URL作成

$imageUrl = $captcha->getImgUrl() . $id . $captcha->getSuffix();

$data = array(

'url' => $imageUrl,

'id' => $id

);

return new ViewModel($data);

}

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);

アクション①

Copyright 2014 konekto, Inc

# 62

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;

}

アクション②

Copyright 2014 konekto, Inc

COPYRIGHT 2014 KONEKTO, INC # 63

<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>

<br>

<a href="http://127.0.0.1/ZendSkeleton/application/captcha/setimage">再表示</a>

</body>

</html>

ビューファイル setimage.phtml

COPYRIGHT 2014 KONEKTO, INC # 64

<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>

ビューファイル getnumber.phtml

COPYRIGHT 2014 KONEKTO, INC # 65

<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="?">

Url:<input type="text" name="url" value="<?php echo $imgurl; ?>">

<input type="submit" value="送信">

</form>

</p>

<br>

<a href="http://127.0.0.1/ZendSkeleton/application/captcha/setimage">再表示</a>

</html>

ビューファイル revalid.phtml

例題ファイルの内容 ZF2code.zip>tree /F

C:.

│ form.html

│ index.php

├─config

│ module.config.php

├─src

│ └─Applica�on

│ └─Controller

│ CaptchaController.php

│ IndexController.php

│ UserController.php

└─view

# 66

└─view

├─applica�on

│ ├─captcha

│ │ getnumber.phtml

│ │ revalid.phtml

│ │ se�mage.phtml

│ │

│ ├─index

│ │ index.phtml

│ │

│ └─user

│ kyoto.phtml

│ osaka.phtml

│ tokyo.phtml

├─error

│ 404.phtml

│ index.phtml

└─layout

layout.phtml

index.phpとform.htmlは、

c:¥xampp¥htdocs¥ZendSkeleton へ

それ以外のディレクトは、c:¥xampp¥ZendSkeleton¥module¥Application へ

*オリジナルから変更なし

Copyright 2014 konekto, Inc