ご無沙汰のFuelPHP
FuelPHPご無沙汰してます。
ブログの更新もご無沙汰していました。
最近FuelPHPを使ったプロジェクトが一段落し、落ち着いていたらなんと!
本番にもろエラーが出力されてましたwwww
忘れてました!
FuelPHPは何もしないと、エラーを優しく丁寧に教えてくれるので、そのまま出力してリリースすると結構とんでもないことになります。
あああぁ、やっちまった/( ^o^ )\ なんてこったい
ということでエラーを出ないように調整。
今回はPDO使ってDBを参照しているんだけども、PHPでのエラー出力は、例外処理の出力と違う!ってわけで、
PHPのエラー出力を制御しても、DB系のエラーでます!
例えば、変なクエリー「 WHERE id in (1,2,)」こんなのが流れてきた場合、PHPのエラーを出力しないようにしてもちゃんと教えてくれます!優しいです!!!てか、当たり前だ!!気づけよもっと前に!
って気づいた後に、あわわわわわわってなって対策しました。
■PHPエラーが出ないようにする
こっちは簡単。
publicのindex.phpに
error_reporting(0); ini_set('display_errors', 0);
を追記これでPHP系のエラーはでないはず、、、
■SQLエラーがでないようにする
PDOの場合、DBのエラーは,Database_Exceptionで管理されているので、こいつを拡張する。
Bootstrapに
Autoloader::add_classes(array( // Add classes you want to override here // Example: 'View' => APPPATH.'classes/view.php', 'Database_Exception' => APPPATH.'classes/exception.php',//追記 ));
「fuel\app\classes」直下にexception.phpというファイルを作成
class Database_Exception extends Fuel\Core\Database_Exception { public function __construct($message="" , $code="", $e="") { \Log::error('SQL ERROR',$message . " " . $code . " " . $e); exit; } }
と記述。
例外処理が出た場合にログ出力してexitするようにした。
ログは「fuel\app\logs\年月日」に出るよ
てか、即席なのでこんなんでいいのか不安、、、いい方法教えて下さい。
fuelphpで外部ライブラリを読み込む方法
fuelphp1.7で外部ライブラリを使いたいとき。
今回は、Passwordhashというライブラリを使ってみた。
設置する場所:/fuel/app/vendor/
ファイル名:passwordhash.php
以下は外部ファイルの中身
<?php class Passwordhash { ... ... }
このファイルを
これを読み込むときは、controllerなど、そのファイルを使用したいファイルで
以下のように記述すると使える。
<?php \Autoloader::add_class('PasswordHash',APPPATH.'vendor/passwordhash.php'); class Controller_Password extends Controller { public function action_index() { $passhash = new PasswordHash(); } }
はい!これで使えるようになりました!!( ^ω^)
fulephpでの独自バリデーション
fuelphp1.7で独自バリデーションクラスを作ったので忘れないようにメモ。
独自のバリデーションを利用したい場合は、 /fuel/app/classes/controller/ 直下にバリデーションクラスを記述したファイルを設置する。
自分が設置したファイルは
/fuel/app/classes/controller/myvalidation.php
「_validation_」 というプレフィックスをつけてメソッドを用意する。
ファイルの中身はこんな感じ
<?php class MyValidation { /** * 必須チェック * @param array $val * @param int $min 最低チェック数 * @param int $max 最高チェック数 * @return boolean */ public static function _validation_checkbox_require($val, $min=1, $max=3) { if (count($val) >= $min && count($val) <= $max) { return true; } return false; } }
コメントを編集する場合は、
/fuel/app/lang/ja/validation.php
に追加
<?php return array( 'checkbox_require' => ':labelを :param:1 つ以上、:param:2 つ以下で選択して下さい。', );
呼び出すとき
<?php $validation = \Validation::forge(); //独自バリデーションクラスを呼び出し $validation->add_callable('MyValidation'); $validation->add('check' , 'チェックボックス')->add_rule('checkbox_require',1,3);
簡単だったね( ^ω^)
fuelphpでのsession
またまたfuelphp。(fuelphp1.7)
最近fuelをいじっているので、忘れないためにメモメモ。
fuelphpでのsessionはcodeigniterと同じくデフォルトではcookieにデータが書き込まれます。
そして、セッション情報は暗号化されてCookieに埋め込まれるという点も同じ。
セッションが多くなればなるほどcookieの情報が多くなるので注意してください。
多くなる恐れがある場合は、別のドライバを使用しましょう。
ドライバの種類は、cookie,file,db,memcached,redis があります。
別のドライバを利用したい場合は、APP_PATH/config/session.phpというファイルを作成し
以下の様な形式で保存し、'driver'部分を変更します。
<?php return array( 'auto_initialize' => true, 'driver' => 'redis', 'match_ip' => false, 'match_ua' => true, 'cookie_domain' => '', 'cookie_path' => '/', 'cookie_http_only' => null, 'expire_on_close' => false, 'expiration_time' => 7200, 'rotation_time' => 300, 'flash_id' => 'flash', 'flash_auto_expire' => true, 'post_cookie_name' => '', 'cookie' => array( 'cookie_name'=> 'fuelcid', ), 'file' => array( 'cookie_name' => 'fuelfid', 'path' => '/tmp', 'gc_probability' => 5 ), 'memcached' => array( 'cookie_name'=> 'fuelmid', 'servers' => array( 'default' => array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100) ), ), 'db' => array( 'cookie_name' => 'fueldid', 'database' => null, 'table' => 'sessions', 'gc_probability' => 5 ), 'redis' => array( 'cookie_name' => 'fuelrid', 'database' => 'default' ) );
もちろんのことですが、memcached,db,redisはそれぞれがサーバーにインストールされていないとエラーが起こりますので注意してください。
fuelphpでredisを使ってみた
<? php //インスタンスの生成 //$nameはredis接続先config.phpのredis設定 $redis = Redis_Db::forge($name); $redis->set('key', 'value'); $a = $redis->get('key'); var_dump($a) . "\n"; $redis->del('key'); $a = $redis->get('key'); var_dump($a) . "\n"; $redis->rpush('key', 'a'); $redis->rpush('key', 'b'); $redis->rpush('key', 'c'); $redis->rpush('key', 'd'); $a = $redis->lrange('key',0,-1); var_dump($a) . "\n"; $redis->lpush('key', 'a'); $redis->lpush('key', 'b'); $redis->lpush('key', 'c'); $redis->lpush('key', 'd'); $a = $redis->lrange('key',0,-1); var_dump($a) . "\n"; //有効期間は一時間 $redis->expireAt('key',time()+3600); //削除 $redis->del('key'); 出力結果 string(5) "value" NULL array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } array(8) { [0]=> string(1) "d" [1]=> string(1) "c" [2]=> string(1) "b" [3]=> string(1) "a" [4]=> string(1) "a" [5]=> string(1) "b" [6]=> string(1) "c" [7]=> string(1) "d" }
fuelphpでのpagination
fuelphp(ver1.7)のpaginationで少々ハマったのでメモ。
1~7ページまであったとして、
1ページ目にいるとき
1 2 3 4 5 6 >> 最後
2-6ページ目にいるとき
最初 << 1 2 3 4 5 6 7 >> 最後
7ページ目にいるとき
最初 << 1 2 3 4 5 6 7
こんな感じで出力したかったのだが、
すべてのページで、すべてのリンクが出てしまった。
最初 << 1 2 3 4 5 6 >> 最後
色々やった結果以下の様なconfigに設定すればOKだった。
/app/config/pagination.php <?php return array( // the active pagination template 'active' => 'default', // default FuelPHP pagination template, compatible with pre-1.4 applications 'default' => array( 'wrapper' => "<div class=\"pagination\">{pagination}</div>", 'first' => "<span class=\"first\">{link}</span>", 'first-marker' => "最初 ", 'first-link' => "<a href=\"{uri}\">{page}</a>", 'previous' => "{link}", 'previous-marker' => "<<", 'previous-link' => "<a href=\"{uri}\">{page}</a>", 'previous-inactive' => "", 'previous-inactive-link' => "", 'regular' => " {link} ", 'regular-link' => "<a href=\"{uri}\">{page}</a>", 'active' => " <span class=\"active\">{link}</span> ", 'active-link' => "<a href=\"{uri}\">{page}</a>", 'next' => "{link}", 'next-marker' => ">>", 'next-link' => "<a href=\"{uri}\">{page}</a>", 'next-inactive' => "", 'next-inactive-link' => "", 'last' => "<span class=\"last\">{link}</span>", 'last-marker' => " 最後", 'last-link' => "<a href=\"{uri}\">{page}</a>", ), );
ポイントは
'previous-inactive' => "",
'previous-inactive-link' => "",
'next-inactive' => "",
'next-inactive-link' => "",
ここを空で設定すること。
'first-inactive','first-inactive-link','last-inactive','last-inactive-link'
この設定項目は、出力したくない場合は書かなくてもいいみたい。
空で設定するのとそもそも消していいのと、違うのね。。