10分でわかるfuelphp @ 2013/04 fuelphp入門ハンズオン vol.1
TRANSCRIPT
10分でわかるFuelPHP
A simple, flexible, community driven PHP 5.3 framework.
2013/04/13 @ FuelPHP入門ハンズオン vol.1kenjis
FuelPHPとは?
コミュニティで開発されているオープンソースのPHPフレームワーク
2011/7/30、初の公式リリース1.0.0 公式サイト http://fuelphp.com/
FuelPHPとは?
MITライセンス PHP 5.3以降 いろいろなフレームワークのいいとこ取り
➔CodeIgniter➔Kohana➔Symfony➔Rails
FuelPHPとは?
2010/末 開発開始 2011/01/08 1.0.0-BETA1リリース 2011/07/30 1.0リリース 2011/12/13 1.1リリース 2012/06/03 1.2リリース 2012/09/09 1.3リリース 2012/11/09 1.4リリース 2013/01/20 1.5リリース 2013/03/08 1.5.3リリース (←今ここ)
FuelPHPとは?
日本での4大PHPフレームワークの1つ
Googleトレンドによる検索数(2013/4/7)
FuelPHPとは?
日本での4大PHPフレームワークの1つ
Googleトレンドによる検索数(2013/4/7)
フレームワークとは?
Webアプリケーションフレームワークとは?➔Webアプリケーションを作成する「枠組み」➔機能としては• 過去のプログラミングの経験則の規約化• 頻繁に使う機能を抽象化(モジュール化、
ライブラリ化)➔Webアプリケーション全体を見通しよく
開発できるようにするもの
FuelPHPに向いている人 CodeIgniterを知っている人
➔開発者がCodeIgniter系の人なので、かなり似ている
Kohanaを知っている人➔Kohanaも参考に作られていますので、さらに
似ている(Kohana+α=FuelPHP) Configuration over Convention
➔規約が嫌いな人➔CodeIgniter系のフレームワークなので、
強制的な規約は最小限になっている
FuelPHPに向いている人
軽量高速なフレームワークが好きな人 フレームワークをいろいろ拡張したい人
➔CodeIgniterのように拡張できます 見やすいドキュメントが好きな人
➔CodeIgniterのユーザガイドのように見やすいです(ただし、翻訳率は現在67%程度)
コマンドラインが好きな人(嫌いでも可)
FuelPHPに向いている人
他のフレームワークに挫折した人➔規約が多すぎて覚えきれない➔デカすぎてソース読めないから嫌
FuelPHPを使うメリット
高速な動作➔軽量で動作が高速
最新のPHPフレームワーク➔PHP 5.3以降なので、5.3の機能をフルに
使える コードや仕様がクリーン
➔PHP 5.3でゼロから書かれたフレームワークなので、完全にOOPであり、クリーンなコード
➔PHP4を引きずっていたりしない
FuelPHPを使うメリット
バランス➔CodeIgniterよりは広い範囲をカバー
している(多機能)➔ビューのレイアウト機能、モデルの
CRUD機能、HMVC、認証インターフェイス、ORM、PHPUnitでのテストなど
コマンドラインによるパワフルな機能➔ScaffoldingやMigration
MVCモデルとは?
Controller(コントローラ)は、入力データに従って適切なデータを呼び出しModelやViewの連携など、アプリケーション全体の制御を行う
Model(モデル)は、データベースへのアクセスやデータの修正/加工などのデータの管理を行う
View(ビュー)は、処理結果の表示など、画面表示を担当する
MVCモデル
Controller流れの制御など
View画面表示
Modelデータの管理
・リクエスト・データ入力
結果
結果
結果
呼び出し
呼び出し
FuelPHPのフォルダ構成
公式ドキュメント
アプリケーションを配置
FuelPHP本体
FuelPHPのパッケージ
oilコマンド
Web公開領域
フロントコントローラ
css、img、js
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なコントローラ➔Web APIがすぐに作成できる➔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参照
Model
オプション(使わないことも可能) ただのPHPのクラス データベース・アクセスの方法
➔DB::query()➔Query Builder➔ORMパッケージ
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のコード
Model拡張したクラス
Model_Crudクラス➔CRUD機能を追加したもの➔Model_Crudクラスを継承する
ORMの使い方
1. config.phpでの設定2. Modelの作成3. クエリの実行
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というライブラリが付属
FuelPHPの高い拡張性
Coreクラス➔継承・置き換え可能• コアクラスを置き換えずに拡張する• コアクラスを拡張し、置き換える• パッケージからコアを拡張する
公式ドキュメントの翻訳
https://github.com/NEKOGET/FuelPHP_docs_jp http://fuelphp.jp/ 翻訳を手伝ってくれる人を募集中
FuelPHPについての日本語コミュニティ
fuelphp.jp Googleグループhttps://groups.google.com/group/fuelphp_jp?hl=ja
twitter 「fuelphp」で検索https://twitter.com/search/realtime?q=fuelphp&src=typd
facebook FuelPHP日本語ニュースhttps://www.facebook.com/jp.fuel
FuelPHPについての書籍
『FuelPHP Advent Calendar 2011』技術評論社 『FuelPHP入門』ソーテック社 『はじめてのフレームワークとしてのFuelPHP』達人出版会
『FuelPHP Advent Calendar 2012』達人出版会
FuelPHPについての書籍無料 無料
まとめ
FuelPHPは、シンプルでフレキシブルなコミュニティにより開発されているPHP 5.3のフレームワークです。
公式ドキュメントの翻訳を手伝ってくれる人を募集しています。