Help us understand the problem. What is going on with this article?

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
- 一時リンク
- テキストと画像が混合してる時とか

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした