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

Page : ( 2 / 2 )


@injectを使ったケース

コントローラーに書いていた処理をServiceに一つまとめています。

*サービス

//サービス
// App/Services/ArticleService.php

namespace App\Services\ArticleService;

// modelのインポート
use App\Models\Article;

class ArticleService
{
  // 記事一覧 (ページネーション)
  public function articlePaginate()
  {
    return Article::orderBy('published_at')->paginate(10);
  }

  // 最新の記事
  public function latestArticles()
  {
    return Article::orderBy('published_at')->take(10);
  }

  // 記事を取得
  public function getArticle($id)
  {
    return Article::where('id', $id)->get();
  }


} // END class

*コントローラー

// コントローラー
// app/Http/Controllers/ArticleController.php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

// サービスのインポート
use App\Services\ArticleService\ArticleService;

class ArticleController extends Controller
{
  public $article;

  public function __construct()
  {
    // サービスのインスタン
    $this->article = new ArticleService();
  }

  // indexページ
  public function getIndex()
  {
    // テンプレート
    return view('post')
      // 記事一覧
      ->with('articles', $this->article->articlePagenate());
  }

  // 記事のページ
  public function getPost($id)
  {
    // テンプレート
     return view('post')
      // 記事一覧
      ->with('article', $this->article->getArticle($id));
  }

} //end Class

*テンプレート

{{-- sidebar.blade.php --}}

{{-- ArticleServiceを$articleにインジェクト  --}}
@inject('article', '\App\Services\ArticleService')

<div class="sidebar">
    <h5>最新の投稿</h5>
    <ul>
        {{-- サービスクラスからメソッドを呼び出し --}}
        @foreach($article->latestArticles() as $article)
            <li>{{ $article->title }}</li>
        @endforeach
    </ul>
</div


この様な簡単な例では「Eloquentの Query Scopeを使ったほうがいいんじゃね?」等
ツッコミ所もあるかもしれませんが、
lumen等で簡単で機能が少ないWebサイトを作る場合等であれば恩赦が大きです。

例を挙げると、

  • - コントローラーは使わずにrouteファイルからviewを渡すのみ
  • - データー処理の部分はServiceに一本化する
  • - テンプレート側でデータを呼び出し


この他に自作のライブラリを呼び出したりする場合等、
テンプレート側で受け渡し出来るので使い方次第で様々なことが出来ます。

皆さんも機会があれば使ってみてください。

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

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



その他の運営サービス

最新の記事