Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
19
Help us understand the problem. What is going on with this article?
@mikkame

Laravel初心者から毛を生やす

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

19
Help us understand the problem. What is going on with this article?
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
mikkame
兼業フリーランス
yyphp
PHPerが毎週集まり、ざっくばらんに情報交換する雑談コミュニティ

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
19
Help us understand the problem. What is going on with this article?