10分でわかるfuelphp @ 2012/05 osc2012 nagoya
DESCRIPTION
OSC2012 Nagoya用のFuelPHP紹介資料TRANSCRIPT
FuelPHPとは?
コミュニティで開発されているオープンソースのPHPフレームワーク
2011/7/30、初の公式リリース1.0.0
公式サイト http://fuelphp.com/
FuelPHPとは?
2010/後半 開発開始
2011/01/08 1.0.0-BETA1リリース
2011/07/30 1.0.0公式リリース
2011/10/25 1.1.0-RC1リリース
2011/12/13 1.1.0公式リリース
2012/05/06 1.2RC1リリース (←今ここ)
フレームワークとは?
Webアプリケーションフレームワークとは?
➔Webアプリケーションを作成する「枠組み」
➔機能としては
•過去のプログラミングの経験則の規約化する
•頻繁に使う機能を抽象化する(モジュール化、ライブラリ化)
➔Webアプリケーション全体を見通しよく開発できるようにするもの
FuelPHPに向いている人
CodeIgniterを知っている人
➔ 開発者がCodeIgniter系の人なので、かなり似てます
Kohanaを知っている人
➔ Kohanaも参考に作られていますので、さらに似てます(Kohana+α=FuelPHP)
Configuration over Convention
➔ 規約が嫌いな人
➔ CodeIgniter系のフレームワークですので、強制的な規約は最小限になっています
FuelPHPに向いている人
軽量高速なフレームワークが好きな人
フレームワークをいろいろ拡張したい人
➔ CodeIgniterのように拡張できます
見やすいドキュメントが好きな人
➔ CodeIgniterのユーザガイドのように見やすいです(ただし、まだ多くの部分が英語)
コマンドラインが好きな人(嫌いでも可)
FuelPHPを使うメリット
高速な動作
➔軽量で動作が高速
最新のPHPフレームワーク
➔PHP5.3以降なので、5.3の機能をフルに使える
コードや仕様がクリーン
➔PHP5.3でゼロから書かれたフレームワークなので、完全にOOPであり、クリーンなコード
➔PHP4を引きずっていたりしない
FuelPHPを使うメリット
バランス
➔CodeIgniterよりは広い範囲をカバーしている
➔ビューのレイアウト機能、モデルのCRUD機能、認証インターフェイス、ORMなど
コマンドラインによるパワフルな機能
➔ScaffoldingやMigration
MVCモデルとは?
Controller(コントローラ)は、入力データに従って適切なデータを呼び出しModelやViewの連携など、アプリケーション全体の制御を行う
Model(モデル)は、データベースへのアクセスやデータの修正/加工などのデータの管理を行う
View(ビュー)は、処理結果の表示など、画面表示を担当する
FuelPHPのフォルダ構成
アプリケーションを配置
コントローラを配置
モデルを配置
ビューモデルを配置
ビューを配置
クラスを配置
キャッシュフォルダ
ブートストラップ
設定ファイルを配置
言語ファイルを配置
ログフォルダ
マイグレーションファイルを配置
モジュールを配置
タスクを配置
サードパーティライブラリを配置
tmpフォルダ
FuelPHPのURLの構造
URLの構造http://example.jp/コントローラ/メソッド/引数
class Controller_Shop extends Controller{
...
function action_search($id){
...}
}
http://example.jp/shop/search/123
Controller
Controllerクラスを継承
クラス名には先頭に「Controller_」を付ける
「Controller_」の後の単語の先頭は大文字
アクションメソッド名には先頭に「action_」を付ける
ファイル名やフォルダ名はすべて小文字(FuelPHPでの共通の規約)
クラス名の中の「_」はフォルダ区切りを意味する
Controller
class Controller_Time extends Controller{
public function action_index(){
// タイトル$data['title'] = '時刻メッセージ';// 現在の時刻$data['now_time'] = date("H時i分s秒");
// テンプレートに変数を代入return View::forge(
'time_view', $data);
}}
fuel/app/classes/controller/time.php
action_index()メソッドはデフォルトメソッド
➔http://example.jp/time/
Controllerクラス名とファイル名の対応
class Controller_Time_Message
➔controller/time/message.php
➔http://example.jp/time/message
class Controller_Time
➔controller/time.php
➔function action_message()
➔http://example.jp/time/message
両方あったら?
➔class Controller_Timeが優先
ControllerURLとクラス名の対応
http://example.jp/time_message
➔class Controller_Time_Message
➔controller/time_message.php
➔クラス名の「_」はフォルダ区切りになるのでこれは使えない → 404
ControllerURLとクラス名の対応
http://example.jp/time/time_message
➔class Controller_Time
➔controller/time.php
➔function action_time_message()
➔メソッド名の「_」はOK
Controller拡張したクラス
Template Controller
➔ビューのレイアウト機能を追加したもの
➔Controller_Templateクラスを継承する
Rest Controller
➔RESTfulなコントローラ
➔Controller_Restクラスを継承する
Hybrid Controller
➔Rest Controller + Template
➔Controller_Hybridクラスを継承する
View
<html><head><title><?php echo $title; ?></title></head><body><?php echo $now_time; ?></body></html>
fuel/app/view/time_view.php
標準のビューファイルは、単なるPHPファイル
$data['title'] = '時刻メッセージ';$data['now_time'] = date("H時i分s秒");return View::forge('time_view', $data);
Controllerのコード
View
(オプション)Parserモジュール
以下のテンプレートを標準でサポート
➔ Smarty / Twig / Dwoo / PHPTAL / Mustache / Jade / Haml / Markdown
packages/parser/README.md参照
DB::query()
// SQLクエリの実行$result = \DB::query('SELECT * FROM `posts`')>execute();
// 表示処理foreach ($result>as_array() as $row){
echo $row['id'] . ' ';echo $row['title'] . ' ';echo $row['summary'] . '<br />';
}
echo 'レコード数: ' . count($result);
Query Builder
// SQLクエリの実行$result = \DB::select('*')>from('posts')>execute();
// 表示処理foreach ($result>as_array() as $row){
echo $row['id'] . ' ';echo $row['title'] . ' ';echo $row['summary'] . '<br />';
}
echo 'レコード数: ' . count($result);
Model
class Model_Post extends Model{
function find_all(){
...}
}
Modelクラスを継承
fuel/app/classes/model/post.php
namespace Model;class Post extends \Model{
function find_all(){
...}
}
または
←名前空間なし
←名前空間あり
Modelの使い方名前空間なし
メソッドを呼び出す
$data['posts'] = Model_Post::find_all();
class Model_Post extends Model{
function find_all(){
...}
}
Modelのコード
Modelの使い方名前空間あり
メソッドを呼び出す
$data['posts'] = \Model\Post::find_all();
namespace Model;class Post extends \Model{
function find_all(){
...}
}
Modelのコード
ORMの使い方1. config.phpでの設定
'always_load' => array('packages' => array(
'orm',//'auth',
),),
fuel/app/config/config.php
ORMの使い方2. Modelの作成
<?php
namespace Model;
class Post extends \Orm\Model{
protected static $_properties = array('id', 'title', 'summary', 'body', 'created_at', 'updated_at',
);
protected static $_observers = array('Orm\Observer_CreatedAt' =>
array('events'=>array('before_insert')),'Orm\Observer_UpdatedAt' =>
array('events'=>array('before_save')),);
}
fuel/app/classes/model/post.php
※ $_propertiesでカラム名を定義する
ORMの使い方3. クエリの実行
// SQLクエリの実行$result = \Model\Post::find('all');
// 表示処理foreach ($result as $row){
echo $row['id'] . ' ';echo $row['title'] . ' ';echo $row['summary'] . '<br />';
}
echo 'レコード数: ' . count($result);
Coreクラス
どんなものがあるか?AgentArrAssetAutoloaderCacheCliConfigCookieCryptDatabase
DateDebugEventFieldsetFileFinderFormFormatFtpFuel
HtmlImageInflectorInputLangLogMarkdownMigrateModel_CrudModule
Mongo_DbNumPackagePaginationProfilerRedisRequestResponseRouterSecurity
SessionStrThemeUploadUriValidationView
クラスの使い方
静的な呼び出し
<form action="http://localhost/blog/uri/to/form" acceptcharset="utf8" method="post">
echo Form::open('uri/to/form');
出力されるHTML
クラスの使い方
インスタンス化
$val = Validation::forge();
$val>add('title', 'Title')>add_rule('required');
if ($val>run()){
...}else{
...}
FuelPHPのセキュリティ
フールプルーフではない!
➔フールプルーフとは?「よくわかっていない人が扱っても安全」 -- http://e-words.jp/
➔○○を使っていれば安全
ただし、FuelPHPには、
➔デフォルトのセキュリティ機能
➔手動で利用するセキュリティ機能
• フレームワークを使わない場合より、かなり安全
FuelPHPのセキュリティ
デフォルトのセキュリティ機能
➔ Output encoding
• viewへの変数はHTMLエスケープ
• config.phpのsecurity.output_filter
• デフォルトはSecurity::htmlentities
➔ URL encoding
• URLもHTMLエスケープ
• config.phpのsecurity.uri_filter
• デフォルトはSecurity::htmlentities
➔ SQL injection対策
• Query BuilderやORMでは自動エスケープ
FuelPHPのセキュリティ
セキュリティ機能
➔ Input filtering
• config.phpのsecurity.input_filter
➔ CSRF保護
• 自動ではないが支援機能あり
➔XSS filtering
• HTMLawedというライブラリが付属している
公式ドキュメントの翻訳
https://github.com/NEKOGET/FuelPHP_docs_jp
http://press.nekoget.com/fuelphp_doc/
翻訳を手伝ってくれる人を募集中
FuelPHPについての日本語情報
fuelphp.jp Googleグループhttps://groups.google.com/group/fuelphp_jp?hl=ja
FuelPHP まとめ Wikihttp://fuelphp.phpfogapp.com/wiki/
書籍
➔ 『FuelPHP Advent Calendar 2011』 技術評論社
『FuelPHP Advent Calendar 2011』
技術評論社より、2012年3月22日に発売!https://gihyo.jp/dp/sp/advent2011/G11C13