忍者ブログ

STEP UP BLOG

Home > ブログ > 記事一覧

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Laravel4でのリダイレクト指定

世間ではLaravel5のリリースが騒がれていますが、まだまだ案件で使用するには不安な点もあるので未だLaravel4で開発しています。
4から5は大幅に変わっているっぽいので、どこかで踏ん切りをつけて5にジャンプしたいですね。
というわけで今回はリダイレクトです。
Webサイトを作っているといろいろな場面でリダイレクトを使います。
当然Laravelにもリダイレクトの機構があり、しかもLaravelでは様々な書き方ができるので以下にまとめてみました。
// 普通にURLのルート以下を指定
// http://www.hoge.com/login にリダイレクト
Redirect::to('login');

// 識別名を付ける
Route::get('top', array('as' => 'home', 'uses' => 'TopController@index'));
// 識別名で指定して、 http://www.hoge.com/top にリダイレクト
Redirect::route('home');

// コントローラとアクションを指定してリダイレクト
Redirect::action('TopController@index');

// バリデーションエラーなどで入力も一緒にリダイレクト
Redirect::to('edit')->withInput();
// バリデーションエラーなどでエラーメッセージも一緒にリダイレクト
Redirect::to('edit')->withInput()->withErrors($validator);

最後の$validatorはMessageBagのインスタンスです。
http://laravel.com/docs/4.2/validation#error-messages-and-views
http://laravel.com/api/4.2/Illuminate/Support/MessageBag.html
これは、
$errors = new Illuminate\Support\MessageBag();
$errors->add('number', '整数で入力してください。');
Redirect::to('edit')->withInput()->withErrors($errors);

と好きなように作れます。
ビューでは、
@if ($errors->has('number'))
    {{{$errors->first('number')}}}
@endif

とすれば表示できるので活用してみてはいかがでしょうか。
PR

起動スクリプトでのsudoエラーとその解決策

普段はPHPで開発しているのですが、ここ数日はLinuxの起動や終了の流れを調べたり、シェル書いたり、シェル書いたりしてました。
同じIT技術といっても知らないことが多く、頭がこんがらがり中です。
しかし新しいことを覚えると気持ちいいもので、守備範囲が広がると身軽に感じたりします。

今回、OS起動時にしたい処理があり、そのためにいろいろ調べていたのですが、
起動時に実行されるスクリプト(/etc/init.d内のスクリプト)はroot権限で実行されるのですね。
私はそのスクリプト内のある処理を一般ユーザ権限で実行させたかったので、最初は
sudo -u username /hoge/script
と書いていましたが、エラー発生。
調べると、
sudo: sorry, you must have a tty to run sudo
というエラーメッセージが出ていました。
つまりtty(端末)でないところからsudoしているから弾いているというわけです。
解決策を探ったところ、sudoじゃなくてsuでも出来るとのこと。
su - username -c "/hoge/script"
で、めでたく一般ユーザ権限で実行させることに成功しました。
この場合、実行したいコマンドをダブルクオーテーションで囲むことを忘れずに^^

LaravelにおけるEager Loading

LaravelはRuby on Railsの思想を強く受け継いでいるPHPフレームワークです。
したがって、DBからのデータ取得もRailsのActiveRecordのような強力なORマッパーが用意されています。
それがEloquentです(エロクワントと読むらしい…)。
もちろん、1対1や1対多の関連付けも対応しています。
例えば、
class Train extends Eloquent {
    public function stations()
    {
        return $this->hasMany('Station', 'train_id', 'id');
    }
}
こんな感じで路線と駅が1対多で関連付けられます。
こう設定すると、
$trains = Train::all();
foreach ($trains as $train) {
    foreach ($train->stations as $station) {
        echo $station->name."¥n";
    }
}
とか出来ます。
しかもデータが必要になるタイミングでSQLが発行されるので、
無駄なSQLが発行されません。

ただし!!
このように便利なORマッパーにも問題がありまして、
その中でも重大なものが「N+1問題」というものです。
この問題は、1対多などの場合で、最初に親を取ってきて、
ループで関連付けられている子のデータを1つずつ取ってくる、
結果としてN+1回SQLが発行される問題です。
「N+1問題」で検索するとわかると思いますが、これはORマッパーの遅延ローディングでは仕方のないことです。

ですがそこはそれ、Railsの先人達はとっくの昔に気付いており対策が施されています。
それがEager Loadingという概念です。
これだと子をまとめて1回のSQLで取ってきてしまいます。
つまり、SQL発行回数がN+1回から2回になり激減。みんな笑顔^^

同様にLaravelでもEager Loadingが取り入れられています。

http://laravel.com/docs/4.2/eloquent#eager-loading

Laravelでは、
$trains = Train::with('stations')->all();
のようにwith()に設定した関連付けを渡すことで、子もまとめて取得してくれます。
1対多でループしている場合、with()を使うと使わないとではSQL発行回数が桁違いに異なってくるので、
是非とも使用していきたい機能です。

そして、これは例えば孫がある場合も使えます。
駅Stationに駅員Memberが関連付けられているとすると、
$trains = Train::with(['stations', 'stations.members'])->all();
のようにピリオドでどんどん深い関連付けまでまとめて取得してくれます。

ORマッパーは適切に使うとビジネスロジックを直感的に扱うことが出来るので便利です。
つまり、ビジネスロジックをSQLに落としこむ苦労が軽減されます。
ORマッパーの発行するSQLに関しても、Eager Loadingなどを使い適切な実装をすればそこまで効率が悪くなることもありません。
その点に意識的になると、Laravelレベルがまたひとつ上がるのかなと思います。

Laravelでのデバッグツールlaravel-debugbarが使えすぎる

先日、外部から講師を招いて社内Laravel勉強会が開かれました。
どちらかというと初心者向けのチュートリアルで、
知っていることが多かったのですが、
その中でひとつ、これは便利だなというツールがありました。

laravel-debugbar
https://github.com/barryvdh/laravel-debugbar

というLaravelのデバッグツールです。
これを使用すると、ブラウザ上でログや発行されたSQL、ルーティングや呼ばれているビューなどが閲覧出来ます。
便利すぎる。。

こんな便利なツールは使わない手はない! ということで、まずはインストールです。
composer.jsonのrequireに以下の1行を追加。
"barryvdh/laravel-debugbar": "1.*"

そしてcomposer updateします。
次にapp/config/app.phpに以下の2つを追加。
providers配列に
'Barryvdh\Debugbar\ServiceProvider',

aliases配列に
'Debugbar' => 'Barryvdh\Debugbar\Facade',

最後にdebugbar用の書き込みディレクトリを用意。
$ mkdir app/storage/debugbar
$ chmod 777 app/storage/debugbar

これで開発しているサイトにアクセスしてみると、、、
一番下にデバッグバーが表示されます!!!
開発しながら知りたい情報ばかりで、かゆいところにしっかりと手が届くデバッグツールです。
Laravelで開発する上で非常に便利なツールだと思うので是非使ってみてはいかがでしょうか。

Advent Calendarのすすめ

Advent Calendar、もともとは
クリスマスまでの期間に日数を数えるために使用されるカレンダー
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%99%E3%83%B3%E3%83%88%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC

ということなんですが、最近は(というよりもIT業界?)では
インターネット上などで、アドベントカレンダーに見立てて12月に一人、または複数人で毎日記事を投稿していくという企画
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%99%E3%83%B3%E3%83%88%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC

というイベントのほうが意味合いが大きくなっています。
あるテーマに則して毎日記事が上がってくるので、
この期間をチェックすればそのテーマについてある程度網羅出来るのではないかと思います。
特に新しめの技術に関しては紹介的な記事も多く、
1年を総括する上でとても便利なイベントとなっています。
以下のリンクが主要なAdvent Calendarまとめサイトです。
http://qiita.com/advent-calendar/2014
http://www.adventar.org/

興味があるのを見ていくのがいちばんですが、オススメは、
CSS 珍百景 Advent Calendar 2014
http://www.adventar.org/calendars/341
#LOVEFONT Advent Calendar 2014
http://www.adventar.org/calendars/385

でしょうか。会社で取り組んでいるところもありますね。
年末感あっていいですよね。
自分もそろそろ今年を振り返ろうかな。。

PAGE TOP