目次
- 1 fuelPHPまとめ
- 2 インストール
- 3 フォルダ構成
- 4 ページを開いてみる
- 5 安全なディレクトリ構成へ変更する
- 6 コントローラーからビューへの値の受け渡し方
- 7 ビューを作る
- 8 画像やリンク、cssの配置
- 9 コントローラー
- 10 モデルを作る
- 11 アプリのモジュール化
- 12 バリデーション
- 13 認証機能
- 14 Sessionクラス
- 15 ファイルアップロード
- 16 ログについて
- 17 created_atとupdated_atをdatetimeで保存する
- 18 FuelPHP で自作クラスを自分で作りたい場合
- 19 Auth認証でユーザー登録を行う際にEmail重複やusername重複を無くしたい場合(クラスの拡張)
- 20 よく使いそうなメソッド
- 21 Ajaxでファイルアップロード(画像アップロード)
- 22 アプリ制作時に注意する点
- 23 サーバーにUPする
fuelPHPまとめ
環境はMac&MAMPを使ってる前提でまとめています。
FuelPHPは1.7.2を使用。
インストール
1.クイックインストーラをインストールする
1 |
$ curl get.fuelphp.com/oil | sh |
2.プロジェクト作成する
作成したいフォルダへ移動し、以下コマンド実行。
1 |
$ oil create test |
※今回の場合、testプロジェクトを作成
そうするとtestフォルダが作成され、その中に色々なファイルがインストールされる
※もしdate_default_timezoneなんたら的なエラーが出たら、/etc/php.ini
ファイル(ルートにあるetcフォルダ内のやつ)のdate.timezone
部分を
1 |
date.timezone = 'Asia/Tokyo' |
と変更する。(頭のセミコロン「;」は取ること!)
もしetcフォルダ内にphp.iniファイルがなかった場合
php.ini.default的なのしかなければ、下記のsudo cp
コマンドでコピーして名前をphp.iniへ変更。
1 |
$ sudo cp php.ini.default php.ini |
↑php.ini.defaultファイルを新しい名前のphp.iniファイルとしてコピーするよって意味。
もし、中身を編集してもreadonlyだとエラーが出る場合は、下記のようにsudo chmod
コマンド で 権限を664に変更すれば書き込み可能になる。
1 |
$ sudo chmod 664 php.ini |
フォルダ構成
覚えておけばいいところだけ抜き出した構成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
fuel/ ・・・FuelPHPのプログラムやファイル群 |- app/ | | | |- logs/ ・・・ログファイル | |- classes/ | | |------- controller/ ・・・コントローラファイル置き場 | | | ∟ blog.php | | | | | |------- model/ ・・・モデルファイル置き場 | | | |- config/ ・・・各種設定ファイル | | | | | |- config.php ・・・ アプリケーション全体に関わる設定(p.32) | | | | | |- db.php ・・・DBの設定 | | | |- views/ ・・・ビューファイル置き場 | |- core/ ・・・FuelPHPが標準で提供するプログラムなど。配下はappフォルダ内の構成と似てる。 | |- packages/ ・・・パッケージとして提供されるプログラムなど public/ ・・・WEBサーバの公開ディレクトリ以下に配置する |
ページを開いてみる
‘test’というプロジェクトを作った場合、下記のURLでアクセスするとFuelPHPのWELCOME画面が表示される。
1 |
http://localhost:8888/test/public/ |
URLとファイルとの対応関係
例えば、下記のようなURLがある場合、
1 |
http://localhost:8888/test/public/index.php/welcome/index |
サーバーはhttp://localhost/blog/public/index.php
を呼び出し、welcome/index
がパラメータとして渡され、/
で区切られた最初のパラメータ名の「コントローラ」を呼び、次のパラメータ名の「アクション」を呼び出す。
(コントローラー名がWelcomeのwelcome.phpファイル内にある、アクション名indexを呼んでるってこと)
安全なディレクトリ構成へ変更する
WEBサーバの公開ディレクトリ(htdocs)にFuelPHPをインストールした場合、FuelPHPの設定ファイルなどもそこにインストールされるため全て公開されてしまい、あまり良くない。
そこで、htdocsと同階層に違うフォルダを作成(名前は「sample」とかなんでもOK)し、そこにFuelPHPをインストールする。
(必要なら、インストールしたFuelPHPのフォルダに対してアクセス権も設定しておくこと)
その後、httpd.confに下記のようなバーチャルホスト設定を追加する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
NameVirtualHost 127.0.0.1:80 <span class="nt"><VirtualHost</span> <span class="err">127.0.0.1:80</span><span class="nt">></span> DocumentRoot /usr/local/apache/sample/public ServerName sample.localhost <span class="c"><!-- ⇐sample.localhostにアクセスするとDocumentRootで設定したディレクトリを参照するようにしてる --></span> <span class="nt"><Directory</span> <span class="err">/usr/local/apache/sample/public</span><span class="nt">></span> Order Allow,Deny Allow from All Options All AllowOverride All DirectoryIndex index.php index.html <span class="nt"></Directory></span> <span class="nt"></Directory></span> <span class="nt"></VirtualHost></span> |
そして、/etc/hosts
ファイルに下記1行を追加する。
1 |
127.0.0.1 sample.localhost |
※sample.localhostのホスト名は127.0.0.1のipアドレス(自分のPCになる)だよと定義してる
コントローラーからビューへの値の受け渡し方
1 2 3 4 5 6 7 8 9 10 |
<span class="k">public</span> <span class="k">function</span> <span class="nf">action_index</span><span class="p">(){</span> <span class="nv">$data</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span> <span class="nv">$data</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'きむりおん'</span><span class="p">;</span> <span class="k">return</span> <span class="nx">Response</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="nx">View</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="s1">'welcome/test'</span><span class="p">,</span><span class="nv">$data</span><span class="p">));</span> <span class="c1">// 「〜::forge」はオブジェクトを生成するメソッド。</span> <span class="c1">// Response::forgeでresponse オブジェクトを生成してる。(ブラウザへ返すレスポンスのこと)</span> <span class="c1">// responseオブジェクトを生成するときにViewオブジェクトのインスタンスを渡してる。</span> <span class="c1">// View::forgeの中の第一引数でビューファイルを指定。今回だとviews/welcomeフォルダ内のビューファイルtest.phpを指定してる</span> <span class="c1">// 第二引数では、指定したビューファイルへ渡す値を指定してる。(配列で渡す)</span> <span class="p">}</span> |
1 2 3 4 5 6 7 8 9 10 11 |
<span class="o"><</span><span class="nx">html</span><span class="o">></span> <span class="o"><</span><span class="nx">head</span><span class="o">></span> <span class="o"><</span><span class="nx">title</span><span class="o">></span><span class="nx">ビューのテスト</span><span class="o"></</span><span class="nx">title</span><span class="o">></span> <span class="o"><</span><span class="nx">body</span><span class="o">></span> <span class="o"><?</span><span class="nx">php</span> <span class="k">echo</span> <span class="nv">$name</span><span class="p">;</span> <span class="cp">?></span> <span class="x"> <!-- ==============================================</span> <span class="x"> コントローラーから渡された配列のインデックス名を変数として指定するだけでその値が使える</span> <span class="x"> =============================================== --> </span> <span class="x"> </body></span> <span class="x"> </head></span> <span class="x"></html></span> |
他にも、オブジェクト変数で渡すこともできる
1 2 3 4 5 |
<span class="k">public</span> <span class="k">function</span> <span class="nf">action_index</span><span class="p">(){</span> <span class="nv">$data</span> <span class="o">=</span> <span class="k">new</span> <span class="k">stdClass</span><span class="p">();</span> <span class="nv">$data</span><span class="o">-></span><span class="na">name</span> <span class="o">=</span> <span class="s1">'きむりおん'</span><span class="p">;</span> <span class="k">return</span> <span class="nx">Response</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="nx">View</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="s1">'welcome/test'</span><span class="p">,</span><span class="nv">$data</span><span class="p">));</span> <span class="p">}</span> |
上記ケースの場合、アクセスするURLは下記のようになる。
1 |
http://localhost:8888/test/public/welcome/ |
ビューを作る
fuel/app/views
内に〇〇.phpという形で作成してあげる。
もし、viewsフォルダ内に別フォルダを作って、その中にビューファイルを置いた場合、コントローラー側でのビューファイルの指定は下記のようにする。
例:viewsフォルダの中にhome
フォルダを作り、その中にビューファイルindex.php
を作った場合
1 2 3 4 5 6 7 8 |
<span class="o"><</span><span class="nx">html</span><span class="o">></span> <span class="o"><</span><span class="nx">head</span><span class="o">></span> <span class="o"><</span><span class="nx">title</span><span class="o">><?</span><span class="nx">php</span> <span class="k">echo</span> <span class="nv">$title</span><span class="p">;</span> <span class="cp">?></span><span class="x"></title></span> <span class="x"> </head></span> <span class="x"> <body></span> <span class="x"> Welcome, </span><span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$username</span><span class="p">;</span> <span class="cp">?></span><span class="x">.</span> <span class="x"> </body></span> <span class="x"></html></span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="k">class</span> <span class="nc">Controller_Home</span> <span class="k">extends</span> <span class="nx">Controller</span> <span class="p">{</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">action_index</span><span class="p">()</span> <span class="p">{</span> <span class="nv">$data</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span> <span class="nv">$data</span><span class="p">[</span><span class="s1">'username'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Joe14'</span><span class="p">;</span> <span class="nv">$data</span><span class="p">[</span><span class="s1">'title'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Home'</span><span class="p">;</span> <span class="c1">//ビューへ変数と値を渡す</span> <span class="k">return</span> <span class="nx">View</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="s1">'home/index'</span><span class="p">,</span> <span class="nv">$data</span><span class="p">);</span> <span class="c1">//home/indexとすれば、homeフォルダ内のindex.phpのビューという意味になる。</span> <span class="p">}</span> <span class="p">}</span> |
※ビューに渡される値は全て自動でサニタイズされる。
ビューファイルを入れ子にする
headerやfooterなど別ファイルにして、ビューファイルの中で別のビューファイルを読み込むようにする。
1 2 3 4 5 6 7 8 9 10 |
<span class="nt"><html></span> <span class="nt"><head></span> <span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$head</span><span class="p">;</span> <span class="cp">?></span> <span class="nt"></head></span> <span class="nt"><body></span> <span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$header</span><span class="p">;</span> <span class="cp">?></span> <span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$content</span><span class="p">;</span> <span class="cp">?></span> <span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$footer</span><span class="p">;</span> <span class="cp">?></span> <span class="nt"></body></span> <span class="nt"></html></span> |
1 2 3 4 |
<span class="nt"><title></span><span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$title</span><span class="p">;</span> <span class="cp">?></span><span class="nt"></title></span> fuel/app/views/header.php <span class="nt"><div</span> <span class="na">class=</span><span class="s">"logo"</span><span class="nt">></div></span> <span class="nt"><div</span> <span class="na">class=</span><span class="s">"logo_text"</span><span class="nt">></span><span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$site_title</span><span class="p">;</span> <span class="cp">?></span><span class="nt"></div></span> |
1 2 |
<span class="nt"><h1></span><span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$title</span><span class="p">;</span> <span class="cp">?></span><span class="nt"></h1></span> <span class="nt"><div</span> <span class="na">class=</span><span class="s">"welcome_user"</span><span class="nt">></span>Welcome <span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$username</span><span class="p">;</span> <span class="cp">?></span><span class="nt"></div></span> |
1 2 3 |
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"footer"</span><span class="nt">></span> <span class="ni">&copy;</span> Copyright <span class="cp"><?php</span> <span class="k">echo</span> <span class="nb">date</span><span class="p">(</span><span class="s1">'Y'</span><span class="p">);</span><span class="cp">?></span> <span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$site_title</span><span class="p">;</span> <span class="cp">?></span> <span class="nt"></div></span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<span class="k">class</span> <span class="nc">Controller_Home</span> <span class="k">extends</span> <span class="nx">Controller</span> <span class="p">{</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">action_index</span><span class="p">()</span> <span class="p">{</span> <span class="c1">//変数としてビューを割り当てる</span> <span class="nv">$view</span> <span class="o">=</span> <span class="nx">View</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="s1">'template/template_1colum'</span><span class="p">);</span> <span class="c1">//テンプレートとなるビューファイルの読込み</span> <span class="nv">$view</span><span class="o">-></span><span class="na">set</span><span class="p">(</span><span class="s1">'head'</span><span class="p">,</span><span class="nx">View</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="s1">'template/head'</span><span class="p">));</span> <span class="nv">$view</span><span class="o">-></span><span class="na">set</span><span class="p">(</span><span class="s1">'contents'</span><span class="p">,</span><span class="nx">View</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="s1">'login'</span><span class="p">));</span> <span class="nv">$view</span><span class="o">-></span><span class="na">set</span><span class="p">(</span><span class="s1">'footer'</span><span class="p">,</span><span class="nx">View</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="s1">'template/footer'</span><span class="p">));</span> <span class="nv">$view</span><span class="o">-></span><span class="na">set_global</span><span class="p">(</span><span class="s1">'site_title'</span><span class="p">,</span><span class="s1">'WEBsite'</span><span class="p">);</span> <span class="c1">//テンプレートビューの中でさらに読み込んだビューの中にある変数へ値を渡したい場合はset_globalを使う。</span> <span class="c1">//テンプレートビューの中で使う変数へ値を渡すだけならsetでいい。</span> <span class="c1">// レンダリングした HTML をリクエストに返す</span> <span class="k">return</span> <span class="nv">$view</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> |
画像やリンク、cssの配置
画像やcss、jsに関してはプロジェクト名/public/assets
の中にそれぞれimg,js,cssでフォルダが既に作られているので、その中に置く。
そして、画像を表示させたい時やCSS、jsの読込みしたいときなどはAssetクラスのメソッドを使う。
Assetクラス
Assetクラスのメソッドを使うことで簡単にhtmlに書き出してくれる。
画像を読み込む場合
ビュー内で下記のようにファイルを指定し
1 |
<?php echo Asset::img('title.png'); ?> |
公開ディレクトリ配下のassets/img/
の中にtitle.png
ファイルを配置すればOK。
属性など指定したい場合は下記のように第2引数に指定してあげる。
1 |
<?php echo Asset::img('title.png',array('width'=>'200','alt'=>'タイトル画像')); ?> |
CSSを読み込む場合
ビュー内で下記のようにファイルを指定し、
1 |
<?php echo Asset::css('base.css'); ?> |
公開ディレクトリ配下のassets/css/'の中に
base.css’ファイルを配置すればOK。
aタグを使う場合
1 |
<?php echo Html::anchor('welcome','トップへ'); ?> |
※リンク先はコントローラ名/メソッド名の形で指定する
※第3引数は属性をつけたいときに使用する
※第4引数にtrueを指定するとhttpsで始まるリンクになる。
iconを読み込みたい場合
find_fileメソッドを使うと指定したファイルのパスが返ってくるのでそれを使う。
1 |
<link rel="icon" href="<?php Asset::find_file('icon.ico', 'img','icons/'); ?>" type="image/png"> |
第一引数がファイル名、第二引数がファイルタイプ(imgかjsかcss)、第三引数がフォルダ
上記の場合、assets/icons/内にある画像ファイルのicon.pngのパスを教えて!とメソッドを呼んでいる。
assetsフォルダ内にjs,css,img以外のフォルダを作ってそこのファイルを読み込みたい場合
初期状態では、Asset::jsとやればassets/js内のファイルを指定でき、Asset::cssとやればassets/css内のファイルが指定できるが、
assets/pluginsなどのフォルダ内のファイルを指定したい場合には、下記のようにAssetクラスにパスを追加してやる必要がある。
1 |
<?php Asset::add_path('assets/plugins/', 'js'); ?> |
※今回はjsと指定したので、Asset::jsでファイル名を指定するとデフォルトのassets/jsフォルダ内と新たにパスを追加したassets/pluginsフォルダ内を探しに行く。
コントローラー
コントローラの基本
fuel/app/classes/controller
の中に作成する。
ファイル名は小文字。
www.test.com/example/index
というURLを指定した場合、exampleというコントローラーのindexというアクションが指定されたという意味になる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="k">use</span> <span class="nx">\Model\Welcome</span><span class="p">;</span> <span class="c1">//使うモデルを指定</span> <span class="c1">//ファイル名の頭文字を大文字にして、Controller_をつけるのが規則</span> <span class="c1">//基本はControllerを継承しておく</span> <span class="k">class</span> <span class="nc">Controller_Welcome</span> <span class="k">extends</span> <span class="nx">Controller</span> <span class="p">{</span> <span class="c1">//action_をつけてアクション名を指定</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">action_index</span><span class="p">()</span> <span class="p">{</span> <span class="c1">//cssを指定</span> <span class="nv">$data</span><span class="p">[</span><span class="s1">'css'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">Asset</span><span class="o">::</span><span class="na">css</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="s1">'reset.css'</span><span class="p">,</span><span class="s1">'960.css'</span><span class="p">,</span><span class="s1">'main.css'</span><span class="p">));</span> <span class="c1">//ビューへ(この場合、welcomeフォルダ内のindex.phpのビューファイルを指定してる)</span> <span class="k">return</span> <span class="nx">Response</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="nx">View</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="s1">'welcome/index'</span><span class="p">));</span> <span class="p">}</span> <span class="p">}</span> |
リクエストされたコントローラ名が見つからないorコントローラ名が指定されてない場合
config/routes.php
の設定先に遷移する
1 2 3 4 5 |
<span class="cp"><?php</span> <span class="k">return</span> <span class="k">array</span><span class="p">(</span> <span class="s1">'_root_'</span> <span class="o">=></span> <span class="s1">'welcome/index'</span><span class="p">,</span> <span class="c1">//コントローラ名が指定されてない場合の遷移先</span> <span class="s1">'_404_'</span> <span class="o">=></span> <span class="s1">'error/404'</span><span class="p">,</span> <span class="c1">//コントローラ名、アクション名がない場合の遷移先</span> <span class="p">);</span> |
モデル・ビューへの呼び出し
1 2 3 4 5 6 7 8 9 10 |
<?php class Controller_Example extends Controller{ public function action_test(){ $model = Model_Test::forge(); //モデルのインスタンスを生成して利用する return View::forege('test_view'); //ビューの呼び出し } } ?> |
ビューへの値の受け渡し方
値の受け渡し方は2通りある。
配列などで受け渡す方法とオブジェクトを作成して受け渡す方法。
引数で受け渡す
1 2 3 4 5 6 |
public function action_test(){ $data = array(); $data['title'] = 'テストです。'; $data['body'] = '内容です。'; return view::forge('test',$data); //第2引数に渡したい変数を指定する } |
ビューのオブジェクトを生成して受け渡す
1 2 3 4 5 6 7 8 9 10 |
public function action_test(){ $view = View::forge('test'); //viewオブジェクトを生成する。この時、引数に表示したいビューファイルを指定 //ビューファイル内にある変数へ値を渡したい場合はsetを使う //第一引数に変数名、第二引数に値を指定する $view->set('title','テストです。'); $view->set('body','内容です。'); return $view; } |
パラメータを受け取る
URLのアクションメソッド名の後にパラメータを指定することでコントローラ側で受け取れる。
1 2 3 4 5 6 7 |
http://localhost/sample/test/param1/param2/... ------- ---- ------ ------ ① ② ③ ④ ①コントローラ名 ②アクション名 ③パラメータ1 ④パラメータ2 |
1 2 3 4 5 |
<span class="c1">//受け取る側のコントローラのアクションメソッドには引数を設定する</span> <span class="c1">//※URLにパラメータが設定されてなかった場合、エラーになってしまうので必ずデフォルト値を設定しておくこと</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">action_test</span><span class="p">(</span><span class="nv">$param1</span> <span class="o">=</span> <span class="k">null</span><span class="p">,</span><span class="nv">$param2</span> <span class="o">=</span> <span class="k">null</span><span class="p">){</span> <span class="nx">・・・</span> <span class="p">}</span> |
パラメータがいくつ渡されるか不明な場合
1 2 3 4 5 |
<span class="k">public</span> <span class="nx">funciton</span> <span class="nx">action_test</span><span class="p">(){</span> <span class="nv">$data</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span> <span class="nv">$data</span><span class="p">[</span><span class="s1">'param'</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-></span><span class="na">request</span><span class="o">-></span><span class="na">route</span><span class="o">-></span><span class="na">method_param</span><span class="p">;</span> <span class="k">return</span> <span class="nx">View</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="s1">'param'</span><span class="p">,</span><span class="nv">$data</span><span class="p">);</span> <span class="p">}</span> |
※引数をつけなくてもいい
※ビュー側で、foreach文などで変数paramから順に取り出してあげる
before()メソッドでログインチェックなどの各ページ共通処理をする
before()メソッドはURLで指定されたアクションメソッドが実行される前に実行されるので、会員専用ページなどのログインチェックなどに使える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="cp"><?php</span> <span class="k">class</span> <span class="nc">Controller_Sample</span> <span class="k">extends</span> <span class="nx">Controller</span><span class="p">{</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">before</span><span class="p">(){</span> <span class="c1">//認証チェックなどの処理をここに記述する</span> <span class="p">}</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">action_editpass</span><span class="p">(){</span> <span class="nx">・・・</span> <span class="p">}</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">action_editinfo</span><span class="p">(){</span> <span class="nx">・・・</span> <span class="p">}</span> <span class="p">}</span> |
コントローラーをまとめる
似た機能のコントローラー同士でまとめておきたいなど、classes/controller
の配下にさらにディレクトリを作ってコントローラーを配置したい場合は以下のようにする。
例:会員用機能のコントローラをmembersディレクトリ配下にまとめる場合
1 2 3 4 5 |
classes/ |-----controller/ |--------members/ |--------mypage.php |--------editpass.php |
1 2 3 4 |
http://localhost/members/mypage ------- -------- ⬆ ⬆ ディレクトリ名 コントローラ名 |
1 2 3 4 |
<span class="k">class</span> <span class="nc">Controller_Members_Mypage</span> <span class="k">extends</span> <span class="nx">Controller</span><span class="p">{</span> <span class="nx">・・・</span> <span class="p">}</span> <span class="c1">//クラス名は「Controller_ディレクトリ名_コントローラー名」にする</span> |
ベースのコントローラを作る
会員専用サイトなどで複数のコントローラで同じ処理をさせる場合、各コントローラ内に記述していくよりも、ベースのコントローラを作って、それを継承する形で各コントローラを作ってあげる。
※ベースコントローラと同階層に継承したコントローラを置いても大丈夫
1 2 3 4 5 6 7 |
classes/ |-----controller/ |------login.php ⬅ログイン画面を表示させるコントローラ |------members.php ⬅ベースコントローラ |--------members/ |--------mypage.php ⬅ベースコントローラを拡張して作ったコントローラ |--------editpass.php ⬅ベースコントローラを拡張して作ったコントローラ |
1 2 3 4 5 6 7 |
<span class="k">class</span> <span class="nc">Controller_Members</span> <span class="k">extends</span> <span class="nx">Controller</span><span class="p">{</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">before</span><span class="p">(){</span> <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">Auth</span><span class="o">::</span><span class="na">check</span><span class="p">()){</span> <span class="c1">//ログインチェック</span> <span class="nx">Response</span><span class="o">::</span><span class="na">redirect</span><span class="p">(</span><span class="s1">'login'</span><span class="p">);</span> <span class="c1">//認証されてなければリダイレクト</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> |
作ったコントローラを継承する
オートローダのお陰で、クラス定義で名前以外のものを記述しなくても他のコントローラを継承できる。
1 2 3 4 |
class Controller_Example extends Controller_Welcome { // メソッド } |
テンプレートコントローラ
ヘッダ、フッタは共通のものを使い、コンテンツ部分だけ各ページで違う内容にしたいなどサイト全体で共通するHTMLを作成し、一部分だけを入れ替える時に使えるのが「テンプレートコントローラ」
テンプレートコントローラにはあらかじめ、$templateというプロパティが用意されているので、そいつに色々設定してやる。
テンプレートコントローラを使うにはController_Templateを継承してあげる。
1 2 3 4 5 6 |
<span class="k">class</span> <span class="nc">Controller_Test</span> <span class="k">extends</span> <span class="nx">Controller_Template</span><span class="p">{</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">action_index</span><span class="p">(){</span> <span class="nv">$this</span><span class="o">-></span><span class="na">template</span><span class="o">-></span><span class="na">title</span> <span class="o">=</span> <span class="s1">'タイトルです。'</span><span class="p">;</span><span class="nx"> </span><span class="c1">//タイトルを設定</span> <span class="nv">$this</span><span class="o">-></span><span class="na">template</span><span class="o">-></span><span class="na">content</span> <span class="o">=</span> <span class="nx">View</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="s1">'sample/index'</span><span class="p">);</span> <span class="c1">//contentにビューファイル(sample/index.php)を設定</span> <span class="p">}</span> <span class="p">}</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="o"><</span><span class="nx">html</span><span class="o">></span> <span class="o"><</span><span class="nx">head</span><span class="o">></span> <span class="o"><</span><span class="nx">title</span><span class="o">><?</span><span class="nx">php</span> <span class="k">echo</span> <span class="nv">$title</span><span class="p">;</span> <span class="cp">?></span><span class="x"></title></span> <span class="x"> </head></span> <span class="x"> <body></span> <span class="x"> <div id="header"></span> <span class="x"> <p>へっだー</p></span> <span class="x"> </div></span> <span class="x"> <div id="contents"></span> <span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$content</span><span class="p">;</span> <span class="cp">?></span> <span class="x"> </div></span> <span class="x"> <div id="footer"></span> <span class="x"> <p>ふったー</p></span> <span class="x"> </div></span> <span class="x"> </body></span> <span class="x"></html></span> |
モデルを作る
まずDBの設定をする
/fuel/app/config/db.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 |
<span class="k">return</span> <span class="k">array</span><span class="p">(</span> <span class="s1">'active'</span> <span class="o">=></span> <span class="s1">'testdb'</span><span class="p">,</span> <span class="sd">/**</span> <span class="sd"> * Base config, just need to set the DSN, username and password in env. config.</span> <span class="sd"> */</span> <span class="s1">'default'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span> <span class="s1">'type'</span> <span class="o">=></span> <span class="s1">'pdo'</span><span class="p">,</span> <span class="s1">'connection'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span> <span class="s1">'persistent'</span> <span class="o">=></span> <span class="k">false</span><span class="p">,</span> <span class="p">),</span> <span class="s1">'identifier'</span> <span class="o">=></span> <span class="s1">'`'</span><span class="p">,</span> <span class="s1">'table_prefix'</span> <span class="o">=></span> <span class="s1">''</span><span class="p">,</span> <span class="s1">'charset'</span> <span class="o">=></span> <span class="s1">'utf8'</span><span class="p">,</span> <span class="s1">'enable_cache'</span> <span class="o">=></span> <span class="k">true</span><span class="p">,</span> <span class="s1">'profiling'</span> <span class="o">=></span> <span class="k">false</span><span class="p">,</span> <span class="p">),</span> <span class="s1">'redis'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span> <span class="s1">'default'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span> <span class="s1">'hostname'</span> <span class="o">=></span> <span class="s1">'127.0.0.1'</span><span class="p">,</span> <span class="s1">'port'</span> <span class="o">=></span> <span class="mi">6379</span><span class="p">,</span> <span class="p">)</span> <span class="p">),</span> <span class="s1">'testdb'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span> <span class="s1">'type'</span> <span class="o">=></span> <span class="s1">'mysqli'</span><span class="p">,</span> <span class="s1">'connection'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span> <span class="s1">'hostname'</span> <span class="o">=></span> <span class="s1">'localhost'</span><span class="p">,</span> <span class="s1">'database'</span> <span class="o">=></span> <span class="s1">'データベース名'</span><span class="p">,</span> <span class="s1">'username'</span> <span class="o">=></span> <span class="s1">'ユーザ名'</span><span class="p">,</span> <span class="s1">'password'</span> <span class="o">=></span> <span class="s1">'パスワード'</span><span class="p">,</span> <span class="s1">'persistent'</span> <span class="o">=></span> <span class="k">FALSE</span><span class="p">,</span> <span class="p">),</span> <span class="s1">'table_prefix'</span> <span class="o">=></span> <span class="s1">''</span><span class="p">,</span> <span class="s1">'charset'</span> <span class="o">=></span> <span class="s1">'utf8'</span><span class="p">,</span> <span class="s1">'caching'</span> <span class="o">=></span> <span class="k">false</span><span class="p">,</span> <span class="s1">'profiling'</span> <span class="o">=></span> <span class="k">true</span><span class="p">,</span> <span class="p">),</span> <span class="p">);</span> |
モデルを作る
Model_Crudクラスを拡張して作る
Model_CrudクラスにはCRUD(作成、検索、更新、削除)するためのメソッドが用意されてるので、簡単な操作くらいならこっちを使えばOK。
例)フォームで入力した内容をDB登録し、そのDB内容を表示する場合
1 2 3 4 5 6 7 |
<span class="cp"><?php</span> <span class="k">class</span> <span class="nc">Model_Post</span> <span class="k">extends</span> <span class="nx">\Model_Crud</span><span class="p">{</span> <span class="c1">//①テーブルの名前を登録する</span> <span class="k">protected</span> <span class="k">static</span> <span class="nv">$_table_name</span> <span class="o">=</span> <span class="s1">'posts'</span><span class="p">;</span> <span class="c1">//②テーブルの主キーを登録する</span> <span class="k">protected</span> <span class="k">static</span> <span class="nv">$_primary_key</span> <span class="o">=</span> <span class="s1">'id'</span><span class="p">;</span> <span class="p">}</span> |
1 2 3 4 5 6 7 8 9 10 11 |
<span class="nt"><html></span> <span class="nt"><meta</span> <span class="na">charset=</span><span class="s">"UTF-8"</span><span class="nt">></span> <span class="nt"><body></span> //送信した値の受け渡し先をaction属性で指定。この場合コントローラpostのアクションsaveへ渡る <span class="nt"><form</span> <span class="na">action=</span><span class="s">"/post/save"</span> <span class="na">method=</span><span class="s">"post"</span><span class="nt">></span> <span class="nt"><input</span> <span class="na">type=</span><span class="s">"text"</span> <span class="na">name=</span><span class="s">"title"</span> <span class="na">value=</span><span class="s">""</span> <span class="nt">/></span> <span class="nt"><textarea</span> <span class="na">cols=</span><span class="s">"30"</span> <span class="na">rows=</span><span class="s">"3"</span> <span class="na">name=</span><span class="s">"body"</span> <span class="nt">></textarea></span> <span class="nt"><input</span> <span class="na">type=</span><span class="s">"submit"</span> <span class="na">name=</span><span class="s">"submit"</span> <span class="na">value=</span><span class="s">"送信"</span> <span class="nt">/></span> <span class="nt"></form></span> <span class="nt"></body></span> <span class="nt"></html></span> |
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 |
<span class="cp"><?php</span> <span class="k">class</span> <span class="nc">Controller_Post</span> <span class="k">extends</span> <span class="nx">Controller</span><span class="p">{</span> <span class="c1">//フォームを表示させるためのアクション(http://localhost/post/formで表示される)</span> <span class="k">public</span> <span class="nx">funciton</span> <span class="nx">action_form</span><span class="p">(){</span> <span class="k">return</span> <span class="nx">View</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="s1">'post/form'</span><span class="p">);</span> <span class="c1">//View::forege()メソッドでビューを読み込む</span> <span class="p">}</span> <span class="c1">//フォームが送信された際に値を受け取り、DBへ書き込むアクション</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">action_save</span><span class="p">(){</span> <span class="nv">$form</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span> <span class="nv">$form</span><span class="p">[</span><span class="s1">'title'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">Input</span><span class="o">::</span><span class="na">post</span><span class="p">(</span><span class="s1">'title'</span><span class="p">);</span> <span class="c1">//フォームの内容を配列へ格納</span> <span class="nv">$form</span><span class="p">[</span><span class="s1">'body'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">Input</span><span class="o">::</span><span class="na">post</span><span class="p">(</span><span class="s1">'body'</span><span class="p">);</span> <span class="nv">$post</span> <span class="o">=</span> <span class="nx">Model_Post</span><span class="o">::</span><span class="na">forge</span><span class="p">();</span> <span class="c1">//Model_Postクラスのオブジェクトを作成</span> <span class="nv">$post</span><span class="o">-></span><span class="na">set</span><span class="p">(</span><span class="nv">$form</span><span class="p">);</span> <span class="c1">//setメソッドで、配列をpostオブジェクトに設定</span> <span class="nv">$post</span><span class="o">-></span><span class="na">save</span><span class="p">();</span> <span class="c1">//saveメソッドで、テーブルにレコードを書き込む</span> <span class="nx">Response</span><span class="o">::</span><span class="na">redirect</span><span class="p">(</span><span class="s1">'post'</span><span class="p">);</span> <span class="c1">//投稿一覧ページへリダイレクト</span> <span class="p">}</span> <span class="c1">//DBの内容を表示するアクション</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">action_index</span><span class="p">(){</span> <span class="nv">$data</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span> <span class="nv">$data</span><span class="p">[</span><span class="s1">'rows'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">Model_Post</span><span class="o">::</span><span class="na">find_all</span><span class="p">();</span> <span class="c1">//Model_Postクラスにあるfind_allメソッドでDBを検索し、結果を配列へ格納</span> <span class="k">return</span> <span class="nx">View</span><span class="o">::</span><span class="na">forege</span><span class="p">(</span><span class="s1">'Post/list'</span><span class="p">,</span><span class="nv">$data</span><span class="p">);</span> <span class="c1">//配列をViewのlistへ渡す</span> <span class="p">}</span> <span class="p">}</span> |
1 2 3 4 5 6 7 8 9 10 |
<span class="k">namespace</span> <span class="nx">Model</span><span class="p">;</span> <span class="k">class</span> <span class="nc">Welcome</span> <span class="k">extends</span> <span class="nx">\Model</span> <span class="p">{</span> <span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">get_results</span><span class="p">()</span> <span class="p">{</span> <span class="c1">// Database interactions</span> <span class="p">}</span> <span class="p">}</span> |
フォーム内容をDBへ登録する場合
SQLを書く
SQLをそのまま書くか、クエリビルダというものを使って書くかの2通り。
1 2 |
<span class="err">$</span><span class="n">query</span> <span class="o">=</span> <span class="n">DB</span><span class="p">::</span><span class="n">query</span><span class="p">(</span><span class="s1">'SELECT * FROM users WHERE id = 5'</span><span class="p">);</span> <span class="err">$</span><span class="n">query</span><span class="o">-></span><span class="k">execute</span><span class="p">()</span><span class="o">-></span><span class="n">as_array</span><span class="p">();</span> |
※as_array()を使わないと中身が取り出せないので注意!!
1 |
<span class="err">$</span><span class="n">query</span> <span class="o">=</span> <span class="n">DB</span><span class="p">::</span><span class="k">select</span><span class="p">(</span><span class="s1">'title'</span><span class="p">,</span><span class="s1">'content'</span><span class="p">)</span><span class="o">-></span><span class="k">from</span><span class="p">(</span><span class="s1">'articles'</span><span class="p">)</span><span class="o">-></span><span class="k">execute</span><span class="p">()</span><span class="o">-></span><span class="k">get</span><span class="p">(</span><span class="s1">'title'</span><span class="p">);</span> |
※クエリビルダを使えば、自動でエスケープしてくれる
1 |
<span class="err">$</span><span class="n">query</span> <span class="o">=</span> <span class="n">DB</span><span class="p">::</span><span class="k">insert</span><span class="p">(</span><span class="s1">'table_name'</span><span class="p">,</span> <span class="nb">array</span><span class="p">(</span><span class="s1">'id'</span><span class="p">,</span> <span class="s1">'name'</span><span class="p">));</span> |
1 |
<span class="err">$</span><span class="n">query</span> <span class="o">=</span> <span class="n">DB</span><span class="p">::</span><span class="n">count_records</span><span class="p">(</span><span class="s1">'users'</span><span class="p">);</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span class="o">//</span> <span class="err">典型的なトランザクションコードの流れ</span> <span class="n">try</span> <span class="err">{</span> <span class="n">DB</span><span class="p">::</span><span class="n">start_transaction</span><span class="p">();</span> <span class="o">//</span> <span class="err">何らかのクエリ</span><span class="p">...</span> <span class="n">DB</span><span class="p">::</span><span class="n">commit_transaction</span><span class="p">();</span> <span class="o">//</span> <span class="err">クエリの結果を返す</span> <span class="err">}</span> <span class="n">catch</span> <span class="p">(</span><span class="k">Exception</span> <span class="err">$</span><span class="n">e</span><span class="p">)</span> <span class="err">{</span> <span class="o">//</span> <span class="err">未決のトランザクションクエリをロールバックする</span> <span class="n">DB</span><span class="p">::</span><span class="n">rollback_transaction</span><span class="p">();</span> <span class="n">throw</span> <span class="err">$</span><span class="n">e</span><span class="p">;</span> <span class="err">}</span> |
コントローラーからモデルへ
1 2 3 4 5 6 7 8 9 |
<span class="k">use</span> <span class="nx">\Model\Welcome</span><span class="p">;</span> <span class="c1">//useはjavaのimportみたいなもの</span> <span class="k">class</span> <span class="nc">Controller_Welcome</span> <span class="k">extends</span> <span class="nx">Controller</span> <span class="p">{</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">action_index</span><span class="p">()</span> <span class="p">{</span> <span class="nv">$results</span> <span class="o">=</span> <span class="nx">Welcome</span><span class="o">::</span><span class="na">get_results</span><span class="p">();</span> <span class="p">}</span> <span class="p">}</span> |
ORMを使う
テーブル同士のリレーション(多対多、1対多など)を定義しておくことで、ひとつのテーブルを更新すると自動的に関連するテーブルも更新してくれたりする。
書き方
\Orm\Model
を継承したモデルクラスを作成し、fuel/app/classes/model/
配下に置く。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<span class="cp"><?php</span> <span class="k">class</span> <span class="nc">Model_Contents1</span> <span class="k">extends</span> <span class="nx">\Orm\Model</span><span class="p">{</span> <span class="c1">//\Orm\Modelを継承する</span> <span class="k">protected</span> <span class="k">static</span> <span class="nv">$_table_name</span> <span class="o">=</span> <span class="s1">'contents1'</span><span class="p">;</span> <span class="c1">//テーブル名を指定</span> <span class="k">protected</span> <span class="k">static</span> <span class="nv">$_primary_key</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s1">'id'</span><span class="p">);</span> <span class="c1">//プライマリーキーを指定</span> <span class="k">protected</span> <span class="k">static</span> <span class="nv">$_propeties</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span> <span class="c1">//カラム名を指定</span> <span class="s1">'id'</span><span class="p">,</span> <span class="s1">'created_at'</span><span class="p">,</span> <span class="s1">'updated_at'</span><span class="p">,</span> <span class="s1">'erase'</span><span class="p">,</span> <span class="s1">'users_id'</span><span class="p">,</span> <span class="s1">'category_code_id'</span><span class="p">,</span> <span class="s1">'name'</span><span class="p">,</span> <span class="s1">'company'</span><span class="p">,</span> <span class="s1">'zip'</span><span class="p">,</span> <span class="s1">'pref'</span><span class="p">,</span> <span class="s1">'address'</span><span class="p">,</span> <span class="s1">'tel'</span><span class="p">,</span> <span class="s1">'email'</span><span class="p">,</span> <span class="p">);</span> <span class="p">}</span> |
アプリのモジュール化
アプリの規模が大きくなる際などは、アプリの各機能を独立させモジュール化(部品化)してあげた方が開発効率や保守性も高まる。(詳しくはp.52)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
APPPATH/ |---- modules/ |------- user/ ⬅userモジュール | |----- classes/ | |----- controller/ | |----- model/ | |----- view/ |------- article/ ⬅articleモジュール |----- classes/ |----- controller/ |----- model/ |----- view/ ※modulesフォルダの中に各MVCのアプリがあるイメージ |
1 2 3 4 |
http://localhost/user/register ------- -------- ⬆ ⬆ モジュール名 コントローラ名 |
バリデーション
方法1:add_fieldメソッドを使う
※add_fieldメソッドは文字列の検証しか出来ない略式的なもの
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<span class="nv">$val</span> <span class="o">=</span> <span class="nx">Validation</span><span class="o">::</span><span class="na">forge</span><span class="p">();</span> <span class="nv">$val</span><span class="o">-></span><span class="na">add_field</span><span class="p">(</span><span class="s1">'name'</span><span class="p">,</span><span class="s1">'名前'</span><span class="p">,</span><span class="s1">'required'</span><span class="p">);</span> <span class="nv">$val</span><span class="o">-></span><span class="na">add_field</span><span class="p">(</span><span class="s1">'email'</span><span class="p">,</span><span class="s1">'メアド'</span><span class="p">,</span><span class="s1">'required | valid_email'</span><span class="p">);</span> <span class="nv">$val</span><span class="o">-></span><span class="na">add_field</span><span class="p">(</span><span class="s1">'password'</span><span class="p">,</span><span class="s1">'パスワード'</span><span class="p">,</span><span class="s1">'required | min_length[8] | max_length[12]);</span> <span class="s1">$val->add_field('</span><span class="nx">password2</span><span class="s1">','</span><span class="nx">パスワード(確認用</span><span class="p">)</span><span class="s1">','</span><span class="nx">required</span><span class="o">|</span><span class="nx">match_field</span><span class="p">(</span><span class="nx">password</span><span class="p">)</span><span class="s1">');</span> <span class="s1">'</span> <span class="c1">//そのほかの規則はP141参照</span> <span class="c1">//名前、メアドなどはエラーメッセージの時に使われるラベル</span> <span class="c1">//最大、最小などを指定してもフォームを空欄で送信されたら、チェックにひっかからないので注意(requiredを指定しておく)</span> <span class="nv">$out</span> <span class="o">=</span> <span class="s1">''</span><span class="p">;</span> <span class="k">if</span><span class="p">(</span><span class="nv">$val</span><span class="o">-></span><span class="na">run</span><span class="p">()){</span> <span class="c1">//runメソッドで検証実行</span> <span class="nv">$out</span> <span class="o">=</span> <span class="s1">'合ってます'</span><span class="p">;</span> <span class="c1">//検証成功時にする処理</span> <span class="p">}</span><span class="k">else</span><span class="p">{</span> <span class="c1">//検証失敗時の処理</span> <span class="k">foreach</span><span class="p">(</span><span class="nv">$val</span><span class="o">-></span><span class="na">error</span><span class="p">()</span> <span class="k">as</span> <span class="nv">$error</span><span class="p">){</span> <span class="c1">//エラー取り出し</span> <span class="nv">$out</span> <span class="o">.=</span> <span class="nv">$error</span><span class="o">.</span><span class="s1">'<br>'</span><span class="p">;</span> <span class="c1">//各項目のエラーを改行で繋げる</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="nx">Response</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="nv">$out</span><span class="p">);</span> <span class="c1">//エラーをビューへ渡しながら表示</span> <span class="p">}</span> |
エラーメッセージの日本語化
1.APPPATH/config/config.phpで’language’を’ja’にする
2.APPPATH/lang/ja/vallidation.phpファイル作成
3.編集する
1 2 3 4 5 6 |
<span class="cp"><?php</span> <span class="k">return</span> <span class="k">array</span><span class="p">(</span> <span class="s1">'requred'</span> <span class="o">=></span> <span class="s1">':labelがにゅうりょくされていまあせん。'</span><span class="p">,</span> <span class="s1">'min_length'</span> <span class="o">=></span> <span class="s1">':labelが:param:1文字未満です'</span><span class="p">,</span> <span class="nx">・・・</span> <span class="p">);</span> |
※「:label」の部分には指定したラベルの名前が入る
※「:param:x」x番目のパラメータを取得する
エラーメッセージの上書き
$val->set_message(‘required’,’:labelが入力されていません’);
方法2:add()とadd_rule()を使う
文字列以外のチェックも可能。
$val->add(‘password’,’ぱすわーど’)
->add_rule(‘required’)
->add_rule(‘min_length’,8)
->add_rule(‘max_length’,12)
->add_rule(‘valid_string’,array(‘alpha’,’numeric’,’dashes’,’utf8′));
※dashesは「ー」ハイフンと「_」アンダースコアを許可。
※utf8は正規表現のまっちんぐをutf8で行うことを指定。
※valid_stringの後の第2引数を指定しないと自動でarray(‘alpha’,’utf8′);が入る。
独自の検証規則を作成する
既に登録済みのemailでないかを調べる場合など
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="cp"><?php</span> <span class="k">class</span> <span class="nc">MyValidation</span> <span class="p">{</span> <span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">_validation_unique_email</span><span class="p">(</span><span class="nv">$email</span><span class="p">){</span> <span class="c1">//頭に必ず「_validation_」をつける</span> <span class="nv">$result</span> <span class="o">=</span> <span class="nx">DB</span><span class="o">::</span><span class="na">select</span><span class="p">(</span><span class="s1">'LOWER ("email")'</span><span class="p">)</span> <span class="o">-></span><span class="na">where</span><span class="p">(</span><span class="s1">'email'</span><span class="p">,</span> <span class="s1">'='</span><span class="p">,</span> <span class="nb">strtolower</span><span class="p">(</span><span class="nv">$email</span><span class="p">))</span> <span class="c1">//emailを条件にDB検索</span> <span class="o">-></span><span class="na">from</span><span class="p">(</span><span class="s1">'users'</span><span class="p">)</span><span class="o">-></span><span class="na">execute</span><span class="p">();</span> <span class="c1">//usersテーブル内を検索</span> <span class="k">return</span> <span class="o">!</span><span class="p">(</span><span class="nv">$result</span><span class="o">-></span><span class="na">count</span><span class="p">()</span> <span class="o">></span> <span class="mi">0</span><span class="p">);</span> <span class="c1">//取得件数が0より多ければfalseを返す</span> <span class="p">}</span> <span class="p">}</span> <span class="nv">$val</span><span class="o">-></span><span class="na">add_callable</span><span class="p">(</span><span class="s1">'myvalidation'</span><span class="p">);</span> <span class="c1">//myvalidationクラスを規則として読み込む</span> <span class="nv">$val</span><span class="o">-></span><span class="na">add</span><span class="p">(</span><span class="s1">'email'</span><span class="p">,</span><span class="s1">'メールアドレス'</span><span class="p">)</span> <span class="o">-></span><span class="na">add_rule</span><span class="p">(</span><span class="s1">'required'</span><span class="p">)</span> <span class="o">-></span><span class="na">add_rule</span><span class="p">(</span><span class="s1">'unique_email'</span><span class="p">);</span> <span class="c1">//myvalidationクラスのunique_emailのfunctionを規則に使う</span> <span class="nv">$val</span><span class="o">-></span><span class="na">set_message</span><span class="p">(</span><span class="s1">'unique_email'</span><span class="p">,</span><span class="s1">'既に登録されています'</span><span class="p">);</span> |
エラーメッセージを毎回書くのが面倒ならメソッド側に設定する
1 2 3 4 5 6 7 8 |
<span class="k">class</span> <span class="nc">MyValidation</span> <span class="p">{</span> <span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">_validation_unique_email</span><span class="p">(</span><span class="nv">$email</span><span class="p">){</span> <span class="nx">Validation</span><span class="o">:</span><span class="nx">active</span><span class="p">()</span><span class="o">-></span><span class="na">set_message</span><span class="p">(</span><span class="s1">'unique_email'</span><span class="p">,</span><span class="s1">'既に登録されています'</span><span class="p">);</span> <span class="c1">//Validationクラスを呼び出し、set_massageメソッドでメッセージを設定する。</span> <span class="nv">$result</span> <span class="o">=</span> <span class="nx">DB</span><span class="o">::</span><span class="na">select</span><span class="p">(</span><span class="s1">'LOWER("email")'</span><span class="p">)</span> <span class="o">-></span><span class="na">where</span><span class="p">(</span><span class="s1">'email'</span><span class="p">,</span> <span class="s1">'='</span><span class="p">,</span> <span class="nb">strtolower</span><span class="p">(</span><span class="nv">$email</span><span class="p">))</span> <span class="o">-></span><span class="na">from</span><span class="p">(</span><span class="s1">'users'</span><span class="p">)</span><span class="o">-></span><span class="na">execute</span><span class="p">();</span> <span class="k">return</span> <span class="o">!</span><span class="p">(</span><span class="nv">$result</span><span class="o">-></span><span class="na">count</span><span class="p">()</span> <span class="o">></span> <span class="mi">0</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> |
認証機能
SimpleAuthを使う。
Authパッケージを使う
使うにはconfig.phpにauthを追加する
1 2 3 4 |
'packages' => array( 'orm', 'auth', ), |
テーブルを用意する
デフォルトでは、テーブル名はusersを想定していて、
id,username,password,group,email,last_login,login_hash,profile_fields,created_at
のカラムがあることが前提。
テーブル名だけは設定すれば変更可能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `username` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , `password` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , `group` INT NOT NULL DEFAULT 1 , `email` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , `last_login` VARCHAR( 25 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 0, `login_hash` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , `profile_fields` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , `created_at` INT( 11 ) UNSIGNED NOT NULL , UNIQUE ( `username` , `email` ) ) |
ユーザ登録
1 2 |
$auth = Auth::instance(); $auth->create_user($_POST['username'], &_POST['password'], $_POST['email']); |
※パスワードは自動でハッシュ化されて保存される
ログイン
1 2 3 4 5 6 |
$auth = Auth::instance(); if($auth->login($_POST['username'], $_POST['password'])){ //ログイン成功時の処理 }else{ //ログイン失敗時の処理 } |
※ログインするとusersテーブルのlast_loginにログイン時刻、login_hashにタイムスタンプを基にしたハッシュ値が保存される。
さらに、セッションにユーザ名とログインハッシュ値が保存される。
ログアウト
1 2 |
$auth = Auth::instance(); $auth->logout(); |
ログイン状態のチェック
1 2 3 4 5 6 7 8 |
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">Auth</span><span class="o">::</span><span class="na">check</span><span class="p">()){</span> <span class="nx">Response</span><span class="o">::</span><span class="na">redirect</span><span class="p">(</span><span class="s1">'login'</span><span class="p">);</span> <span class="c1">//ログインしてなかったら、コントローラーloginへ遷移</span> <span class="p">}</span><span class="k">else</span><span class="p">{</span> <span class="nv">$data</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span> <span class="nv">$data</span><span class="p">[</span><span class="s1">'username'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">Auth</span><span class="o">::</span><span class="na">get_screen_name</span><span class="p">();</span> <span class="c1">//ユーザ名を取得</span> <span class="nv">$data</span><span class="p">[</span><span class="s1">'user_id'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">Arr</span><span class="o">:</span><span class="nx">get</span><span class="p">(</span><span class="nx">Auth</span><span class="o">::</span><span class="na">get_user_id</span><span class="p">(),</span><span class="mi">1</span><span class="p">);</span> <span class="c1">//ユーザIDを取得</span> <span class="k">Return</span> <span class="nx">Response</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="nx">View</span><span class="o">::</span><span class="na">forge</span><span class="p">(</span><span class="s1">'member/top'</span><span class="p">));</span> <span class="c1">//コントローラーmemberのtopアクションへ遷移</span> <span class="p">}</span> |
ログイン保持(1週間ログインを保持するなど)をする
1.simpleauth.phpをコピーする
fuel/packages/auth/config/simpleauth.php
をfuel/app/config/
内へコピペ。
2.コピペしたsimpleauth.phpを編集する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
'remember_me' => array( /** * Whether or not remember me functionality is enabled */ 'enabled' => true, /* falseになってるので、trueへ変更する*/ /** * Name of the cookie used to record this functionality */ 'cookie_name' => 'rmcookie', /** * Remember me expiration (default: 31 days) */ 'expiration' => 86400 * 31, /*クッキーの期限(ログイン保持の期限)を設定する*/ ), ・ ・ ・ /** * Salt for the login hash */ 'login_hash_salt' => 'tekitounimojiwoireru', /* 暗号化するためのキー文字列。適当な文字列へ変更する*/ |
3.コントローラ内のログイン認証でOKだった場合の中で下記を記述する
1 2 3 4 5 6 |
$remember = Input::post('remember'); //保持のチェックボックスの値を取得 if($remember){ //保持にチェックがついていた場合 // remember-me クッキーを作成 Auth::remember_me(); } |
ユーザグループの設定
1.PKGPATH/auth/config/simpleauth.phpの「groups」セクションにグループの定義を設定する
どのグループに属しているかを調べる場合
1 2 3 |
if(Auth::member(100)){ //100はAdministratorグループ //処理 } |
ユーザ認証ページの例
1 2 3 |
・ログインフォーム ・マイページ ・管理者ページ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
APPPATH/ |———classes/ | |———controller/ | |———member.php ・・・①メンバーのベースコントローラ | |———member/ | |———admin.php ・・・②管理者のベースコントローラ | |———admin/ |———views/ |———member/ | |———form.php | |———index.php | |———template.php・・・③メンバーのビューテンプレート |———admin/ |———index.php |———template.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 50 |
<span class="cp"><?php</span> <span class="k">class</span> <span class="nc">Controller_Member</span> <span class="k">extends</span> <span class="nx">Controller_Template</span><span class="p">{</span> <span class="k">public</span> <span class="nv">$template</span> <span class="o">=</span> <span class="nx">‘member</span><span class="o">/</span><span class="nx">template’</span><span class="p">;</span> <span class="c1">//テンプレートファイルを指定</span> <span class="k">public</span> <span class="nv">$is_admin</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span> <span class="c1">//管理者かどうかフラグ</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">before</span><span class="p">(){</span> <span class="k">parent</span><span class="o">::</span><span class="na">before</span><span class="p">();</span> <span class="c1">//before()をオーバーライドするので、親クラスのbefore()を呼び出す</span> <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">Auth</span><span class="o">::</span><span class="na">check</span><span class="p">()</span> <span class="k">and</span> <span class="nx">Request</span><span class="o">::</span><span class="na">active</span><span class="p">()</span><span class="o">-></span><span class="na">action</span> <span class="o">!=</span> <span class="nx">‘login’</span><span class="p">){</span> <span class="c1">//認証通らず、現在リクエストされてるアクションがloginでない場合にログインフォームへリダイレクト</span> <span class="nx">Response</span><span class="o">::</span><span class="na">redirect< |