2012年09月

FuelPHPで自作のClassを格納する場所とその呼び出し方

早川聖司(2012)FuelPHP入門 ソーテック社
FuelPHP入門FuelPHP入門
著者:早川 聖司
販売元:ソーテック社
(2012-06-02)
販売元:Amazon.co.jp
クチコミを見る

には、MでもCでもVでもない自分で作ったClassをどこにおいてどうやって呼び出すか書いていません。
そして、公式のマニュアルを見ても、いまいちよくわからない気がします。
私は…わかるまでひどく時間がかかりました。

googleで「自作 クラス fuelphp」で検索すると、共通処理クラスを作りたい場合にどうしてますか?がでてきて、もう、なんといいますか、質問者の方の意図(私の疑問とほぼ同じ疑問をもっている方です)と、回答している方々の回答がかみ合って無くて、ああ、難しいなあと思いました。

公式のマニュアルはクラス - 概要 - FuelPHP ドキュメントになるのですが、結局どこに自作のclassを置いていいかがわかりませんでした。

多分、同じところでつまづく方がいらっしゃると思うので、記録に残します。

自作のClassの置き場所
 APPPATH/class/の配下
例えば、
 APPPATH/class/test.php

そこに例えば、
<?php
class Test
{
public function a()
{
return "OK";
}
}
と書いて、
 
APPPATH/class/controller/test.php

$test = new test();
var_dump( $test->a() );
と書くと、OKと表示されます。
classのファイルをincludeする必要はなくて、
APPPATH/class/の配下にファィルを規則にしたがったファイル名とclassの名前を規則にしたがって定義すれば、オートロードされます。

ちなみに、 Codeigniterみたいにfunctionををおくための場所はないみたいですので、自分の今までの資産はclassに書き換えることになるのかなと思います。 
 

FuelPHPでPostgreSQLを使う場合のSimpleAuthのDatabase tableについて

FuelPHPでSimpleAuthを使う場合、 ログインユーザーの情報を保持するためのテーブルが必要です。
mysqlだとIntroduction - SimpleAuth - Auth Package - FuelPHP Documentationに書いてある通り以下のようなテーブルの定義になります。

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` ) ) 

Postgresqlの場合は以下のようになるかと思います。

CREATE TABLE test_users (
    id SERIAL PRIMARY KEY ,
    username VARCHAR( 50 )  NOT NULL ,
    password VARCHAR( 255 )  NOT NULL ,
    "group" INT NOT NULL DEFAULT 1 ,
    email VARCHAR( 255 )  NOT NULL ,
    last_login VARCHAR( 25 )  NOT NULL DEFAULT 0,
    login_hash VARCHAR( 255 )  NOT NULL  DEFAULT '',
    profile_fields TEXT NOT NULL,
    created_at INT NOT NULL ,
    UNIQUE (
        username ,
        email
    )
);
GRANT ALL ON test_users TO PUBLIC ;
GRANT ALL ON test_users_id_seq TO PUBLIC ;

※テーブルの名前のデフォルトの設定は、usersです。
 上記のようにテーブルの名前をかえた場合は、APPPATH/config/simpleauth.phpにテーブルの名前がtest_usersであるという設定を書く必要があります。

※GRANTはTO PUBLICになっていますが、それらしいユーザーを設定しましょう。

※ usernameがVARCHER(50)になっていのますが、多分50文字にこだわる理由はないと思います。50文字をこえるユーザー名を設定するユーザーがいたらそれはそれでどうかなーと思いますが。PostgreSQLではVARCHARを使う理由はない(TEXTで良い)とどこかで見た気がしますので、TEXT型でいいかなーと思います。

ポイントは2つあります。
1. 列名groupは予約語なので、"group"すること
2.  login_hashにDEFAULT ''を追加すること

2.でDEFAULTの値を設定しないと、ユーザーの作成の際のINSERTに失敗します。
失敗の要因は「 login_hash」はNOT NULLです、になります。

simpleauth.phpを見ると
$user = array(
'username'        => (string) $username,
'password'        => $this->hash_password((string) $password),
'email'           => $email,
'group'           => (int) $group,
'profile_fields'  => serialize($profile_fields),
'created_at'      => \Date::forge()->get_timestamp()
);
$result = \DB::insert(\Config::get('simpleauth.table_name'))
->set($user)
->execute(\Config::get('simpleauth.db_connection'));
と書いてあります。
login_hashの列がないので、 login_hashにDEFAULT ''を追加しないと駄目です。

※MYSQLの場合は、NOT NULLの列にデフォルトの値が入っていなくても、空文字が挿入されるのかなあと想像します。

※AuthパッケージはemailアドレスがかぶるとユーザーIDの登録ができないようになっています。
 サービスにもよると思いますが、emailがかぶっていても登録できた方がいい場合もあるので(ErogameScapeのように気軽にユーザーIDを取得して情報を登録できるようなサイトな場合)、必要に応じてソースをいじってみてもいいかなと思います。

動くかどうかを確かめた結果が以下のような感じです。
ユーザーの作成
$auth = Auth::instance();
$auth->create_user("uid","passweord","mail@mail.co.jp");
すると、
 ap2=# SELECT * FROM test_users ;
 id | username |                   password                   | group |      email      | last_login | login_hash | prof
ile_fields | created_at
----+----------+----------------------------------------------+-------+-----------------+------------+------------+-----
-----------+------------
  1 | uid      | xvBIQwcBRf0+l56uTmeAVM3MqfkI8w5jfD3VF6mJ59k= |     1 | mail@mail.co.jp | 0          |            | a:0:
{}         | 1348325469
(1 行)

ログイン
$auth = Auth::instance();
if( $auth->login("uid","passweord") )
{
var_dump("OK");
}
すると、
ap2=# SELECT * FROM test_users ;
 id | username |                   password                   | group |      email      | last_login |                lo
gin_hash                | profile_fields | created_at
----+----------+----------------------------------------------+-------+-----------------+------------+------------------
------------------------+----------------+------------
  1 | uid      | xvBIQwcBRf0+l56uTmeAVM3MqfkI8w5jfD3VF6mJ59k= |     1 | mail@mail.co.jp | 1348325657 | 83843e97111e17d36
62cd7148d7c9ce3f6a2b83c | a:0:{}         | 1348325469
(1 行)
last_loginに時刻、login_hashにハッシュ値 が入ります。

ログイン中かを確認
if( Auth::check() )
{
var_dump(Auth::get_screen_name());
}
では、特にDBの内容はかわらなくて、
$auth = Auth::instance();
$auth->logout();
 ログアウトしても、DBの内容はかわらないです。

再度ログインすると
UPDATE "test_users" SET "last_login" = 1348496738, "login_hash" = 'cb94453fab5e4e05ab012457c167879e95de6e22' WHERE "username" = 'uid'
なクエリが実行されて、 last_loginの時刻、login_hashのハッシュ値 が書き換わります。

 

 


FuelPHPでPostgreSQLを使う場合のdb.phpについて

FuelPHPはPostgrSQLが非標準だそうです。
 → PHPカンファレンス 2012 フレームワークアップデート

でもPDOドライバ使えば特に問題なく(と思っています…)使えます。
マニュアルの通りテーブルを作ってAuth パッケージがちゃんと動くことを確認しました。

※ネイティブのドライバがないことのデメリットが自分には分かりません…PDOを介すと遅いとかあるのでしょうか…

PostgreSQLにPDOドライバで接続するためのdb.phpの書き方はマニュアルに書いてある通りで
'production' => array( 'type' => 'pdo', 'connection' => array( 'dsn' => 'pgsql:host=localhost;dbname=fuel_db', 'username' => 'your_username', 'password' => 'y0uR_p@ssW0rd', 'persistent' => false, ), 'identifier' => '"', 'table_prefix' => '', 'charset' => 'utf8', 'enable_cache' => true, 'profiling' => false, ), 
のようになります。

さて、「PostgreSQL fuelphp pdo」で検索するとFuelPHP、PDO、Postgresで実験。 : 生存戦略 しましょうかのページが引っかかります。

ここに、 identifier は
'"' ←ダブルクオーテーション(")をシングルクォーテーションで囲う
または
'' ←空にする
と書いてありますが、マニュアルの通り'"'が正解かなと思います。

大抵の場合、''で問題ないのですが、 列名に予約語…たとえばtimestampだったりgroupだったりする場合、列名を"で囲わないといけないので、'"'が正解だと思っています。

Authパッケージを使う際には、groupという名前の列を持つテーブルを作成しないといけないので、そこではまります。 

FuelPHP、PDO、Postgresで実験。 : 生存戦略 しましょうかのページ では、その後に、mb_convert_encodingでSJISからUTF8に変換しないと日本語の挿入でエラーがでたと書いてありましたが、これは…どこかの設定がSJISなんじゃないかなと思います。私の環境では、 mb_convert_encoding は特にいりませんでしたし、いらないと思います。

また、 マニュアルにがちょっといけてなくて、「データベースの設定ファイルは APPPATH/config/db.php にあります」と書いてあるので、そのdb.phpを編集するとNGです。
APPPATH/config/development/db.php、 APPPATH/config/production/db.php、もそれなりに書き換えてあげないとNGです。

APPPATH/config/db.phpをちゃんとPDOドライバで書いているのに、なぜかmysqlで接続しようとしていて、なぜかと思ったら、そういうことでした。

※Fuelphpは、設定が上書きされていきます。 APPPATH/config/db.php とAPPPATH/config/development/db.php に同じ項目があった場合、APPPATH/config/development/db.php の設定で動きます。

早川聖司(2012)FuelPHP入門 ソーテック社には、ちゃんと APPPATH/config/development/db.php を変更しますと書いてあるのですが、マニュアルの通りにやってすっかりはまりました…




 


PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/apc.so' - /usr/lib64/php/modules/apc.so: undefined symbol: pcre_exec in Unknown on line 0

PHPのAPCがインストールされている状態でPHPのVerをあげて、phpを実行すると以下のエラーがでます。

 [user@hostname ~]$php -v
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/apc.so' - /usr/lib64/php/modules/apc.so: undefined symbol: pcre_exec in Unknown on line 0

PECL - Wikipediaに書いてあるようにPECL拡張モジュールはPHP内部のAPIに依存する部分があるため、PHPのバージョンアップに伴いAPIが変更された場合は再コンパイルを必要とします。

自分は[PHP] APCの導入(失敗)&エラーが起きていたので適当に直しましたに書いてあったように
# pecl upgrade APC-beta
でAPCのBeta版の最新版にあげてしまいました。

再コンパイルせよと書いてあるので、本来のやり方は
  1. ソースをダウンロードしてくる
  2. phpize
  3. make
  4. make install
 になるのかと思います。
peclのコマンドで同じことをするコマンドが見当たらなかったのでなんともですが、多分、一度アンインストールして再インストールする…
  1. upgrade uninstall APC
  2. upgrade install APC
なのかな…と思います。


早川聖司(2012)FuelPHP入門 ソーテック社 をPart8まで読んで

Part6からPart8までの内容は以下の通りです。
  • フォーム
  • Validation
  • 認証とセッション管理
Part6からPart8まではパソコンの前で読んだ方がいいかなと思います。
Part5まではCodeigniterをいじったことがあれば、何も調べなくても、まあ、そんなもんかなと頭に入ってくると思います。
Pqrt6からは、あれ?と思ったことを、googleで調べる環境があった方がいいと思います。
本だけで完結していないのは、まあ…、それはそれで問題な気もしますが、FuelPHPの紹介のダイジェスト本と思えばそれでもいいかなという気がします。

googleで調べて思ったのですが、私がFuelPHPに興味を持ったころから比べて、有志の方による和訳や、日本語の例がとても増えていて、少なくともFuelPHP入門で疑問に思ったことを解決するだけの日本語の情報はどこかにあると思って間違いないと思います。いや…Pqrt9以降にあるのかもしれないですが…

ここからは本の内容ではなくてFuelPHPの内容です。
認証のためのAuthパッケージはとてもいいと思いました。
どうやったらいいか迷うことなく使えそうな気がします。

フォーム、ValidationはPEARやCodeigniterと同様にちょっと取っつきにくそうというイメージでした。
車輪の再開発はやってはいけないのですが、日曜プログラマー程度ですと、フォームとかは自分でゴリゴリ書いた方が、やりたいことができる…例えば「デザインをこうしたいなー」とか「ここの入力はjavascriptでチェックして、こう返したいなー」とかがすぐにできる、ので、使うのに躊躇します。
確かに、いちいち<form>とか書くのはだるいのですが。
ログイン等の簡単なフォームで使ってみて、ゲームのデータの入力等にも使えるかを判断しようかなと思います。

内容が本ではPart5からの内容になるのですが、FuelPHPのモデルは比較的単純なDBだったらすごく使える気がしました。ormってすごいなと…
SQLを日常的に直接ガリガリ書いているとORMってめんどくさい…思っていたのですが、なんとなく使いどころが分かった気がします。

こんなことをCodeigniterを学んだ時にも書いた気がするのですが、結局、SQLを直接ガリガリ書いていました。
フレームワークのSQL生成機能を使うと、SQLの見通しが悪いと思っています。
スロークエリがあった場合に、クエリ文字で検索するとどのスクリプトのSQLかが分かったりして便利です。
でも、考えると、そんな複雑なクエリは、SQLを直書きする気がしますので、ケースバイケースで、簡単なクエリはフレームワークの機能を使って、複雑なSQLは直書きと使い分けるのがいいかもしれませんね。

自分は…多分、これからも直書きするかなあ…
SELECT id
     , name
  FROM userlist
とか、スクリプトに直書きしたいです… 見やすいですし…

まとめも何もないですが、FuelPHPの日本語の情報が増えていてびっくりです。
やる気が出てきました。

FuelPHP入門は、重要そうなことを何ページかでさらっと書いてるので、多分、自分でやってみるとつまづくんだろうなと思います。例えばCSRFの説明は1.5ページで終わっていて、当然読者がCSRFのなんたるかを知っていて、使いどころを知っていることが前提です。あとは自身で組み込めってことだと思うのですが、躓きそうです。でも、googleでAuthパッケージを 検索すると 、ちゃんとCSRF対策の行もあるので、まあ、なんとかなるかなという感触です。

また、モジュール化とHMVCについては、5ページ説明があるのですが、\を付け忘れてつまづいたり、いざモジュール化しようみようと思い立ったときに、すごいつまづく気がします。

[PHP][FuelPHP][FuelPHP Advent Calendar 2011]FuelPHP動作実験 - 実験くんソースをModulesに閉じ込めてモジュール分割してみる。(ヌル日記)

こちらのドキュメントの「作業のキモ」が、とてもキモな気がしますので、自分のためにリンクをはっておきます。

早川聖司(2012)FuelPHP入門 ソーテック社 をPart5まで読んで

早川聖司(2012)FuelPHP入門 ソーテック社 をPart5まで読みました。
多分4時間くらいでPart5まで読んだと思います。

FuelPHPに興味を持たれた方が書籍として購入する選択肢は2012/ 09/04現在で2つです。

  1. 早川 聖司(2012)FuelPHP入門 ソーテック社
  2. 鈴木憲治(2012)はじめてのフレームワークとしてのFuelPHP 達人出版会
後者はpdfですので、pdfを読める環境でないと読むことができないので、外でpdfを読む環境がない私はとりあえず前者を購入して読もうと思いました。

FuelPHP入門FuelPHP入門
著者:早川 聖司
販売元:ソーテック社
(2012-06-02)
販売元:Amazon.co.jp
クチコミを見る

Part5までの感想は以下の通りです。
  • 間違いが意外と多い(phpと関係ないところで、DBの定義が間違っていて、多分、この本の対象読者の方はDBも扱える方々を想定していると思うので気づくと思うのと、その後ろのページのMYSQLの出力画面はあっているので大丈夫だと思います)
  • 間違いの正誤表が今のところない(技術評論社の本だったら、多分、正誤表があったんだろうなあと思います。)
  • PHPの初心者向けではない
  • MVCモデルの初心者向けではない
  • 実行するとNOTICEな警告がでる書き方をしている(と思う)部分があって、初級者以上向けなのかもちょっと考えてしまった
  • array_walkが例文ででているので、array_walkを知っているレベル以上の方が対象かな。array_walkを見て、php初心者向けでもプログラムの初心者向けでもないと思いました。(自分はarray_walkがちゃんと使えません…)
  • 他のフレームワークを使ったことがある方々向けです
自分は、Codeigniterを使ってサイトを作ったことがあるので、すっと入ってきます。
Codeigniterを使ったことがある方が、FuelPHPってどんなもんかなと思って読むのはいいと思います。
他のフレームワークは挫折したのでなんともですが、多分、他のフレームワークを使ったことがあれば大丈夫だと思います。

Amazonのレビューは2012/09/04時点で4件登録されています。
4件とも「確かに」と思うことが書いてあります。

「フロントエンドエンジニアという立場」で「phpを触るのは普通にphpを使うのとwordpressくらい」な方が1点をつけて「フレームワーク初心者視点でかかれているとは思えない」と書いています。
この方ぐらいの段階ですと、「他のフレームワークを使ったことがない」という時点で、 FuelPHP入門は駄目だと思います。それは確かに1点だと思います。

FuelPHP入門は、PHP初心者向けではなく、フレームワーク初心者向けでもなく、PHPを日常的に使っていて、フレームワークも使ったことがある方が、FuelPHPってどんなもんかなというのを感じるための本だと思います。

記事検索