Laravel初心者がつまづきがちな22個のポイント?

この記事は [Laravel Advent Calendar 2015](http://qiita.com/advent-calendar/2015/laravel) の 12/17 の記事です。全然埋まってなくてﾜﾛﾀ。ﾜﾛﾀ…。

[Symfony初心者がつまづきがちな22個のポイント](http://qiita.com/tarokamikaze/items/b6cb73be0294fe6b14c1) という記事を見つけたので Laravel 版も書いてみようと思います。

## 01.この案件にLaravelを使いたいんですが

- PHP の案件
- PHP らしいゆるふわさが良いと思ってる
- でもかっちりと書ける
- 規約で縛られるのが苦手
- 学習コストは低いほうが助かる

という人にはオススメできると思います。

## 02.公式サイトどこ？

[laravel.com](http://laravel.com/)が公式サイトです。[@Hirokws](https://twitter.com/Hirokws) さんがドキュメントの[日本語訳](http://readouble.com/)を作ってくれてます。英語が苦手な人も安心ですね。

## 03.日本語の本はありますか？

今年の春に [Laravelエキスパート養成読本](http://www.amazon.co.jp/Laravel%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88%E9%A4%8A%E6%88%90%E8%AA%AD%E6%9C%AC-%E3%83%A2%E3%83%80%E3%83%B3%E3%81%AA%E9%96%8B%E7%99%BA%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8BPHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%EF%BC%81-%E5%B7%9D%E7%80%AC%E8%A3%95%E4%B9%85-ebook/dp/B00WHEJDKK/) が出ました。…が、執筆時のバージョンがLaravel4だった(現在は 5.1)ので内容としては少し古いですが、役立つ部分はまだ多いと思います。

来年には 5.1 LTS 対応の [Laravel リファレンス](http://www.amazon.co.jp/Laravel-%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-Ver-5-1-LTS-Web%E8%81%B7%E4%BA%BA%E5%A5%BD%E3%81%BF%E3%81%AE%E6%96%B0%E4%B8%96%E4%BB%A3PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF/dp/4844339451/)が出版されますのでもうちょっと待ってくださいね。

## 04.ここは読んどけって記事はありますか？

これ！というのはないのですが、[@Hirokws](https://twitter.com/Hirokws) さん や [@ex_takezawa](https://twitter.com/ex_takezawa)さん、[@shin1x1](https://twitter.com/shin1x1)さんのブログエントリは参考になるものが多いです。よかったら僕のブログとか qiita の記事とかも読んでください。

## おすすめのバンドルは？

Laravel では拡張とかパッケージと言っていますが…

元記事と比較しますと…

- ユーザー/ログイン管理
  - 標準でついている
- マイグレーション
  - 標準でついている
- フィクスチャ
  - 標準でついている(モデルファクトリー)

という感じです。他の便利なパッケージといえば

- コメントを日本語化してくれる [comja5](https://github.com/laravel-ja/comja5)
- IDE の補完に役立つ [ide-helper](https://github.com/barryvdh/laravel-ide-helper)
- PHP Debugbar の Laravel 版である [laravel-debugbar](https://github.com/barryvdh/laravel-debugbar)

でしょうか。

Laravel は [Packagist](https://packagist.org/) で公開されているライブラリをそのまま使えるので、用途に合わせて探せば大体見つかります。

## 06.どのバージョンを使えばいいのでしょう？

今(2015年12月17日)からなら LTS である 5.1 で決まりです。新しいもの好きはまもなくリリースされる 5.2 を使ってみるのもよいかと思います。

## 07.公式の通りにインストールしたけど動かない

元記事を読んでて（わかる…わかるよ…）って思いました。Laravel の場合は `storage` ディレクトリがそれに当たります。ちゃんと書き込み権限を与えましょう。

## 08.フォルダ構成はどうしたらいいの？

デフォルトのままでいいんじゃないですかね。なにかディレクトリ作りたくなったらその時点でつくればよいと思います。`PSR-4` を抑えておけば問題無いです。

## 09.設定は何で書けばいいの? XML?

Laravel の設定は PHP で書きます。読みやすいし、書きやすいのでよいと思います。

## 10.設定内容が反映されない><

Laravel ではあまりないですねー。本番運用しているときはデプロイ時に `route:cache` , `config:cache` するんですが、処理内でクリアしてからキャッシュするという動きをしてるので、あんまりトラブルになることはないかと思います。

## 11.なんか英語のエラー出た><

頑張って読め。大丈夫だ。怖くない。

# 実装編

## 12.Modelはどこに書くの？

適当に `Models` ディレクト作ればいいんじゃないですかね? Model とは…? とか考え始めると日が暮れてしまうので、早く帰りたい人は折り合いをつけましょう。

## 13.確認フォームってどうやったら出せるの?

セッションにつめとけばいいよ！（疲れてきた…）

## 14.Ajax用の API 作りたい！

Laravel はこのへん便利にできていて、Model を return すると json になるし、配列を return しても json になる。特に考えずに return するとよいと思います。

## 15.CSVダウンロード機能を作りたい！

これ、オススメなのは Response マクロを作ることです。

- [Response マクロ](http://readouble.com/laravel/5/1/ja/responses.html#response-macros)

マクロは既存のクラスに後からメソッドを生やすという機能で、既存のクラスをどうこうすることなく機能を増やすことができます。

```php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Routing\ResponseFactory;

class ResponseMacroServiceProvider extends ServiceProvider
{
    /**
     * サービス初期処理登録後に実行
     *
     * @param  ResponseFactory  $factory
     * @return void
     */
    public function boot(ResponseFactory $factory)
    {
        $factory->macro('csv', function ($value) use ($factory) {
            // ここの CSV を作る処理
        });
    }
}
```

## 16.FormやAPIの形式とEntityの形がかけ離れている......つらい......

Laravel は Form の設定をあんまりコードに書かないので… Laravel 4 の頃は Form Model Binding という機能があったのですが、Laravel 5 から Form/HTML に関するコンポーネントが本体から削除されるということがあって、あんまり強く結びついてないんですね。

- [laravelcollective/html](https://github.com/LaravelCollective/html)

そういう意味では自由なぶん、記述量は増えるのではないかと思います。

## 17.ログインの仕組みを独自に作りたいんですけど......

いいんじゃないでしょうか。色々考える必要があるので、頑張ってください。

# Eloquent編

## 18.Eloquentが不要なカラムもselectしようとしています。なんとかしたい。

ちゃんと指定しよう。find メソッドの場合は第2引数に配列で欲しいカラムを指定してやればよい。

```php
<?php
// select * from `products`
Product::find(1);

// select `name`  from `products`
Product::find(1, ['name']);
```

上記の場合は Model のインスタンスが返ってくるんだけど、name の文字列だけ欲しい場合は value メソッドを使う。

```php
<?php
Product::find(1, ['name'])->value('name');

```

## 19.Lazy Load うざい

Laravel では Lazy Eager Loading とか Eager Loading といわれるやつですね。`load` メソッドや `with` メソッドを使うんだ。

[Eloquent：リレーション](http://readouble.com/laravel/5/1/ja/eloquent-relationships.html)

## 20.論理削除ってどうすればいいの？

論理削除の是非はともかく標準で用意されています。`deleted_at` というカラムの中に論理削除された日付が入る…という仕組みです。

[Eloquent SoftDelete](http://readouble.com/laravel/5/1/ja/eloquent.html#soft-deleting)

## 21. OneToMany を設定していて、親のEntityと子供のEntityを一気にpersistしようとしたらエラーが出た

ちょっと symfony 詳しくないので合ってるかわからないけど…

```php

$post = new App\Post(['title' => 'title', 'body' => 'なんかテキスト']);

$post->save();

$comment = new App\Comment(['message' => 'A new comment.']);

$comment = $post->comments()->save($comment);
```

こんな感じ?

## 「Update時に、自動的にあのカラムも更新する」とかやりたい。EventLister を使えばいいの？

更新日付なら標準の仕組みでやれますね。それ以外となると…モデルイベントを使うのが手軽な方法ですね。updated か saved のイベントに引っ掛けてやればいけると思います。

[Eloquent モデルイベント](http://readouble.com/laravel/5/1/ja/eloquent.html#events)

ちなみに僕も猫が好きです。お疲れ様でした！