LoginSignup
36
33

More than 5 years have passed since last update.

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

Posted at

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

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

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    |
+--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+

この1行を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に切り替えることが出来ます。
もっと細かい実装については後の記事で説明していきます。

36
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
33