チュートリアル
チュートリアル 画像認証
次 未定
おはようございます。給料日前はいつもぎりぎり生活のゆうきんです。
captcha(キャプチャ) というものはご存知でしょうか。
よくユーザ登録などの際に、画像中の文字を入力して下さい とか言ってくるあれです。
主にスクリプトやBOT対策のために使用されます。
だって、機械がルーチンワークで登録繰り返したらあっという間にDBいっぱいになっちゃうじゃないですか。
そこで、画像認証は必要なものなのです。
FuelPHP で使える画像認証用のライブラリが公開されているので、簡単に実装できます。やったね!
導入
https://github.com/carlcraig/fuel-captcha から zip ファイルを落としてきて解凍して下さい。
解凍して出来たフォルダを captcha にリネームして、 fuel/package/ に突っ込んで下さい。
これで終わりです。
config.php の編集
app/config/config.php に以下の項目を追加して下さい。
1 2 3 |
'packages' => array( 'captcha', ), |
既に packages がある場合は、 captcha を追加するだけでいいです。
captcha の config を編集
ここからsimplecaptcha を使うか、recaptcha を使うかで書き方が違います。
simplecaptcha を使う場合は以下のようにします。
1 2 3 4 5 6 7 8 9 10 |
/** Default Driver * * (string) * * The name of the default driver to load * * The default driver will be called when you forge without giving the driver * e.g. Captcha::forge(); */ 'driver_default' => 'simplecaptcha', |
逆に recaptcha を使いたい場合は、 simplecaptcha と書かれている部分を recaptcha にして下さい。
この設定は、デフォルトでどっちを使うかの設定なので、特にやる必要はないですが、多く使う方を指定しておくと楽になります。
simplecaptcha を使用する
controller フォルダに simplecaptcha.php という名のファイルを作り以下の通りにして下さい。
1 2 3 4 5 6 7 8 9 |
<?php class Controller_Simplecaptcha extends Controller_Rest { public function get_image() { return Captcha::forge('simplecaptcha')->image(); } } |
captcha 用の画像を生成して、返す関数を用意しています。
なお、forge に ‘simplecaptcha’ を渡していますが、何も書かなければデフォルトの方が渡されるようになっています。
が、このファイルでは絶対に省略しないで下さい。
ファイルを作ったら、 fuel/package/captcha/config/simplecaptcha.php を以下の様に編集して下さい。
1 2 3 4 5 6 7 8 |
/** Captcha Route * * (string) * * The route to the captcha image * e.g. Uri::create('captcha/index') */ 'captcha_route' => Uri::create('simplecaptcha/image'), |
特にいじってなければ58行目にあると思います。
これは、captcha 用の画像はどれを使うのかという指定をしています。
この場合は先程の get_image 関数を指定いるわけです。
肝心の使い方は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Captchaテスト</title> </head> <body> {Form::open('captchatest/confirm')} {Captcha::forge('simplecaptcha')->html()} </p> {Form::submit('submit','送信')} </p> {Form::close()} </body> </html> |
これがビューです。名前は captchatest.smarty としてます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php class Controller_Captchatest extends Controller { /** * アクションインデックス */ public function action_index() { return View_Smarty::forge('captchatest'); } /** * 認証に成功したか確認 */ public function action_confirm() { if( Captcha::forge('simplecaptcha')->check() ) { return '認証に成功'; } else { return View_Smarty::forge('captchatest'); } } } |
で、これがコントローラです。captchatest.php としてます。
Captcha::forge(‘simplecaptcha’)->html() で入力フォーム付きの HMLT を生成してくれます。
んでもって Captcha::forege(‘simplecaptcha’)->check() で入力した文字列が正しいかチェックをかけてます。
recaptcha を使う
私はこちらを使うのをオススメします。セキュリティの問題で・・・。
recaptcha とはgoogleさんが提供している captcha です。
まず、http://www.google.com/recaptcha にアクセスし、USE reCAPTCHA YOUR SITE をクリックして下さい。
そしたら SIGN UP をクリック、出てきた画面で recaptcha を使用したい画面のURLを入力しって、Create Key ボタンを押して下さい。
※Enable this key on all domains (global key) にチェックを付けるかドウかはTipsをよく読んでください。
ボタンを押したあとに出てきた画面で、 Public Key と Private Key をメモしておきましょう。
fuel/package/captcha/config/recaptcha.php に同じ項目があるので、メモした内容をペーストして下さい。
で、肝心の使い方なんですが、ビューとコントローラーは simplecapthca とまったく同じです。
forge 関数に渡す文字列を simplecaptcha から recaptcha に変えるだけです。
もし、デフォルトを simplecatpcha にしてて、 forge 関数ではなくも渡してないなら。デフォルトを recaptcha に変えるだけで終わりです。
以上で、画像認証についての説明を終わります。
では、おやすみなさい。・
チュートリアル セッション
前 チュートリアル 複数のアプリケーションをフォルダごとにわける
おはようございます。何も買わないのに通販番組を見るのが好きなゆうきんです。
・・・セッション・・・。この単語を聞いただけで拒否反応が出るあなた。
そんなあなたに朗報です。
FuelPHP なら、なんと!簡単にセッション管理できるんです! オーディエンス<ナンダッテー!
セッション開始
1 |
Session::create(); |
これでセッションを開始できます。
古いセッションがある場合は破棄します。
セッションに値をセット
1 2 3 4 5 |
Session::set( 'userdata', array( 'id' => 'yukin', 'name' => 'ゆうきん', 'age' => '24', 'sex' => 'male' ) ); |
多分見ただけでわかりますよね。
第1引数でセッション名、第2引数で値を渡してあげるだけです。
サンプルのように連想配列も渡すことができます。
セッションから値の取得
1 |
Session::get('userdata'); |
これで、値の取得ができます。
格納したときと同じ型で返ってくるので、この場合は連想配列です。
セッションから値の削除
1 |
Session::delete('userdata'); |
セッションから値を破棄するだけです。
セッション自体が破棄されるわけではありません。
セッションの破棄
1 |
Session::destroy(); |
これで、セッションを破棄します。
セッションにセットした値も全て破棄されます。
セッションにフラッシュ変数をセット
1 |
Session::set_flash('flash', 'mabusii'); |
構成によってページのリクエストや変数の取得が行われたら、値が破棄される変数をセットします。
使い方は普通に値をセットするときと同じです。
セッションからフラッシュ変数を取得
1 |
Session::get_flash('flash'); |
フラッシュ変数を取得すると、フラッシュ変数が削除されます。
フラッシュ変数の寿命を延ばす
1 |
Session::keep_flash('flash'); |
次の消されるタイミングまで、寿命を延ばすことができます。
セッションからフラッシュ変数を削除
1 |
Session::delete_flash('flash'); |
削除したい場合これで。
基本的には、これだけでセッション管理できます。
他にも数個、関数があるのですが、使い方がわからないため説明できません。ごめんなさい。
でも、上記の関数だけで良いと思います。
以上でセッションの説明を終わります。
ちなみに、デフォルトではセッションはクッキーに保存されますが、ファイルやDBに保存することも可能らしいです。
今のところ必要性を感じないので、使うときが来たら説明します。
では、おやすみなさい。
チュートリアル 複数のアプリケーションをフォルダごとにわける
おはようございます。最近21時には寝て3時に起きる、超絶早寝早起き人間のゆうきんです。
FuelPHP にも大分、慣れたことだと思います。
今回は、複数のアプリケーションをフォルダごとにわける方法を説明します。
FuelPHP のモジュール機能を使っても、数が増えすぎると限界がきますからね。
やはり、プロジェクトはわけたいところです。
1.FuelPHPを配置する
これは、終わっていると思うので、配置してあるディレクトリだけ覚えておいて下さい。
今回は、 home/work/ に fuelphp という名前で配置してあるものとします。
2.アプリケーション用のフォルダを作成する
適当な場所にフォルダを作成して下さい。
今回は FuelPHP のフォルダと同じ階層に test というフォルダを作成するとします。
作成したらフォルダ内に FuelPHP から app フォルダ、 public フォルダ、 oil をコピーして下さい。
3.ファイルを書き換える
public/index.php と oil を書き換えます。
コアへのパスがデフォルトとは違うので、1で覚えておいたFuelPHPのパスに変更して下さい。
今回の場合は、以下のようになります。
public/index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/** * Path to the application directory. */ define('APPPATH', realpath(__DIR__.'/../app/').DIRECTORY_SEPARATOR); /** * Path to the default packages directory. */ define('PKGPATH', realpath(__DIR__.'/../../fuelphp/fuel/packages/').DIRECTORY_SEPARATOR); /** * The path to the framework core. */ define('COREPATH', realpath(__DIR__.'/../../fuelphp/fuel/core/').DIRECTORY_SEPARATOR); |
oil
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/** * Path to the application directory. */ define('APPPATH', realpath(__DIR__.'/app/').DIRECTORY_SEPARATOR); /** * Path to the default packages directory. */ define('PKGPATH', realpath(__DIR__.'/../fuelphp//fuel/packages/').DIRECTORY_SEPARATOR); /** * The path to the framework core. */ define('COREPATH', realpath(__DIR__.'/../fuelphp/fuel/core/').DIRECTORY_SEPARATOR); |
相対パスにしていますが、絶対パスでもいいです。
3.コマンド実行
配置した test フォルダに移動して、以下のコマンドを実行してください。
1 |
php oil refine install |
4.Apacheのドキュメントルートフォルダにアプリケーションフォルダのシンボリックリンクを貼り付ける
test/public のシンボリックリンクを、Apache の htdocs フォルダに作成してください。
これで、公開されます。
※本当は test フォルダのシンボリックリンクを作成するらしいのですが、ファルダ構成とか見られてしまう可能性があるので、test/public としてます。
アプリケーションを増やすたびに 2~4 を繰り返して下さい。
では、おやすみなさい。
チュートリアル フォームの作成とDBの使い方
次 チュートリアル 複数のアプリケーションをフォルダごとにわける
おはようございます。いつまでも中二病を卒業できないゆうきんです。
今回はフォームの作成と、送信したデータをDBに書きこむということをやってみたいと思います。
現代のWebサイトでDBが絡まないということはとても少ないです。
というわけで、作って行きましょう。
あ、Smartyの使い方ってページ読みました?
今回からビューは全てSmartyを使って書いていくので、読んでおいて下さい。
ユーザに登録させる情報を決める
今回はユーザに ユーザ名、ユーザID、パスワード、e-mailアドレス、を登録させたいと思います。
ユーザ名は1〜8文字まで、ユーザIDとパスワードは半角英数字で4〜12文字という制約を設けます。
データベースの構造を考える
まず前提として文字列は全て utf8_general_ci を使います。
データベース名 test で、テーブル名は users としましょう。
プレイマリ は id というカラムで、オートインクリメントも有効にしておきます。
ame, userid, password, email というカラムも追加しましょう。
全部 text 形式でOKです。
画面遷移を決める
- 入力ページ
- 確認ページ
- 完了ページ
の3つを作成し、上から順に遷移していくものとします。
いろいろ決まった所で作っていきます。
こらから作るファイルはサブフォルダは作らず、controler, model, views のフォルダに配置するものとします。
入力ページの作成
こちらが、入力ページのソースです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>ユーザ情報登録入力ページ</title> </head> <body> {if (isset($errors))} {$errors} {/if} {Form::open('input/confirm')} <p> {Form::label('ユーザ名', 'username')} {Form::input('username', Input::post('username'), ['required'=>'required'])}<br /> </p> <p> {Form::label('ユーザID', 'userid')} {Form::input('userid', Input::post('userid'), ['required'=>'required'])}<br /> </p> <p> {Form::label('パスワード', 'password')} {Form::password('password', Input::post('password'), ['required'=>'required'])}<br /> </p> <p> {Form::label('e-mail', 'email')} {Form::input('email', Input::post('email'), ['required'=>'required', 'email' => 'email'])}<br /> </p> <p> {Form::submit('submit','送信')} </p> {Form::close()} </body> </html> |
Formクラスの説明をします。FormクラスはHTMLタグを生成するクラスです。
ここで使っているものを順次説明します。
Form::open
form開始タグを生成します。
第1引数 実行された時の動作、又は、属性の連想配列(例:array(‘action’ => ‘example/index’, ‘method’ => ‘post’))
Form::close
form終了タグを生成します。
引数はありません。
Form::label
labelタグを生成します。
第1引数 ラベル名
第2引数 関連付けたい部品のID
Form::input
inputタグを生成します。
第1引数 任意のID
第2引数 初期データ
第3引数 タグの属性
Form::password
inputタグを生成します。
使い方は Form::input と同じです。
input タグの属性が password になります。
他にもラジオボタンを生成したり、テキストエリアを生成したりできる関数がありますが、割愛します。
input関数の第2引数で Input::post(‘username’) としていますが、これは username が post されていたら、それを初期値で表示するとういことです。
入力内容に誤りがあったとき、確認ページで修正を選択したとき、などに前回入力したデータを初期値で持たせるということをしたいので、このようになっています。
続いて、こちらがコントローラです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
<?php use FuelCoreHttpNotFoundException; class Controller_Input extends Controller { /** * アクションインデックス */ public function action_index() { return View_Smarty::forge('input'); } /** * 確認ページ */ public function action_confirm() { // POST 以外のアクセスを禁止する if( Input::method() != 'POST' ) { throw new HttpNotFoundException; } // 入力チェック $val = $this->get_validation(); // 入力された値が正しかったか? if( $val->run() ) { // 正しい場合は確認ページに遷移 $data['input'] = $val->validated(); return View_Smarty::forge('confirm', $data); } else { // 正しくない倍位は入力ページに戻り、エラーを表示 $input_view = View_Smarty::forge('input'); $input_view->set_safe('errors', $val->show_errors()); return $input_view; } } /** * 入力検証 */ // 検証ルールの定義 public function get_validation() { $val = Validation::forge(); $val->add('username', 'ユーザ名') ->add_rule('required') ->add_rule('min_length', 1) ->add_rule('max_length', 8); $val->add('userid', 'ユーザID') ->add_rule('required') ->add_rule('min_length', 4) ->add_rule('max_length', 12); $val->add('password', 'パスワード') ->add_rule('required') ->add_rule('min_length', 4) ->add_rule('max_length', 12); $val->add('email', 'e-mail') ->add_rule('required') ->add_rule('valid_email'); return $val; } } |
action_index で input ビューを表示。
action_confirm で データが post されていたら、データチェックして confirm ビューを表示。
データに誤りがあれば。エラー内容を input ビューに渡して再表示。
action_confirm で行うデータチェックのルールは get_validation で定義しています。
validation とは?
form の input で入力するデータにルール付を行うことです。
例えばこの文字は30文字しか入力できないとか、4文字以上でなければ認めない、などです。
validation の使い方
Validation::forge メソッドでクラスのインスタンスを生成し、それにルールを加えていきます。
add メソッドで ルール付けを行う input の ID と、任意のフィールド名を指定します。
フィールド名は混乱を避けるために、 input ニ関連付けた label と同じ名前が好ましいです。
そして、 add_rule メソッドでルールを追加します。
ルールの内容はソースを見ていただければわかると思います。
※ メモ:私が悩んだことなのですが trim とは、文字列前後の空白を取り除くphpの標準関数のことです
ルール付けが終わったら run メソッドでデータチェックを行えます。
正しければ true 、間違っていれば false が返ってきます。
validated メソッドでチェックをかけた後のデータを配列で取得することができるので、 confirm ビューニ渡しています。
show_errors メソッドでエラー内容を表示できるので、set_safe メソッドで input ビューに渡しています。
set_safe を使うとエスケープされずに文字列をビューに渡すことが可能です。
確認ページの作成
続いて、 確認ページのソースです。
まずはビューです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>ユーザ情報登録確認ページ</title> </head> <body> <p> ユーザ名:{$input['username']} </p> <p> ユーザID:{$input['userid']} </p> <p> パスワード:{$input['password']} </p> <p> e-mail:{$input['email']} </p> {Form::open('input/')} {Form::hidden('username', $input['username'])} {Form::hidden('userid', $input['userid'])} {Form::hidden('password', $input['password'])} {Form::hidden('email', $input['email'])} <p> {Form::submit('submit','修正')} </p> {Form::close()} {Form::open('input/conplete')} {Form::hidden(Config::get('security.csrf_token_key'), Security::fetch_token())} {Form::hidden('username', $input['username'])} {Form::hidden('userid', $input['userid'])} {Form::hidden('password', $input['password'])} {Form::hidden('email', $input['email'])} <p> {Form::submit('submit','登録')} </p> {Form::close()} </body> </html> |
確認用に受け取ったデータを表示しています。
そして、修正ボタンを押したら入力ページに現在のデータを post して遷移します。
登録ボタンを押したら確認ページに現在のデータを post して遷移します。
そのためフォームタグは2つ用意しています。
以下が、見たことないと思われる関数の使い方と説明です。
Form::hidden
実際には表示されない input タグを生成します。
第1引数 任意のID
第2引数 送信したいデータ
Config::get
config.php の内容を取得できます。
第1引数 取得したい項目名
第2引数 指定した項目名がなかった場合に、代入するデータ
今回は CSRF 対策のため、security 内の csrf_token_key を取得しています。
CSRF 対策用のトークンを post する際の ID は必ず security.csrf_token_key を指定するようにして下さい。
Security::fetch_token
CSRF 対策のトークンを発行します。
引数なし
次に書くコントローラのソースで説明しますが、このトークンをチェックすることにより、CSRF 対策を行うことが出来ます。
続いてコントローラです。
入力ページで作成した Controller_Input クラスに追加して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/** * 完了ページ */ public function action_conplete() { if( Input::method() != 'POST' ) { throw new HttpNotFoundException; } // CSRF対策 if( !Security::check_token() ) { return 'ページ遷移が正しくありません。'; } // DBに書きこむ Model_Input::push_user( Input::post('username'), Input::post('userid'), Input::post('password'), Input::post('email') ); // 完了ページ表示 return View_Smarty::forge('complete'); } |
Security::check_token
引数なし
CSRF 対策トークンをチェックします。
まず post されているかチェック、CSRF トークンチェックを行い、どちらも認証できれば、データベース操作に移ります。
Model_Input::push_user は独自に作ったクラスと関数です。
以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php class Model_Input extends Model { public static function push_user( $username, $userid, $password, $email ) { $result = DB::insert('users')->set(array( 'username' => $username, 'userid' => $userid, 'password' => $password, 'email' => $email, ) )->execute(); return $result; } } |
確認ページの作成
「登録完了しました」と表示しているだけなので、特に記載しません。
以上で、フォームの作り方の説明を終わります。
大分省きました。
本当は、ユーザ名、ユーザIDとe-mailアドレスの2重チェックとか、データベースに書き込み成功したかのチェックかけたりとかしなければなりません。
ここまで、少し調べれば出来ることだと思うので、気が向いたら書くかも知れないです。
以下、どうでもいい話
これ作ってる最中に、同僚に「e-mailアドレスの変数名って emal じゃなくて email_address じゃないの?」って言われました。
そこで「email_address だと長いから address は?」と返したんですが、「address だと住所じゃん(笑)」と言われてしまいました。
確かに email だと意味が違いますし、 address だと住所になっちゃうんで、 email_addressが正解ですね(笑)
でも、なんか間違いを認めると負けた気がするので、私はずっと emal で通しますよ!
同じ理由で職場のエアコンで暖房を付けることを、ストーブを付けると言いはってます。
では、おやすみなさい。
チュートリアル Smartyの使い方
おはようございます。あぁん?ゆうきんじゃねーの?
この記事を読む前に ツグツグ が書いた を舐める様に参照して下さい。(^ω^)ペロペロ
では、Smarty の使い方について説明していきたいと思います。
ちなみに Smarty は拡張子を好き※に変更することができますが、今回は .samrty にしているとして話を進めます。
※プロジェクトで使用している他の拡張子と同じにするのは無理です
なお、Smartyの使い方を全部説明するわけではありません。
今回は基本的なことだけです。詳しくは公式のマニュアルを参照して下さい。
Smartyファイルの生成方法
おさらいです。
1 2 3 4 5 |
// 方法その1 $view1 = View_Smarty::forge('view1'); // 方法その2 $view2 = View::forge('view2.smarty'); |
この2つで生成することが可能です。
Smarty内で変数、PHPコードの呼び出し方
おさらいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Smarty</title> </head> <body> <!-- 変数の呼び出し --> <p>ユーザ名:{$username}</p> <!-- PHPコードの呼び出し --> {Html::Anchor('top/index','トップページ')} </body> </html> |
Smarty でPHPコードの結果を画面上に表示する場合でも、 echo を記述しる必要はありません。
Smartyでの連想配列の扱い方
1 2 |
// Smarty での配列の扱い {Form::input('userid', Input::post('userid'), ['required'=>'required'])} |
これが連想配列の使い方です。
通常のPHPコードと違い array() ではなく、 [] で囲むだけですので注意して下さい。
Smartyで覚えておくと便利な事
※この項目に関しては、随時増やしていきます
コメント
1 |
{* この中に書いたものはコメントです *} |
if文
1 2 3 4 5 6 |
{$age = 24} {if $age < 20} <p>未成年</p> {else} <p>成年</p> {/if} |
現在の時刻
1 2 |
{$date = $smarty.now|date_format:'%Y-%m-%d %H:%M:%S'} <p>現在の日付と時間:{$date}</p> |
文字の連結
1 2 3 |
{$text1 = 'あんかけ'} {$text2 = 'ちゃーはん'} <p>連結した文字 = {$text1|cat:$text2}</p> |
文字数
1 2 3 |
{$text = 'ひゃっはー! ここは通さねぇぜ!'} <p>文字数:{$text|count_characters}</p> <p>空白を含めた文字数:{$text|count_characters:true}</p> |
変数のデフォルト値
1 |
<p>変数に何が入ってる?:{$var|default:'何もねぇ!'}</p> |
大文字化。小文字化
1 2 3 |
{$text = 'Small or Large'} <p>全部大文字:{$text|upper}</p> <p>全部小文字:{$text|lower}</p> |
文字数の規制
1 2 3 |
{$text = 'いやに長い文章考えるのって逆に困るよね特に俺みたいに寡黙な人間にとっては長い文章考えるなんて拷問に等しいよ本当に'} <p>原文:{$text}</p> <p>切捨:{$text|truncate:32:'..'}</p> |
前述しましたが、この記事はちょくちょく更新したいと思います。
では、おやすみなさい。
チュートリアル HTTPエラー処理その2
おはようございます。SAN値0のゆうきんです。
前回に引き続きHTTPエラー処理の説明を行います。
今回は、404と500以外のエラーを返す方法について説明します。
方法は2種類あります。順に説明します。
1,404と500以外のエラーを返す簡単な方法
1 2 3 4 |
public function action_error() { return new Response(null, 405); } |
これで、明示的に405エラーを返すことができます。
今回はnullとしましたが、第1引数にビューオブジェクトを渡すと、それが表示されます。
なお、nullだと真っ白の画面が表示されます。
Response クラスには他の使い方もあるのですが、記事の項目が違うため割愛します。
2,エラーを定義し、それを投げる
1の方法で全て解決できますが、1の方法だとエラーを返したい場所ごとに書かなければならないため、非常に面倒くさいです。
404と500を明示的に返すときと同じように、例外を投げるだけにしたいですよね?
そこでエラーを定義したクラスを作り、それを例外として投げる方法を説します。
今回は405エラーを作成することを前提にして説明します。
まずは、 fuel/app/classes/ に httpexceptions.php というファイルを作成して下さい。
そして、以下のクラスを記述して下さい。
1 2 3 4 5 6 7 |
class HttpMethodNotAllowd extends FuelCoreHttpException { public function response() { return new Response(View::forge('errors/405'), 405); } } |
1の方法とほぼ同じです。
今回は、第1引数でビューオブジェクトを生成して渡していますが、適当なビューファイルを用意して下さい。
この場合は405エラーだと視覚的にわかるビューが最適だと思われます。
定義したいエラーが増えるたびに、この httpexceptions.php にクラスを追加していくことになるので、覚えておいて下さい。
クラス名は定義したいHTTPエラーコードに準じた名前にするとわかりやすくていいです。
記述が終わったら、 fuel/app/bootstrap.php を開き、次のように書き加えて下さい。
1 2 3 4 5 |
Autoloader::add_classes(array( // Add classes you want to override here // Example: 'View' => APPPATH.'classes/view.php', 'HttpMethodNotAllowd' => APPPATH.'classes/httpexceptions.php', )); |
‘HttpMethodNotAllowd’ が定義したエラークラス名、 APPPATH.’classess/httpexceptions.php’ がエラークラスを定義しているファイル名となります。
ここまで終わったら下準備は同じです。
後は、404と500と同じように例外を投げるだけです。
1 2 3 4 |
public function action_405error() { throw new HttpMethodNotAllowd; } |
これで405エラーを明示的に返すことが可能となります。
さらに。この方法を使用すれば、404と同じように405が発生したらこのページにルーティングするという設定を適用することができます。
ただし、またいろいろと手を加える必要があります。
その方法は次の項目をご覧ください。
3,2で発生させた例外にルート設定を行う
この項目は2の項目で定義した405に対してルーティングを行うことを前提とします。
2で発生させた例外は public/index.php で受け取ることが可能です。
なので、以下の通りに書き加えて下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
// Generate the request, execute it and send the output. try { $response = Request::forge()->execute()->response(); } catch (HttpNotFoundException $e) { $route = array_key_exists('_404_', Router::$routes) ? Router::$routes['_404_']->translation : Config::get('routes._404_'); if($route instanceof Closure) { $response = $route(); if( ! $response instanceof Response) { $response = Response::forge($response); } } elseif ($route) { $response = Request::forge($route, false)->execute()->response(); } else { throw $e; } } catch (HttpMethodNotAllowd $e) { $route = array_key_exists('_405_', Router::$routes) ? Router::$routes['_405_']->translation : Config::get('routes._405_'); if($route instanceof Closure) { $response = $route(); if( ! $response instanceof Response) { $response = Response::forge($response); } } elseif ($route) { $response = Request::forge($route, false)->execute()->response(); } else { throw $e; } } |
catch文で、さきほど定義した例外 HttpMethodNotAllowd を受け取り、ルート設定があれば、そちらにルーティングし、なければ2で生成したビューがそのまま表示されます。
ルート _405_ を fuel/config/routes.php で定義していれば、そちらにルートされるということです。
catch文の中で _405_ があれば・・・とやっています。
つまり _405_ という名前は自由に変更できます。が、変数の命名はなるべく揃えた方がわかりやすので、このままで良いでしょう。
以上で、HTTPエラー処理の説明を終わります。
以前説明した、モードで処理を切り替える方法などを複合すれば、開発環境では405エラーを発生させるが、製品環境では404エラーとする、ということが可能です。
下準備は手間ですが、一度作成してしまえば繰り返し使えるので非常に便利です。
では、おやすみなさい。
チュートリアル HTTPエラー処理その1
おはようございます。†ゆうきん†です。
今回はエラー処理について説明します。
Webサイトである以上、特に404エラーと500エラーは避けて通れないエラーです。
404と500がなんであるかは別に説明の必要ないですよね。
FuelPHPではこの404と500を明示的に投げる処理が組み込まれています。
うまく、活用して役立てましょう。
404エラーをスローする
1 |
throw new HttpNotFoundException; |
上記で404エラーを投げることが出来ます。
FuelPHPは404エラーがスローされたら、以前説明した routes.php の404ルートを元にページを表示します。
404エラーをスローするのが好ましい状況
例えば、以下のコードを見て下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php /** * サンプルクラス */ class Controller_Sample extends Controller_Hybrid { /** * アクションインデックス */ public function action_index() { // 省略 } /** * post メソッド */ public function post_rasta() { // 省略 } } |
psot_rasta というメソッドがありますが、このままだと、GETで http://localhost/fuelphp/sample/rasta にアクセスできてしまいます。
POSTでのみアクセスを許可したい、許可しなければならない場合は次のようにして下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/** * サンプルクラス */ class Controller_Sample extends Controller_Hybrid { /** * アクションインデックス */ public function action_index() { // 省略 } /** * post メソッド */ public function post_rasta() { // 省略 } /** * get メソッド */ public function get_rasta() { throw new HttpNotFoundException; } } |
同じく rasta という名前でGETメソッド get_rasta を用意し、そのメソッドで 404エラーをスローするようにします。
こうすれば、GETメソッドでアクセスした場合、404エラーページが表示されるようになります。
また、以下の方法でもGETでのアクセス可を回避できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php /** * サンプルクラス */ class Controller_Sample extends Controller_Hybrid { /** * アクションインデックス */ public function action_index() { // 省略 } /** * アクションrastaメソッド */ public function action_rasta() { if( Input::method() != 'POST' ) { throw new HttpNotFoundException; } // 省略 } } |
ちなみに、RestコントローラでPOSTメソッドのみ用意した場合、そのURLにGETでアクセスすると405エラーになります。
しかし、405エラーだとユーザにわかりにくくなるので、404エラーを返したほうが親切です。
なぜ、405エラーだとダメなのかというと、405エラーの場合、特に設定しなければ真っ白い画面が表示されてしまうからです。
ユーザからして見れば、ポルナレフのような状態になってしまいます。
403エラーも同じ理由で404エラーを返したほうがいいです。
さらに403エラーは。404エラーを返したほうがセキュリティが向上します。
今回はPOSTのみ用意してGETでのアクセスを回避するというものですが、逆もまた然りです。
GETのみ用意して、POSTのアクセスを禁止したい場合でも似たようなことを行なって下さい。
500エラーをスローする
1 |
throw new HttpServerErrorException; |
上記で500エラーを投げることが出来ます。
500エラーがスローされた場合、アプリケーションを停止し、専用のページを表示します。
こっちは、スローしなければならない状況が多すぎるためサンプルは割愛します。
パッと思いつくのが、送信されたファイルのデータが大きすぎて処理しきれないとかですかね。
何かしらのデータやファイルを送信したけれど、規格外のものが送られてきて処理しきれないから、ユーザに警告を出すという使い方が多いと思います。
ユーザに知らせるのは404と500だけでいいと思いますが、それだけではデバッグするときは非常に不便です。
ですので、開発環境と製品環境で返すエラーを切り替えるという処理が必須になります。
モードによる処理の切り替えは前回説明しました。
後は404と500以外のエラーを発生させる方法だけですね。
その方法は、長くなるので次で説明します。
では、おやすみなさい。
チュートリアル モードを切り替える
前 チュートリアル css と javascript のリンク方法
おはようございます。北斗神拳伝承者ゆうきんです。
今回はモードの切り替え方について説明します。
モードとはつまりデバッグモードだったり、リリースモードだったりです。
では、見て行きましょう。
定義済み環境
- 製品環境 Fuel::PRODUCTION
- 開発環境 Fuel::DEVELOPMENT
- テスト環境 Fuel::TEST
- ステージング環境 Fuel::STAGE
の、4種類が存在します。
それぞれに切り替える方法は次の項目を読んで下さい。
モードを切り替える
FuelPHPでは public/.htaccess で、 production を宣言すると開発環境になります。
宣言の仕方は、
1 |
SetEnv FUEL_ENV production |
という感じです。
特に弄った記憶がなければ、2行目でコメントアウトされているはずなので、外してあげるだけでいいです。
それ以外にも、 development, test, stage を宣言することが出来ます。
それぞれのモードは読んで字の如くなので、特に説明する必要はないかと思われます。
また、何も宣言しなければ自動で development が適用される仕様です。
他にも fuel/app/bootstrap.php を編集することで、モードの切り替えが行えます。
1 2 3 4 5 6 7 8 9 |
/** * Your environment. Can be set to any of the following: * * Fuel::DEVELOPMENT * Fuel::TEST * Fuel::STAGE * Fuel::PRODUCTION */ Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT); |
この部分の Fuel::DEVELOPMENT を Fuel::TEST or Fuel::STAGE or Fuel::PRODUCTION のいずれかに適用したいモードによって切り替えて下さい。
※ public/.htaccess を編集する方法でモードを指定している場合は。そちらが優先されます。
モードによって処理を切り替える
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public function action_modecheck() { if( Fuel::$env == Fuel::PRODUCTION ) { return '製品環境'; } else if( Fuel::$env == Fuel::DEVELOPMENT ) { return '開発環境'; } else if( Fuel::$env == Fuel::TEST ) { return 'テスト環境'; } else if( Fuel::$env == Fuel::STAGE ) { return 'ステージング環境'; } else { return 'いったい何を宣言したんですか!'; } } |
これが全てです。
特に説明することはありません。
では、おやすみなさい。
チュートリアル css と javascript のリンク方法
おはようございます。ゆうきんだぜぇ。ワイルド(ry
前回までで、大分FuelPHPの使い方に慣れたかと思います。
今回は近代のWebページでは必ずと言っていいほど用いられる css と javasript のリンク方法を説明します。
といっても簡単なので、すぐ終わります。
リンク方法
css は Asset::css(‘リンクしたいcss名’); を呼び出す。
javascript は Asset::js(‘リンクしたいjavascript名’); を呼び出す。
これだけです。
css は public/assets/css に、javascript は public/assets/js に配置します。
呼び出すファイルはビューになります。
必要ないとは思いますがサンプルをどうぞ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <?php echo Asset::css('sample.css'); ?> <?php echo Asset::js('sample.js'); ?> <title>リンク</title> </head> <body> <p>リンクって聞くとゼ○ダの伝説しか出てこない</p> </body> </html> |
sample.css と sample.js をリンクしてます。
そっちは css と javascript の記述に従って適当に用意してください。
ここに書くべきではないかも知れませんが、Asset::css などはFuelPHPの関数です。
phpで使えるならFuelPHPで用意されている関数だろうが、独自に作った関数だろうがビューで呼び出せるので、覚えておくとプログラミングの幅が広がるかもしれません。
では、おやすみなさい。
チュートリアル モジュールとは
次 チュートリアル css と javascript のリンク方法
おはようございます。さっそくネタが尽きたゆうきんです。
今回はモジュールについて説明します。
モジュールとは、「いくつかの部品的機能を集め、まとまりのある機能を持った部品のこと」だってwikipediaさんが言ってました。
FuelPHPでもこのモジュールを作る機能が用意されています。
FuelPHPでいうところのモジュールとは、MVCそれぞれのファイルをひとまとめにしたものです。
これでファイル数が増えて非常に見づらくなる問題も解決することができます。
モジュールの作成方法
まずは、 fuel/app/modules/ に任意の名前でフォルダを作ります。
今回は rasta という名前にします。
そして、 rasta の中に classes, config, lang, views とういフォルダを作り、さらに classes の中に controller, model, view というフォルダを作ります。
・・・・・・・・・図で表します。
1 2 3 4 5 6 7 8 9 10 11 |
fuel └app └modules └rasta ├classes │├controller │├model │└view ├config ├lang └views |
最終的に、こんな階層になります。
もうお分かりでしょうが、この新しいフォルダの中にコントローラとモデルとビューを追加していくのです。
モジュールを使った時のURL
通常 コントローラ名/メソッド名 がURLになってましたが、モジュール内に作ったコントローラにアクセスしたい場合は、 モジュール名/コントローラ名/メソッド名となります。
私の環境で rasta というモジュールの、 sample というコントローラの test というメソッドにアクセスしたい場合、 http://localhost/fuelphp/rasta/sample/test という感じになります。
モジュール内のconfigファイル
モジュールを作ったとき、 config フォルダを作りました。
この中に config.php や routes.php を配置した場合、 fuel/app/config/ 内の設定項目とかぶりがあった場合、モジュール内の設定が優先されます。
つまり、モジュール内のファイルで404エラーが発生した時に、飛ばすページを通常と切り替えることが可能になったりします。
以上で、モジュールの説明は終わりです。
では、おやすみなさい。