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が使われています。
@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を使ったサンプルを紹介します。