LoginSignup
0
1

Laravelでリポジトリーパターンを使う

Last updated at Posted at 2024-04-27

実装

基本的なファイルを作成

# Model, Controller, Migration, Seederファイルを作成 
php artisan make:model [Model名] -crms

Interfaceを作成

// app/Interfaces/TaskInterface.php

namespace App\Interfaces;

interface TaskInterface
{
    public function index();
    public function store(array $data);
    public function show(string $id);
    public function update(string $id, array $data);
    public function destroy(string $id);
}

Serviceを作成

// app/Services/TaskService.php

namespace App\Services;

use App\Interfaces\TaskInterface;

class TaskService
{
	// メンバ変数にセット
  public function __construct(TaskInterface $taskInterface)
  {
    $this->taskInterface = $taskInterface;
  }

  public function index()
  {
	  // インターフェースで定義したメソッドを呼び出す
    return $this->taskInterface->index();
  }
}
  • TaskInterface をコンストラクタに渡してメンバ変数にセット
  • 各メソッドでインターフェースで定義したメソッドを呼び出す

ControllerからServiceを読み込む

// app/Http/Controllers/Task/TaskController.php

namespace App\Http\Controllers\Task;

use App\Http\Controllers\Controller;
use App\Models\Task\Task;
use App\Services\TaskService;
use Illuminate\Http\Request;

class TaskController extends Controller
{
    public function __construct(TaskService $taskService)
    {
		    // コンストラクタに渡してメンバ変数にセット
        $this->taskService = $taskService;
    }

    public function index()
    {
		    // サービスで定義したメソッドを呼び出す
        return $this->taskService->index();
    }
}
  • TaskService をコンストラクタに渡してメンバ変数にセット
  • 各メソッドでサービスで定義したメソッドを呼び出す

Repositoryを作成

//app/Repositories/TaskRepository.php

namespace App\Repositories;

use App\Interfaces\TaskInterface;
use App\Models\Task\Task;

class TaskRepository implements TaskInterface
{
    public function index()
    {
        return Task::all();
    }
}
  • TaskInterface を元に具体的な処理を実装

InterfaceとRepositoryを紐付ける

上記コマンドを実行

php artisan make:provider RepositoryServiceProvider

コマンドを実行すると

  • /app/Provider ディレクトリに RepositoryServiceProvider.phpファイルが生成
  • /bootstrap/providers.php に生成されたプロバイダクラスが読み込まれる
// bootstrap/providers.php

return [
    App\Providers\AppServiceProvider::class,
    App\Providers\AuthServiceProvider::class,
    App\Providers\RepositoryServiceProvider::class, // 追加される
];

生成された RepositoryServiceProvider.phpファイルの register メソッドに追記する

// app/ProviderRepositoryServiceProvider.php

namespace App\Providers;

use App\Interfaces\TaskInterface;
use App\Repositories\TaskRepository;
use Illuminate\Support\ServiceProvider;

class RepositoryServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     */
    public function register(): void
    {
        // 追加(InterfaceとRepositoryを紐付け)
        $this->app->bind(TaskInterface::class, TaskRepository::class);
    }

    /**
     * Bootstrap services.
     */
    public function boot(): void
    {
        //
    }
}

一応オートロードしといたほうがいいかも

composer dump-autoload

考察

  • 仮にDBの保存先をMySQLからFirestoreへ変更になったとしても、レポジトリファイルを作成 + プロバイダでバインドするクラスを書き換えれば対応が可能になる
  • ビジネスロジックやユースケースのコードを修正する必要がなくなる
  • よって保守性・拡張性の高いコードになると感じた

参考

Laravel - The PHP Framework For Web Artisans

Laravelアプリケーションでリポジトリパターンを使う方法

akippaで採用しているLaravelのデザインパターンのお話:後編|村上 健一郎

0
1
1

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
0
1