Laravel5.4でServiceを使ったプロジェクト構成

Laravelで実装する際のプロジェクト構成例を１つ挙げます。
今回は一般的なMVCに加え、Serviceを使ってモデルとロジックを分離します。
あくまで私が使っている１例ですので、ご了承ください。

#Model
まずはテーブルを作成します。
```# php artisan make:migration create_hoges_table```

```
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateHogesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('hoges', function (Blueprint $table) {
            $table->increments('id');
            $table->string('hoge');
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('hoges');
    }
}
```

migrateしてテーブルを作ります。
```# php artisan migrate```

そしてモデルを作ります。
```# php artisan make:model Hoge```

```
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Hoge extends Model
{
    protected $fillable = [
        'hoge'
    ];
}
```

#Service
続いてサービスを作ります。
laravel/app/Servicesを作成し、
laravel/app/Services/HogeService.phpを作成します。

```
<?php
namespace App\Services;
use App\Hoge;
class HogeService{
    public function getHoge(){
        return Hoge::all();
    }
}
```

laravel/app/Providers/AppServiceProvider.phpのregisterに追加します。

```
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('App\Services\HogeService');
    }
}
```

#Route
Laravel5.4の基本構築は済んでいるものとします。
[http://qiita.com/minechan1234/items/7e0cbe04bf5f3f405938](http://qiita.com/minechan1234/items/7e0cbe04bf5f3f405938)

laravel/routes/web.phpに以下を追加します。
```Route::resource('hoge', 'HogeController');```

```
+--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
| Domain | Method    | URI                    | Name             | Action                                                                 | Middleware   |
+--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
|        | GET|HEAD  | /                      |                  | Closure                                                                | web          |
|        | GET|HEAD  | api/user               |                  | Closure                                                                | api,auth:api |
|        | POST      | hoge                   | hoge.store       | App\Http\Controllers\HogeController@store                              | web          |
|        | GET|HEAD  | hoge                   | hoge.index       | App\Http\Controllers\HogeController@index                              | web          |
|        | GET|HEAD  | hoge/create            | hoge.create      | App\Http\Controllers\HogeController@create                             | web          |
|        | DELETE    | hoge/{hoge}            | hoge.destroy     | App\Http\Controllers\HogeController@destroy                            | web          |
|        | PUT|PATCH | hoge/{hoge}            | hoge.update      | App\Http\Controllers\HogeController@update                             | web          |
|        | GET|HEAD  | hoge/{hoge}            | hoge.show        | App\Http\Controllers\HogeController@show                               | web          |
|        | GET|HEAD  | hoge/{hoge}/edit       | hoge.edit        | App\Http\Controllers\HogeController@edit                               | web          |
|        | GET|HEAD  | home                   | home             | App\Http\Controllers\HomeController@index                              | web,auth     |
|        | POST      | login                  |                  | App\Http\Controllers\Auth\LoginController@login                        | web,guest    |
|        | GET|HEAD  | login                  | login            | App\Http\Controllers\Auth\LoginController@showLoginForm                | web,guest    |
|        | POST      | logout                 | logout           | App\Http\Controllers\Auth\LoginController@logout                       | web          |
|        | POST      | password/email         | password.email   | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  | web,guest    |
|        | POST      | password/reset         |                  | App\Http\Controllers\Auth\ResetPasswordController@reset                | web,guest    |
|        | GET|HEAD  | password/reset         | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest    |
|        | GET|HEAD  | password/reset/{token} | password.reset   | App\Http\Controllers\Auth\ResetPasswordController@showResetForm        | web,guest    |
|        | POST      | register               |                  | App\Http\Controllers\Auth\RegisterController@register                  | web,guest    |
|        | GET|HEAD  | register               | register         | App\Http\Controllers\Auth\RegisterController@showRegistrationForm      | web,guest    |
+--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
```

この１行をrouteに追加することで、決められたアクションを登録出来ます。
以下のコマンドで登録されているrouteの一覧を取得出来ます。
※Controller等が無い場合はエラーになるので、作成してから実行してください。
```# php artisan route:list```

#Controller
コマンドで作れます。
```# php artisan make:controller HogeController```

laravel/app/Http/Controllers/HogeController.php

```
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Services\HogeService;
class HogeController extends Controller
{
    protected $hogeService;
    public function __construct(HogeService $hoge_service)
    {
        $this->hogeService = $hoge_service;
    }
    
    public function index(Request $request)
    {
        $hoges = $this->hogeService->getHoge();
        return view('hoge.index', compact('hoges'));
    }
    
    public function show($id){}
    
    public function create(){}
    
    public function store(Request $request){}
    
    public function edit($id){}
    
    public function update(Request $request, $id){}
    
    public function destroy($id){}
}

```

#view
Bladeを使いますが、サンプルなので適当です。
laravel/resources/views/hogeというディレクトリを作成し、
laravel/resources/views/hoge/index.blade.phpを作成します。

```
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>Hello World!</h1>
@foreach($hoges as $hoge)
<p>{{$hoge->hoge}}</p>
@endforeach
</body>
</html>
```

以上です。
ザックリとした雰囲気ですが、このようなプロジェクト構成になります。
AppServiceProviderのregisterを変えるだけでテスト用のServiceに切り替えることが出来ます。
もっと細かい実装については後の記事で説明していきます。