Edited at
LaravelDay 10

Laravel初心者から毛を生やす

More than 1 year has passed since last update.


はじめに

これはLaravel Advent Calendar 2017 10日目の記事です。

こんにちは、Laravel見習いの @mikkame です。

Laravelのドキュメントに載っているのに(私の周りでは)あまり知られていない機能の紹介をする記事です。

もう知っているよという職人の方はごめんなさい!


この記事の目的


  • とりあえず現場でLaravelを使っている方

  • これからLaravel案件にJOINする方

  • 昔からLaravelを使っているが新しい機能について調べていない

  • ドットインストールとか、Udemyとかをとりあえず見た人

色々な立場の方でも、体系的にLaravelを勉強したこと、ドキュメントを読破した事がない人が対象です。

私も、MVCはわかるからとりあえずやってみよう!という感じでLaravelを使っていますが、基本的な事かもしれないですが知らなかった機能、便利な機能

ドキュメントの下のほうに書いてある機能などを思いつく限り書いてみました。

今まではFatControllerでしたが、Skinny ControllerにすべくTipsを残します。


代入からcreate/fillへ


$user = new User();
$user->username = $request->get('username');
$user->email = $request->get('email');
$user->password = Hash::make($request->get('password'));
$user->save();

これを


$user = User::create($request->only(['username', 'email', 'password']);

こうすることでControllerがスリムになります。

createメソッドをオーバーライドすることによって初期化ステップを挟む事も出来ます。


whereからscopeへ

$my_items = Item::where('user_id', $user->id)->get();

これを

$my_items = Item::own($user)->get();


User.php

function scopeOwn($query, User $user)

{
return $query->where('user_id', $user->id);
}

こうすることで、Conteoller側にwhere文を列挙しなくてもすみます。

大抵の場合、where文は使い回されることが多く、複数のコントローラで同じ条件を書いている事があるので

一元化しましょう。

例)

- https://qiita.com/namaozi/items/11b65ccb6b7ecaefc23e


Mutatorを使う

$user->json = json_encode($data);

$data = json_decode($user->json, true);

これを

$user->json = $data;

$data =$user->json;


User.php

function setJsonAttribute($arg)
{
$this->attributes['json'] = json_encode($arg);
}

function getJsonAttribute()
{
return json_decode($this->attributes['json'], true);
}


こうします。

これも、プロパティの加工はいろいろなところで使い回される傾向があるので

一元化することで、修正の手間を省きます。

例:

- first_nameとlast_nameをスペースで連結してから返す

- 後述のHtmlStringでタグにしてから返す


HtmlStringを使う


blade.php

@if ($model->type == 'text')

{{$model->value}}
@elseif(model->type == 'link')
<a href='{{$model->value}}'>リンク</a>
@endif

これを


blade.php

{{$model->html}}



Model.php

function getHtmlAttribute()

{
if ($model->type == 'text') {
return $this->value
} else {
return new HtmlString("<a href='$model->value'>リンク</a>");
                 // view('hoge',$hoge)->render();の方が好ましい セキュリティ的にも
}
}

こうすることで、viewを簡潔にします。

typeの種類が増えてもモデルの修正だけで済むので改修コストが下がります

例)

- 添付ファイルDL

- 一時リンク

- テキストと画像が混合してる時とか