思想
規約より設定
MVCパターン
テンプレートエンジンは、独自言語ではなくPHP
oilコマンドで、コードの自動生成、データベースマイグレーション、パッケージインストール、自作コードの実行が可能 環境構築
Ubuntu
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のインストール
ライブラリ
配置場所
サードパーティ製のライブラリを配置する場所
fuel/vendor
fuel/packages 設定
設定ファイル
ファイル名
内容
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)); 設定ファイル
ログ
Log::info('hoge');
出力レベル
'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基本
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
├── 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 ・・・ ビュー
コントローラー
文字列を返す
<?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
操作方法
内容
DB::query()
SQLをそのまま
クエリビルダー
SQLをメソッドで組み立て
Model_Crudクラス
テーブルCRUD操作のメソッドが実装されている
ORMパッケージ
ORMツールを使用
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)
設定
return array(
'default' => array(
'type' => 'mysqli',
)
);
fuel/app/config/development/db.php
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);
}
<textarea style="width:800px;height:400px">
<?php echo $content; ?>
</textarea>
Authパッケージ
http://fuelphp.jp/docs/1.9/packages/auth/intro.html
Fuel における標準化された認証インターフェイスを提供
ユーザは自分自身で新しいドライバを書くことができ、 基本的なメソッドを保つことで、古いコードに新しいドライバを簡単に統合可能
インターフェースには 3 つのタイプのドライバが含まれています
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',
),
)
$ 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
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>