20200801のlaravelに関する記事は7件です。

Laravel factoryを使ってテストデータを流し込む

開発において必須のテストデータの流し込みの備忘録です。。。
※データベース、モデル、マイグレーション完了時からのお話です。

Factoryを作る

php artisan make:factory [モデル名]Factory

例)
php artisan make:factory RecipeFactory
                ↑クラス名は大文字注意

<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Model;
use Faker\Generator as Faker;

$factory->define(Model::class, function (Faker $faker) {
    return [
        //
    ];
});

こういうのができます。

//のところに入れたいデータを書き込んでいきましょう

<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Recipe;    ←ここ要書き換え!!
use Faker\Generator as Faker;

$factory->define(Recipe::class, function (Faker $faker) {
    return [    ↑ここも要書き換え!!

        'user_id' => $faker->numberBetween($min = 1, $max = 10),
        'name' => $faker->realText($maxNbChars = 10, $indexSize = 1),
        'liqueur' => $faker->numberBetween($min = 1, $max = 10),
        'time' => $faker->numberBetween($min = 1, $max = 10),
        'invention' => $faker->numberBetween($min = 1, $max = 10),
    ];
});

ここで気を付けたいのは
use App\Model;
を書き換えること!
矢印で示しておきました。

ここでモデルを指定してあげないと
InvalidArgumentException : Unable to locate factory with name [default] [App\Recipe].

てな感じでエラーが出ちゃいます(><)

Seederを作る

$php artisan make:seeder [ファイル名]

例)
php artisan make:seeder RecipesTableSeeder

こんな感じ
デフォルトで入っているUsersTableSeederを参考にしてみてください。

<?php

use Illuminate\Database\Seeder;

class AdminTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}

中身はこんな感じ

function run()の中に、Factoryでダミーデータ何個作るかを記述する。

<?php

use Illuminate\Database\Seeder;

class RecipesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(\App\Recipe::class, 10)->create();  
    }
}

これで10個データができます

最後に、、、

DatabaseSeeder.phpの更新

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UsersTableSeeder::class);  ←元から入ってるよ
        $this->call(RecipesTableSeeder::class); ←こいつを追加
    }
}

ラスト
$php artisan db:seed で実行

あれなんかおかしいよって人は

composer dump-autoload

試してみてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】Artisanコマンド基礎

Artisanコマンドとは

  • PHPのフレームワークであるLaravel専用のコマンド
  • Artisanコマンド使用することでモデルやコントローラを簡単に作成することが出来る

アプリケーション作成

ターミナル
laravel new アプリケーション名

サーバー立ち上げ

ターミナル
php artisan serve

コントローラ作成

ターミナル
php artisan make:controller コントローラ名

サービスプロバイダー作成

ターミナル
php artisan make:provider サービスプロバイダー名

ミドルアウェア作成

ターミナル
php artisan make:middleware ミドルウェア名

フォームリクエスト作成

ターミナル
php artisan make:request フォームリクエスト名

モデル作成

ターミナル
php artisan make:model モデル名

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

ターミナル
php artisan make:migration create_テーブル名_table

マイグレーションファイルの実行状況確認

;ターミナル
php artisan migrate:status

マイグレーションを実行

ターミナル
php artisan migrate

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

ターミナル
php artisan migrate:rollback

シーダーファイルの作成

ターミナル
php artisan make:seeder シーダー名

シーダーを実行する

ターミナル
php artisan db:seed
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntu上Docker(docker-compose)を使ってmysql8,https対応、redis使用のngnix+Laravel環境構築

今まではLaravelのローカル開発環境はVagrant+VirtualBox+Homesteadを使ったが,Vagrant,VirtualBox,OSのバージョンアップにより、数時間をかけて環境を作り直したことがあります。今回は、Dockerを使ったので、下記の記事を参考しながら、環境構築をしてみました。
docker-composeでLaravelの開発環境を整える方法とその解説
とてもわかり易い記事ですが、開発に必要なhttps対応や、Mysql8とRedisなど必要な設定対応がなかったので、メモとしてを整理しました。
★ベストプラクティスかどうか分からないので、ご指摘ください。

読む対象:
* docker + laravel 開発者で、 HomesteadからDockerへ移行したい方
* nginxのhttps対応、Mysql8の設定、redisの設定、何れが必要な方

ホストマシンOS
Ubuntu18.0.4

全体目次:
手順
初期のフォルダー構造
docker-compose.yaml設定
phpコンテナのDockerfile設定
nginxのhttps対応
project source codeダウンロード
mysql8対応設定
redisコンテナと設定
動作確認

手順

初期のフォルダー構造

まず/home/user/の下に初期のフォルダー構造を作成します。

├── docker
│   └── web
│       └── default.conf
|   └── php
|       └── Dockfile
|   └── mysql
├── docker-compose.yml
└── project

※ projectフォルダーはproject(laravel)source code を入れるところ
ファイル~/docker/docker-compose.yaml, ~/docker/web/default.conf, ~/php/Dockfileの設定は下記になります。

docker-compose.yaml設定

~/docker/docker-compose.yaml設定
version: '3'
services:
  web:
    image: nginx:1.18.0
    container_name: web
    ports:
      - 443:443
    depends_on:
      - app
    volumes:
      - ./web/default.conf:/etc/nginx/conf.d/default.conf
      - ./server.crt:/etc/nginx/server.crt
      - ./server.key:/etc/nginx/server.key
      - .:/var/www/html
  app:
    build: ./php
    container_name: app
    volumes:
      - .:/var/www/html
    depends_on:
      - mysql
  mysql:
    build: ./mysql

 image: mysql:8
    container_name: mysql
    environment:
      MYSQL_DATABASE: habidodb
      MYSQL_USER: homestead
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/mysql-confd:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql

  redis:
    image: redis:3.2.12-alpine # 以前はlatestだった
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
    restart: unless-stopped
volumes:
        mysql-data:

nginxのhttps対応

(1)~/docker/web/default.conf設定

default.conf設定
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

server {
    listen 80;
    server_name localhost;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ;
    server_name localhost;

    ssl on;
    ssl_certificate /etc/nginx/server.crt;
    ssl_certificate_key /etc/nginx/server.key;

    root  /var/www/html/project;
    index index.php index.html index.htm;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    location / {
        try_files $uri $uri/ /index.php$is_args$args; }
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

(2)sslキーを作成
自己署名証明書でhttpsアクセスができるコンテナを作るためにsslキーが必要になります。

$cd ~/docker
$openssl req -x509 -nodes -new -keyout server.key -out server.crt -days 365

を実行したら、server.keyとserver.crtを~/dockerの下に確認できました。

phpコンテナのDockerfile設定]

FROM php:7.2-fpm

# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim

RUN docker-php-ext-install pdo_mysql

RUN apt-get update \
    && apt-get install -y libpq-dev \
    && docker-php-ext-install mysqli pdo pdo_pgsql

RUN pecl install -o -f redis \
    &&  rm -rf /tmp/pear \
    &&  docker-php-ext-enable redis

RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - \
    && apt-get update \
    && apt-get install -y nodejs

#Add user for laravel application
RUN groupadd -g 1000 teiri && \
    useradd -u 1000 -ms /bin/bash -g teiri teiri


# Install Node
RUN apt-get update &&\
    apt-get install -y --no-install-recommends gnupg &&\
    curl -sL https://deb.nodesource.com/setup_10.x | bash - &&\
    apt-get update &&\
    apt-get install -y --no-install-recommends nodejs &&\
    npm config set registry https://registry.npm.taobao.org --global &&\
    npm install --global gulp-cli

project source codeダウンロード

※既に自分のPCにプロジェクトソースコード管理している場合は下記の部分をスキップできます。
projectソースコード用フォルダー作成

$mkdir ~/docker/projectname
$cd ~/docker/habido

git初期化

$cd ~/docker
$git init

laravelプロジェクトのソースコード取得

$git remote add origin 追加したいリポジトリ
$git clone リポジトリのURL

~/docker/projectnameのフォルダーが作成されることが確認できます。
laravelインストール

composer installでcomposer.jsonに定義されているlaravel framesなど必要なパッケージをインストールします。

$composer install

※Homesteadの環境よりずっと速い!

mysql8対応設定

.envファイルを設定

必要があれば、DBの設定をdocker-compose.yamlと一致するようにします
例:

DB_HOST="mysql"
DB_PORT=3306
DB_DATABASE="habidodb"
DB_USERNAME="homestead"
DB_PASSWORD="secret"

MySQL8.0.4以降 のログイン認証方式は caching_sha2_password がデフォルトなので、
もしmysql 5.* からmysql8に変更した場合は認証方式の設定を変更する必要があります。

(1)mysqlのコンテナに入る

コンテナを起動

$docker-composer up -d

コンテナ一覧を確認する
docker-compose ps
image.png

$docker exec -it {mysql_container_name} bash

(2)rootユーザとしてログイン,passwordはdocker-compose.yamlの中の設定一致する必要があります。

$mysql -uroot -p

認証方式を変更

 ALTER USER 'homestead'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';

注)↑のコマンドに使うユーザとパスワードはdocker-compose.yamlに設定された内容が一致する必要があります。

image.png

変更を反映するために、コンテナ再起動

$docker-compose down
$docker-compose up -d

プロジェクトのデータベーステーブル作成
appコンテナに入る

docker exec -it --user {username} app bash

cd project フォルダー

cd /var/www/html/project
$ php artisan migrate

必要なSeed data作成

$ php artisan db:seed

redisコンテナと設定

redisのIPアドレス確認
docker inspect redis | grep "IPAddress"
image.png

.envでRedis設定

REDIS_HOST="172.23.0.2"
REDIS_PASSWORD="null"
REDIS_PORT="6379"

動作確認

最後にブラウザで確認サイト確認
https://localhost

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-composeで、MySQLの設定ファイル変更を適用させる

何をするのか

docker-composeでMySQLの設定ファイル(my.conf)の中身を更新したが、作り直したコンテナに反映されなかったため、これを反映させる。

環境

  • Laravel
  • MySQL8.0
  • docker-compose version 1.26.2

こちらを参考にDockerでLaravelの環境構築をしていました。
【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン

問題が起きた背景

Laravelでは、MySQLのバージョンが8の場合にデータベース接続がうまくできない不具合があります。

MySQLのバージョンが8.0.4以降の場合、デフォルトの認証方式がcaching_sha2_passwordになっており、PHPのMySQL接続ライブラリがcaching_sha2_passwordに対応していないため、MySQLに接続できない(ログインできない)というエラーが発生していました。

引用:Laravel+MySQL8.0環境でマイグレートできない場合の原因と対処法

このため、「認証方法を変更」を行いました。

ただ、↓のリンクに「すでに認証方法が対応された」と書かれていたのであえて変更する必要もないと思いMySQLの設定の以下をコメントアウトしました。(これが間違いだった。)
MySQL8.0 認証方式を変更する(Laravel5) - Qiita

my.cnf
# MySQL8 caching_sha2_password to mysql_native_password
default-authentication-plugin = mysql_native_password

そのままdocker-compose up -d —buildして

マイグレーションしたらところエラー発生

Illuminate\Database\QueryException 

  SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = routine-share and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
    667|         // If an exception occurs when attempting to run a query, we'll format the error
    668|         // message to include the bindings with SQL, which will make this exception a
    669|         // lot more helpful to the developer instead of just the database's errors.
    670|         catch (Exception $e) {
  > 671|             throw new QueryException(
    672|                 $query, $this->prepareBindings($bindings), $e
    673|             );
    674|         }
    675| 

      +34 vendor frames 
  35  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

それならば、さっきのコメントアウトを戻せば大丈夫だろうと思い
docker-compose downしてから
先程のmy.cnfの認証方法変更部分のコメントアウトを戻しました。

改めてdocker-compose up -d —buildをします。

が、マイグレーションできず、同じエラー画面になります。

解決方法

どうやらデータベース(volumes)がマウントされていると設定が変更されないようでした。

一度データベース(volumes)を削除すればOKなので、、、

docker volume prune

したところ、マイグレーションまで問題なくできました。

参考にしてもらえたらうれしいです。

以下参考:
DockerのMySQLの環境変数系の設定が反映されないのは余計なデータベースをマウントしているから - Qiita

Laravel+MySQL8.0環境でマイグレートできない場合の原因と対処法

Docker: where is docker volume located for this compose file

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】ルート定義を正規表現付きで設定するには

正規表現の制約設定

Laravelでは、ルートを定義するファイルroutes/web.phpに正規表現を利用してルート定義できます。ルートインスタンスのwhereメソッドを使用しましょう。
第1引数に制約設定をしたいパラメータ名、第2引数に正規表現を記入します。

(例1)routes/web.php
Route::get('user/{name}', function ($name) {
    // 
})->where('name', '[A-Za-z]+');

nameパラメータは、小文字a~z、大文字A~Zで1文字以上であること
 

(例2)routes/web.php
Route::get('user/{id}', function ($id) {
    //
})->where('id', '[0-9]+');

idパラメータは、数字0~9で1文字以上であること
 

(例3)routes/web.php
Route::get('user/{id}/{name}', function ($id, $name) {
    //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

idパラメータは、数字0~9で1文字以上であること
nameパラメータは、小文字a~zで1文字以上であること

例3ではwhereメソッドに連想配列を入れて制約設定を行っています。
キーにパラメータ名、値に正規表現という感じです。

上記の各々の例を参考に、パラメータの制約が設定できます。「自分で定めた設定のパラメータを正規表現で設定したいんや~!」というときに、このwhereメソッドを活用しましょう。:grinning:

グローバル制約

ルート定義ファイルroutes/web.phpwhereメソッドを使用して、1個ずつルートの制約設定をするのも良いですが、指定した正規表現を、ルート定義した全部のルートパラメータに適応させたい場合はapp/Providers/RouteServiceProvider.phpbootメソッド内で設定を行いましょう。

app/Providers/RouteServiceProvider.php
    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        Route::pattern('id', '[0-9]+'); // 追加した部分
        parent::boot();
    }

Route::pattern('id', '[0-9]+');の部分を追加することで、idパラメータを使用している全ルートで、自動的に「0~9の数字で1文字以上」という制約がかかります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでLaravel+Apache+MySQLの開発環境を構築する

https://note.com/pocke_techblog/n/n8af813848fa0

上記の記事通りにすすめて、DockerでLaravel+Apache+MySQLの開発環境を構築しましたが、パーミションのエラーが出て解決に手こずったので記録に残しておきます。

作業環境

OS:Windows 10 Pro ver.2004
Docker:version 19.03.12, build 48a66213fe

Dockerのインストール

Dockerのインストール方法については別記事にて解説しているので、まだインストールしていないのであれば参考にしてみてください。
Windows 10 Pro : Dockerをインストールする

サンプルコードを準備する

フォルダ構成

フォルダ構成は以下の通りです。

.
├── docker/
│   ├── app/
│   │   ├ Dockerfile
│   │   ├ php.ini # PHP設定用のファイル
│   │   └ 000-default.conf  # Apacheの設定ファイル
│   └── db/
│        ├ data/ # MySQLのデータを保存しておくディレクトリ
│        └ my.cnf  # MySQLの設定ファイル
│
├── src/ # Laravelのソースを格納するディレクトリ
└── docker-compose.yml

ソースコード

Dockerfile

# どんなdockerイメージを利用して構築をするか
FROM php:7.4-apache

# 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる
ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

# Composerのインストール
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

# ミドルウェアインストール
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libpng-dev \
libpq-dev \
&& docker-php-ext-install pdo_mysql

# Laravelで必要になるmodRewriteを有効化する
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

php.ini

docker/app/php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
docker/app/000-default.conf
<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html/laravelapp/public
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/html/laravelapp/public>
           AllowOverride All
       </Directory>
</VirtualHost>

my.cnf

docker/db/my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4

docker-compose.yml

docker-compose.yml
# Compose fileのバージョン指定
version: '3'
# どんなコンテナを立ち上げるか
services:
 # laravelを動かすコンテナ
 app:
   # どのポートを開いて繋ぐか。下記はコンテナの80番ポートを開いて、ホストの8000番につなぐ
   ports:
     - "8000:80"
   # 先ほど作ったDockerfileを使って、コンテナをビルドするという指定
   build: ./docker/app
   # コンテナの名前を指定
   container_name: laravel_app
   # コンテナとホスト側のディレクトリを同期する場所の指定。laravelのソースが入る予定の場所
   volumes:
     - ./src:/var/www/html
 # MySQLを動かすコンテナ
 db:
   # Docker HubからMySQL5.7の公式イメージをダウンロードしてくる指定
   image: mysql:5.7
   container_name: laravel_db
   # コンテナ内の環境変数を指定。環境変数を渡すとビルド時に設定してくれるDockerイメージがあるので、利用の際はDocker Hubのサイトで確認すると良い
   environment:
     MYSQL_ROOT_PASSWORD: root
     MYSQL_DATABASE: laravel_db
     MYSQL_USER: laravel_user
     MYSQL_PASSWORD: laravel_pass
     TZ: 'Asia/Tokyo'
   # 起動時のコマンド
   command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
   # ディレクトリ同期。設定ファイルとMySQLのデータが保存される場所を同期している。コンテナは基本的に起動時に変更されてもコンテナ自体が止まるとデータが消えてしまうため、保存しておきたいものはホストマシンと同期しておく必要がある。
   volumes:
     - ./docker/db/data:/var/lib/mysql
     - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
   ports:
     - 3306:3306

開発環境を構築する

Docker Composeでコンテナを立ち上げる

次のコマンドを実行して、Docker Composeでコンテナを立ち上げます。

$ docker-compose build
$ docker-compose up

Laravelのプロジェクトを作成する

上記とは別の画面を立ち上げて次のコマンドを実行して、Laravelのプロジェクトを作成します。

$ docker exec -it laravel_app bash
$ composer create-project laravel/laravel --prefer-dist laravelapp

これでhttp://localhost:8000 にアクセスするとLaravelの画面が立ち上がるはずですが、パーミッションのエラーが起きてしまいました。

パーミッションのエラーを解決する

最初に以下のようなエラーメッセージが出ました。
The stream or file "/var/www/html/laravelapp/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: Permission denied

ここのサイトを参考に以下のコマンドを実行しました。

$ chmod 777 /var/www/html/laravelapp/storage/logs/laravel.log
$ chmod 775 /var/www/html/laravelapp/storage/logs/

すると以下のようにエラーメッセージの文言が変わりました。
file_put_contents(/var/www/html/laravelapp/storage/framework/sessions/oI2ffP9BUcWC0llE0NEoFU09eqQyXTosSZZeq4BV): failed to open stream: Permission denied

ここのサイトを参考に以下のコマンドを実行しました。

chmod -R gu+w /var/www/html/laravelapp/storage
chmod -R guo+w /var/www/html/laravelapp/storage
cd ./laravelapp
php artisan cache:clear

これでパーミッションのエラーが解決して、Laravelの画面が表示されました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでAPI単位で接続先DBを切り替える

TL; DR

Laravelでは、接続先のDBのホストのread/write接続が自動的に設定されすが、OracleDatabaseへの接続をyajra/OCI8を用いると、このread/write接続が行えません。

そのため、Middlewareにて、エンドポイント単位で接続先のDBを切り替えます。

環境

  • Windows 10
  • PHP 7.2
  • Laravel 5.5
  • Oci8 5
  • Oracle database

Middleware作成

今回は、read接続先指定用とwrite接続先指定用のMiddlewareを作成します。
作成手順は、以下の要領です。

/var/www/html# php artisan make:middleware ConnectWriteDatabase
Middleware created successfully.
/var/www/html# php artisan make:middleware ConnectReadDatabase
Middleware created successfully.

これで、以下のMiddlewareが作成されました。

ConnectWriteDatabase.php

<?php
namespace App\Http\Middleware;
use Closure;
class ConnectWriteDatabase
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

ConnectReadDatabase.php

<?php
namespace App\Http\Middleware;
use Closure;
class ConnectReadDatabase
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

Middlewareの登録

作成したMidllewareはそのままでは使用できません。そのため、使用できるようにするためには、Karnel.phpへの登録が必要です。通常ですとMiddlewareを全HTTPリクエストに適用するにはGlobal MiddlewareとしてKarnerl.phpへの登録を行う必要があります。

ですが、今回は特定のHTTPリクエストに対してMiddlewareを適用するため、Kernelの$routeMiddlewareへの登録を行います。

App\Http\Kernel.php

<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/** 省略 */
    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        // ここにMidlewareを追加
        'connect.write' => \App\Http\Middleware\ConnectWriteDatabase::class,
    ];
}

Middlewareのエンドポイントへの適用

指定したエンドポイントに作成したMiddlewareを適用するには、大きく2つの方法があります。

  1. routes/api.phpに記載
  2. ハンドラメソッドのコンストラクタに記載

ここでは、「1.routes/api.phpに記載」の方法をとります。
Laravelでは、Routingの設定では、routesディレクトリ直下のルートファイルで定義をします。
このとき、RouteGroupを使用することで、複数のRoutingの定義対象に対して、適用するMiddlewareを指定することができます。

例:公式ドキュメントRoutingから抜粋

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // firstとsecondミドルウェアを使用
    });
    Route::get('user/profile', function () {
        // firstとsecondミドルウェアを使用
    });
});

この要領で、write接続を行うエンドポイントを定義するRouteメソッドをGroupで定義し、Middlewareconnect.writeの指定を行います。

Route::middleware(['connect.write'])->group(function () {
    Route::post('/user', '/Api/User/StoreAction');
    Route::put('/user/{user}', '/Api/User/UpdateAction');
});
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む