FuelPHP Model_XXX::find()->get()は注意が必要

追記 – 平成24年7月24日

find()からレコードがとれたかどうか確認するステップを無くして、
エラーを回避するがためにArrayAccessを使用するやり方は好ましくないとご指摘を頂きました。
確かにそのとおりだと思います。

この記事は、FuelPHPのORMの動きの理解につながると思いますが、
正しい方法では無いので決して使わないでください。

正しい方法はマニュアルに従って下さい。(後日ここに正しい手順で修正したものをあげときます。)

FuelPHP Monkey

// $pkがないときに処理が中断してしまう。
$name = Model_Monkey::find($pk)->get('name');

FuelPHPに含まれているORMパッケージのfindメソッドはPKが存在しないときnullを返します。

なのでそのまま続けて、メソッドチェーンで記述してしまうと、以下のエラーが出てしまいます。

Call to a member function get() on a non-object

これが出てしまうとPHPは処理を中断してしまうため色々と問題になります。

これを回避する方法

(環境はDocsに書いてあるScaffoldを使いました。FuelPHP1.2 Docs Scaffolding)

// findとgetを別々に書く方法 ←これは普通
$row = Model_Monkey::find($pk);
if ($row)
{
    $name = $row->get('name');
}

// PHP5.3 ArrayAccessインターフェースを使う方法 ←良い感じ
$row = Model_Monkey::find($pk);
$name = $row['name'];

// PHP5.4 ArrayAccessインターフェースを使う方法(未検証)
$name = Model_Monkey::find($pk)['name'];

ポイントはArrayAccessを使っていること

なぜArrayAccess

FuelPHPのORMはカラムの値を取得する方法が三種類あります。

存在しないPKでfindメソッドを実行し、
カラムの値を取得する時のエラーの比較をしてみます。

// getterメソッドを使う
// ErrorException [ Error ]: Call to a member function get() on a non-object
$name = $row->get('name');

// マジックメソッドを使う(getterが呼ばれる)
// ErrorException [ Notice ]: Trying to get property of non-object
$name = $row->name;

// ArrayAccessを使う(getterが呼ばれる)
$name = $row['name']; // エラーが出ない。

ArrayAccessを使った最後の例はエラーが出ないです。
なので、Viewで表示する時や色々な場面でこのArrayAccessを使った方法がいいとおもいます。

他にもスマートな方法がありましたら、是非教えて下さいお願いしますm(__)m
おわり。

あとがき

以下のコードはエラーになりません。
そんな特徴を活かした記事でした。

php > error_reporting(-1);
php > $row = null;
php > echo $row['name'];
php >

Tumblrカスタマイズでコード貼り付ける時のCSS追加

Markdown記法で先頭にスペース4つかタブ文字で

{スペース4つ}testtest
↓
<pre><code>testtest</code></pre>

になるのですが、テンプレによってはデザインが崩れたり背景色が無かったりと、
個人的には残念でした。なので簡単なCSSをカスタムCSSとして追加しました。

code{
    font-family: Verdana, Arial, sans-serif,monospace;
}
pre{
    width:700px;
    font-size:13px;
    padding:15px;
    margin-bottom:14px;
    word-wrap: break-word;
    background:#f4f6f7;
    border:2px solid #cdd3d6;
    border-radius:10px;
    box-shadowa:-3px 0 10px
    -webkit-border-radius:10px;
    -moz-border-radius:10px;
}

個人的に一番いいのは、 word-wrap: break-word; ですね。
横に長い文字を折り返して表示してくれます。
これ以外は、見た目の問題なので個人の好みがあります。

結構良い感じやろー

それにしても、MOUってアプリは素晴らしい。。。
プレビューを見ながらMarkdownが自然と書ける。