Laravel 5.1からbladeテンプレートで使用可能になったService Injectionを使ってみる

Page : ( 1 / 2 )


Laravel5.1からbladeテンプレートで新たにService Injectionがの機能が追加されました。

@inject()には、第一引数にオブジェクトをインスタンス化する変数が入り、
第二引数にオブジェクトが入ります。

{{-- 公式のサンプル --}}
@inject('metrics', 'App\Services\MetricsService')

<div>
    Monthly Revenue: {{ $metrics->monthlyRevenue() }}.
</div>

もう少しザックリ言うと、@inject('変数', 'クラス名') という形になり、
公式のサンプル通りにすると、
app/Services/MetricsService.phpからファイルをインポートし、
MentricsServiceのクラスをインスタン化していることになります。
 

公式: Service Injection


公式のサンプルでは上記の様になっていますが、もう少し実用的にしてみます。

右のサイドバーに”最新の記事”がリスト表示されていますが、
その部分にもService Injectionが使われています。

@inject構文を使う方法と、従来通りの使わないサンプルです。

 @injectを使わない従来のケース

*コントローラー

<?php

// app/Http/Controllers/ArticleController.php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

// モデルのインポート
use App\Models\Article;

class ArticleController extends Controller
{

  // indexページ
  public function getIndex()
  {
    // テンプレート
    return view('post')
      // 記事一覧
      ->with('articles', Article::orderBy('published_at')->paginate(10))
      // ***最新の投稿
      ->with('newArticles', Article::orderBy('publishd_at')->take(10));

  }

  // 記事のページ
  public function getPost($id)
  {
    // テンプレート
     return view('post')
      // 記事一覧
      ->with('article', Article::where('id', $id)->get())
      // **最新の投稿
      ->with('newArticles', Article::orderBy('publishd_at')->take(10));

  }

} //end Class

*テンプレート

{{-- sidebar.blade --}}

<div class="sidebar">
    <h5>最新の投稿</h5>
    <ul>
        {{-- コントローラーから渡された変数$newArticles  --}}
        @foreach($newArticles as $article)
            <li>{{ $article->title }}</li>
        @endforeach
    </ul>
</div

コントローラーの、getIndex(), getPost()に同じ処理が書かれています。
共通した処理がある場合コントローラーのメソッド毎に同じ処理を書く必要がありました。

次のページでは@injectを使ったサンプルを紹介します。

この記事のカテゴリ
プログラミング

この記事に付けられているタグ



その他の運営サービス

最新の記事