| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

FuelPHP

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

FuelPHP

思想

  • 規約より設定
  • MVCパターン
  • テンプレートエンジンは、独自言語ではなくPHP
  • oilコマンドで、コードの自動生成、データベースマイグレーション、パッケージインストール、自作コードの実行が可能

環境構築

Ubuntu

XAMPPのインストール
oil クイックインストール
piroto@phpenv:~$ curl -L https://get.fuelphp.com/oil | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   479  100   479    0     0    447      0  0:00:01  0:00:01 --:--:--   449
~/.bashrcにPATHを追加
export PATH="/opt/lampp/bin:$PATH"
FuelPHPのインストールと新しいプロジェクトを作成

$ oil create test_prj
$ ls test_prj/
CHANGELOG.md     LICENSE.md  TESTING.md     composer.lock  docs  oil
CONTRIBUTING.md  README.md   composer.json  composer.phar  fuel  public
  • Apacheからアクセスできるようにシンボリックリンクを設定
$ cd /opt/lampp/htdocs/
$ ln -s ~/workspaces/test_prj/public test_prj
  • アクセス

 

PHPUnitのインストール

PHPUnitのインストール

起動

ubuntu@puli-sub1:/opt/lampp$ sudo ./lampp start
Starting XAMPP for Linux 8.0.2-0...
XAMPP: Starting Apache...ok.
XAMPP: Starting MySQL...ok.
XAMPP: Starting ProFTPD...ok.

ライブラリ

配置場所


  • サードパーティ製のライブラリを配置する場所
    • fuel/vendor
    • fuel/packages

設定

設定ファイル

  • fuel/app/config フォルダに配置
ファイル名 内容
config.php メイン設定
db.php DB設定
routes.php ルーティング設定

環境

環境別の設定ファイル


クラス定数 意味
Fuel::DEVELOPMENT development 開発環境
Fuel::TEST test テスト環境
Fuel::STAGING staging ステージング環境
Fuel::PRODUCTION production 本番環境

環境の設定


  • 現在の環境は、FUEL_ENV の値により決定
  • .htaccessが利用できる環境では、
    • SetEnv FUEL_ENV production
    • 環境変数 FUEL_ENV が定義されていない場合のデフォルトは開発環境
    • 環境変数が設定できない場合、fuel/app/bootstrap.php の以下を設定を変更
    • Fuel::$env = \Arr::get($_SERVER, 'FUEL_ENV', \Arr::get($_ENV, 'FUEL_ENV', \Fuel::DEVELOPMENT));

設定ファイル


  • fuel/app/config のサブフォルダ

ログ


  • fuel/app/logs に日付別で出力される
Log::info('hoge');
出力レベル
  • 出力レベルは、config.php に指定
'log_threshold'  => Fuel::L_ALL,
オブジェクトをログに出力
Log::info(print_r($result, true));

oil


$ php oil console
PHP Fatal error:  Array and string offset access syntax with curly braces is no longer supported in /home/piroto/workspaces/sample2/fuel/packages/oil/classes/console.php on line 176
piroto@puli-sub1:~/workspaces/sample2$ php oil console
Fuel 1.8.2 - PHP 8.0.2 (cli) (Feb  5 2021 21:42:11) [Linux]
>>> 

MVC


URL基本


  • FuelPHP URLの基本パターン
http://hoge.jp/コントローラ/メソッド[/パラメータ1[/パラメータn]]

ディレクトリ構成

  • 全体
/
├── composer.json ・・・ Composer設定
├── composer.lock ・・・ Composerによりインストールされた情報
├── composer.phar ・・・ Composer実行環境(アーカイブ)
├── docs ・・・ ドキュメント
├── fuel
│   ├── app  ・・・ アプリケーション
│   ├── core  ・・・ FuelPHP本体
│   ├── packages  ・・・ FuelPHPおよびユーザー作成パッケージ
│   └── vendor  ・・・ Composerパッケージ
├── oil  ・・・ oilコマンド
└── public
	├── assets  ・・・ JavaScript ,CSSなど公開リソース
	└── index.php  ・・・ フロントコントローラ
  • app配下
app
├── bootstrap.php ・・・ Coreクラスの置き換え時などに使用するブートストラップファイル
├── cache  ・・・ キャッシュ
├── classes
│   ├── controller ・・・ コントローラ
│   ├── model  ・・・ モデル
│   └── presenter  ・・・ プレゼンタ(ViewModel)
├── config
│   ├── config.php  ・・・ 全体設定
│   ├── db.php ・・・ DB設定
│   ├── development ・・・ 開発環境用設定
│   ├── oil.php
│   ├── production  ・・・ 本番環境用設定
│   ├── routes.php ・・・ ルーティング設定
│   ├── staging ・・・ ステージング環境用設定
│   └── test
├── lang ・・・ 言語ファイル
├── logs ・・・ ログ
├── migrations ・・・ マイグレーション
├── modules ・・・ MVCをフォルダ別にまとめるモジュール機能
├── tasks ・・・ コマンドラインから実行されるタスク
├── tests ・・・ テスト
├── themes ・・・ 
├── tmp ・・・ 一次ファイル
├── vendor ・・・ サードパーティ製ライブラリを配置
└── views ・・・ ビュー

コントローラー


  • http://fuelphp.jp/docs/1.6/general/controllers/base.html
  • fuel/app/classes/controller ディレクトリに配置
  • "Controller_" というプレフィックス
  • URL を通じてリクエストされたメソッドは、"action_" というプレフィックス
  • HTTPメソッド名をアクション名の前につけることもできます
文字列を返す
<?php 
class Controller_Sample extends Controller {
    public function action_index() {
        return 'Sample!!';
    }
}
?>

ルーティング


  • fuel/app/config/routes.php で設定
  • リクエストされたURIと実行されるURIを配列で定義
  • 上から順に評価されマッチしたら終了
return array(
    'login' => 'user/login'
)

予約済みルート

  • _root_ : コントローラーがないURI、トップページにアクセスした場合
  • _404_ : コントローラーやメソッドが定義されていない場合のルート

正規表現によるルーティング

正規表現 意味
:any 任意の部分にマッチ
:segment URIの1つのセグメントにマッチ
:num 数字にマッチ
:alpha 文字にマッチ
:alnum 文字と数字にマッチ
'hoge/(:any)' => 'hoge/entry/$1',

名前付きパラメータ

  • URLセグメントに名前をつける
  • 先頭に、:をつける
'hoge/:year/:month' => 'hoge/entry',
  • コントローラーでは、$this->param('year'); などで参照できる

名前付きルート

  • ルートに名前をつける
  • 'name' => 'hello' が名前定義、helloが名前
  • Router::get('hello'); でURLを取得できる
'hello(/:name)?' => array('welcome/hello', 'name' => 'hello'),

Coreクラス


Core

クラス 内容
Autoloader クラスの自動読み込み
Config 設定管理
Event イベント管理
Fuel FuelPHPコアクラス
Lang 言語切り替え
Log ログ管理
Module モジュールのロード
Package パッケージのロード
Security セキュリティ管理

DB

クラス 内容
DB DB操作
DBUtil DBユーティリティ
Migrate DBマイグレーション
Model_Crud CRUD操作を実装したモデル

HTML

クラス 内容

Database


  • 提供される操作方法
操作方法 内容
DB::query() SQLをそのまま
クエリビルダー SQLをメソッドで組み立て
Model_Crudクラス テーブルCRUD操作のメソッドが実装されている
ORMパッケージ ORMツールを使用

Databseの作成

piroto@puli-sub1:~$ mysql -u root -p
Enter password: 
    :
MariaDB [(none)]> create database sample_db default character set utf8;
Query OK, 1 row affected (0.002 sec)

Userの作成

  • '%' は、localhostのワイルドーカードにはならない
MariaDB [(none)]> create user 'sample_user'@'%' identified by 'password';
Query OK, 0 rows affected (0.011 sec)

MariaDB [(none)]> grant all privileges on sample_db.* to 'sample_user'@'%' with grant option;
Query OK, 0 rows affected (0.002 sec)

MariaDB [(none)]> create user sample_user@localhost identified by 'north123';
Query OK, 0 rows affected (0.003 sec)

MariaDB [(none)]> grant all privileges on sample_db.* to sample_user@localhost with grant option;
Query OK, 0 rows affected (0.003 sec)

設定

  • fuel/app/config/db.php
return array(
    'default' => array(
        'type'  =>  'mysqli',
    )
);
  • fuel/app/config/development/db.php
    • developmentの部分は環境別
return array(
	'default' => array(
		'connection' => array(
			// 'dsn'      => 'mysql:host=puli-sub1.local:3306;dbname=sample_db',
			'hostname' => 'localhost',
			'port'     => '3306',
			'database' => 'sample_db',
			'username' => 'sample_user',
			'password' => 'password',
		),
	),
);

確認

  • 確認用コントローラー
    public function action_view() {
        $result = DB::query('select * from sample_table')->execute();
        $data = array(
            'content' => print_r($result, true),
        );
        $view = View::forge('sample/sample_view', $data);
        return Response::forge($view);
    }
  • 確認用View
<textarea style="width:800px;height:400px">
<?php echo $content; ?>
</textarea>

 

Authパッケージ


  • http://fuelphp.jp/docs/1.9/packages/auth/intro.html
  • Fuel における標準化された認証インターフェイスを提供
  • ユーザは自分自身で新しいドライバを書くことができ、 基本的なメソッドを保つことで、古いコードに新しいドライバを簡単に統合可能
  • インターフェースには 3 つのタイプのドライバが含まれています
    • login
    • group
    • ACL
  • login ドライバは、ユーザーのログインを処理し同時に複数の login ドライバを扱うことができます
  • ログインの種類を気にせず group ドライバを使用し、 2 つのタイプのログインを グループ化できます

ドライバ


  • ローカルアクセスを提供する2つのドライバが含まれ、1つ以上のデータベースのテーブルを使用
ドライバ 概要
Simpleauth 基本ドライバセット。ユーザー情報の確認にDBテーブルを利用、グループ、ロール、ACLは設定ファイルに格納。ユーザーレコードにシリアライズされメタデータを格納
Ormauth ユーザー、グループ、ロール権限すべての情報をDBに格納し、アクセスのために、ORMモデルを使用。APIはSimpleauthとほぼ互換
Opauth PHP用マルチプロバイダ認証フレームワーク composer でインストールされる。OAuth、OpenIDを使用

Authパッケージには、ドライバに必要なテーブルを作成するためのマイグレーションファイルが含まれる。作成要否は、Auth設定ファイルで決定

設定

  • fuel/packages/auth/config から、auth.php、simpleauth.php を fuel/app/config へコピー
  • fuel/app/config/config.php
 'always_load' => array(
	'packages' => array(
		'auth',
	),
)

Databaseテーブルの作成

$ sudo oil refine migrate:up --packages=auth
Error - Class 'MySQLi' not found in COREPATH/classes/database/mysqli/connection.php on line 116

一旦、Migrationの使用は断念

  • Authパッケージのマイグレーションファイルから、Userテーブル作成の該当部分を抜き出して、手動実行する
  • package/auth/migrations/001_auth_create_usertables.php
    public function action_createusertable() {

        $table = \Config::get('simpleauth.table_name', 'users');

        // only do this if it doesn't exist yet
        if ( ! \DBUtil::table_exists($table))
        {
            // table users
            \DBUtil::create_table($table, array(
                'id' => array('type' => 'int', 'constraint' => 11, 'auto_increment' => true),
                'username' => array('type' => 'varchar', 'constraint' => 50),
                'password' => array('type' => 'varchar', 'constraint' => 255),
                'group' => array('type' => 'int', 'constraint' => 11, 'default' => 1),
                'email' => array('type' => 'varchar', 'constraint' => 255),
                'last_login' => array('type' => 'varchar', 'constraint' => 25),
                'login_hash' => array('type' => 'varchar', 'constraint' => 255),
                'profile_fields' => array('type' => 'text'),
                'created_at' => array('type' => 'int', 'constraint' => 11, 'default' => 0),
                'updated_at' => array('type' => 'int', 'constraint' => 11, 'default' => 0),
            ), array('id'));

            // add a unique index on username and email
            \DBUtil::create_index($table, array('username', 'email'), 'username', 'UNIQUE');
        }
        return "Created ${table}";
    }

 

SimpleAuth

  • oil コンソールから、Auth::create_user()でテストユーザーを追加
piroto@puli-sub1:~/workspaces/sample2$ php oil console
Fuel 1.8.2 - PHP 8.0.2 (cli) (Feb  5 2021 21:42:11) [Linux]
>>> Auth::create_user('sample','password','test@typea.info');
1
コントローラー
  • 認証の確認
   public function action_login() {
        $postparam = Input::post();
        $name = $postparam['username'];
        $pass = $postparam['password'];

        Log::info("${name}/${pass}");
        
        $user = Auth::validate_user($name, $pass);
        Log::info(print_r($user, true));

        $loginresult = (Auth::login($name, $pass)?'Success':'Fail');
        $content = "User '${name}' login  ${loginresult}.";
        
        $data = array(
            'title'   => 'Auth Sample.',
            'content' => $content,
        );
        $view = View::forge('sample/auth', $data);
        return Response::forge($view); 
    }
View
<!DOCTYPE html>
<html>
<head>
</head>
<bodY>
<h1><?php echo $title; ?></h1>
<form action="login" method="POST">
    <p>
        ID:<input type="text" name="username" value="<?php echo $username??''; ?>"/>
        PASSWORD:<input type="password" name="password"/>
    </p>
    <input type="submit">Login</input>
</form>
<textarea style="width:800px;height:400px">
<?php echo $content; ?>
</textarea>
</body>
</html>
結果

 

Tips

WebAPI JSONデータを取得する


<?php

class Controller_JsonSample extends Controller
{
    function action_index() {

        $url = 'http://hoge/json-api-sample.json';
        $curl = Request::forge($url, 'curl');

        $curl->set_method('get');
        $curl->set_params(array());

        $response = $curl->execute()->response();
        $json_data = json_decode($response);
        
        $data = [
            'http_response_code' => $response->status,
            'json_str'  =>  json_encode($json_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE ),
            'somevalue' =>  $json_date->somevalue,
        ];

        $view = View::forge('jsonsample/jsonsample', $data);
        return Response::forge($view);
    }
}