「FuelPHP」の版間の差分
ナビゲーションに移動
検索に移動
| (同じ利用者による、間の76版が非表示) | |||
| 1行目: | 1行目: | ||
| − | | [[PHP]] | | + | | [[PHP]] | [[XAMPP]] | |
==FuelPHP== | ==FuelPHP== | ||
{{amazon|4899774222}} | {{amazon|4899774222}} | ||
| 19行目: | 19行目: | ||
100 479 100 479 0 0 447 0 0:00:01 0:00:01 --:--:-- 449 | 100 479 100 479 0 0 447 0 0:00:01 0:00:01 --:--:-- 449 | ||
</pre> | </pre> | ||
| + | |||
| + | =====~/.bashrcにPATHを追加 ===== | ||
| + | <pre> | ||
| + | export PATH="/opt/lampp/bin:$PATH" | ||
| + | </pre> | ||
| + | |||
=====FuelPHPのインストールと新しいプロジェクトを作成===== | =====FuelPHPのインストールと新しいプロジェクトを作成===== | ||
| + | ---- | ||
<pre> | <pre> | ||
$ oil create test_prj | $ oil create test_prj | ||
| 33行目: | 40行目: | ||
*アクセス | *アクセス | ||
[[File:run_fuelphp_app.png|600px]] | [[File:run_fuelphp_app.png|600px]] | ||
| + | |||
| + | =====PHPUnitのインストール===== | ||
| + | ---- | ||
| + | [[PHP|PHPUnitのインストール]] | ||
| + | |||
| + | =====起動===== | ||
| + | ----- | ||
| + | <pre> | ||
| + | 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. | ||
| + | </pre> | ||
===ライブラリ=== | ===ライブラリ=== | ||
| 40行目: | 61行目: | ||
**fuel/vendor | **fuel/vendor | ||
**fuel/packages | **fuel/packages | ||
| + | ===設定=== | ||
| + | ====設定ファイル==== | ||
| + | *fuel/app/config フォルダに配置 | ||
| + | {|class="wikitable" | ||
| + | !ファイル名 | ||
| + | !内容 | ||
| + | |- | ||
| + | |config.php | ||
| + | |メイン設定 | ||
| + | |- | ||
| + | |db.php | ||
| + | |DB設定 | ||
| + | |- | ||
| + | |routes.php | ||
| + | |ルーティング設定 | ||
| + | |- | ||
| + | |} | ||
| + | |||
===環境=== | ===環境=== | ||
====環境別の設定ファイル==== | ====環境別の設定ファイル==== | ||
| 78行目: | 117行目: | ||
*fuel/app/config のサブフォルダ | *fuel/app/config のサブフォルダ | ||
====ログ==== | ====ログ==== | ||
| − | *fuel/app/logs | + | ---- |
| + | *fuel/app/logs に日付別で出力される | ||
| + | <pre> | ||
| + | Log::info('hoge'); | ||
| + | </pre> | ||
| + | =====出力レベル===== | ||
| + | *出力レベルは、config.php に指定 | ||
| + | <pre> | ||
| + | 'log_threshold' => Fuel::L_ALL, | ||
| + | </pre> | ||
| + | =====オブジェクトをログに出力===== | ||
| + | *[https://www.php.net/manual/ja/function.print-r.php print_r]を利用 | ||
| + | <pre> | ||
| + | Log::info(print_r($result, true)); | ||
| + | </pre> | ||
| + | *[https://www.php.net/manual/ja/function.var-dump.php var_dump] | ||
| + | |||
| + | ===oil=== | ||
| + | ---- | ||
| + | <pre> | ||
| + | $ 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 | ||
| + | </pre> | ||
| + | *[https://qiita.com/rana_kualu/items/6ac293f238c4e6000720 中括弧による文字列配列アクセス削除] | ||
| + | *$c = $line{$i}; を以下に修正 | ||
| + | *$c = $line[$i]; | ||
| + | <pre> | ||
| + | piroto@puli-sub1:~/workspaces/sample2$ php oil console | ||
| + | Fuel 1.8.2 - PHP 8.0.2 (cli) (Feb 5 2021 21:42:11) [Linux] | ||
| + | >>> | ||
| + | </pre> | ||
| + | |||
| + | ===MVC=== | ||
| + | ---- | ||
| + | ====URL基本==== | ||
| + | ---- | ||
| + | *FuelPHP URLの基本パターン | ||
| + | <pre> | ||
| + | http://hoge.jp/コントローラ/メソッド[/パラメータ1[/パラメータn]] | ||
| + | </pre> | ||
| + | ====ディレクトリ構成==== | ||
| + | *全体 | ||
| + | <pre> | ||
| + | / | ||
| + | ├── 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 ・・・ フロントコントローラ | ||
| + | </pre> | ||
| + | *app配下 | ||
| + | <pre> | ||
| + | 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 ・・・ ビュー | ||
| + | </pre> | ||
| + | |||
| + | ====コントローラー==== | ||
| + | ---- | ||
| + | *http://fuelphp.jp/docs/1.6/general/controllers/base.html | ||
| + | *fuel/app/classes/controller ディレクトリに配置 | ||
| + | *"Controller_" というプレフィックス | ||
| + | *URL を通じてリクエストされたメソッドは、"action_" というプレフィックス | ||
| + | *HTTPメソッド名をアクション名の前につけることもできます | ||
| + | =====文字列を返す===== | ||
| + | <pre> | ||
| + | <?php | ||
| + | class Controller_Sample extends Controller { | ||
| + | public function action_index() { | ||
| + | return 'Sample!!'; | ||
| + | } | ||
| + | } | ||
| + | ?> | ||
| + | </pre> | ||
| + | |||
| + | ===ルーティング=== | ||
| + | ---- | ||
| + | *fuel/app/config/routes.php で設定 | ||
| + | *リクエストされたURIと実行されるURIを配列で定義 | ||
| + | *上から順に評価されマッチしたら終了 | ||
| + | <pre> | ||
| + | return array( | ||
| + | 'login' => 'user/login' | ||
| + | ) | ||
| + | </pre> | ||
| + | ====予約済みルート==== | ||
| + | *_root_ : コントローラーがないURI、トップページにアクセスした場合 | ||
| + | *_404_ : コントローラーやメソッドが定義されていない場合のルート | ||
| + | ====正規表現によるルーティング==== | ||
| + | {|class="wikitable" | ||
| + | !正規表現 | ||
| + | !意味 | ||
| + | |- | ||
| + | |:any | ||
| + | |任意の部分にマッチ | ||
| + | |- | ||
| + | |:segment | ||
| + | |URIの1つのセグメントにマッチ | ||
| + | |- | ||
| + | |:num | ||
| + | |数字にマッチ | ||
| + | |- | ||
| + | |:alpha | ||
| + | |文字にマッチ | ||
| + | |- | ||
| + | |:alnum | ||
| + | |文字と数字にマッチ | ||
| + | |- | ||
| + | |} | ||
| + | <pre> | ||
| + | 'hoge/(:any)' => 'hoge/entry/$1', | ||
| + | </pre> | ||
| + | ====名前付きパラメータ==== | ||
| + | *URLセグメントに名前をつける | ||
| + | *先頭に、:をつける | ||
| + | <pre> | ||
| + | 'hoge/:year/:month' => 'hoge/entry', | ||
| + | </pre> | ||
| + | *コントローラーでは、$this->param('year'); などで参照できる | ||
| + | ====名前付きルート==== | ||
| + | *ルートに名前をつける | ||
| + | *'name' => 'hello' が名前定義、helloが名前 | ||
| + | *Router::get('hello'); でURLを取得できる | ||
| + | <pre> | ||
| + | 'hello(/:name)?' => array('welcome/hello', 'name' => 'hello'), | ||
| + | </pre> | ||
| + | |||
| + | ===Coreクラス=== | ||
| + | ---- | ||
| + | ====Core==== | ||
| + | {|class="wikitable" | ||
| + | !クラス | ||
| + | !内容 | ||
| + | |- | ||
| + | |Autoloader | ||
| + | |クラスの自動読み込み | ||
| + | |- | ||
| + | |Config | ||
| + | |設定管理 | ||
| + | |- | ||
| + | |Event | ||
| + | |イベント管理 | ||
| + | |- | ||
| + | |Fuel | ||
| + | |FuelPHPコアクラス | ||
| + | |- | ||
| + | |Lang | ||
| + | |言語切り替え | ||
| + | |- | ||
| + | |Log | ||
| + | |ログ管理 | ||
| + | |- | ||
| + | |Module | ||
| + | |モジュールのロード | ||
| + | |- | ||
| + | |Package | ||
| + | |パッケージのロード | ||
| + | |- | ||
| + | |Security | ||
| + | |セキュリティ管理 | ||
| + | |- | ||
| + | |} | ||
| + | |||
| + | ====DB==== | ||
| + | {|class="wikitable" | ||
| + | !クラス | ||
| + | !内容 | ||
| + | |- | ||
| + | |[http://fuelphp.jp/docs/1.6/classes/database/db.html DB] | ||
| + | |DB操作 | ||
| + | |- | ||
| + | |DBUtil | ||
| + | |DBユーティリティ | ||
| + | |- | ||
| + | |Migrate | ||
| + | |DBマイグレーション | ||
| + | |- | ||
| + | |Model_Crud | ||
| + | |CRUD操作を実装したモデル | ||
| + | |- | ||
| + | |} | ||
| + | |||
| + | ====HTML==== | ||
| + | {|class="wikitable" | ||
| + | !クラス | ||
| + | !内容 | ||
| + | |- | ||
| + | | | ||
| + | | | ||
| + | |- | ||
| + | |} | ||
| + | |||
| + | ===[[Database]]=== | ||
| + | ---- | ||
| + | *提供される操作方法 | ||
| + | |||
| + | {|class="wikitable" | ||
| + | !操作方法 | ||
| + | !内容 | ||
| + | |- | ||
| + | |[http://fuelphp.jp/docs/1.6/classes/database/db.html DB::query()] | ||
| + | |SQLをそのまま | ||
| + | |- | ||
| + | |クエリビルダー | ||
| + | |SQLをメソッドで組み立て | ||
| + | |- | ||
| + | |Model_Crudクラス | ||
| + | |テーブルCRUD操作のメソッドが実装されている | ||
| + | |- | ||
| + | |ORMパッケージ | ||
| + | |ORMツールを使用 | ||
| + | |- | ||
| + | |} | ||
| + | ====[[Databse]]の作成==== | ||
| + | <pre> | ||
| + | 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) | ||
| + | </pre> | ||
| + | ====Userの作成==== | ||
| + | *'%' は、localhostのワイルドーカードにはならない | ||
| + | <pre> | ||
| + | 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) | ||
| + | </pre> | ||
| + | |||
| + | ====設定==== | ||
| + | *fuel/app/config/db.php | ||
| + | <pre> | ||
| + | return array( | ||
| + | 'default' => array( | ||
| + | 'type' => 'mysqli', | ||
| + | ) | ||
| + | ); | ||
| + | </pre> | ||
| + | *fuel/app/config/development/db.php | ||
| + | **developmentの部分は環境別 | ||
| + | <pre> | ||
| + | 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', | ||
| + | ), | ||
| + | ), | ||
| + | ); | ||
| + | </pre> | ||
| + | |||
| + | ====確認==== | ||
| + | *確認用コントローラー | ||
| + | <pre> | ||
| + | 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); | ||
| + | } | ||
| + | </pre> | ||
| + | *確認用View | ||
| + | <pre> | ||
| + | <textarea style="width:800px;height:400px"> | ||
| + | <?php echo $content; ?> | ||
| + | </textarea> | ||
| + | </pre> | ||
| + | [[File:fuelphp_db_result_sample.png|400px]] | ||
| + | |||
| + | ===Authパッケージ=== | ||
| + | ---- | ||
| + | *http://fuelphp.jp/docs/1.9/packages/auth/intro.html | ||
| + | *Fuel における標準化された認証インターフェイスを提供 | ||
| + | *ユーザは自分自身で新しいドライバを書くことができ、 基本的なメソッドを保つことで、古いコードに新しいドライバを簡単に統合可能 | ||
| + | *インターフェースには 3 つのタイプのドライバが含まれています | ||
| + | **login | ||
| + | **group | ||
| + | **ACL | ||
| + | *login ドライバは、ユーザーのログインを処理し同時に複数の login ドライバを扱うことができます | ||
| + | *ログインの種類を気にせず group ドライバを使用し、 2 つのタイプのログインを グループ化できます | ||
| + | ====ドライバ==== | ||
| + | ---- | ||
| + | *ローカルアクセスを提供する2つのドライバが含まれ、1つ以上のデータベースのテーブルを使用 | ||
| + | {|class="wikitable" | ||
| + | !ドライバ | ||
| + | !概要 | ||
| + | |- | ||
| + | |[http://fuelphp.jp/docs/1.7/packages/auth/simpleauth/intro.html Simpleauth] | ||
| + | |基本ドライバセット。ユーザー情報の確認にDBテーブルを利用、グループ、ロール、ACLは設定ファイルに格納。ユーザーレコードにシリアライズされメタデータを格納 | ||
| + | |- | ||
| + | |[http://fuelphp.jp/docs/1.7/packages/auth/ormauth/intro.html Ormauth] | ||
| + | |ユーザー、グループ、ロール権限すべての情報をDBに格納し、アクセスのために、ORMモデルを使用。APIはSimpleauthとほぼ互換 | ||
| + | |- | ||
| + | |[http://fuelphp.jp/docs/1.7/packages/auth/opauth/intro.html Opauth] | ||
| + | |PHP用マルチプロバイダ認証フレームワーク composer でインストールされる。OAuth、OpenIDを使用 | ||
| + | |- | ||
| + | |} | ||
| + | <blockquote>Authパッケージには、ドライバに必要なテーブルを作成するためのマイグレーションファイルが含まれる。作成要否は、Auth設定ファイルで決定</blockquote> | ||
| + | ====設定==== | ||
| + | *fuel/packages/auth/config から、auth.php、simpleauth.php を fuel/app/config へコピー | ||
| + | *fuel/app/config/config.php | ||
| + | <pre> | ||
| + | 'always_load' => array( | ||
| + | 'packages' => array( | ||
| + | 'auth', | ||
| + | ), | ||
| + | ) | ||
| + | </pre> | ||
| + | ====[[Database]]テーブルの作成==== | ||
| + | *http://fuelphp.jp/docs/1.9/general/migrations.html | ||
| + | *fuel/core/config/migrations.php を fuel/app/config/migrations.php にコピー | ||
| + | <pre> | ||
| + | $ sudo oil refine migrate:up --packages=auth | ||
| + | Error - Class 'MySQLi' not found in COREPATH/classes/database/mysqli/connection.php on line 116 | ||
| + | </pre> | ||
| + | <blockquote>一旦、Migrationの使用は断念</blockquote> | ||
| + | *Authパッケージのマイグレーションファイルから、Userテーブル作成の該当部分を抜き出して、手動実行する | ||
| + | *package/auth/migrations/001_auth_create_usertables.php | ||
| + | <pre> | ||
| + | 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}"; | ||
| + | } | ||
| + | </pre> | ||
| + | |||
| + | [[File:fuelphp_auth_user_table.png|400px]] | ||
| + | |||
| + | ====SimpleAuth==== | ||
| + | *http://fuelphp.jp/docs/1.9/packages/auth/simpleauth/usage.html | ||
| + | *http://fuelphp.jp/docs/1.9/packages/auth/simpleauth/intro.html | ||
| + | |||
| + | *oil コンソールから、Auth::create_user()でテストユーザーを追加 | ||
| + | <pre> | ||
| + | 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 | ||
| + | </pre> | ||
| + | =====コントローラー===== | ||
| + | *認証の確認 | ||
| + | <pre> | ||
| + | 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); | ||
| + | } | ||
| + | </pre> | ||
| + | =====View===== | ||
| + | <pre> | ||
| + | <!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> | ||
| + | </pre> | ||
| + | =====結果===== | ||
| + | [[File:fuelphp_simple_auth_success.png|600px]] | ||
| + | |||
| + | ==Tips== | ||
| + | |||
| + | ===WebAPI JSONデータを取得する=== | ||
| + | ---- | ||
| + | *[http://fuelphp.jp/docs/1.7/classes/request/request.html Requestクラス] | ||
| + | *[https://www.php.net/manual/ja/json.constants.php JSON定数] | ||
| + | <pre> | ||
| + | <?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); | ||
| + | } | ||
| + | } | ||
| + | </pre> | ||
2021年5月14日 (金) 03:43時点における最新版
目次
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のインストール
起動
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,
オブジェクトをログに出力
- print_rを利用
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
- 中括弧による文字列配列アクセス削除
- $c = $line{$i}; を以下に修正
- $c = $line[$i];
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テーブルの作成
- http://fuelphp.jp/docs/1.9/general/migrations.html
- fuel/core/config/migrations.php を fuel/app/config/migrations.php にコピー
$ 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
- http://fuelphp.jp/docs/1.9/packages/auth/simpleauth/usage.html
- http://fuelphp.jp/docs/1.9/packages/auth/simpleauth/intro.html
- 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);
}
}
© 2006 矢木浩人