Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What are the problem?

posted at

updated at

Organization

Laravel8 DBのデータを取得する処理をサービスに分割する

目的

  • laravel8のアプリのコントローラでDBから値を取得する処理をサービス層に分割する方法をまとめる

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2 GHz クアッドコアIntel Core i5
メモリ 32 GB 3733 MHz LPDDR4
グラフィックス Intel Iris Plus Graphics 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.8 Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする
Laravel バージョン 8.X commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする

前提条件

  • 実施環境に近い環境が構築されていること

前提情報

  • 今回サービスに処理を分割するlaravel8のアプリではAuthを用いた認証機能が付与されており、ログインができること。(データ取得処理をサービスに分割する本来の目的では必要ない作業だが説明の都合上こちらを記載させていただいた。)
  • laravel8のアプリでの方法を紹介してるがルーティング情報の記載部分とusersテーブルのモデルファイルのデフォルト位置以外はlaravel7、laravel6でも方法は同じである。
  • 筆者はMacのローカルに環境を構築し本記載の確認を行った。
  • Laravel8のアプリでユーザ情報をDBから取得する処理をサービスに分割する方法を記載する。
  • どんなことをするかを簡単に図に記載する。

    • 対応前

      mermaid-diagram-20201217090302.png

    • 対応後

      mermaid-diagram-20201217090428.png

  • ルーティング、コントローラ、ビューにはそれぞれ下記の記載がされており、ログイン後に/userにアクセスするとログイン中のユーザIDとユーザ名が下記のように表示される。

    127_0_0_1_8000_user.png

    • ルーティングファイル

      アプリ名ディレクトリ/routes/web.php
      <?php
      
      use Illuminate\Support\Facades\Route;
      use App\Http\Controllers\ContentController;
      use App\Http\Controllers\UserController;
      
      /*
      |--------------------------------------------------------------------------
      | Web Routes
      |--------------------------------------------------------------------------
      |
      | Here is where you can register web routes for your application. These
      | routes are loaded by the RouteServiceProvider within a group which
      | contains the "web" middleware group. Now create something great!
      |
      */
      
      Route::get('/', function () {
          return view('welcome');
      });
      
      Auth::routes();
      
      Route::get('/user', [UserController::class, 'index'])->name('user.index');
      
    • コントローラ

      アプリ名ディレクトリ/app/Http/Controllers/UserController.php
      <?php
      
      namespace App\Http\Controllers;
      
      use Illuminate\Http\Request;
      use App\Models\User;
      use Illuminate\Support\Facades\Auth;
      
      class UserController extends Controller
      {
          public function index()
          {
              $user_id = Auth::id();
              $user_info = User::select('*')->find($user_id);
              return view('users.index', ['user_info' => $user_info]);
          }
      }
      
    • ビュー

      アプリ名ディレクトリ/resources/views/users/index.blade.php
      <p>user_id: {{$user_info['id']}}</p>
      <p>user_name: {{$user_info['name']}}</p>
      

概要

  1. サービスファイルの作成と記載
  2. コントローラファイルの修正
  3. 確認

詳細

  1. サービスファイルの作成と記載

    1. アプリ名ディレクトリで下記コマンドを実行してサービスファイルを格納するディレクトリを作成する。

      $ mkdir app/Services
      
    2. 下記コマンドを実行してサービスファイルを作成する。サービスファイル名はUserService.phpとする。

      $ vi app/Services/UserService.php
      
    3. 下記の内容を記載する。

      アプリ名ディレクトリ/app/Services/UserService.php
      <?php
      
      namespace App\Services;
      
      use App\Models\User;
      
      class UserService
      {
          /**
           *
           * @var User
           */
          private $user;
      
          public function __construct(User $user)
          {
              $this->user = $user;
          }
      
          /**
           * ユーザIDからユーザ情報を取得する
           *
           * @param int $user_id
           * @return model
           */
          public function getUserInfoByUserId($user_id)
          {
              return $user_info = User::select('*')->find($user_id);
          }
      }
      
  2. コントローラファイルの修正

    1. アプリ名ディレクトリで下記コマンドを実行してコントローラファイルを開く。

      $ vi app/Http/Controllers/UserController.php
      
    2. 下記のように修正する。

      アプリ名ディレクトリ/app/Http/Controllers/UserController.php
      <?php
      
      namespace App\Http\Controllers;
      
      use Illuminate\Http\Request;
      use App\Models\User;
      use Illuminate\Support\Facades\Auth;
      // 下記を追記
      use App\Services\UserService;
      
      class UserController extends Controller
      {
          // 下記を追記
          /**
           *
           * @var UserService
           */
          private $userService;
      
          public function __construct(UserService $userService)
          {
              $this->userService = $userService;
          }
          // 上記までを追記
      
          public function index()
          {
              $user_id = Auth::id();
              // 下記を修正
              $user_info = $this->userService->getUserInfoByUserId($user_id);
              return view('users.index', ['user_info' => $user_info]);
          }
      }
      
  3. 確認

    1. ローカルサーバを起動しAuthで実装した認証機能にログイン後、下記にアクセスする。
    2. 下記のように表示されることを確認する。

      127_0_0_1_8000_user.png

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
4
Help us understand the problem. What are the problem?