booklook

laravel 5.1~ phpstormでクエリービルダーのauto completeを効かせる

phpstorm使ってますか?

phpをメインに開発してるなら今すぐ導入しましょう。

有料で年10000円くらいですが、使いやすさを考えると安すぎるくらいです。

 

そんなphpstormでlaravelのプロジェクトを作るときにお手軽にコード補完をする方法。

お手軽なのでモデル(Eloquent)周りの、さらにquery builder周りだけです。

「composerとかide-helperとかこわい」って人向けです。

 

まずはTestという名前のEloquentを作ります。使用テーブルはtest_table.

そしてTestControllerから「SELECT column1 FROM test_table;」を実行するというコードを書く。

 

WS000174

 

 

 

 

WS000173

 

「そんなメソッドないよ」って言われてます。マジックメソッドですからね。

__callメソッドで指定しているものまでは補完してくれません。でも補完してほしいですね。

 

そんなときはModelクラスに直接PHPDocを追加です。

WS000177

WS000176

 

ちゃんと補完されるようになりました。

「Modelクラスには、\Illuminate\Database\Query\Builderクラスを戻り値として返すselectっていうstaticメソッドありますよ」

って教えてあげたからですね。

参考までにこのクラスを作り出してるのは下のModelクラス内の__callマジックメソッドです。

(正確には、今回はTestクラスのstaticメソッド呼び出し(Test::select)してるので

  1. __callStaticが呼ばれて、自分自身のインスタンスのselectメソッドを呼ぶ
  2. __callが呼ばれて、newQueryメソッドで\Illuminate\Database\Query\Builderインスタンスが生成され、\Illuminate\Database\Query\Builderクラスのselectメソッドが呼ばれる

)

WS000178

 

これで怖いものなしですね。

もしかしてjoinの中でも補完したいとお思いかもしれません。

WS000179

 

そんな時も大丈夫。この$joinは何かといえば、\Illuminate\Database\Query\JoinClause クラスです。

WS000181

 

なので、関数内に…

WS000182

 

やりました。

なんだか長いんだよなーって気になる方にはこちら。

use Illuminate\Database\Query\JoinClause;をコントローラに追加して…

WS000183

スッキリしました。

これまた参考ですが、\Illuminate\Database\Query\JoinClosure クラスを返しているのはこちら。

 

WS000180

 

\Illuminate\Database\Query\Builderクラスのjoinメソッド内で、最初のif文の中でnewされてますね。

これがcall_user_func($one, $join);の2つめの引数として渡され、function($join)の引数になるわけです。

 

これでお手軽にコード補完ができました。

悪いプログラムを書かないようにするには?

「良いプログラムとは?」と聞かれると結構千差万別ですが、悪いプログラムはえてして共通してます。

で、その悪いプログラムを書かないようにするには、「適切な名前を付ける」ことが簡単でおススメです。

深く考えていくと難しいのですが、コード上ですぐできるという意味では非常にお手軽で効果も高い。

お買い得なのです。

 

悪い例

WS000166

checkとはいったいなんなのか?

checkとは値を変えることも含む言葉なのか?

そもそも$dataとは何を投げればいいのか?

困りものです。

 

「この関数・クラスはそもそも何をやっているのか?」を明示しましょう。

 

改善1

WS000169

and多すぎ。

名前を明示すると「ちょっとこの関数でやりすぎじゃないか?」と感じますね。

現状を隠さずはっきりと見つめることで問題が浮かび上がってきます。掃除やダイエットと同じです。

 

さらに改善

WS000170

 

何が必要なのかわかってきましたね。実はclient_id以外はいらなかったのです。

さらに名前もコードも呼び出すときに必要あれば追加すれば良かったのです。チェックする人が勝手に直したら隠蔽です。

 

めでたしめでたし。

これで後からプロジェクトに参加する人も楽しく働けましたとさ。

Cakephp 2.x でページネートの結果をキャッシュ

Webアプリケーションのパフォーマンス改善の筆頭といえばキャッシュです。

データベースへなどへのアクセスが必要なデータをメモリやファイルに持っておけば負荷も減りますし、頼もしい限り。

 

Cakephp (2.x)では、基本的に

キャッシュにデータ書き込み
$result = array(‘result’ => 100);
Cache::write(‘result’, $result, ‘paginate_cache’);

 

キャッシュデータ呼び出し
$result = Cache::read(‘result’, ‘paginate_cache’);

//result = array(‘result’ => 100)

 

で大丈夫なんですが、ページネータの場合はさらに2つの操作が必要になります。

リクエストオブジェクトのparamsパラメータの’paging’キーのキャッシュと、コントローラ内でのPaginatorHelperの使用宣言です。

 

pagingキーに入っている値っていうのはカウント数とか、ページ数を持っている配列ですね。

↓こういう値が入ってます。

WS000076

んで、キャッシュするときにこの値もちゃんとCache::writeでとっておかないと、「結果0件なのに表示されてる。。。けど1ページ目しかない」みたいな表示にバグります。

なので、

$paging = $this->request->params[‘paging’];

Cache::write(‘paging’, $paging, ‘paginate_cache’);

 

$paging = Cache::read(‘paging’, ‘paginate_cache’);

$this->request->params[‘paging’] = $paging;

 

のように、キャッシュを呼び出す時にもう一回設定しなおさないとダメなんですね。

2つめの「PaginatorHelperの使用宣言」ってのはこういうのです。

WS000074

これを設定しておかないと、クエリパラメータとかちゃんととってくれません。 Cakephpのコードを見てみると、確かにPaginatorComponentのpaginateメソッドの最後で設定してます。

WS000077

キャッシュを使うときはこのpaginateメソッドを通らないので、自分で設定しておく必要があるってことですね。 これで Order by とかが重くなりがちなpaginateも余裕のクリアです。

でも売り切れ状態とかリアルタイムでほしいステータスもキャッシュしてしまうので気をつけてください。

謹賀新年

新年明けましておめでとうございます。

旧年中は格別のお引き立てを賜りまして、誠にありがとうございます。

昨年は新たな仲間も加わり、より一層賑やかになったブックルックチームです。
これから新しい仲間達と力を合わせて、より一層飛躍して行きます!!

本年もどうぞよろしくお願い申し上げます。