ざっくりFuelPHP入門

目次

fuelPHPまとめ

環境はMac&MAMPを使ってる前提でまとめています。

FuelPHPは1.7.2を使用。

 

インストール

1.クイックインストーラをインストールする

2.プロジェクト作成する

作成したいフォルダへ移動し、以下コマンド実行。

※今回の場合、testプロジェクトを作成

そうするとtestフォルダが作成され、その中に色々なファイルがインストールされる

※もしdate_default_timezoneなんたら的なエラーが出たら、/etc/php.iniファイル(ルートにあるetcフォルダ内のやつ)のdate.timezone部分を

と変更する。(頭のセミコロン「;」は取ること!)

もしetcフォルダ内にphp.iniファイルがなかった場合

php.ini.default的なのしかなければ、下記のsudo cpコマンドでコピーして名前をphp.iniへ変更。

↑php.ini.defaultファイルを新しい名前のphp.iniファイルとしてコピーするよって意味。

もし、中身を編集してもreadonlyだとエラーが出る場合は、下記のようにsudo chmodコマンド で 権限を664に変更すれば書き込み可能になる。

フォルダ構成

覚えておけばいいところだけ抜き出した構成。

フォルダ構成

ページを開いてみる

‘test’というプロジェクトを作った場合、下記のURLでアクセスするとFuelPHPのWELCOME画面が表示される。

URLとファイルとの対応関係

例えば、下記のようなURLがある場合、

サーバーはhttp://localhost/blog/public/index.phpを呼び出し、welcome/indexがパラメータとして渡され、/で区切られた最初のパラメータ名の「コントローラ」を呼び、次のパラメータ名の「アクション」を呼び出す。

(コントローラー名がWelcomeのwelcome.phpファイル内にある、アクション名indexを呼んでるってこと)

安全なディレクトリ構成へ変更する

WEBサーバの公開ディレクトリ(htdocs)にFuelPHPをインストールした場合、FuelPHPの設定ファイルなどもそこにインストールされるため全て公開されてしまい、あまり良くない。

そこで、htdocsと同階層に違うフォルダを作成(名前は「sample」とかなんでもOK)し、そこにFuelPHPをインストールする。

(必要なら、インストールしたFuelPHPのフォルダに対してアクセス権も設定しておくこと)

その後、httpd.confに下記のようなバーチャルホスト設定を追加する。

そして、/etc/hostsファイルに下記1行を追加する。

※sample.localhostのホスト名は127.0.0.1のipアドレス(自分のPCになる)だよと定義してる

コントローラーからビューへの値の受け渡し方

APPPATH/classes/controller/welcome.php
APPPATH/views/welcome/test.php

他にも、オブジェクト変数で渡すこともできる

APPPATH/classes/controller/welcome.php

上記ケースの場合、アクセスするURLは下記のようになる。

ビューを作る

fuel/app/views内に〇〇.phpという形で作成してあげる。

もし、viewsフォルダ内に別フォルダを作って、その中にビューファイルを置いた場合、コントローラー側でのビューファイルの指定は下記のようにする。

例:viewsフォルダの中にhomeフォルダを作り、その中にビューファイルindex.phpを作った場合

ビュー側
コントローラー側

※ビューに渡される値は全て自動でサニタイズされる。

ビューファイルを入れ子にする

headerやfooterなど別ファイルにして、ビューファイルの中で別のビューファイルを読み込むようにする。

fuel/app/views/head.php
fuel/app/views/content.php
fuel/app/views/footer.php
コントローラー側

画像やリンク、cssの配置

画像やcss、jsに関してはプロジェクト名/public/assetsの中にそれぞれimg,js,cssでフォルダが既に作られているので、その中に置く。

そして、画像を表示させたい時やCSS、jsの読込みしたいときなどはAssetクラスのメソッドを使う。

Assetクラス

Assetクラスのメソッドを使うことで簡単にhtmlに書き出してくれる。

画像を読み込む場合

ビュー内で下記のようにファイルを指定し

公開ディレクトリ配下のassets/img/の中にtitle.pngファイルを配置すればOK。

属性など指定したい場合は下記のように第2引数に指定してあげる。

CSSを読み込む場合

ビュー内で下記のようにファイルを指定し、

公開ディレクトリ配下のassets/css/'の中にbase.css’ファイルを配置すればOK。

aタグを使う場合

※リンク先はコントローラ名/メソッド名の形で指定する

※第3引数は属性をつけたいときに使用する

※第4引数にtrueを指定するとhttpsで始まるリンクになる。

iconを読み込みたい場合

find_fileメソッドを使うと指定したファイルのパスが返ってくるのでそれを使う。

第一引数がファイル名、第二引数がファイルタイプ(imgかjsかcss)、第三引数がフォルダ

上記の場合、assets/icons/内にある画像ファイルのicon.pngのパスを教えて!とメソッドを呼んでいる。

assetsフォルダ内にjs,css,img以外のフォルダを作ってそこのファイルを読み込みたい場合

初期状態では、Asset::jsとやればassets/js内のファイルを指定でき、Asset::cssとやればassets/css内のファイルが指定できるが、

assets/pluginsなどのフォルダ内のファイルを指定したい場合には、下記のようにAssetクラスにパスを追加してやる必要がある。

※今回はjsと指定したので、Asset::jsでファイル名を指定するとデフォルトのassets/jsフォルダ内と新たにパスを追加したassets/pluginsフォルダ内を探しに行く。

コントローラー

コントローラの基本

fuel/app/classes/controllerの中に作成する。

ファイル名は小文字。

www.test.com/example/indexというURLを指定した場合、exampleというコントローラーのindexというアクションが指定されたという意味になる。

Welcome.php

リクエストされたコントローラ名が見つからないorコントローラ名が指定されてない場合

config/routes.phpの設定先に遷移する

モデル・ビューへの呼び出し

ビューへの値の受け渡し方

値の受け渡し方は2通りある。

配列などで受け渡す方法とオブジェクトを作成して受け渡す方法。

引数で受け渡す

ビューのオブジェクトを生成して受け渡す

パラメータを受け取る

URLのアクションメソッド名の後にパラメータを指定することでコントローラ側で受け取れる。

URL
パラメータを受け取るコントローラ

パラメータがいくつ渡されるか不明な場合

※引数をつけなくてもいい

※ビュー側で、foreach文などで変数paramから順に取り出してあげる

before()メソッドでログインチェックなどの各ページ共通処理をする

before()メソッドはURLで指定されたアクションメソッドが実行される前に実行されるので、会員専用ページなどのログインチェックなどに使える。

コントローラーをまとめる

似た機能のコントローラー同士でまとめておきたいなど、classes/controllerの配下にさらにディレクトリを作ってコントローラーを配置したい場合は以下のようにする。

例:会員用機能のコントローラをmembersディレクトリ配下にまとめる場合

ディレクトリ構成
アクセスするURL
アクセスするコントローラ内

ベースのコントローラを作る

会員専用サイトなどで複数のコントローラで同じ処理をさせる場合、各コントローラ内に記述していくよりも、ベースのコントローラを作って、それを継承する形で各コントローラを作ってあげる。

※ベースコントローラと同階層に継承したコントローラを置いても大丈夫

ディレクトリ構成
ベースコントローラ

作ったコントローラを継承する

オートローダのお陰で、クラス定義で名前以外のものを記述しなくても他のコントローラを継承できる。

テンプレートコントローラ

ヘッダ、フッタは共通のものを使い、コンテンツ部分だけ各ページで違う内容にしたいなどサイト全体で共通するHTMLを作成し、一部分だけを入れ替える時に使えるのが「テンプレートコントローラ」

テンプレートコントローラにはあらかじめ、$templateというプロパティが用意されているので、そいつに色々設定してやる。

テンプレートコントローラを使うにはController_Templateを継承してあげる。

テンプレートコントローラを使う
テンプレートhtml(APPPATH/views/template.php)

モデルを作る

まずDBの設定をする

/fuel/app/config/db.phpをいじる。

DBの設定

モデルを作る

Model_Crudクラスを拡張して作る

Model_CrudクラスにはCRUD(作成、検索、更新、削除)するためのメソッドが用意されてるので、簡単な操作くらいならこっちを使えばOK。

例)フォームで入力した内容をDB登録し、そのDB内容を表示する場合

APPPATH/classes/model/post.php
ビュー:登録フォーム(APPPATH/views/post/form.php)
コントローラ:Post(APPPATH/classes/controller/post.php)

フォーム内容をDBへ登録する場合

SQLを書く

SQLをそのまま書くか、クエリビルダというものを使って書くかの2通り。

SQLをそのまま書く場合

※as_array()を使わないと中身が取り出せないので注意!!

クエリビルダを使って書く場合

※クエリビルダを使えば、自動でエスケープしてくれる

クエリビルダを使ったINSERT
クエリビルダを使った件数カウント
クエリビルダを使ったトランザクション

コントローラーからモデルへ

ORMを使う

テーブル同士のリレーション(多対多、1対多など)を定義しておくことで、ひとつのテーブルを更新すると自動的に関連するテーブルも更新してくれたりする。

書き方

\Orm\Modelを継承したモデルクラスを作成し、fuel/app/classes/model/配下に置く。

fuel/app/classes/model/contents1.php

アプリのモジュール化

アプリの規模が大きくなる際などは、アプリの各機能を独立させモジュール化(部品化)してあげた方が開発効率や保守性も高まる。(詳しくはp.52)

アクセスするURL

バリデーション

方法1:add_fieldメソッドを使う

※add_fieldメソッドは文字列の検証しか出来ない略式的なもの

コントローラー内

エラーメッセージの日本語化

1.APPPATH/config/config.phpで’language’を’ja’にする

2.APPPATH/lang/ja/vallidation.phpファイル作成

3.編集する

編集内容

※「: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でないかを調べる場合など

APPPATH/classes/myvalidation.php

エラーメッセージを毎回書くのが面倒ならメソッド側に設定する

認証機能

SimpleAuthを使う。

Authパッケージを使う

使うにはconfig.phpにauthを追加する

テーブルを用意する

デフォルトでは、テーブル名はusersを想定していて、

id,username,password,group,email,last_login,login_hash,profile_fields,created_at

のカラムがあることが前提。

テーブル名だけは設定すれば変更可能。

ユーザ登録

※パスワードは自動でハッシュ化されて保存される

ログイン

※ログインするとusersテーブルのlast_loginにログイン時刻、login_hashにタイムスタンプを基にしたハッシュ値が保存される。

さらに、セッションにユーザ名とログインハッシュ値が保存される。

ログアウト

ログイン状態のチェック

ログイン保持(1週間ログインを保持するなど)をする

1.simpleauth.phpをコピーする

fuel/packages/auth/config/simpleauth.phpfuel/app/config/内へコピペ。

2.コピペしたsimpleauth.phpを編集する

3.コントローラ内のログイン認証でOKだった場合の中で下記を記述する

ユーザグループの設定

1.PKGPATH/auth/config/simpleauth.phpの「groups」セクションにグループの定義を設定する

どのグループに属しているかを調べる場合

ユーザ認証ページの例

サイト構成
① member.php

member用テンプレートビュー

APPPAtH/views/memer/template.php

ログインフォームのビュー

APPPATH/views/member/form.php

管理者用ページ用ベースコントローラ

APPPATH/classes/conroller/member/admin

Sessionクラス

定期的にセッションIDを自動変更してくれたり、次のリクエスト時に削除されるような一時的なセッションの発行もできる。

設定ファイル

初期設定ファイルの場所:COREPATH/config/session.php

初期設定ファイルを以下の場所にコピーして使用する。

コピー先の場所:APPPATH/config/配下

設定詳細はP.169を参照。

基本は設定ファイル内の'expiration_time' => 7200を変更するくらい。

これは、セッションの有効期限を設定するもの。

セッションの読み書き

書き込みはset()メソッド

読み込みはget()メソッド

※Auth認証を使ってるなら自動的にusernameやlogin_hashがSessionに保存されてるので、キーを指定すれば読み書き可能。

削除

フラッシュセッション

フォーム送信時のチケット発行などに使用する。

フラッシュセッションはほかのセッションと名前が衝突しないように別の名前空間で管理されている。

識別子は設定ファイルのflash_idで設定できる。

読み書き

set_flash(),get_flash()を使う。使い方は普通のセッションと同じ。

寿命を延ばす

フラッシュセッションを読み込まれていない状態に戻すことで、次のリクエストまで寿命が延びる。引数にはセッション変数名を指定する。

php:

Session::keep_flash(‘ticket’);

 

削除

※セッション自体(普通のセッションやフラッシュセッション全て)を破棄するならSession::destroy();を使う

ファイルアップロード

Uploadクラスを使う。

設定

Uploadクラスを使うには設定が必要。

デフォルトの設定はアプリ名/fuel/core/config/upload.phpに書かれてるので、アプリ名/fuel/app/config/内にコピペして、必要な箇所のみ修正する。

パスで指定した通り、/public/uploadsフォルダを作成しておく。

使い方

コントローラでまず、Upload::process()メソッドを実行し、ファイル検証やファイル情報の取得を行う。

※ファイル情報はUploadしたファイル数分の連想配列の中にそれぞれのファイル情報が入った連想配列がある形で返される

upload.phpの設定ファイルでauto_processを有効にすると上記のUpload::processメソッドは呼びださなくても自動的に実行してくれる。

Uploadクラスの検証エラーメッセージを日本語化する

以下のようなファイルをAPPPATH/lang/ja/内にupload.phpとして保存すればOK。

ログについて

ログを出力したい場合、app/config/config.php内の下記を変更する。

ログレベルは下記の5段階ある。下に行くほど多く出力される

デバッグ用のログを出力したい場合

下記のメソッドをコントローラー内などで使う。(ログレベルをFuel::L_DEBUGにしてると出力される)

created_atとupdated_atをdatetimeで保存する

FuelPHPはテーブルカラムのcreated_at と updated_at をデフォルトUNIX タイムスタンプで記録するが、datetimeで保存することも可能。

mysql_timestamp のデフォルト値「false」を「true」にすればOK。

create_at
update_at

FuelPHP で自作クラスを自分で作りたい場合

「extends Controller」で継承したコントローラーではなく、普通にクラスを作りたい場合は下記のようにする

①./fuel/app/classes/ 以下に自作クラスを置く

./fuel/app/classes/sample.php

みたいに置けば使える。

呼び出す側の書き方は下のようにやる。

./fuel/app/classes/controller/welcome.php

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/

中身を下記のように編集。

編集前

↓↓↓↓

編集後

bootstrap.phpのコピペ。編集。

下記のbootstrapをコピー。

/auth/bootstrap.php

下記フォルダ内にペースト。

/myauth/

中身を下記のように編集。

編集前

↓↓↓↓

編集後

config.phpの編集

/fuel/app/config/config.phpにmyauthパッケージを読みこむように設定を追加する。

よく使いそうなメソッド

ログインしてるユーザのユーザID取得

Ajaxでファイルアップロード(画像アップロード)

Restコントローラを使う。

他のコントローラと同じく、Controllerディレクトリ内に入れておく

アプリ制作時に注意する点

ユーザ登録を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外に置きます。

まとめると以下のようになります。

  1. ホームディレクトリ直下にfuelphpを解凍

/home/user-name/fuelphp/fuel

  1. fuelphp/public ディレクトリを www以下に移動

/home/user-name/www/public

  1. public/index.php のパスを変更にします。

/../fuel の部分を

/../../fuelphp/fuel

に変更します。

publicが邪魔な場合

1.publicの中身を全部、publicの上層に移動させる。

2.さっきの3. public/index.php のパスを変更にします。はやらない。

BLOGコンテンツをパーソナライズします

あなたは現在「プログラミング学習者」ですか?