目次
- 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</span><span class="p">(</span><span class="nx">‘member</span><span class="o">/</span><span class="nx">login’</span><span class="p">);</span> <span class="p">}</span> <span class="k">if</span><span class="p">(</span><span class="nx">Auth</span><span class="o">:</span><span class="nx">member</span><span class="p">(</span><span class="mi">100</span><span class="p">)){</span> <span class="c1">//ユーザが管理者なら、管理者フラグ立てる</span> <span class="nv">$this</span><span class="o">-></span><span class="na">is_admin</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span> <span class="p">}</span> <span class="nx">View</span><span class="o">::</span><span class="na">set_global</span><span class="p">(</span><span class="s1">'is_admin'</span><span class="p">,</span><span class="nv">$this</span><span class="o">-></span><span class="na">is_admin</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">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="o">.</span><span class="nx">Auth</span><span class="o">::</span><span class="na">get_screen_name</span><span class="p">()</span><span class="o">.</span><span class="s1">'さん'</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">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">'member/index'</span><span class="p">);</span> <span class="p">}</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">action_login</span><span class="p">(){</span> <span class="c1">//既にログイン済みなら会員トップへリダイレクト</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">Response</span><span class="o">::</span><span class="na">redirect</span><span class="p">(</span><span class="s1">'member'</span><span class="p">);</span> <span class="c1">//usernameとpassが送信されていたなら、認証をする</span> <span class="k">if</span><span class="p">(</span><span class="nx">Input</span><span class="o">::</span><span class="na">post</span><span class="p">(</span><span class="s1">'username'</span><span class="p">)</span> <span class="k">and</span> <span class="nx">Input</span><span class="o">::</span><span class="na">post</span><span class="p">(</span><span class="s1">'password'</span><span class="p">)){</span> <span class="nv">$username</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">'username'</span><span class="p">);</span> <span class="nv">$pass</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">'password'</span><span class="p">);</span> <span class="nv">$auth</span> <span class="o">=</span> <span class="nx">Auth</span><span class="o">::</span><span class="na">instance</span><span class="p">();</span> <span class="c1">//認証に成功したら会員トップページにリダイレクト</span> <span class="k">if</span><span class="p">(</span><span class="nv">$auth</span><span class="o">-></span><span class="na">login</span><span class="p">(</span><span class="nv">$username</span><span class="p">,</span> <span class="nv">$password</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">'member'</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</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">title</span> <span class="o">=</span> <span class="s1">'ログインページ'</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">content</span> <span class="o">=</span> <span class="nx">View</span><span class="o">::</span><span class="na">forege</span><span class="p">(</span><span class="s1">'member/form'</span><span class="p">);</span> <span class="p">}</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">action_logout</span><span class="p">(){</span> <span class="c1">//ログアウト</span> <span class="nv">$auth</span> <span class="o">=</span> <span class="nx">Auth</span><span class="o">::</span><span class="na">instance</span><span class="p">();</span> <span class="nv">$auth</span><span class="o">-></span><span class="na">logout</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">'member'</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> |
member用テンプレートビュー
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="o"><</span><span class="nx">body</span><span class="o">></span> <span class="o"><</span><span class="nx">h1</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"></h1></span> <span class="x"> //認証が通れば、ログアウト(aタグ)を表示する。</span> <span class="cp"><?php</span> <span class="k">if</span><span class="p">(</span><span class="nx">Auth</span><span class="o">::</span><span class="na">check</span><span class="p">())</span><span class="o">:?></span> <span class="o"><?</span><span class="nx">php</span> <span class="k">echo</span> <span class="nx">Html</span><span class="o">::</span><span class="na">anchor</span><span class="p">(</span><span class="s1">'member/logout'</span><span class="p">,</span><span class="s1">'ログアウト'</span><span class="p">);</span> <span class="cp">?></span> <span class="cp"><?php</span> <span class="k">endif</span><span class="p">;</span> <span class="cp">?></span> <span class="x"> //管理者フラグが立っていれば、管理者ページへのボタンを表示する</span> <span class="cp"><?php</span> <span class="k">if</span><span class="p">(</span><span class="nv">$is_admin</span><span class="p">)</span><span class="o">:</span> <span class="cp">?></span> <span class="x"> <a href="</span><span class="cp"><?php</span> <span class="k">echo</span> <span class="nx">Url</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">'member/admin'</span><span class="p">);</span> <span class="cp">?></span><span class="x">">管理者ページへ</a></span> <span class="cp"><?php</span> <span class="k">endif</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="x"> //コンテンツ差し替え用</span> <span class="x"></body></span> |
ログインフォームのビュー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="cp"><?php</span> <span class="k">echo</span> <span class="nx">Form</span><span class="o">::</span><span class="na">open</span><span class="p">();</span> <span class="cp">?></span><span class="x"> //送信先は自身のコントローラなので、引数はいらない</span> <span class="x"><fieldset></span> <span class="x"> <div></span> <span class="cp"><?php</span> <span class="k">echo</span> <span class="nx">Form</span><span class="o">::</span><span class="na">label</span><span class="p">(</span><span class="s1">'ユーザ名'</span><span class="p">,</span><span class="s1">'username'</span><span class="p">);</span> <span class="cp">?></span> <span class="cp"><?php</span> <span class="k">echo</span> <span class="nx">Form</span><span class="o">::</span><span class="na">Input</span><span class="p">(</span><span class="s1">'username'</span><span class="p">);</span> <span class="cp">?></span> <span class="x"> </div></span> <span class="x"> <div></span> <span class="cp"><?php</span> <span class="k">echo</span> <span class="nx">Form</span><span class="o">::</span><span class="na">label</span><span class="p">(</span><span class="s1">'パスワード'</span><span class="p">,</span><span class="s1">'password'</span><span class="p">);</span> <span class="cp">?></span> <span class="cp"><?php</span> <span class="k">echo</span> <span class="nx">Form</span><span class="o">::</span><span class="na">password</span><span class="p">(</span><span class="s1">'password'</span><span class="p">);</span> <span class="cp">?></span> <span class="x"> </div></span> <span class="x"> <div></span> <span class="cp"><?php</span> <span class="k">echo</span> <span class="nx">Form</span><span class="o">::</span><span class="na">submit</span><span class="p">(</span><span class="s1">'submit'</span><span class="p">,</span><span class="s1">'ログイン'</span><span class="p">);</span> <span class="cp">?></span> <span class="x"> </div></span> <span class="x"></fieldset></span> <span class="cp"><?php</span> <span class="k">echo</span> <span class="nx">Form</span><span class="o">::</span><span class="na">close</span><span class="p">();</span> <span class="cp">?></span> |
管理者用ページ用ベースコントローラ
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">Controller_Member_Admin</span> <span class="k">extends</span> <span class="nx">Controller_Member</span><span class="p">{</span> <span class="k">public</span> <span class="nv">$template</span> <span class="o">=</span> <span class="s1">'member/admin/template'</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">//親クラス呼び出し</span> <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nv">$this</span><span class="o">-></span><span class="na">is_admin</span><span class="p">){</span> <span class="c1">//管理者フラグが立ってなければmemberコントローラへリダイレクト</span> <span class="nx">Response</span><span class="o">::</span><span class="na">redirect</span><span class="p">(</span><span class="s1">'member'</span><span class="p">)</span><span class="o">+</span> <span class="p">}</span> <span class="p">}</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">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="nx">Auth</span><span class="o">::</span><span class="na">get_screen_name</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">content</span> <span class="o">=</span> <span class="nx">View</span><span class="o">::</span><span class="na">forege</span><span class="p">(</span><span class="s1">'member/admin/index'</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> |
Sessionクラス
定期的にセッションIDを自動変更してくれたり、次のリクエスト時に削除されるような一時的なセッションの発行もできる。
設定ファイル
初期設定ファイルの場所:COREPATH/config/session.php
初期設定ファイルを以下の場所にコピーして使用する。
コピー先の場所:APPPATH/config/
配下
設定詳細はP.169を参照。
基本は設定ファイル内の'expiration_time' => 7200
を変更するくらい。
これは、セッションの有効期限を設定するもの。
セッションの読み書き
書き込みはset()メソッド
1 2 3 4 5 |
<span class="c1">//文字列を保存</span> <span class="nx">Session</span><span class="o">::</span><span class="na">set</span><span class="p">(</span><span class="s1">'username'</span><span class="p">,</span><span class="s1">'きむりおん'</span><span class="p">);</span> <span class="c1">//配列を保存</span> <span class="nx">Session</span><span class="o">::</span><span class="na">set</span><span class="p">(</span><span class="s1">'loging'</span><span class="p">,</span> <span class="k">array</span><span class="p">(</span><span class="s1">'user'</span><span class="o">=></span><span class="nv">$userid</span><span class="p">,</span> <span class="s1">'hash'</span><span class="o">=></span><span class="nv">$login_hash</span><span class="p">));</span> |
読み込みはget()メソッド
1 |
<span class="nv">$username</span> <span class="o">=</span> <span class="nx">Sessio</span><span class="o">::</span><span class="na">get</span><span class="p">(</span><span class="s1">'username'</span><span class="p">);</span> |
※Auth認証を使ってるなら自動的にusernameやlogin_hashがSessionに保存されてるので、キーを指定すれば読み書き可能。
削除
1 |
<span class="nx">Session</span><span class="o">::</span><span class="na">delete</span><span class="p">(</span><span class="s1">'username'</span><span class="p">);</span> |
フラッシュセッション
フォーム送信時のチケット発行などに使用する。
フラッシュセッションはほかのセッションと名前が衝突しないように別の名前空間で管理されている。
識別子は設定ファイルのflash_id
で設定できる。
読み書き
set_flash(),get_flash()を使う。使い方は普通のセッションと同じ。
寿命を延ばす
フラッシュセッションを読み込まれていない状態に戻すことで、次のリクエストまで寿命が延びる。引数にはセッション変数名を指定する。
php:
Session::keep_flash(‘ticket’);
削除
1 |
<span class="nx">Session</span><span class="o">::</span><span class="na">delete_flash</span><span class="p">(</span><span class="s1">'ticket'</span><span class="p">);</span> |
※セッション自体(普通のセッションやフラッシュセッション全て)を破棄するならSession::destroy();
を使う
ファイルアップロード
Uploadクラスを使う。
設定
Uploadクラスを使うには設定が必要。
デフォルトの設定はアプリ名/fuel/core/config/upload.php
に書かれてるので、アプリ名/fuel/app/config/
内にコピペして、必要な箇所のみ修正する。
1 2 3 |
'max_size' => 2000000, //アップロードのファイルサイズ上限(バイトで指定) 'path' => DOCROOT.'/uploads', //ファイルのアップロード先パスを設定しておく 'mime_whitelist' => array('jpg','jpeg','gif','png'), //許可するファイル種類 |
パスで指定した通り、/public/uploads
フォルダを作成しておく。
使い方
コントローラでまず、Upload::process()メソッドを実行し、ファイル検証やファイル情報の取得を行う。
1 2 3 4 5 6 7 8 9 |
$config = array( `path` => DOCROOT . 'files . DS, 'ext_whitelist' => array('jpg','jpeg','gif','png'), ); Upload::process($config); if(Upload::is_valid()){ //検証に成功した場合 Upload::save(); //ファイルを保存する $files = Upload::get_files(); //ファイル情報を取得する } |
※ファイル情報はUploadしたファイル数分の連想配列の中にそれぞれのファイル情報が入った連想配列がある形で返される
upload.phpの設定ファイルでauto_process
を有効にすると上記のUpload::processメソッドは呼びださなくても自動的に実行してくれる。
Uploadクラスの検証エラーメッセージを日本語化する
以下のようなファイルをAPPPATH/lang/ja/
内にupload.php
として保存すればOK。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php return array( 'error_'.\Upload::UPLOAD_ERR_OK => 'ファイルのアップロードに成功しました', 'error_'.\Upload::UPLOAD_ERR_INI_SIZE => 'アップロードファイルのサイズが php.ini の upload_max_filesize ディレクティブ設定値を超えています', 'error_'.\Upload::UPLOAD_ERR_FORM_SIZE => 'アップロードファイルのサイズが HTML フォームの MAX_FILE_SIZE ディレクティブ設定値を超えています', 'error_'.\Upload::UPLOAD_ERR_PARTIAL => 'ファイルの一部しかアップロードされませんでした', 'error_'.\Upload::UPLOAD_ERR_NO_FILE => 'ファイルはアップロードされませんでした', 'error_'.\Upload::UPLOAD_ERR_NO_TMP_DIR => 'アップロード用一時フォルダの設定がありません', 'error_'.\Upload::UPLOAD_ERR_CANT_WRITE => 'アップロードファイルがディスクに書き込めませんでした', 'error_'.\Upload::UPLOAD_ERR_EXTENSION => 'インストールされている PHP の 拡張機能 (extension) によりアップロードが防止されました', 'error_'.\Upload::UPLOAD_ERR_MAX_SIZE => 'アップロードファイルのサイズが既定値上限を超えています', 'error_'.\Upload::UPLOAD_ERR_EXT_BLACKLISTED => 'この拡張子でのファイルアップロードは許可されていません', 'error_'.\Upload::UPLOAD_ERR_EXT_NOT_WHITELISTED => 'この拡張子でのファイルアップロードは許可されていません', 'error_'.\Upload::UPLOAD_ERR_TYPE_BLACKLISTED => 'このファイルタイプでのファイルアップロードは許可されていません', 'error_'.\Upload::UPLOAD_ERR_TYPE_NOT_WHITELISTED => 'このファイルタイプでのファイルアップロードは許可されていません', 'error_'.\Upload::UPLOAD_ERR_MIME_BLACKLISTED => 'この mime タイプでのファイルアップロードは許可されていません', 'error_'.\Upload::UPLOAD_ERR_MIME_NOT_WHITELISTED => 'この mime タイプでのファイルアップロードは許可されていません', 'error_'.\Upload::UPLOAD_ERR_MAX_FILENAME_LENGTH => 'アップロードファイル名の長さが既定値上限を超えています', 'error_'.\Upload::UPLOAD_ERR_MOVE_FAILED => 'アップロードファイルを一時フォルダから指定フォルダに移動できません', 'error_'.\Upload::UPLOAD_ERR_DUPLICATE_FILE => 'アップロードファイルと同じ名前のファイルが既に存在します', 'error_'.\Upload::UPLOAD_ERR_MKDIR_FAILED => 'アップロード先の指定フォルダが作成できません', ); |
ログについて
ログを出力したい場合、app/config/config.php
内の下記を変更する。
1 2 3 4 5 |
'log_threshold' => Fuel::L_DEBUG, //ログレベルを指定 'log_path' => APPPATH.'logs/', //ログ出力フォルダの指定 'log_date_format' => 'Y-m-d H:i:s', //出力されるログの日付フォーマットを指定 'date_default_timezone' => 'Asia/Tokyo' //ログの日付を日本時間にする |
ログレベルは下記の5段階ある。下に行くほど多く出力される
1 2 3 4 5 |
Fuel::L_NONE //何も出力しない Fuel::L_ERROR //phpでのエラーレベルまでのログを出力 Fuel::L_WARNING //phpでの警告レベルまでのログを出力 Fuel::L_DEBUG //Log::debugの内容まで出力 Fuel::L_ALL //全部出力 |
デバッグ用のログを出力したい場合
下記のメソッドをコントローラー内などで使う。(ログレベルをFuel::L_DEBUGにしてると出力される)
1 |
Log::debug('ログイン処理が成功した場合'); |
created_atとupdated_atをdatetimeで保存する
FuelPHPはテーブルカラムのcreated_at と updated_at をデフォルトUNIX タイムスタンプで記録するが、datetimeで保存することも可能。
mysql_timestamp のデフォルト値「false」を「true」にすればOK。
1 2 3 4 5 6 7 |
protected static $_observers = array( 'Orm\Observer_CreatedAt' => array( 'events' => array('before_insert'), 'mysql_timestamp' => true, 'property' => 'created', ), ); |
1 2 3 4 5 6 7 |
protected static $_observers = array( 'Orm\Observer_UpdatedAt' => array( 'events' => array('before_save'), 'mysql_timestamp' => true, 'property' => 'updated', ), ); |
FuelPHP で自作クラスを自分で作りたい場合
「extends Controller」で継承したコントローラーではなく、普通にクラスを作りたい場合は下記のようにする
①./fuel/app/classes/ 以下に自作クラスを置く
1 2 3 4 5 6 7 |
<span class="cp"><?php</span> <span class="k">class</span> <span class="nc">Sample</span> <span class="p">{</span> <span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">test</span><span class="p">(</span><span class="nv">$var</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nv">$var</span> <span class="o">.</span> <span class="s1">' test.'</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> |
みたいに置けば使える。
呼び出す側の書き方は下のようにやる。
1 2 3 4 5 6 7 8 9 10 11 |
<span class="cp"><?php</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">$cls</span> <span class="o">=</span> <span class="nx">Sample</span><span class="o">::</span><span class="na">test</span><span class="p">(</span><span class="s1">'This is'</span><span class="p">);</span> <span class="c1">// クラス名::ファンクション名(引数)で実行</span> <span class="nx"> ・</span> <span class="nx"> ・</span> <span class="nx"> ・</span> <span class="p">}</span> <span class="p">}</span> |
Auth認証でユーザー登録を行う際にEmail重複やusername重複を無くしたい場合(クラスの拡張)
ユーザー登録時、Authでやるとユーザー名は重複できない設定のため、email と passのみでユーザー登録したい場合には面倒。(username固定にしようとするとエラーになる。)
モデルを作って自前でDBへinsertするやり方だとパスワードのハッシュ化が必要になる。
自前でパスワードハッシュを作った場合、ログイン時にAuthでやった時にハッシュ値が違うのでエラーになる。
なので、Auth認証の時に呼び出されているSimpleAuthをコピペして編集し、そっちを読み込ませる方法を使う。
手順
1.simpleauth.phpのコピペ。編集。
2.bootstrap.phpのコピペ。編集。
3.config.phpの編集。
simpleauth.phpのコピペ。編集。
まず、Auth認証時に呼び出されているクラスは下記の場所にあるので、これをコピー。
/auth/classes/auth/login/simpleauth.php
下記のようにフォルダを作り、そこにペースト。
/myauth/classes/auth/login/
中身を下記のように編集。
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 |
<span class="k">namespace</span> <span class="nx">Auth</span><span class="p">;</span> <span class="nx">中略</span> <span class="k">class</span> <span class="nc">Auth_Login_SimpleAuth</span> <span class="k">extends</span> <span class="nx">\Auth_Login_Driver</span> <span class="p">{</span> <span class="nx">中略</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">create_user</span><span class="p">(</span><span class="nv">$username</span><span class="p">,</span> <span class="nv">$password</span><span class="p">,</span> <span class="nv">$email</span><span class="p">,</span> <span class="nv">$group</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="k">Array</span> <span class="nv">$profile_fields</span> <span class="o">=</span> <span class="k">array</span><span class="p">())</span> <span class="p">{</span> <span class="nv">$password</span> <span class="o">=</span> <span class="nb">trim</span><span class="p">(</span><span class="nv">$password</span><span class="p">);</span> <span class="nv">$email</span> <span class="o">=</span> <span class="nb">filter_var</span><span class="p">(</span><span class="nb">trim</span><span class="p">(</span><span class="nv">$email</span><span class="p">),</span> <span class="nx">FILTER_VALIDATE_EMAIL</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="k">empty</span><span class="p">(</span><span class="nv">$username</span><span class="p">)</span> <span class="k">or</span> <span class="k">empty</span><span class="p">(</span><span class="nv">$password</span><span class="p">)</span> <span class="k">or</span> <span class="k">empty</span><span class="p">(</span><span class="nv">$email</span><span class="p">))</span> <span class="p">{</span> <span class="k">throw</span> <span class="k">new</span> <span class="nx">\SimpleUserUpdateException</span><span class="p">(</span><span class="s1">'Username, password or email address is not given, or email address is invalid'</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span> <span class="p">}</span> <span class="nv">$same_users</span> <span class="o">=</span> <span class="nx">\DB</span><span class="o">::</span><span class="na">select_array</span><span class="p">(</span><span class="nx">\Config</span><span class="o">::</span><span class="na">get</span><span class="p">(</span><span class="s1">'simpleauth.table_columns'</span><span class="p">,</span> <span class="k">array</span><span class="p">(</span><span class="s1">'*'</span><span class="p">)))</span> <span class="o">-></span><span class="na">where</span><span class="p">(</span><span class="s1">'username'</span><span class="p">,</span> <span class="s1">'='</span><span class="p">,</span> <span class="nv">$username</span><span class="p">)</span> <span class="o">-></span><span class="na">or_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="nv">$email</span><span class="p">)</span> <span class="o">-></span><span class="na">from</span><span class="p">(</span><span class="nx">\Config</span><span class="o">::</span><span class="na">get</span><span class="p">(</span><span class="s1">'simpleauth.table_name'</span><span class="p">))</span> <span class="o">-></span><span class="na">execute</span><span class="p">(</span><span class="nx">\Config</span><span class="o">::</span><span class="na">get</span><span class="p">(</span><span class="s1">'simpleauth.db_connection'</span><span class="p">));</span> <span class="k">if</span> <span class="p">(</span><span class="nv">$same_users</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="k">if</span> <span class="p">(</span><span class="nb">in_array</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="nb">array_map</span><span class="p">(</span><span class="s1">'strtolower'</span><span class="p">,</span> <span class="nv">$same_users</span><span class="o">-></span><span class="na">current</span><span class="p">())))</span> <span class="p">{</span> <span class="k">throw</span> <span class="k">new</span> <span class="nx">\SimpleUserUpdateException</span><span class="p">(</span><span class="s1">'Email address already exists'</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="k">throw</span> <span class="k">new</span> <span class="nx">\SimpleUserUpdateException</span><span class="p">(</span><span class="s1">'Username already exists'</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="nx"> 以下省略</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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<span class="k">namespace</span> <span class="nx">MyAuth</span><span class="p">;</span> <span class="nx">中略</span> <span class="k">class</span> <span class="nc">Auth_Login_SimpleAuth</span> <span class="k">extends</span> <span class="nx">\Auth\Auth_Login_SimpleAuth</span><span class="p">{</span> <span class="nx">中略</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">create_user</span><span class="p">(</span><span class="nv">$username</span><span class="p">,</span> <span class="nv">$password</span><span class="p">,</span> <span class="nv">$email</span><span class="p">,</span> <span class="nv">$group</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="k">Array</span> <span class="nv">$profile_fields</span> <span class="o">=</span> <span class="k">array</span><span class="p">())</span> <span class="p">{</span> <span class="nv">$password</span> <span class="o">=</span> <span class="nb">trim</span><span class="p">(</span><span class="nv">$password</span><span class="p">);</span> <span class="cm">/*1カ所目:Email形式かどうかの判定なので、バリデーションクラスでやる場合は不要。削除。</span> <span class="cm"> $email = filter_var(trim($email), FILTER_VALIDATE_EMAIL); </span> <span class="cm"> */</span> <span class="cm">/*2カ所目:emptyチェックなので、バリデーションクラスでやる場合は不要。削除。</span> <span class="cm"> if (empty($username) or empty($password) or empty($email))</span> <span class="cm"> {</span> <span class="cm"> throw new \SimpleUserUpdateException('Username, password or email address is not given, or email address is invalid', 1);</span> <span class="cm"> }</span> <span class="cm"> */</span> <span class="cm">/*3カ所目:usernameとemailを元にDB検索し同じユーザがいたらエラーにしている。</span> <span class="cm"> email重複チェックをバリデーションクラスでやる場合 and username重複はOKにしたい場合は不要。削除。</span> <span class="cm"> $same_users = \DB::select_array(\Config::get('simpleauth.table_columns', array('*')))</span> <span class="cm"> ->where('username', '=', $username)</span> <span class="cm"> ->or_where('email', '=', $email)</span> <span class="cm"> ->from(\Config::get('simpleauth.table_name'))</span> <span class="cm"> ->execute(\Config::get('simpleauth.db_connection'));</span> <span class="cm"> if ($same_users->count() > 0)</span> <span class="cm"> {</span> <span class="cm"> if (in_array(strtolower($email), array_map('strtolower', $same_users->current())))</span> <span class="cm"> {</span> <span class="cm"> throw new \SimpleUserUpdateException('Email address already exists', 2);</span> <span class="cm"> }</span> <span class="cm"> else</span> <span class="cm"> {</span> <span class="cm"> throw new \SimpleUserUpdateException('Username already exists', 3);</span> <span class="cm"> }</span> <span class="cm"> }</span> <span class="cm"> */</span> <span class="nx"> 以下省略</span> |
bootstrap.phpのコピペ。編集。
下記のbootstrapをコピー。
/auth/bootstrap.php
下記フォルダ内にペースト。
/myauth/
中身を下記のように編集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="nx">Autoloader</span><span class="o">::</span><span class="na">add_core_namespace</span><span class="p">(</span><span class="s1">'Auth'</span><span class="p">);</span> <span class="nx">Autoloader</span><span class="o">::</span><span class="na">add_classes</span><span class="p">(</span><span class="k">array</span><span class="p">(</span> <span class="s1">'Auth\\Auth'</span> <span class="o">=></span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/classes/auth.php'</span><span class="p">,</span> <span class="s1">'Auth\\AuthException'</span> <span class="o">=></span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/classes/auth.php'</span><span class="p">,</span> <span class="s1">'Auth\\Auth_Driver'</span> <span class="o">=></span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/classes/auth/driver.php'</span><span class="p">,</span> <span class="s1">'Auth\\Auth_Acl_Driver'</span> <span class="o">=></span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/classes/auth/acl/driver.php'</span><span class="p">,</span> <span class="s1">'Auth\\Auth_Acl_SimpleAcl'</span> <span class="o">=></span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/classes/auth/acl/simpleacl.php'</span><span class="p">,</span> <span class="s1">'Auth\\Auth_Group_Driver'</span> <span class="o">=></span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/classes/auth/group/driver.php'</span><span class="p">,</span> <span class="s1">'Auth\\Auth_Group_SimpleGroup'</span> <span class="o">=></span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/classes/auth/group/simplegroup.php'</span><span class="p">,</span> <span class="s1">'Auth\\Auth_Login_Driver'</span> <span class="o">=></span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/classes/auth/login/driver.php'</span><span class="p">,</span> <span class="s1">'Auth\\Auth_Login_SimpleAuth'</span> <span class="o">=></span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/classes/auth/login/simpleauth.php'</span><span class="p">,</span> <span class="s1">'Auth\\SimpleUserUpdateException'</span> <span class="o">=></span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/classes/auth/login/simpleauth.php'</span><span class="p">,</span> <span class="s1">'Auth\\SimpleUserWrongPassword'</span> <span class="o">=></span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/classes/auth/login/simpleauth.php'</span><span class="p">,</span> <span class="p">));</span> |
↓↓↓↓
1 2 3 4 5 6 7 |
<span class="cp"><?php</span> <span class="nx">Autoloader</span><span class="o">::</span><span class="na">add_core_namespace</span><span class="p">(</span><span class="s1">'MyAuth'</span><span class="p">);</span> <span class="c1">//1箇所目:AuthをMyAuthへ変更</span> <span class="nx">Autoloader</span><span class="o">::</span><span class="na">add_classes</span><span class="p">(</span><span class="k">array</span><span class="p">(</span> <span class="c1">//2箇所目:arrayの中身1行を残し、ほかは削除。キー名の先頭をAuthからMyAuthへ。</span> <span class="s1">'MyAuth\\Auth_Login_SimpleAuth'</span> <span class="o">=></span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/classes/auth/login/simpleauth.php'</span><span class="p">,</span> <span class="p">));</span> |
config.phpの編集
/fuel/app/config/config.php
にmyauthパッケージを読みこむように設定を追加する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<span class="sd">/**************************************************************************/</span> <span class="cm">/* Always Load */</span> <span class="sd">/**************************************************************************/</span> <span class="s1">'always_load'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span> <span class="sd">/**</span> <span class="sd"> * These packages are loaded on Fuel's startup.</span> <span class="sd"> * You can specify them in the following manner:</span> <span class="sd"> *</span> <span class="sd"> * array('auth'); // This will assume the packages are in PKGPATH</span> <span class="sd"> *</span> <span class="sd"> * // Use this format to specify the path to the package explicitly</span> <span class="sd"> * array(</span> <span class="sd"> * array('auth' => PKGPATH.'auth/')</span> <span class="sd"> * );</span> <span class="sd"> */</span> <span class="s1">'packages'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span> <span class="c1">//'orm',</span> <span class="s1">'auth'</span><span class="p">,</span> <span class="s1">'myauth'</span> <span class="c1">//⇐myauthを追加</span> <span class="p">),</span> |
よく使いそうなメソッド
ログインしてるユーザのユーザID取得
1 2 3 |
list(, $userid) = Auth::get_user_id(); $email = Auth::get_email(); |
Ajaxでファイルアップロード(画像アップロード)
Restコントローラを使う。
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 |
<span class="cp"><?php</span> <span class="k">class</span> <span class="nc">Controller_Upld</span> <span class="k">extends</span> <span class="nx">Controller_Rest</span><span class="p">{</span> <span class="k">public</span> <span class="k">function</span> <span class="nf">post_img</span><span class="p">(){</span> <span class="nx">Log</span><span class="o">::</span><span class="na">debug</span><span class="p">(</span><span class="s1">'画像アップロード'</span><span class="p">);</span> <span class="nx">Log</span><span class="o">::</span><span class="na">debug</span><span class="p">(</span><span class="s1">'======================================================== (C1) ファイルバリデーションチェック'</span><span class="p">);</span> <span class="k">if</span><span class="p">(</span><span class="nx">Upload</span><span class="o">::</span><span class="na">is_valid</span><span class="p">()){</span> <span class="c1">//検証に成功した場合</span> <span class="nx">Log</span><span class="o">::</span><span class="na">debug</span><span class="p">(</span><span class="s1">'=================================================== (CA) チェック成功の場合'</span><span class="p">);</span> <span class="nx">Log</span><span class="o">::</span><span class="na">debug</span><span class="p">(</span><span class="s1">'=============================================== (Ca) ファイルを保存'</span><span class="p">);</span> <span class="nx">Upload</span><span class="o">::</span><span class="na">save</span><span class="p">();</span> <span class="nx">Log</span><span class="o">::</span><span class="na">debug</span><span class="p">(</span><span class="s1">'=============================================== (Cb) ファイル情報を取得'</span><span class="p">);</span> <span class="nv">$files</span> <span class="o">=</span> <span class="nx">Upload</span><span class="o">::</span><span class="na">get_files</span><span class="p">();</span> <span class="nx">Log</span><span class="o">::</span><span class="na">debug</span><span class="p">(</span><span class="s1">'=============================================== (Cc) エラーフラグに0追加'</span><span class="p">);</span> <span class="nv">$files</span> <span class="o">+=</span> <span class="k">array</span><span class="p">(</span><span class="s1">'error_flg'</span> <span class="o">=></span> <span class="mi">0</span><span class="p">);</span> <span class="c1">//エラーフラグfalse</span> <span class="p">}</span><span class="k">else</span><span class="p">{</span> <span class="nx">Log</span><span class="o">::</span><span class="na">debug</span><span class="p">(</span><span class="s1">'=================================================== (CB) チェック失敗の場合'</span><span class="p">);</span> <span class="nx">Log</span><span class="o">::</span><span class="na">debug</span><span class="p">(</span><span class="s1">'=============================================== (Ca) エラーメッセージ取得'</span><span class="p">);</span> <span class="k">foreach</span> <span class="p">(</span><span class="nx">Upload</span><span class="o">::</span><span class="na">get_errors</span><span class="p">()</span> <span class="k">as</span> <span class="nv">$file</span><span class="p">)</span> <span class="c1">//エラーメッセージ取得</span> <span class="p">{</span> <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$file</span><span class="p">)){</span> <span class="nx">Log</span><span class="o">::</span><span class="na">debug</span><span class="p">(</span><span class="s1">'==========エラーあり'</span><span class="p">);</span> <span class="k">foreach</span><span class="p">(</span><span class="nv">$file</span><span class="p">[</span><span class="s1">'errors'</span><span class="p">]</span> <span class="k">as</span> <span class="nv">$key</span> <span class="o">=></span> <span class="nv">$val</span><span class="p">){</span> <span class="k">if</span><span class="p">(</span><span class="nv">$key</span> <span class="o">==</span> <span class="s1">'message'</span> <span class="o">&&</span> <span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$val</span><span class="p">)){</span> <span class="nx">Log</span><span class="o">::</span><span class="na">debug</span><span class="p">(</span><span class="s1">'==========エラーメッセージ取得'</span><span class="p">);</span> <span class="nv">$files</span><span class="p">[</span><span class="s1">'message'</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$val</span><span class="p">[</span><span class="s1">'message'</span><span class="p">];</span> <span class="c1">//メッセージを格納</span> <span class="nv">$files</span> <span class="o">+=</span> <span class="k">array</span><span class="p">(</span><span class="s1">'error_flg'</span> <span class="o">=></span> <span class="mi">1</span><span class="p">);</span> <span class="c1">//エラーフラグtrue</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="nv">$files</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="cp">?></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 |
<span class="c1">//Ajaxで画像選択時にアップロード</span> <span class="nx">$</span><span class="p">(</span><span class="s1">'.ajax-upload'</span><span class="p">).</span><span class="nx">change</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">){</span> <span class="kd">var</span> <span class="nx">name</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="s1">'name'</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'変更されたフォームのname属性:'</span><span class="o">+</span><span class="nx">name</span><span class="p">);</span> <span class="nx">name</span> <span class="o">=</span> <span class="s1">'#'</span><span class="o">+</span><span class="nx">name</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">file</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">prop</span><span class="p">(</span><span class="s1">'files'</span><span class="p">)[</span><span class="mi">0</span><span class="p">];</span> <span class="kd">var</span> <span class="nx">img_url</span> <span class="o">=</span> <span class="nx">file</span><span class="p">.</span><span class="nx">name</span><span class="p">;</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'選択後ファイル名:'</span> <span class="o">+</span> <span class="nx">img_url</span><span class="p">);</span> <span class="kd">var</span> <span class="nx">filedata</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">FormData</span><span class="p">();</span> <span class="c1">//FormDataオブジェクトを使ってfileデータを送る</span> <span class="nx">filedata</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="s2">"files"</span><span class="p">,</span> <span class="nx">file</span><span class="p">);</span> <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span> <span class="nx">url</span><span class="o">:</span> <span class="s2">"<?php echo Uri::create('/upld/img.json'); ?>"</span><span class="p">,</span> <span class="c1">//相対パスだと画面によってパスが違ってしまうので、Uri::create()を使う</span> <span class="nx">type</span><span class="o">:</span> <span class="s2">"post"</span><span class="p">,</span> <span class="nx">processData</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span> <span class="nx">contentType</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span> <span class="nx">data</span><span class="o">:</span> <span class="nx">filedata</span><span class="p">,</span> <span class="p">}).</span><span class="nx">done</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">json</span><span class="p">){</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'ok'</span><span class="p">);</span> <span class="nx">$</span><span class="p">(</span><span class="nx">name</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="s1">'src'</span><span class="p">,</span><span class="s1">'<?php echo Uri::base(false).'</span><span class="nx">assets</span><span class="o">/</span><span class="nx">img</span><span class="o">/</span><span class="p">..</span><span class="o">/</span><span class="nx">uploads</span><span class="o">/</span><span class="s1">';?>'</span><span class="o">+</span><span class="nx">img_url</span><span class="p">);</span> <span class="p">}).</span><span class="nx">fail</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">jqXHR</span><span class="p">,</span> <span class="nx">textStatus</span><span class="p">){</span> <span class="nx">alert</span><span class="p">(</span><span class="s1">'Error!'</span><span class="p">);</span> <span class="p">});</span> <span class="p">});</span> |
アプリ制作時に注意する点
ユーザ登録をemailとパスのみ(usernameは使わない)でやる場合
FuelPHPのSimpleAuthはデフォルトでは、usernameとpasswordでユーザ登録し、ユーザー情報もusernameとpasswordを元にDBから取得したりしているので、usernameをgestなど重複するものにして登録してしまうと、ログインした際にusernameが重複している他のユーザーのデータも書き換えてしまう&他のユーザーの情報を取得してしまったりする。
なので、’/fuel/packages/auth/classes/auth/login/simpleauth.php’内のusernameを使っているところをemailなどに置き換える必要がある。
(直で書き換えずにコピペしてやった方がいいけども)
サーバーにUPする
ロリポップレンタルサーバーにUPする例
500エラーが起きる場合
プロジェクト名/public/.htaccess
のOptions +FollowSymLinks -Indexesをコメントアウト
publicのみを公開されている場所に置き、それ以外のファイルは外部からは見えない場所におく必要があります(セキュリティのため)。
さくらのレンタルサーバーでは、www が apacheのドキュメントルートになっていて、これを変更することができません。
そのため、publicだけはwww以下において、それ以外はwww外に置きます。
まとめると以下のようになります。
- ホームディレクトリ直下にfuelphpを解凍
/home/user-name/fuelphp/fuel
- fuelphp/public ディレクトリを www以下に移動
/home/user-name/www/public
- public/index.php のパスを変更にします。
/../fuel の部分を
/../../fuelphp/fuel
に変更します。
publicが邪魔な場合
1.publicの中身を全部、publicの上層に移動させる。
2.さっきの3. public/index.php のパスを変更にします。はやらない。