【Laravel入門】データベースに接続する方法と解説

Laravel,PHP

ミニマリスト_カミ

kamiです。
TwitterYoutubeもやってます。

今回はデータベースに接続する方法と解説の紹介です。

データベースに接続する方法

Laravelでデータベースへ接続するには以下のことを行います。

  1. DBの接続情報の入力
  2. config/database.phpの確認
  3.  Modelの作成
  4. マイグレーションの記述
  5. Serviceの作成
  6. Controllerの作成
  7. ルーティングの記述

DBの接続情報

「DBの接続情報」「.env」ファイルに記述します。

envファイル

こちらがenvファイル内に記述されている内容です。

APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_app
DB_USERNAME=root
DB_PASSWORD=

BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

MEMCACHED_HOST=127.0.0.1

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1

VITE_APP_NAME="${APP_NAME}"
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

コメント付きenvファイル

envファイルにコメントをつけました。
こちらでわからない点があれば確認しましょう。

# アプリケーションの名前
APP_NAME=Laravel

# アプリケーションの実行環境(local、productionなど)
APP_ENV=local

# アプリケーションのキー(セキュリティのため、ランダムな値を設定する必要があります)
APP_KEY=

# アプリケーションのデバッグモード(true または false)
APP_DEBUG=true

# アプリケーションの URL
APP_URL=http://localhost

# ログの出力先チャンネル
LOG_CHANNEL=stack

# 非推奨のログの出力先チャンネル
LOG_DEPRECATIONS_CHANNEL=null

# ログのレベル
LOG_LEVEL=debug

# データベース接続の種類
DB_CONNECTION=mysql

# データベースのホスト
DB_HOST=127.0.0.1

# データベースのポート
DB_PORT=3306

# データベースの名前
DB_DATABASE=laravel_app

# データベースのユーザー名
DB_USERNAME=root

# データベースのパスワード
DB_PASSWORD=

# ブロードキャストドライバー
BROADCAST_DRIVER=log

# キャッシュドライバー
CACHE_DRIVER=file

# ファイルシステムのディスク
FILESYSTEM_DISK=local

# キューの接続先
QUEUE_CONNECTION=sync

# セッションのドライバー
SESSION_DRIVER=file

# セッションの有効期間(分単位)
SESSION_LIFETIME=120

# Memcached のホスト
MEMCACHED_HOST=127.0.0.1

# Redis のホスト
REDIS_HOST=127.0.0.1

# Redis のパスワード
REDIS_PASSWORD=null

# Redis のポート
REDIS_PORT=6379

# メール送信のドライバー
MAIL_MAILER=smtp

# メールホスト
MAIL_HOST=mailpit

# メールポート
MAIL_PORT=1025

# メールユーザー名
MAIL_USERNAME=null

# メールパスワード
MAIL_PASSWORD=null

# メールの暗号化方式
MAIL_ENCRYPTION=null

# 送信元メールアドレス
MAIL_FROM_ADDRESS="hello@example.com"

# 送信元の名前(アプリケーションの名前と同じ)
MAIL_FROM_NAME="${APP_NAME}"

# AWS アクセスキー ID
AWS_ACCESS_KEY_ID=

# AWS シークレットアクセスキー
AWS_SECRET_ACCESS_KEY=

# AWS デフォルトリージョン
AWS_DEFAULT_REGION=us-east-1

# AWS バケット名
AWS_BUCKET=

# AWS のパススタイルエンドポイントを使用するかどうか
AWS_USE_PATH_STYLE_ENDPOINT=false

# Pusher アプリケーション ID
PUSHER_APP_ID=

# Pusher アプリケーションキー
PUSHER_APP_KEY=

# Pusher アプリケーションシークレット
PUSHER_APP_SECRET=

# Pusher ホスト
PUSHER_HOST=

# Pusher ポート
PUSHER_PORT=443

# Pusher スキーム
PUSHER_SCHEME=https

# Pusher アプリケーションクラスター
PUSHER_APP_CLUSTER=mt1

# Vite アプリケーション名(アプリケーションの名前と同じ)
VITE_APP_NAME="${APP_NAME}"

# Vite Pusher アプリケーションキー
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"

# Vite Pusher ホスト
VITE_PUSHER_HOST="${PUSHER_HOST}"

# Vite Pusher ポート
VITE_PUSHER_PORT="${PUSHER_PORT}"

# Vite Pusher スキーム
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"

# Vite Pusher アプリケーションクラスター
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

データベースに使用する環境変数

icon

データベースに接続で使用するenvファイルの環境変数です。

環境変数説明
DB_CONNECTIONデータベースの種類
DB_HOST接続先のホスト
DB_PORT接続先のポート
DB_DATABASEデータベース名
DB_USERNAMEユーザー名
DB_PASSWORDパスワード

「.env」ファイルはアプリ内に管理しないので、「.env.example」などを「.env」ファイルをではありませんが、環境変数が記述されて、値が入ってないファイルを「コピー&リネーム」で生成して作成します。

// .env.example をコピーして .env を作成
cp .env.example .env

スポンサードサーチ

config/database.php

「config/database.php」は、Laravel のデータベース設定が含まれているファイルです。

「.env 」ファイルの値は、「config/database.php」 などの設定ファイル内で、env() ヘルパー関数を使用して読み取られます。
※「.env」の環境設定でデータベースへの接続先の変数に入力済みの場合は、「config/database.php」では何もしないので、使用だけ確認して次にいきましょう。


env() 関数は、指定された環境変数の値を取得します。
通常、config/database.php」 の中でこの関数が使用され、データベース接続情報などの環境に依存する設定値が取得されます。

<?php

use Illuminate\Support\Str;

return [

    /*
    |--------------------------------------------------------------------------
    | Default Database Connection Name
    |--------------------------------------------------------------------------
    |
    | Here you may specify which of the database connections below you wish
    | to use as your default connection for all database work. Of course
    | you may use many connections at once using the Database library.
    |
    */

    'default' => env('DB_CONNECTION', 'mysql'),

    /*
    |--------------------------------------------------------------------------
    | Database Connections
    |--------------------------------------------------------------------------
    |
    | Here are each of the database connections setup for your application.
    | Of course, examples of configuring each database platform that is
    | supported by Laravel is shown below to make development simple.
    |
    |
    | All database work in Laravel is done through the PHP PDO facilities
    | so make sure you have the driver for your particular database of
    | choice installed on your machine before you begin development.
    |
    */

    'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'url' => env('DATABASE_URL'),
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
        ],

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

        'pgsql' => [
            'driver' => 'pgsql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'search_path' => 'public',
            'sslmode' => 'prefer',
        ],

        'sqlsrv' => [
            'driver' => 'sqlsrv',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '1433'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            // 'encrypt' => env('DB_ENCRYPT', 'yes'),
            // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
        ],

    ],

    /*
    |--------------------------------------------------------------------------
    | Migration Repository Table
    |--------------------------------------------------------------------------
    |
    | This table keeps track of all the migrations that have already run for
    | your application. Using this information, we can determine which of
    | the migrations on disk haven't actually been run in the database.
    |
    */

    'migrations' => 'migrations',

    /*
    |--------------------------------------------------------------------------
    | Redis Databases
    |--------------------------------------------------------------------------
    |
    | Redis is an open source, fast, and advanced key-value store that also
    | provides a richer body of commands than a typical key-value system
    | such as APC or Memcached. Laravel makes it easy to dig right in.
    |
    */

    'redis' => [

        'client' => env('REDIS_CLIENT', 'phpredis'),

        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
        ],

        'default' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'username' => env('REDIS_USERNAME'),
            'password' => env('REDIS_PASSWORD'),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_DB', '0'),
        ],

        'cache' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'username' => env('REDIS_USERNAME'),
            'password' => env('REDIS_PASSWORD'),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_CACHE_DB', '1'),
        ],

    ],

];

もし「.env」ファイルの記述されていない場合はデフォルトの値が使用されます。
設定されている場合は「.env」の差内容が採用されます。

        'mysql' => [
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
        ],

database.phpの読み込み

config/database.php」 ファイルは、Laravel アプリケーションの起動時に自動的に読み込まれます。
「Illuminate\Foundation\Bootstrap\LoadConfiguration 」クラスがこのファイルを読み込み、アプリケーションの設定をロードします。

このプロセスは、Illuminate\Foundation\Applicationクラスの bootstrapWith() メソッド内で行われます。
bootstrapWith() メソッドは、アプリケーションのブートストラッププロセスを管理する責任があります。
LoadConfiguration クラスはその一部であり、様々な設定ファイル(config ディレクトリ内のファイル)を読み込みます。

<?php

namespace Illuminate\Foundation\Bootstrap;

use Exception;
use Illuminate\Config\Repository;
use Illuminate\Contracts\Config\Repository as RepositoryContract;
use Illuminate\Contracts\Foundation\Application;
use SplFileInfo;
use Symfony\Component\Finder\Finder;

class LoadConfiguration
{
    /**
     * Bootstrap the given application.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function bootstrap(Application $app)
    {
        $items = [];

        // ファイルがキャッシュされているかどうかを確認し、キャッシュされていればその内容を使用します。
        // キャッシュされていない場合は、設定ファイルをすべて読み込んで設定を準備します。
        if (file_exists($cached = $app->getCachedConfigPath())) {
            $items = require $cached;

            $loadedFromCache = true;
        }

        // 設定ファイルを読み込んでリポジトリに登録します。
        // キャッシュから読み込まれた場合は、このステップはスキップされます。
        $app->instance('config', $config = new Repository($items));

        // キャッシュされた設定ファイルがないかの確認。
        if (!isset($loadedFromCache)) {
            // 設定ファイルを読み込んでアプリケーションの設定を準備します
            $this->loadConfigurationFiles($app, $config);
        }

        // アプリケーションの環境を設定ファイルの内容に基づいて検出します。
        // "--env" スイッチが存在しないウェブコンテキストで使用されるコールバックを渡します。
        $app->detectEnvironment(fn () => $config->get('app.env', 'production'));

        // タイムゾーンを設定ファイルの内容に基づいて設定します。
        date_default_timezone_set($config->get('app.timezone', 'UTC'));

        // 内部文字エンコーディングを UTF-8 に設定します。
        mb_internal_encoding('UTF-8');
    }

    /**
     * Load the configuration items from all of the files.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @param  \Illuminate\Contracts\Config\Repository  $repository
     * @return void
     *
     * @throws \Exception
     */
    protected function loadConfigurationFiles(Application $app, RepositoryContract $repository)
    {
        $files = $this->getConfigurationFiles($app);

        if (! isset($files['app'])) {
            throw new Exception('Unable to load the "app" configuration file.');
        }

        foreach ($files as $key => $path) {
            $repository->set($key, require $path);
        }
    }

    /**
     * Get all of the configuration files for the application.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return array
     */
    protected function getConfigurationFiles(Application $app)
    {
        $files = [];

        $configPath = realpath($app->configPath());

        foreach (Finder::create()->files()->name('*.php')->in($configPath) as $file) {
            $directory = $this->getNestedDirectory($file, $configPath);

            $files[$directory.basename($file->getRealPath(), '.php')] = $file->getRealPath();
        }

        ksort($files, SORT_NATURAL);

        return $files;
    }

    /**
     * Get the configuration file nesting path.
     *
     * @param  \SplFileInfo  $file
     * @param  string  $configPath
     * @return string
     */
    protected function getNestedDirectory(SplFileInfo $file, $configPath)
    {
        $directory = $file->getPath();

        if ($nested = trim(str_replace($configPath, '', $directory), DIRECTORY_SEPARATOR)) {
            $nested = str_replace(DIRECTORY_SEPARATOR, '.', $nested).'.';
        }

        return $nested;
    }
}

スポンサードサーチ

マイグレーションを行う

マイグレーションファイルは、データベースのテーブル構造を定義するためのものや、スキーマの変更を管理するために使用されます。

そのために、「マイグレーションファイルの作成」から「記述」して、「マイグレーションの実行」まで行います。

マイグレーションファイルを作成

Laravelのマイグレーションファイルを作成するには、artisanコマンドラインツールを使用します。

php artisan make:migration テーブル名

新しいマイグレーションファイルが"database/migrations"ディレクトリに作成されます。

マイグレーションファイルの記述

php artisan make:migration createUsersTable

上記の例では、ユーザーを作成する「create_users」という名前のマイグレーションファイルが作成されます。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id'); // ユーザーID (自動増分)
            $table->string('username', 20)->unique(); // ユーザー名 (最大長: 20, ユニーク)
            $table->string('password', 50); // パスワード (最大長: 50)
            $table->string('remember_token', 50)->nullable(); // ログイン維持のためのトークン (null許容)
            $table->timestamps(); // 作成日時と更新日時
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

マイグレーションの実行

artisanコマンドの実行により、作成されているマイグレーションファイルが実行されます。

php artisan migrate

「upメソッド」では、usersテーブルのスキーマが定義されています。

マイグレーションのロールバック

「downメソッド」では、マイグレーションをロールバックするための操作が定義されています。

php artisan migrate:rollback

最後に実行されたマイグレーションを1つ戻します。

php artisan migrate:rollback --step=3

最後に実行されたマイグレーションを3つ戻します。

Eloquent ORM(オーアルマッパー)とは?

Eloquent ORM(Eloquent Object Relational Mapping) とは、Laravel で提供されているデータ操作の為の機能です。
データベースとモデルを関連付け、柔軟なデータ操作を行う為の Laravel 独自の機能になります。

ORM(Object Relational Mapping)という言葉は昔から存在していて、オブジェクト指向のプログラムとデータベースを繋ぐ「オブジェクト関係マッピング」を意味します。

LaravelのEloquent ORM とは、Laravel 独自の O/R マッパーという事になります。

icon

読み方はORM(オーアルマッパー)と呼びます。

急になんでORMが出てきたかというと、Laravelのデータベースの接続するにあたって、コードの記述をORMで行うからです。

スポンサードサーチ

Modelとは?

Modelとは、MVCアーキテクチャの「M」の部分です。
LaravelにおけるModelは、Eloquent(DBのデータを操作する実装)の機能とビジネスロジックを持ったクラスです。

icon

主にデータベースとの連携を行います

Modelの作成方法

Modelファイルの作成

Modelの作成にはartisanコマンドでModelを作成します。

php artisan make:model Model名

「app/Modelsディレクトリにファイルが作成されます。

ModelとMigrationファイルの作成

Modelと一緒にマイグレーションファイルの生成する方法です。
モデルと一緒にマイグレーションも生成する場合は、-mオプションを付けます。

php artisan make:model Model名 -m

database/migrationsディレクトリにマイグレーションファイルが作成されます。

ルーティングとは?

Routing(ルーティング)は特定のURLにアクセスしたときの処理を定義することです。
ModelやServiceでの処理をルーテイングに関連させて使用します。

方法としては、ルートファイルにエンドポイントを追加します。
routes/web.php」または、「routes/api.php」にルーティングを記述します。

web.phpとは?

  • ウェブアプリケーションのルートを定義するために使用される
  • ブラウザを介してアクセスされるルートや、HTMLを返すビューを持つルートがここに含まれる
  • セッション状態の管理やCSRF保護が必要なルートも含まれるため、外部からPOST通信できない

api.phpとは?

  • APIエンドポイントのルートを定義するために使用される
  • APIを介してJSONなどのデータを返すことが主な目的使用される
  • セッション状態の管理やCSRF保護が不要なため、外部からPOST通信ができる

Modelの作成例

icon

ここからは実践向けのModelを作成していきます。

Modelの作成

php artisan make:model User -m

「artisan」コマンドでモデルとマイグレーションファイルを作成します。

icon

以下のディレクトリにファイルが作成されます
(この後、出てくるサービスとコントローラーのパスも載せておきます)

  • モデル:app/Models/
  • マイグレーション:database/migrations
  • サービス:app/Services/
  • コントローラー:app/Http/Controllers/

マイグレーションの記述

モデルと一緒に生成したマイグレーションファイルを編集して、テーブルの構造を定義します。

モデルと一緒に作成した場合、「database/migrations/{timestamp}_create_users_table.php」という名前で、マイグレーションファイルが生成されています。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        // usersテーブルの定義
        Schema::create('users', function (Blueprint $table) {
            $table->id(); // ユーザーID
            $table->string('name'); // 名前
            $table->string('email')->unique(); // メールアドレス(ユニーク)
            $table->timestamp('email_verified_at')->nullable(); // メール確認日時
            $table->string('password'); // パスワード
            $table->rememberToken(); // Remember Token
            $table->timestamps(); // 作成日時と更新日時
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        // usersテーブルの削除
        Schema::dropIfExists('users');
    }
}

upメソッドにテーブルの定義を記述します。
作成後、マイグレーションの実行でテーブルが作成されます。

Modelの記述方法

「app/Models」ディレクトリにモデルが作成されています。
Modelではデーターベースのテーブル詳細(fillableやguardedなど)を記述します。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use HasFactory, Notifiable;


     // モデルに関連付けるテーブル名
    protected $table = 'テーブル名'

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    // 更新可能なフィールド
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array<int, string>
     */
    // 取得しないフィールド
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array<string, string>
     */
    // 型変換するフィールド
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}
  • fillable:データ登録、更新を許可するフィールド
  • guarded:データ登録、更新を許可しないフィールド
  • hidden:取得しない不要なフィールド
  • casts:型変換したいフィールド

Serviceの作成

Laravelにはサービスを作成するための専用コマンドはデフォルトでは用意されていません。
なので、Linuxコマンドで作成していきます。

Serviceディレクトリの作成

ディレクトリを作成します。

mkdir app/Services

Serviceファイルの作成

ファイルを作成します。

touch app/Services/UserService.php

Serviceの記述

Usersサービスを作成します。
サービス層を使うことで、ビジネスロジックをコントローラーから分離できます。

app/Services/UserService.php」を作成しビジネスロジックを記述していきます。

<?php

namespace App\Services;

use App\Models\User;
use Illuminate\Support\Facades\Hash;

class UserService
{
    // 全ユーザーを取得
    public function getAllUsers()
    {
        return User::all();
    }

    // IDでユーザーを取得
    public function getUserById($id)
    {
        return User::findOrFail($id);
    }

    // 新しいユーザーを作成
    public function createUser($data)
    {
        $data['password'] = Hash::make($data['password']); // パスワードをハッシュ化
        return User::create($data);
    }

    // ユーザーを更新
    public function updateUser($id, $data)
    {
        $user = User::findOrFail($id);
        if (isset($data['password'])) {
            $data['password'] = Hash::make($data['password']); // パスワードをハッシュ化
        }
        $user->update($data);
        return $user;
    }

    // ユーザーを削除
    public function deleteUser($id)
    {
        $user = User::findOrFail($id);
        $user->delete();
    }
}

Controllerの作成

「artisan」コマンドでControllerを作成していきます。

php artisan make:controller UserController

app/Http/Controllers/UserController.phpにコントローラーファイルが作成されます。

Controllerの記述

Controllerの記述を行います。
データベースとのやり取りを行うために、ORMの記述を使い、サービスとの連携を行います。

モデルやサービスの記述がまだであれば、コントローラーはかけないので、エラーが出てない前提で記述していきましょう。

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use App\Services\UserService;

class UserController extends Controller
{
    protected $userService;

    // コンストラクタでUserServiceを注入
    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    // 全ユーザーを取得
    public function index()
    {
        $users = $this->userService->getAllUsers();
        return response()->json($users);
    }

    // 新しいユーザーを作成
    public function store(Request $request)
    {
        $user = $this->userService->createUser($request->all());
        return response()->json($user, 201);
    }

    // 特定のユーザーを取得
    public function show($id)
    {
        $user = $this->userService->getUserById($id);
        return response()->json($user);
    }

    // 特定のユーザーを更新
    public function update(Request $request, $id)
    {
        $user = $this->userService->updateUser($id, $request->all());
        return response()->json($user);
    }

    // 特定のユーザーを削除
    public function destroy($id)
    {
        $this->userService->deleteUser($id);
        return response()->json(null, 204);
    }
}

データベースから取得するなどビジネスロジックはサービスを使うことが一般です。
コントローラーに記述することもできますが、コントローラーに負荷が偏ってしまうので、サービスを使うことを推奨しています。

ルーティングの記述

ルーティングの記述例です。
サービスを使ってルーティング処理を組んでいます。

<?php

use Illuminate\Support\Facades\Route;
use App\Services\UserService;
use Illuminate\Http\Request;

// UserServiceのインスタンスを作成
$userService = new UserService();

// 全ユーザーを取得
Route::get('/users', function() use ($userService) {
    return response()->json($userService->getAllUsers());
});

// 新しいユーザーを作成
Route::post('/users', function(Request $request) use ($userService) {
    $user = $userService->createUser($request->all());
    return response()->json($user, 201);
});

// 特定のユーザーを取得
Route::get('/users/{id}', function($id) use ($userService) {
    return response()->json($userService->getUserById($id));
});

// 特定のユーザーを更新
Route::put('/users/{id}', function(Request $request, $id) use ($userService) {
    $user = $userService->updateUser($id, $request->all());
    return response()->json($user);
});

// 特定のユーザーを削除
Route::delete('/users/{id}', function($id) use ($userService) {
    $userService->deleteUser($id);
    return response()->json(null, 204);
});

Laravel,PHPLaravel

Posted by kami