fuelphp osu nagoya vol.1

53
FuelPHP 勉強会 大須 vol. 1 水野 史土 [email protected]

Upload: fumito-mizuno

Post on 05-Jul-2015

15.511 views

Category:

Technology


2 download

DESCRIPTION

FuelPHP 勉強会の資料。 fuel.php-web.net を題材としている。 FuelPHP の概要、PHPTAL や PHPUnit 等 名古屋コワーキングスペース アートファクトリーで開催

TRANSCRIPT

Page 1: FuelPHP Osu Nagoya vol.1

FuelPHP 勉強会 大須 vol. 1

水野 史土[email protected]

Page 2: FuelPHP Osu Nagoya vol.1

FuelPHP とは

● 軽量&シンプルなフレームワーク○ ファイル 756(5.1 MB)、含ドキュメント○ cf. CakePHP2.1.3 ファイル 1,356(8.8 MB)

● 最初から PHP5.3 前提● ルールが緩い● オープンソース

○ https://github.com/fuel○ 多くのユーザーがコミットしている

Page 3: FuelPHP Osu Nagoya vol.1

フォルダ構成

fuel 本体

app corepackages

public 公開部分

Page 4: FuelPHP Osu Nagoya vol.1

fuel/app フォルダ

コントローラ、モデルはclasses 配下

ビューは app/views を使う

Page 5: FuelPHP Osu Nagoya vol.1

作ってみたサイト

● FuelPHP クラス名検索○ http://fuel.php-web.net/○ FuelPHP のクラス名から、ソースコード閲覧○ PHP のリフレクション機能を活用○ Model は未使用

● 使用したソースコード○ https://github.com/twitter/bootstrap○ https://github.com/jquery○ https://github.com/pornel/PHPTAL○ https://github.com/kenjis/sample-contact-form/

Page 6: FuelPHP Osu Nagoya vol.1

http://fuel.php-web.net/

Page 7: FuelPHP Osu Nagoya vol.1

http://fuel.php-web.net/ の構造

コントローラ

ビューPHPTAL

リフレクション(通常のアプリのモデル部分)

Page 8: FuelPHP Osu Nagoya vol.1

コントローラ

● fuel/app/classes/controller に置く

fuel/app/classes/controller/methodlist.php

class Controller_Methodlist extends Controller{

public function action_index(){…

Page 9: FuelPHP Osu Nagoya vol.1

コントローラのクラス

● Controller_(ファイル名) というクラス名○ (ファイル名) の先頭は大文字

● Controller を継承する

Page 10: FuelPHP Osu Nagoya vol.1

コントローラのメソッド名

● action_hoge メソッド○ URL/クラス名/hoge でアクセス可能○ URL/クラス名/ => action_index

● action_ をつけないメソッド○ ブラウザからは(たぶん)呼び出しできない

fuel.php-web.net では、

フォームを作るメソッド _form() $this->_form() で呼び出している

Page 11: FuelPHP Osu Nagoya vol.1

特殊なメソッド名

● before() ○ 他のメソッドの呼び出し前に実行

● after($response)○ 他のメソッドの呼び出し後に実行

fuel.php-web.net では未使用

Page 12: FuelPHP Osu Nagoya vol.1

URL とコントローラの対応

URL/methodlist/index↓

methodlist.php の action_index()

URL/methodlist/list/Arr↓

methodlist.php の action_list('Arr')

Page 13: FuelPHP Osu Nagoya vol.1

ルーティング

● fuel/app/config/routes.php で設定

_root_ トップページへアクセスした時

( http://fuel.php-web.net/ )

_404_ 見つからない時

(キャッチオール的に使える)

(404 レスポンス を指定する必要あり)

Page 14: FuelPHP Osu Nagoya vol.1

fuel/app/config/routes.php

return array('_root_' => 'methodlist/index', '_404_' => 'methodlist/404',

);

fuel.php-web.net にアクセス

↓fuel.php-web.net/index.php/methodlist/index

Page 15: FuelPHP Osu Nagoya vol.1

$view = View::forge('methodlist/index');

素のビューを使う場合は、View::forge(フォルダ/ファイル名)で指定する

ビューのファイルを指定する

Page 16: FuelPHP Osu Nagoya vol.1

$view = View::forge('methodlist/index');$view->set('title', 'クラス名検索');

$view->set(変数名, 値)

ビューに渡すデータ設定 方法1

Page 17: FuelPHP Osu Nagoya vol.1

$view = View::forge('methodlist/index');$view->title = 'クラス名検索';

$view->変数名 = 値

ビューに渡すデータ設定 方法2

Page 18: FuelPHP Osu Nagoya vol.1

$data['title'] = 'クラス名検索';return View::forge('methodlist/index',$data);

連想配列に格納 → View::forge に引数で渡す

ビューに渡すデータ設定 方法3

Page 19: FuelPHP Osu Nagoya vol.1

標準以外のビューを使う

TwigMustacheMarkdownDwooJadeHamlSmartyPhptal

Page 20: FuelPHP Osu Nagoya vol.1

app/config/config.php

'always_load' => array('packages' => array(

'parser', // ここを追加する

), ...

);

Page 21: FuelPHP Osu Nagoya vol.1

app/vendor にライブラリを設置する

ライブラリをダウンロードするapp/vendor 以下に置く

app/vendor/PHPTAL/PHPTAL.php

Mustache と markdown はデフォルトで入っている

Page 22: FuelPHP Osu Nagoya vol.1

PHPTAL のライセンス

FuelPHP : MIT

PHPTAL : LGPL

ライブラリは MIT とは限らない

Page 23: FuelPHP Osu Nagoya vol.1

PHPTAL を使う

● コントローラView::forge

↓View_Phptal::forge

config で設定できる?

Page 24: FuelPHP Osu Nagoya vol.1

PHPTAL を使う

● FuelPHP で使う場合○ 拡張子 .phptal (*)○ 明示的に指定すれば .html でも可

● ファイルは app/views フォルダに置く

* FuelPHP 以外では .html のこともある

Page 25: FuelPHP Osu Nagoya vol.1

PHPTAL の特徴 1

● テンプレートファイル(HTML) の属性に記述する

<h1 tal:content="title">title here</h1>↓

<h1>FuelPHPクラス名検索</h1>

● テンプレートをブラウザで表示して確認可能

Page 26: FuelPHP Osu Nagoya vol.1

app/views/methodlist/template.phptal

Page 27: FuelPHP Osu Nagoya vol.1

<body onload="prettyPrint()"><div class="container">

<div class="hero-unit"><h1 id="applypos" tal:content="title" >title here</h1></div><div class="alert alert-error" tal:condition="exists:

error_message" tal:content="error_message" >error message sample</div>

<p tal:replace="structure html_form" >Form</p><div class="row" metal:define-slot="content" >

contents here</div>

<footer><p class="pull-right"><a href="http://fuel.php-web.net/"

>http://fuel.php-web.net/</a> is programmed by <a href="http://php-web.net/">PHPでWEB作成</a></p>

<p><a href="http://fuelphp.com">FuelPHP</a> is released

under the MIT license.<br /></p>

</footer></div>

</body></html>

Page 28: FuelPHP Osu Nagoya vol.1

PHPTAL の特徴 2

● ビュー変数の出力をデフォルトエスケープ○ FuelPHP もデフォルトエスケープする

● FuelPHP のエスケープを無効にする方法'auto_filter_output' => false,

● HTML 属性をクォートしないとエラー○ エラー例: <div class=menu>メニュー</div>

Page 29: FuelPHP Osu Nagoya vol.1

PHPTAL の特徴 3

● 継承できる (ただし、ややこしい)

● 親 template.phptal

<html metal:define-macro="template"><div metal:define-slot="content">

● 子 index.phptal

<html metal:use-macro="template.phptal/template"><div metal:fill-slot="content">

Page 30: FuelPHP Osu Nagoya vol.1

PHPTAL のデメリット

● パフォーマンス○ smarty より遅いらしい http://d.hatena.ne.

jp/tanakahisateru/20100906/1283766620

● テンプレート HTML が厳密○ 例えば、</p> 無しだとエラー

● 日本語の情報が少ない

Page 31: FuelPHP Osu Nagoya vol.1

CSRF とは

● Cross Site Request Forgery

● 取り消しできない重要な処理を実行させる○ by 「安全な Web アプリケーションの作り方」 (徳丸浩)

● 被害者自身の操作で意図しないHTTPリクエストを送信させる攻撃○ by 「PHP逆引き516の大全」(大家正登, 鮫島康浩, 谷

中志織, 茂木健一)

Page 32: FuelPHP Osu Nagoya vol.1

CSRF 対策

● 重要な処理の直前の画面でトークン発行○ $form->add(Config::get('security.

csrf_token_key'),'token',array('type'=>'hidden','value'=>Security::fetch_token())) ;

○ $form->add_csrf(); (Form のみ?)

● 重要な処理実行時にチェック○ クッキー(*)の値と照合する○ Security::check_token()

* FuelPHP では(デフォルトでは)クッキーを使用

Page 33: FuelPHP Osu Nagoya vol.1

トークンを発行する箇所

入力画面 実行

トークン発行 チェック

Page 34: FuelPHP Osu Nagoya vol.1

トークンを発行する箇所

入力画面 実行

トークン発行 チェック

罠ページ 正規のトークンが無いので処理を実行しない

Page 35: FuelPHP Osu Nagoya vol.1

トークンを発行する箇所

入力画面 実行

チェック

確認画面

確認画面がある場合はどうなるか?

Page 36: FuelPHP Osu Nagoya vol.1

トークンを発行する箇所

入力画面 実行

チェック

確認画面

トークン発行

確認画面がある場合重要な処理実行の直前 = 確認画面

Page 37: FuelPHP Osu Nagoya vol.1

XSS とは

● クロスサイトスクリプティング

● 外部からの入力などに応じて表示が変化する箇所があり、この部分のHTML生成の実装に問題がある○ by 「安全な Web アプリケーションの作り方」 (徳丸浩)

● 2つ以上のサイトをまたがって、脆弱なサイトに悪意のあるスクリプトを混入させる○ by 「PHP逆引き516の大全」(大家正登, 鮫島康浩, 谷

中志織, 茂木健一)

Page 38: FuelPHP Osu Nagoya vol.1

XSS 対策

● 出力 HTML をエスケープする○ FuelPHP/PHPTAL はデフォルトエスケープ

■ エスケープ漏れが生じにくい

● HTML 属性値をクォートする○ PHPTAL は、クォート無しをハネる

■ ミスによる脆弱性が防げる

Page 39: FuelPHP Osu Nagoya vol.1

バリデーション

● 入力値の間違いを早期に発見して再入力を促すことにより、ユーザビリティを向上する○ by 「安全な Web アプリケーションの作り方」 (徳丸浩)

● 間違った処理を継続することによるデータの不整合などを防ぎ、システムの信頼性を向上させる○ by 「安全な Web アプリケーションの作り方」 (徳丸浩)

Page 40: FuelPHP Osu Nagoya vol.1

バリデーション

● add_rule で追加していく$form->add('classname','クラス名')

->add_rule('trim')->add_rule('valid_string',array

('alpha','dashes'))->add_rule('required')->add_rule('max_length',30);

php の関数(trim 等)も使用できる

valid_string はややこしい&ハマりやすい

Page 41: FuelPHP Osu Nagoya vol.1

バリデーション

$val = $form->validation();if ($val->run()){

検証を通過した場合

}else{

検証に失敗した場合

}

Page 42: FuelPHP Osu Nagoya vol.1

reflection

● クラスや関数等の情報を表示する○ メソッド、プロパティの情報取得○ コメントの取得○ クラス/関数が定義されているファイル名、行数の取得○ protected/private メソッド実行

● PHP の機能○ ReflectionClass が用意されている○ FuelPHP 以外でも利用可能

Page 43: FuelPHP Osu Nagoya vol.1

Reflection クラスのメソッド

getFileName()getStartLine()getEndLine()getMethods()

詳細は PHP マニュアル参照http://www.php.net/manual/ja/book.reflection.php

Page 44: FuelPHP Osu Nagoya vol.1

クラスのソースコードの表示

getFileName() でファイル名を取得

そのファイルを読み込むgetStartLine(), getEndLine() で範囲をチェック

getMethods() でメソッド一覧を取得

Page 45: FuelPHP Osu Nagoya vol.1

ユニットテスト

● 個々のメソッドのテスト○ メソッドの返り値のチェック等

● テストケースを残す○ 繰り返し実行可能

Page 46: FuelPHP Osu Nagoya vol.1

ユニットテスト

● FuelPHP では、PHPUnit を利用する

● oil から実行可能○ php oil test ○ php oil test --group=App○ php oil test --group=Core

Page 47: FuelPHP Osu Nagoya vol.1

FuelPHP をインストールしたルートで実行する

Page 48: FuelPHP Osu Nagoya vol.1

ユニットテストを書く

● app/tests フォルダに置く

● @group App アノテーションを書く

/** * * @group App */class Test_SourceView extends \TestCase

Page 49: FuelPHP Osu Nagoya vol.1

assertEquals で値が等しいかチェック

function test_sourceview(){

$classname = 'Date';$expected = 'クラス名:'.$classname;$data = Controller_Methodlist::_sourceview($classname);$title = $data->title;$this->assertEquals($expected,$title);

}

Page 50: FuelPHP Osu Nagoya vol.1

例外のテスト(アノテーションをつける)

/** * @expectedException InvalidArgumentException **/function test_sourceview_argument_null_raises_exception(){

$data = Controller_Methodlist::_sourceview('');}

Page 51: FuelPHP Osu Nagoya vol.1

ユニットテスト

● カバレッジ(*)も確認できる○ php oil test --group=App --coverage-html ./report/○ xdebug の設定が必要

* コードのうち、どれくらいがテストされているか

 = テストされている部分/コード全体

Page 52: FuelPHP Osu Nagoya vol.1

テスト通過 : 緑、 未テスト : 橙

Page 53: FuelPHP Osu Nagoya vol.1

● 開催日時・頻度○ 平日夜で良いか?○ 定期開催するか?頻度は?

● 考えているネタ○ 効率的なWebアプリケーションの作り方

○ Novius OS http://www.novius-os.org/

今後の予定