SlideShare a Scribd company logo
10分でわかるFuelPHP

A simple, flexible, community driven
        PHP 5.3 framework.

2013/04/13 @ FuelPHP入門ハンズオン vol.1
               kenjis
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)
FuelPHPの利用例




  http://animita.tv/
FuelPHPの利用例




http://bushidotickets.com/
フレームワークとは?
 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
・リクエスト
              流れの制御など             呼び出し
・データ入力

                             結果
         結果
                                   Model
              結果      呼び出し        データの管理




                 View
                画面表示
FuelPHPのフォルダ構成


        公式ドキュメント




        アプリケーションを配置

        FuelPHP本体

        FuelPHPのパッケージ

        oilコマンド

        Web公開領域

        css、img、js

        フロントコントローラ
FuelPHPのフォルダ構成
      アプリケーションを配置
      ブートストラップ
      キャッシュフォルダ
      クラスを配置
       コントローラを配置
       モデルを配置
       ビューモデルを配置
      設定ファイルを配置
      言語ファイルを配置
      ログフォルダ
      マイグレーションファイルを配置
      モジュールを配置
      タスクを配置
      tmpフォルダ
      サードパーティライブラリを配置
      ビューを配置
FuelPHPのURLの構造
 URLの構造
http://example.jp/コントローラ/メソッド/引数

  http://example.jp/shop/search/123



  class Controller_Shop extends Controller
  {
      ...

      function action_search($id)
      {
               ...
      }
  }
Controller
 Controllerクラスを継承
 クラス名には先頭に「Controller_」を付ける
 「Controller_」の後の単語の先頭は大文字
 アクションメソッド名には先頭に「action_」を
  付ける
 ファイル名やフォルダ名はすべて小文字
  (FuelPHPでの共通の規約)
 クラス名の中の「_」はフォルダ区切りを意味す
  る
Controller

 action_index()メソッドはデフォルトメソッド
  ➔ http://example.jp/time/
    fuel/app/classes/controller/time.php
     class Controller_Time extends Controller
     {
          public function action_index()
          {
               // タイトル
               $data['title'] = '時刻メッセージ';
               // 現在の時刻
               $data['now_time'] = date("H時i分s秒");

              // テンプレートに変数を代入
              return View::forge(
                   'time_view', $data
              );
         }
     }
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が優先
Controller
      URLとクラス名の対応
 http://example.jp/time_message
  ➔ class Controller_Time_Message
  ➔ controller/time_message.php ?
  ➔ クラス名の「_」はフォルダ区切りにな
    るのでこれは使えない → 404
Controller
         URLとクラス名の対応
 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
 標準のビューファイルは、単なるPHPファイル
fuel/app/view/time_view.php
<html>
<head>
<title><?php echo $title; ?></title>
</head>
<body>
<?php echo $now_time; ?>
</body>
</html>

         Controllerのコード
                  $data['title'] = '時刻メッセージ';
                  $data['now_time'] = date("H時i分s秒");
                  return View::forge('time_view', $data);
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
 Modelクラスを継承
 fuel/app/classes/model/post.php
 class Model_Post extends Model
 {
      function find_all()
      {
           ...
                                  ←名前空間なし
      }
 }

 または
 namespace Model;
 class Post extends Model
 {
      function find_all()
      {                      ←名前空間あり
           ...
      }
 }
Modelの使い方
             名前空間なし

 メソッドを呼び出す
 $data['posts'] = Model_Post::find_all();



                 Modelのコード
                  class Model_Post extends Model
                  {
                       function find_all()
                       {
                            ...
                       }
                  }
Modelの使い方
             名前空間あり

 メソッドを呼び出す
 $data['posts'] = ModelPost::find_all();



                 Modelのコード
                  namespace Model;
                  class Post extends Model
                  {
                       function find_all()
                       {
                            ...
                       }

                  }
Model
       拡張したクラス
 Model_Crudクラス
  ➔ CRUD機能を追加したもの
  ➔ Model_Crudクラスを継承する
ORMの使い方
1. config.phpでの設定
2. Modelの作成
3. クエリの実行
ORMの使い方
1. config.phpでの設定

fuel/app/config/config.php
 'always_load'  => array(
      'packages'  => array(
           'orm',
           //'auth',
      ),
 ),
ORMの使い方
                      2. Modelの作成
fuel/app/classes/model/post.php
<?php

namespace Model;

class Post extends OrmModel
{
     protected static $_properties = array(
           'id', 'title', 'summary', 'body', 
           'created_at', 'updated_at',
     );

        protected static $_observers = array(
             'OrmObserver_CreatedAt' => 
                   array('events'=>array('before_insert')),
             'OrmObserver_UpdatedAt' => 
                   array('events'=>array('before_save')),
        );
}

※ $_propertiesでカラム名を定義する
ORMの使い方
        3. クエリの実行

// SQLクエリの実行
$result = ModelPost::find('all');

// 表示処理
foreach ($result as $row)
{
     echo $row['id']      . ' ';
     echo $row['title']   . ' ';
     echo $row['summary'] . '<br />';
}

echo 'レコード数: ' . count($result);
Coreクラス
   どんなものがあるか?
Agent        Date       Html         Mongo_Db     Session
Arr          Debug      Image        Num          Str
Asset        Event      Inflector    Package      Theme
Autoloader   Fieldset   Input        Pagination   Upload
Cache        File       Lang         Profiler     Uri
Cli          Finder     Log          Redis        Validation
Config       Form       Markdown     Request      View
Cookie       Format     Migrate      Response
Crypt        Ftp        Model_Crud   Router
Database     Fuel       Module       Security
クラスの使い方
 静的な呼び出し
 echo Form::open('uri/to/form');


 出力されるHTML
 <form action="http://localhost/blog/uri/to/form" 
 accept­charset="utf­8" method="post">
クラスの使い方
 インスタンス化
  $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 まとめ Wiki
  http://wiki.fuelphp1st.com/wiki/
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のフレームワークです。
 公式ドキュメントの翻訳を手伝ってくれ
  る人を募集しています。

More Related Content

10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1