20200324のlaravelに関する記事は9件です。

【Laravel】Docker for WindowsでLaradock(+MySQL)に挑戦(※格闘)してみた。【備忘録】

はじめに

Docker for WindowsでLaradockの環境構築をして、Webアプリが作れるところまで記載しております。

DBに関してはMySQLでphpmyadminも利用できるようにしています。

※まだできていませんが、PostgreSQLでの環境構築の格闘記録はこちらにあります。(なんでこんなに難しいの。。。)

https://chobimusic.com/laradock_postgresql/

※僕の備忘録でもあり、構築できるようになるまでにかなり苦労したのでとても長文です。かなりのエラーを潰してきたので、部分部分かいつまんで参考にしていただければと思います。どなたかの参考になれば幸いです。※

参考記事


Windows10でLaradockを使ってLaravel 5.5環境を作る
https://qiita.com/sket88/items/4de708ce394179c61d8a


DockerでMySQL複数バージョンを共存させる
https://qiita.com/tanakaworld/items/427b94ea0435b5dccfa2


LaradockのMySQLに接続できなくてはまった話
https://qiita.com/dnrsm/items/4bd078c17bb0d6888647


laradockの環境設定からMySQL接続まで
https://qiita.com/yknsmullan/items/dea4102cf14b1b66e5af


docker起動でportが確保できないエラーの解決
https://nijoen.net/blog/773/


Dockerでコンテナの停止・削除ができなくなった時の対処法
https://qiita.com/musatarosu/items/31d6293a93e75ca6073e


docker docker-compose コマンド
https://qiita.com/souichirou/items/6e701f6469822a641bdd

参考書籍

https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-Laravel-Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B35-5-LTS%E5%AF%BE%E5%BF%9C/dp/4802611846

環境構築


(Dockerのインストールは、書籍を参考にインストール)

フォルダ作成。

$ mkdir laravel_app 
$ cd laravel_app

git cloneコマンドでLaradockのダウンロード後、.envファイルの作成
$ git clone https://github.com/laradock/laradock.git
$ cd laradock
$ cp env-example .env

.envファイルを編集(※MySQLのバージョンが8.0以上になっているとセキュリティの関係でDockerがうまく動作しないらしい)
MYSQL_VERSION=5.7

APP_CODE_PATH_HOST=../laravel-practice/ //後でインストールするlaravelの名前

コンテナの初期化(実行コマンド※Dockerアプリは起動した状態※)
$ docker-compose up -d nginx mysql workspace phpmyadmin

ここでエラー発生。

どうやら3306ポートが使えないらしい。.envファイル上で3306と記載の部分を3307に変更して再度compose upするも同様のエラー。(追記:XAMPPを起動していたのを見落としていました。それが原因。)

XAMPPでも3307のポートを使用しているので、念のためその後ポートは3306に戻す。

ためしに以下のコマンドで起動してみる。

docker-compose up

バカみたいに時間がかかったのでctrl+cで離脱。
docker-compose up -d nginx mysql

上記と同様(3306ポートが使えない。)のエラーが発生。

一応下記のコマンドでstatusがupになっていれば起動しているらしい。

$ docker ps

どうやらnginx,php-fpm,workspace,docker:dindは起動してる。記載のないphpmyadminとmysqlが起動していない。

$ docker-compose exec --user=laradock workspace bash
laradock@0b80605539aa:/var/www$

ただnginxとworkspaceは起動しているのでとりあえずログインを試みたところログインはできた。
composer create-project laravel/laravel laravel-practice --prefer-dist "5.5.*"

さらにLaravelプロフェクトの作成を試みる。下記ディレクトリに作成されていることを確認。
(ここで最低限、Docker自体は起動していることは確認。MySQLのエラー解決に関しては後述。)

exitでコンテナからログアウト。.envファイル(laradock側の共有ディレクトリ)に以下を追記。

DB_HOST=mysql

サービスの終了
docker-compose stop

再起動
docker-compose up -d nginx mysql workspace phpmyadmin

やはり3306ポートエラーになる。

XAMPPを終了して3307に変更して再起動。(ここでXAMPPを切り忘れていたことに気付く。)

mysqlが起動した!!どうやらXAMPPと干渉しあってたっぽい。。。(3306はなんなんだ。。。)

Dockerを使う際はXAMPPを停止しましょう。

ただphpmyadminはエラーで起動できていないので、laravel-practiceの.envファイルを編集して再起動。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

⇓以下のように編集
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3307
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

再起動してみてもphpmyadminのエラーは変わらず。

ダメもとでコンテナにログインしてmigrateしたところ下記のようなエラー。
そもそもartisanコマンドすら利かないことが判明。。。

$ docker-compose exec --user=laradock workspace bash
laradock@0b80605539aa:/var/www$ php artisan migrate
Could not open input file: artisan

localhostへアクセスしてもnot found。hostsファイルやらDockerの初期設定にも間違いがあるかもしれない。

戦いは続く…

再挑戦編


phpmyadminとの格闘


PCを再起動してからDockerを再起動してみる。

phpmyadminは変わらず起動しない。
※0.0.0.0:8080のバインドに失敗しました:ポートは既に割り当てられています

netstat -ano | find ":8080"
find: ‘:8080’: No such file or directory

このコマンドでポートで何が使用されているかわかるらしいが何も反応せず。。。
docker ps -a

調べると以前のプロセスもこのコマンドでチェックできるとのことで実行。

7 weeks agoとめちゃくちゃ怪しいログを発見。

docker rm docker ps -a -q

こちらで停止できるとのことだが
Error response from daemon: You cannot remove a running container
(デーモン(メモリ上の常駐ソフトウェア)からのエラー応答:実行中のコンテナを削除できません)

終了できそうなコマンドを一通り入力。

docker-compose kill
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

再起動するも変わらないので、まだ削除されていないコンテナがあるっぽい。。。
docker ps //起動中のコンテナを表示。
docker rm --force <コンテナID> //指定のコンテナを強制終了

見つけたコンテナを強制終了して再起動するもport被りの状況は変わらず。。。
docker-compose up -d

ためしに上記コマンド。(鬼時間かかる。。。おそらく3時間くらい待った。)長すぎるので割愛。最後の文が赤字の時点でアウト。。。

以下の通り何も表示されない。待った意味。。。一旦ステイ。。。

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

MySQLとの格闘


たまたまこんなものを見つける。(いつ入れたのか全く覚えていない。これが干渉している??)

見つけた。どうやらLaravelを学習する際に入れた模様。

一応MAMPインストールした過去があったのでこちらの共存も気になったが、起動してなければ特にコンフリクト(衝突)することはないそうなので追求せず。

とりあえずこいつを停止してみた。

おそらくこいつのせいでXAMPPのポートも3306で起動できず、3307に変更せざるを得なかったんだなと気づく。

とりあえず3306にDocker内のファイルを変更してみる。mysqlは3306でも起動するようになった!!

残る問題はphpmyadminとartisanコマンドの実行だ。。。

artisanコマンドとの格闘


laradock@48ebb9bcd534:/var/www$ php artisan serve
Could not open input file: artisan
$ cd laravel-practice
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>

ディレクトリが違うだけだった。。。

が、http://127.0.0.1:8000にアクセスしてもエラー。

コンテナからexitしてもしやと思いコンテナに入らずにアクセス。

表示された。(これであってるのか。。。??) 追記:コンテナで環境構築してるのでartisan serveは不要なのを後に知る。

ためしにdockerを終了してからアクセスしたところ表示されないので合ってるっぽい。とりあえず構築成功??

マイグレートも失敗。これはテーブル作成などもしてないからなんとなく理解できる。

php artisan migrate

phpmyadminとの格闘②


docker-compose.ymlのphpmyadminのポート番号を8081に変更。
//ポートのみ変更した場合
phpmyadmin:
      build: ./phpmyadmin
      environment:
        - PMA_ARBITRARY=1
        - MYSQL_USER=root
        - MYSQL_PASSWORD=password
        - MYSQL_ROOT_PASSWORD=password
    ports:
    - 8081:80

//サーバ名を調べるのに試行錯誤したパターン。※ログインエラー。
mysql:
      build:
        context: ./mysql
        args:
          - MYSQL_VERSION=${MYSQL_VERSION}
      environment:
        - MYSQL_DATABASE=DB
        - MYSQL_HOST=DB
        - MYSQL_USER=root
        - MYSQL_PASSWORD=password
        - MYSQL_ROOT_PASSWORD=password
        - TZ=${WORKSPACE_TIMEZONE}

phpmyadmin:
      build: ./phpmyadmin
      environment:
        - PMA_ARBITRARY=1
        - PMA_HOST=mysql
        - PMA_USER=root
        - PMA_PASSWORD=password
      ports:
        - 8081:80

全てきれいにdoneになった。泣 (そして一体8080ポートは何に使用しているんだろうか。。。)

http://localhost:8081でphpmyadminへアクセス。

サーバ名。。。わからずログインできず。。。

(その後かなり格闘した末。。。)laravel-practiceの.envに従い入力したところログインに成功。
サーバ:mysql
ユーザー:default
パスワード:secret

以下参照

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3307
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

喜びも束の間。データベースを作成する特権がありません。と表示。

.envファイルにこんな記載があるのを思い出す。ユーザーrootでパスワードrootを入力したところログイン。編集もできた◎

MYSQL_ROOT_PASSWORD=root

mysql -u root -p root //こちらからもアクセス可能

create database default; //DB作成

ところがコンテナ内でmigrateはできず。。。

次はちゃんと教材見ながらトライしてみよう。。。挑戦はまだまだ続く。。。

日を改め再チャレンジ


PostgreSQLでサイトの表示まではできたので、再度チャレンジ。(以下参考。)

https://chobimusic.com/laradock_postgresql/

compose upの前に.envファイルを編集。

APP_CODE_PATH_HOST=../laravel #laravelのプロジェクトファイル名に書き換え
DATA_PATH_HOST=../data #複数データを参照してしまう可能性があるため
COMPOSE_PROJECT_NAME=docker_mysql #dockerのコンテナ名を変更
MYSQL_VERSION=5.7 #latestから変更
DB_HOST=mysql #追記

さらにdocker-compose.ymlのphpmyadminのポート番号を8081に変更。(MySQL Notifierも毎回起動するので停止させておく。)

コマンド実行。もはや1つもdoneされない状況に。。。泣 前は表示されなかったのに。

$ docker-compose up -d nginx mysql workspace phpmyadmin

【ERROR: Service 'php-fpm' failed to build: The command '/bin/sh -c if [ ${INSTALL_IMAGEMAGICK} = true ]; then apt-get install -y libmagickwand-dev imagemagick && pecl install imagick && docker-php-ext-enable imagick ;fi' returned a non-zero code: 100】でサービス 'php-fpm'の構築に失敗しているとのこと。


以下の記事を参考に、php-fpmディレクトリのDockerfileにて以下をImageMagickの欄に追記。再度試したところdoneと表示◎

http://domwp.hatenablog.com/entry/2019/01/30/151146

apt-get update && \ 

laravelのバージョンを教本だと5.5のところあえて6.8で今回はチャレンジ。成功。

$ docker-compose exec workspace composer create-project --prefer-dist laravel/laravel . "6.8.*"
Application key set successfully.

Laravelアプリ トップ画面 http://localhost/
phpmyadmin トップ画面 http://localhost:8081/

以下でphpmyadminにログイン。DBにdocker_mysqlがあること確認。

サーバ名:mysql
ユーザー名:root
パスワード:root

Laravel側の.envファイルを編集。

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=docker_mysql
DB_USERNAME=root
DB_PASSWORD=root

コントローラー作成


コントローラー作成はOK
$ docker-compose exec workspace php artisan make:controller ArticleController
Controller created successfully.

DB作成


マイグレーションファイルの作成。
$ docker-compose exec workspace php artisan make:migration create_articles_table --create=articles
Created Migration: 2020_03_24_092458_create_articles_table

マイグレート。初めてマイグレートに成功◎laravel側の.envファイルをrootユーザーで記入したからっぽい。
$ docker-compose exec workspace php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.13 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (0.13 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.07 seconds)
Migrating: 2020_03_24_092458_create_articles_table
Migrated: 2020_03_24_092458_create_articles_table (0.05 seconds)

これでやっとアプリ制作に取り掛かれるようになった。。。泣
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】Docker for WindowsでMailHogの実装をしてみた。

はじめに

Dockerの環境構築を頑張ろうと思ったきっかけである以下の教材。

https://chobimusic.com/laravel_vue_sns/

Dockerの環境構築ができたので、当時できなかったMailHogの実装に挑戦してみました。

※ちなみに以下が死ぬほど格闘したLaradock(+MySQL)の環境構築の備忘録です。

https://chobimusic.com/laradock_mysql/

MailHogの実装


以下の記事と上記記載の教材を参考に。

https://tech.windii.jp/backend/laravel/laravel-mailhog-docker-compose

MailHogのコンテナを起動。http://localhost:8025/にアクセスするとMailHogが表示される。

$ docker-compose up -d mailhog
WARNING: Image for service mailhog was built because it did not already exist. To rebuild this image you must use docker-compose build or docker-compose up --build.
Creating docker_mysql_mailhog_1 ... done

以降、再起動する場合はコマンドが以下になる。
docker-compose up -d workspace nginx php-fpm postgres mailhog

laravel側の.envを編集。
MAIL_DRIVER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=user
MAIL_PASSWORD=password
MAIL_ENCRYPTION=null

Mailableクラスを作成
$ docker-compose exec workspace php artisan make:mail Test --markdown=emails.test
Mail created successfully.

routes/web.phpを編集。
use Illuminate\Support\Facades\Mail;
use App\Mail\Test;

Route::get('/', function () {
return view('welcome');
});

Route::get('/test', function () {
Mail::to('test@example.com')->send(new Test);
return 'メール送信しました!';
});

http://localhost/test
にアクセス。

http://localhost:8025
にアクセス。無事確認できました◎

XAMPP環境下では、MailHogの実装ができなかったので嬉しい!!

 

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

Laravel5でマイグレーション実行時に読み込む.envファイルを切り替える

はじめに

Laravel5ではマイグレーション実行時にも読み込む.envファイルを切り替えることができますが、バージョンによって方法が異なります。
5.3以降の方法についての説明はいくつかありますが、5.2以前の方法があまりなかったので、以下に記載します。

前提

環境ごとに各.envファイルが作成されているものとします。

環境 ファイル
開発環境 .env.dev
ステージ環境 .env.stg
本番環境 .env.prod

5.3以降の場合

開発環境
$ php artisan migrate --env=dev
ステージ環境
$ php artisan migrate --env=stg
本番環境
$ php artisan migrate --env=prod

5.2以前の場合

開発環境
$ export APP_ENV=dev
$ php artisan migrate
ステージ環境
$ export APP_ENV=stg
$ php artisan migrate
本番環境
$ export APP_ENV=prod
$ php artisan migrate

解説

5.2以前でもマイグレーション実行時のオプションを確認する下記コマンドを実行すると、--envオプションが使えるように見えます。

$ php artisan migrate --help
Usage:
  migrate [options]

Options:
# 中略
      --env[=ENV]            The environment the command should run under.

しかし、下記のIssueにあるような不具合があるため、実行しても意図したenvファイルを読み込みません(エラーにもなりません)。
https://github.com/laravel/framework/issues/14941

これは下記のPRで修正され、バージョン5.3に適用されました。
https://github.com/laravel/framework/pull/15629

そのため、5.2以前と5.3以降で実行コマンドに差異が生じます。

まとめ

  • Laravel5のマイグレーション実行コマンドはバージョンによって異なる。
  • 使用できないオプションをヘルプに書いてはいけない。

参考

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

【Laravel】テストDBとしてSQLiteを設定する

config/database.php

config/database.phpにテスト用のDBとしてSQLiteを追加します。

database.php
    'connections' => [

        'testing_sqlite' => [
            'driver' => 'sqlite',
            'database' => ':memory:',
            'prefix' => '',
        ],
    ],

'database' => ':memory:'ではインメモリの設定をしています。

phpunit.xml

phpunit.xmlに<server name="DB_CONNECTION" value="testing_sqlite"/>を追加します。

phpunit.xml
                       (略)
    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="DB_CONNECTION" value="testing_sqlite"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <server name="MAIL_DRIVER" value="array"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>   
    </php>
</phpunit>

自分は5.8ですが、Laravelのバージョンによってはタグが<server />ではなく<env />となっている場合もあるようです。

設定キャッシュをクリア

忘れないようにしましょう。

$ php artisan config:clear

これでテスト用のDBがSQLiteに設定されたと思います。

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

Laravelでジョブとキューを理解する

はじめに

Laravelにはジョブとキューと言う機能があります
本記事ではジョブとキューとは何か
そして、ジョブとキューを使って非同期な機能を実装する
サンプルを作成していきます

キュートとは

キューはある決まった処理を非同期で実行するための仕組み
キューにジョブを登録していきその処理を実行していく

ジョブとは

ジョブとは処理を実行する本体になります
キューにジョブが登録され、キューにあるジョブが実行されます
処理自体を担当するのがジョブになります

サンプル作成

では実際に、ジョブとキューを使ったサンプルを作っていき
ジョブとキューの仕組みについて理解していきます
今回作るサンプルは、Userを一覧表示し/{id?}に対してidの部分にUserのIDを指定します
その指定されたUserの名前に[JOB]と言う文字を付けたり、外したりを非同期で行います
Laravelプロジェクトは各自で作成してください

キュー用のテーブルを作成する

まずジョブが登録されるキューのテーブルを作成していきます
コマンドにて下記を実行してください

$ php artisan queue:table
$ php artisan migrate

これでキュー用のテーブルjobs
キューの実行失敗時に使用されるテーブルfailed_jobsが作成されます
また、今回使用するUsersテーブルも作成されてるかと思います
また、バージョンの違いによりfailed_jobsテーブルが作成されていない場合は
下記コマンドを実行し作成してくだ際

$ php artisan queue:failed-table
$ php artisan migrate

これで必要なテーブルは用意できました

サンプルデータの作成

Seederファイルを作成しダミーのデータを作成します
下記コマンド実行

$ php artisan make:seeder PersonTableSeeder

database/seedsにファイルが作成されます
作成したファイルに追加していきます

PersonTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class PersonTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $param = [
            'name' => '太郎',
            'email' => 'taro@gmail.com',
            'password' => '99999999'
        ];

        DB::table('users')->insert($param);

        $param = [
            'name' => '花子',
            'email' => 'hanako@gmail.com',
            'password' => '99999999'
        ];

        DB::table('users')->insert($param);

        $param = [
            'name' => '次郎',
            'email' => 'ziro@gmail.com',
            'password' => '99999999'
        ];

        DB::table('users')->insert($param);
    }
}

次に作成したシーダファイルを登録します
database/seeds/DatabaseSeeder.phpにて下記を記述してください

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(PersonTableSeeder::class);
    }
}

これでシーダファイルと登録が完了しました
下記コマンドを実行します

$ php artisan db:seed

これでUsersテーブルに3件のダミーデータを用意できました
このデータを一覧表示します

データの表示

まずはコントローラを作成します

$ php artisan make:controller MainController

次にルートの定義をします

web.php
Route::get('/{id?}, 'MainController@index');

コントローラーのアクションを実装します

MainController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;
use App\Jobs\SampleJob;

class MainController extends Controller
{
    public function index($id = null) {
        if ($id !== null) {
            $user = User::find($id);
        } else {
            $user = null;
        }

        if ($user != null) {
            SampleJob::dispatch($user)->delay(now()->addMinutes(1));
        }

        $data = User::all();

        return view('main.index', compact('data'));
    }
}

SampleJob::dispatch($user)とあります
この部分でジョブを呼び出しています
ジョブはdispatch()を使い呼び出します
また今回はパスに/{id?}としているのでidが入っているかどうかを確認し
もしidがあればそのidに該当するユーザーを所得してジョブの発行の際に引数としてジョブにUserを渡してあげてます
delay(now()->addMinutes(1))これで1分後にジョブを実行する処理をしています
ここまでの処理により、idがあるかを判断しidがあれば該当するUserを所得
Userが存在していればジョブを発行し1分後に実行すると言う処理の実装をしました

次にresourcesmainファルだを作成してindex.blade.phpを作成します
index.blade.phpに下記を追加してください

index.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ユーザー表示</title>
</head>
<body>
    <ul>
        @foreach($data as $item)
            <li>{{ $item->name }}</li>
        @endforeach
    </ul>
</body>
</html>

これで、登録したダミーデータをリストで一覧表示することができました
それではこのデータに対して、ジョブとキューを利用して加工していきます

Jobクラスの作成

コマンドにて下記を実行する

$ php artisan make:job SampleJob

実行すると、app/Jjobsフォルダが作成され中にSampleJob.phpファイルが作成されています
これがジョブファイルになります
ではジョブファイルに追加していきます

SampleJob.php
<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\User;

class SampleJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $sufix = '[Job]';

        if (strpos($this->user->name, $sufix)) {
            $this->user->name = str_replace($sufix, '', $this->user->name);
        } else {
            $this->user->name .= $sufix;
        }

        $this->user->save();
    }
}

ジョブでは実行したい処理をhandle()メソッドに記入します
そこに記述された処理が実行されています
また、今回の例では__construct()でUserを受け取っています
このUserはMainControllerindex()アクションでジョブの発行の際に引数で渡してあげたUserになります
受け取ったUserをプロパティで管理しています
そのUserを使用し、もしUserのnameに[JOB]が含まれていればそれを削除し
含まれていなければ、名前に追加してDBに登録する処理を書いています
これがジョブ自体の処理になります
このジョブの処理を実行したければ先ほどのMainControllerindex()メソッドで行ったように
dispatchを使用してジョブを発行させてあげれば良いのです

ただ、これだけではジョブは使用できません
ジョブはサービスプロバイダーに登録してあげる必要があります

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

ジョブ登録専用のプロバイダーを作成します

$ php artisan make:provider JobServiceProvider

app/providersフォルダに作成したプロバイダーファイルが作られます
JobServiceProvider.phpを下記のように記述してください

JobServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class JobServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bindMethod(SampleJob::class.'@handle', function($job, $app) {
            return $job->handle();
        });
    }

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

register()メソッドでジョブクラスの登録を行っています
第一引数にジョブクラス名.'@handle'を渡してあげます
第二引数にクロージャを渡します
クロージャの第一引数にはジョブクラスのインスタンスが渡され、第二引数にはサービスコンテナが渡されます
クロージャ内で$jobジョブのインスタンスでhandle()を呼び出すことでジョブが実行できるようにすることができます

ジョブのサービスプロバイダーへの登録は以上になります

最後に.envの編集をします

.evnの編集

デフォルトではキューは同期で動くようになっているため
非同期で動かすために.envでキューをデータベースを利用するように変更します

QUEUE_CONNECTION=database
QUEUE_DIRVER=database

これで全ての準備が完了しました
それでは実際に動作を確認してみましょう

サンプルの実行

ブラウザから/1とURLを叩いてみましょう
そのまま待ちます
1分後/にアクセスしてみてください
太郎[JOB]となっていれば成功です
1分後にジョブを実行するようになっているのでURLで指定したidのユーザーに[JOB]が1分後に付きます
また、ついているユーザーのidを再度叩くことで次は[JOB]が消えることも確認してみてください
また、/1とアクセスした際にすぐにデータベースのjobsテーブルを確認してみてください
何かデータが入っているかと思います
また、1分後に[JOB]が付いた後に再度jobsテーブルを確認してみてください
中身がなくなっているかと思います
このように発行されたジョブをキューに登録していくことでDBに用意されそれが実行されDBから消えます

これがジョブとキューになり非同期で実行することができました
長くなりましたので最後に簡単にまとめます

まとめ

ジョブとキュートは

  • キュートは非同期で処理を実行するもの
  • ジョブとは実装する処理そのものである

ジョブとキューを非同期で利用する手順

  • ジョブを作成する
  • ジョブを登録するサービスプロバイダを作成しジョブを登録する
  • キュー専用のテーブルをartisanコマンドで作成する
  • .envを編集する
  • ジョブのhandle()メソッドに処理を書く
  • ジョブを発行したい際にdispatch()を利用してジョブを使用する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laradockで構築したMySQLの日本語化けを解決

はじめに

LaradockでLaravelの環境構築をしました
ところが、マイグレーションを実行しRegisterを実行しDBを確認したところ
日本語が???と文字化けしてしまっていました
色んな記事を参考に試したものの、どれもうまく行かなかったので
備忘録として残しておきます

初期のDBの設定

まずは初期状態のDBの文字コードの設定は下記でした

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

これをutf8mb4に変更していきます

my.cnfの編集

laradock/mysql/my.cnfを下記に書き換えます

my.cnf
 # The MySQL  Client configuration file.
 #
 # For explanations see
 # http://dev.mysql.com/doc/mysql/en/server-system-variables.html

 [mysql]

[mysqld]
skip-character-set-client-handshake
character-set-server = utf8mb4
# collation-server = utf8mb4_general_ci
collation-server = utf8mb4_unicode_ci
init-connect = SET NAMES utf8mb4

[client]
default-character-set=utf8mb4

database.phpの編集

config/database.phpを下記のように変更します

        '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'),
            ]) : [],
        ]

編集はこれで終了

buildする

--buildオプションをつけてコンテナを起動します
下記コマンドを実行

$ docker-compose up -d --build workspace nginx mysql

mysqlコンテンに入り文字コードを確認する

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

utf8mb4に変更することができました

DBの文字化けしていた部分を確認すると、日本語で表示されていることが確認できました

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

Laravel Auditingでデータベースの変更を監視する

『誰がいつ、データをいじったか知りたい』というデータの監視が必要な時に、Laravel Auditingが便利です。

概要

Laravel Auditingはデータベース上の指定した監視対象のテーブルに追加・更新・削除などの変更が行われた場合に、誰がどのような変更を行ったかを自動でログ保存するパッケージです。

outline.001.jpeg

インストール & 設定

インストール

composerで行います。

composer require owen-it/laravel-auditing

設定

インストール後、config/app.phpにプロバイダーを追加します。

config/app.php
'providers' => [
+    OwenIt\Auditing\AuditingServiceProvider::class,
],

追加したら、Laravel Auditing用の設定ファイルを作成するために以下のコマンドを実行します。

php artisan vendor:publish --provider "OwenIt\Auditing\AuditingServiceProvider" --tag="config"

実行すると、config/audit.phpというファイルが作成されます。特にカスタマイズする必要がなければそのまま、データベースのマイグレーションファイルを以下のコマンドで作成します。

php artisan vendor:publish --provider "OwenIt\Auditing\AuditingServiceProvider" --tag="migrations"

実行すると、auditsテーブルを作成するためのdatabase/migrations/yyyy_mm_dd_nnnnnn_create_audits_table.phpというファイルが作成されます。作成後にマイグレーションしてauditsテーブルを作成します。

php artisan migrate

監視

基本的な設定

設定が完了したら、監視したいデータのモデルに追記します。例えばitemsテーブルのデータを監視したい場合は、

app/Item.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
+ use OwenIt\Auditing\Contracts\Auditable;
+
+ class Item extends Model implements Auditable
- class Item extends Model
{

+    use \OwenIt\Auditing\Auditable;

ちょっとややこしいのですが、インターフェイスはOwenIt\Auditing\Contracts\Auditable、traitは\OwenIt\Auditing\Auditableを指定します。これらを追記するだけで、監視対象となります。

実際に監視

では、このテーブルに対して新規登録・変更・削除を行ってみましょう。これらを実行すると、auditsテーブルに以下のようなデータが追加されます。

id user_type user_id event auditable_type auditable_id old_values new_values url ip_address user_agent tags created_at updated_at
1 NULL NULL updated App\Item 2 {"name":"\u8ffd\u52a01"} {"name":"\u8ffd\u52a02"} http://localhost:8000/items/2 127.0.0.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15 NULL 2020-03-23 12:20:34 2020-03-23 12:20:34
2 App\User 1 created App\Item 3 [] {"name":"\u307b\u3052","stock":"10","id":3} http://localhost:8000/items 127.0.0.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15 NULL 2020-03-23 12:21:39 2020-03-23 12:21:39
3 App\User 1 deleted App\Item 3 {"id":"3","name":"\u307b\u3052","stock":"10"} [] http://localhost:8000/items/3 127.0.0.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15 NULL 2020-03-23 12:51:57 2020-03-23 12:51:57

監視対象のデータは以下のような内容が蓄積されます。

フィールド名 蓄積内容
id 監視データのID
user_type ユーザモデルのクラス名
user_id ユーザID
event 実行したイベント
auditable_type 更新したデータモデルのクラス名
auditable_id 更新したデータのID
old_values 更新前のデータ
new_values 更新後のデータ
url 実行されたURL
ip_address IPアドレス
user_agent ユーザエージェント
tags タグ
created_at 作成日時(= データが更新された日時)
updated_at 更新日時

あまりないと思いますが、ログインせずにデータを更新した場合は、user_type, user_idがNULLになります。

監視データの取得

監視データは監視対象のモデルに関連しています。

<?php

$item = Item::find(1);

// 該当データの全ての監視データ
$audits = $item->audits;

// 該当データの最初の監視データ
$first = $item->audits()->first();

// 該当データの直近の監視データ
$latest = $item->audits()->latest()->first();

// 該当データの監視データのID指定
$audit = $item->audits()->find(1);

監視データもEloquentモデルなので、直接取得できます。

<?php

use OwenIt\Auditing\Models\Audit;

// 全件取得
$audits = Audit::all();

// ID指定
$audit = Audit::find(1);

カスタマイズ

コンソールコマンドでの実行も監視したい

デフォルトでは、コンソールコマンドやジョブの更新は監視対象外となっています。監視したい場合は、config/audit.phpで設定を変更します。

config/audit.php
-    'console' => false,
+    'console' => true,

監視するフィールドを絞り込みたい

デフォルトでは、登録・更新日時以外を対象とします。監視するフィールドを絞り込みたい場合は監視対象モデルに設定を追記します。

app/Item.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use OwenIt\Auditing\Contracts\Auditable;

class Item extends Model implements Auditable
{
    use \OwenIt\Auditing\Auditable;


+    protected $auditInclude = [
+        'name',
+    ];

逆に除外したい場合は、$auditExcludeに指定することで、除外できます。

蓄積するデータを変えたい

蓄積するデータをカスタマイズしたい場合は、独自のResolverを作成します。Laravel Auditingでは以下のResolver用インターフェイスが用意されています。

インターフェイス 概要
OwenIt\Auditing\Contracts\IpAddressResolver IPアドレス用I/F
OwenIt\Auditing\Contracts\UrlResolver URL用I/F
OwenIt\Auditing\Contracts\UserAgentResolver ユーザエージェント用I/F
OwenIt\Auditing\Contracts\UserResolver ユーザモデル用I/F

これらを実装することで、蓄積するデータを変えることができます。

app/resolvers/IpAddressResolver.php
<?php
namespace App\Resolvers;

use Illuminate\Support\Facades\Request;

class IpAddressResolver implements \OwenIt\Auditing\Contracts\IpAddressResolver
{
    /**
     * {@inheritdoc}
     */
    public static function resolve(): string
    {
        return Request::header('HTTP_X_FORWARDED_FOR', '0.0.0.0');
    }
}

独自Resolverはconfig/audit.phpで設定することで反映されます。

config/audit.php
return [
    'resolver' = [
        'user'       => OwenIt\Auditing\Resolvers\UserResolver::class,
-        'ip_address' => OwenIt\Auditing\Resolvers\IpAddressResolver::class,
+        'ip_address' => App\Resolvers\IpAddressResolver::class,
        'user_agent' => OwenIt\Auditing\Resolvers\UserAgentResolver::class,
        'url'        => OwenIt\Auditing\Resolvers\UrlResolver::class,
    ],
];

マスクしたい

監視データは変更前・後の値をそのまま保存しますが、場合によってはマスクして保存したい時もあります。その場合は、監視対象のモデルに設定することで、マスクできます。

app/Item.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use OwenIt\Auditing\Contracts\Auditable;
+use OwenIt\Auditing\Redactors\LeftRedactor;

class Item extends Model implements Auditable
{
    use \OwenIt\Auditing\Auditable;


+    protected $attributeModifiers = [
+        'title' => LeftRedactor::class,
+    ];

LeftRedactorは左から90%マスクし残り10%はそのまま、RightRedactorは右から90%マスクします。マスク部分は#####で保存されます。

特定のイベントのみ監視したい

デフォルトは追加・更新・削除を監視しますが、設定によりイベントを絞り込むことができます。例えば削除のみ監視したい場合は以下のように設定します。

全体

config/audit.php
    'events' => [
-        'created',
-        'updated',
        'deleted',
-        'restored',
    ],

特定の監視対象のみ

app/Item.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use OwenIt\Auditing\Contracts\Auditable;

class Item extends Model implements Auditable
{
    use \OwenIt\Auditing\Auditable;


+    protected $auditEvents = [
+        'deleted',
+    ];

監視ログの上限を設ける

デフォルトでは監視ログは延々と蓄積され続けます。上限を設けたい場合は以下のように設定するこで、上限を超えた古いデータが削除されていきます。

全体

config/audit.php
-    'threshold' => 0, // 0だと上限なし
+    'threshold' => 10,

特定の監視対象のみ

app/Item.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use OwenIt\Auditing\Contracts\Auditable;

class Item extends Model implements Auditable
{
    use \OwenIt\Auditing\Auditable;


+    protected $auditThreshold = 10;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel で 最適化 高速化 手法一覧

色々あったので備忘録的にまとめ
順不同です。
全てやれというわけではなく、現行の速度を見てできそうなことやる感じ。

他にありましたら教えて頂きたいです

0.PHPのバージョン

7↑使う

1.BladeのMinify

BladeがコンパイルされHTML(手続き型のPHPだけど)になったものを圧縮する
自作のディレクティブがあるとうまく動かなかった

https://xzxzyzyz.com/2018/02/larave-html-minify/

2.Laravel MixでCSS JSの圧縮

Laravel Mix使ってるなら行う

npm run product

3.OPCache有効か

OPcache はコンパイル済みのバイトコードを共有メモリに保存し、PHP がリクエストのたびにスクリプトを読み込み、パースする手間を省くことでパフォーマンスを向上させます。

php -v
or
phpinfo()でページで確認

無効だったら有効化させる

4.View Cache

bladeから普通のphpにコンパイルされるがそれが初回アクセス時なので、先にやっておく

php artisan view:cache

5.Configキャッシュ

設定値等々を事前にキャッシュしておく

php artisan config:cache

6.オートローダー最適化

プロダクションへデプロイする場合、Composerのクラスオートローダマップを最適し、Composerが素早く指定されたクラスのファイルを確実に見つけ、ロードできるようにします。

composer install --optimize-autoloader --no-dev

7.ルートキャッシュ

リクエスト毎にルーティング確認しに行き、Controllerを精査するのでキャッシュしておく
Controllerを使わず、クロージャなどで処理してると使えないのでinvokeのコントローラーでも作って処理させる
view返すだけならRoute::viewを使用する

php artisan route:cache

8.SetCacheHeadersミドルウェアの使用

あんまり情報がないミドルウェア
レスポンスをキャッシュできる
ApacheとかいじらなくていいのでGetメソッドでキャッシュして問題ないものにつけておくとよい

100秒キャッシュ

web.php
Route::get('example', 'ExampleController@index')->middleware('cache.headers:public;max_age=100');

https://github.com/spatie/laravel-responsecache

このようなパッケージもあるみたい

9.未使用middlewareの削除

app/Http/Kernel.phpの中から不要なのを消す

参考→https://qiita.com/kurikazu/items/0c57f050f5dfef02b23e

10.未使用Facadeの削除

config/app.phpaliases 配列から消していく

11.クエリの結果キャッシュできないか

クエリの結果キャッシュできないか
cacheドライバーはfile以外apcu、redis、memcached
fileでも使わないよりは良い

HogeController
$minutes = 1;//1分
return Cache::remember('key', $minutes, function(){
    return User::all();
});

12.未使用CSS削除

MixならPurgeCSSで使っていないCSS削除する

13.Eloquentを使わない

DBファサードでやっていく

ex.

EagerLoadingしていないか

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

Mac Laravelでライブラリ「laravel-dompdf」をインストールする

目的

  • Laravelのライブラリインストールが初めてだったので実施方法をまとめる
  • ライブラリ「laravel-dompdf」のインストール方法をまとめる

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Air (11-inch ,2012)
プロセッサ 1.7 GHz デュアルコアIntel Core i5
メモリ 8 GB 1600 MHz DDR3
グラフィックス Intel HD Graphics 4000 1536 MB
  • ソフトウェア環境
項目 情報
PHP バージョン 7.4.3
Laravel バージョン 7.0.8
  • ライブラリ環境
項目 情報 備考
laravel-dompdf v0.8.6 アプリ名ディレクトリに移動後コマンド`composer show -i

実施方法概要

  1. インストール
  2. 設定
  3. 確認

実施方法詳細

  • ローカル開発環境を前提に説明を記載する。
  1. インストール

    1. 下記コマンドを実行してライブラリ「laravel-dompdf」をインストールする。

      $ composer require barryvdh/laravel-dompdf
      
  2. 設定

    1. 下記コマンドを実行して設定を記載するファイルを開く。

      $ vi アプリ名ディレクトリ/app.php
      
    2. 先のコマンドを実行後、viのコマンドモードにて下記のコマンドを入力して設定を追記する行を検索する。

      /'providers' => [
      
    3. 検索にヒットした部分が下記の様な記載になっていることを確認する。

      app.php
      'providers' => [
      
          /*
           * Laravel Framework Service Providers...
           */
          Illuminate\Auth\AuthServiceProvider::class,
          Illuminate\Broadcasting\BroadcastServiceProvider::class,
          Illuminate\Bus\BusServiceProvider::class,
          Illuminate\Cache\CacheServiceProvider::class,
          Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
          Illuminate\Cookie\CookieServiceProvider::class,
          Illuminate\Database\DatabaseServiceProvider::class,
          Illuminate\Encryption\EncryptionServiceProvider::class,
          Illuminate\Filesystem\FilesystemServiceProvider::class,
          Illuminate\Foundation\Providers\FoundationServiceProvider::class,
          Illuminate\Hashing\HashServiceProvider::class,
          Illuminate\Mail\MailServiceProvider::class,
          Illuminate\Notifications\NotificationServiceProvider::class,
          Illuminate\Pagination\PaginationServiceProvider::class,
          Illuminate\Pipeline\PipelineServiceProvider::class,
          Illuminate\Queue\QueueServiceProvider::class,
          Illuminate\Redis\RedisServiceProvider::class,
          Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
          Illuminate\Session\SessionServiceProvider::class,
          Illuminate\Translation\TranslationServiceProvider::class,
          Illuminate\Validation\ValidationServiceProvider::class,
          Illuminate\View\ViewServiceProvider::class,
      
          /*
           * Package Service Providers...
           */
      
          /*
           * Application Service Providers...
           */
          App\Providers\AppServiceProvider::class,
          App\Providers\AuthServiceProvider::class,
          // App\Providers\BroadcastServiceProvider::class,
          App\Providers\EventServiceProvider::class,
          App\Providers\RouteServiceProvider::class,
      
      ],
      
    4. 先に「app.php」ファイルを検索したファイルのApp\Providers\RouteServiceProvider::class,の後に下記の内容を追記する。

      Barryvdh\DomPDF\ServiceProvider::class,
      
    5. 先の内容を追記後、下記の様に「app.php」ファイルが記載されていることを確認する。

      app.php
      'providers' => [
      
          /*
           * Laravel Framework Service Providers...
           */
          Illuminate\Auth\AuthServiceProvider::class,
          Illuminate\Broadcasting\BroadcastServiceProvider::class,
          Illuminate\Bus\BusServiceProvider::class,
          Illuminate\Cache\CacheServiceProvider::class,
          Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
          Illuminate\Cookie\CookieServiceProvider::class,
          Illuminate\Database\DatabaseServiceProvider::class,
          Illuminate\Encryption\EncryptionServiceProvider::class,
          Illuminate\Filesystem\FilesystemServiceProvider::class,
          Illuminate\Foundation\Providers\FoundationServiceProvider::class,
          Illuminate\Hashing\HashServiceProvider::class,
          Illuminate\Mail\MailServiceProvider::class,
          Illuminate\Notifications\NotificationServiceProvider::class,
          Illuminate\Pagination\PaginationServiceProvider::class,
          Illuminate\Pipeline\PipelineServiceProvider::class,
          Illuminate\Queue\QueueServiceProvider::class,
          Illuminate\Redis\RedisServiceProvider::class,
          Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
          Illuminate\Session\SessionServiceProvider::class,
          Illuminate\Translation\TranslationServiceProvider::class,
          Illuminate\Validation\ValidationServiceProvider::class,
          Illuminate\View\ViewServiceProvider::class,
      
          /*
           * Package Service Providers...
           */
      
          /*
           * Application Service Providers...
           */
          App\Providers\AppServiceProvider::class,
          App\Providers\AuthServiceProvider::class,
          // App\Providers\BroadcastServiceProvider::class,
          App\Providers\EventServiceProvider::class,
          App\Providers\RouteServiceProvider::class,
          Barryvdh\DomPDF\ServiceProvider::class,
      
      ],
      
    6. 先のコマンドを実行後、viのコマンドモードにて下記のコマンドを入力して設定を追記する行を検索する。

      /'aliases' => [
      
    7. 検索にヒットした部分が下記の様な記載になっていることを確認する。

      app.php
      'aliases' => [
      
          'App' => Illuminate\Support\Facades\App::class,
          'Arr' => Illuminate\Support\Arr::class,
          'Artisan' => Illuminate\Support\Facades\Artisan::class,
          'Auth' => Illuminate\Support\Facades\Auth::class,
          'Blade' => Illuminate\Support\Facades\Blade::class,
          'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
          'Bus' => Illuminate\Support\Facades\Bus::class,
          'Cache' => Illuminate\Support\Facades\Cache::class,
          'Config' => Illuminate\Support\Facades\Config::class,
          'Cookie' => Illuminate\Support\Facades\Cookie::class,
          'Crypt' => Illuminate\Support\Facades\Crypt::class,
          'DB' => Illuminate\Support\Facades\DB::class,
          'Eloquent' => Illuminate\Database\Eloquent\Model::class,
          'Event' => Illuminate\Support\Facades\Event::class,
          'File' => Illuminate\Support\Facades\File::class,
          'Gate' => Illuminate\Support\Facades\Gate::class,
          'Hash' => Illuminate\Support\Facades\Hash::class,
          'Http' => Illuminate\Support\Facades\Http::class,
          'Lang' => Illuminate\Support\Facades\Lang::class,
          'Log' => Illuminate\Support\Facades\Log::class,
          'Mail' => Illuminate\Support\Facades\Mail::class,
          'Notification' => Illuminate\Support\Facades\Notification::class,
          'Password' => Illuminate\Support\Facades\Password::class,
          'Queue' => Illuminate\Support\Facades\Queue::class,
          'Redirect' => Illuminate\Support\Facades\Redirect::class,
          'Redis' => Illuminate\Support\Facades\Redis::class,
          'Request' => Illuminate\Support\Facades\Request::class,
          'Response' => Illuminate\Support\Facades\Response::class,
          'Route' => Illuminate\Support\Facades\Route::class,
          'Schema' => Illuminate\Support\Facades\Schema::class,
          'Session' => Illuminate\Support\Facades\Session::class,
          'Storage' => Illuminate\Support\Facades\Storage::class,
          'Str' => Illuminate\Support\Str::class,
          'URL' => Illuminate\Support\Facades\URL::class,
          'Validator' => Illuminate\Support\Facades\Validator::class,
          'View' => Illuminate\Support\Facades\View::class,
      
      ],
      
    8. 先に「app.php」ファイルを検索したファイルの'View' => Illuminate\Support\Facades\View::class,の後に下記の内容を追記する。

      'PDF' => Barryvdh\DomPDF\Facade::class,
      
    9. 先の内容を追記後、下記の様に「app.php」ファイルが記載されていることを確認する。

      app.php
      'aliases' => [
      
          'App' => Illuminate\Support\Facades\App::class,
          'Arr' => Illuminate\Support\Arr::class,
          'Artisan' => Illuminate\Support\Facades\Artisan::class,
          'Auth' => Illuminate\Support\Facades\Auth::class,
          'Blade' => Illuminate\Support\Facades\Blade::class,
          'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
          'Bus' => Illuminate\Support\Facades\Bus::class,
          'Cache' => Illuminate\Support\Facades\Cache::class,
          'Config' => Illuminate\Support\Facades\Config::class,
          'Cookie' => Illuminate\Support\Facades\Cookie::class,
          'Crypt' => Illuminate\Support\Facades\Crypt::class,
          'DB' => Illuminate\Support\Facades\DB::class,
          'Eloquent' => Illuminate\Database\Eloquent\Model::class,
          'Event' => Illuminate\Support\Facades\Event::class,
          'File' => Illuminate\Support\Facades\File::class,
          'Gate' => Illuminate\Support\Facades\Gate::class,
          'Hash' => Illuminate\Support\Facades\Hash::class,
          'Http' => Illuminate\Support\Facades\Http::class,
          'Lang' => Illuminate\Support\Facades\Lang::class,
          'Log' => Illuminate\Support\Facades\Log::class,
          'Mail' => Illuminate\Support\Facades\Mail::class,
          'Notification' => Illuminate\Support\Facades\Notification::class,
          'Password' => Illuminate\Support\Facades\Password::class,
          'Queue' => Illuminate\Support\Facades\Queue::class,
          'Redirect' => Illuminate\Support\Facades\Redirect::class,
          'Redis' => Illuminate\Support\Facades\Redis::class,
          'Request' => Illuminate\Support\Facades\Request::class,
          'Response' => Illuminate\Support\Facades\Response::class,
          'Route' => Illuminate\Support\Facades\Route::class,
          'Schema' => Illuminate\Support\Facades\Schema::class,
          'Session' => Illuminate\Support\Facades\Session::class,
          'Storage' => Illuminate\Support\Facades\Storage::class,
          'Str' => Illuminate\Support\Str::class,
          'URL' => Illuminate\Support\Facades\URL::class,
          'Validator' => Illuminate\Support\Facades\Validator::class,
          'View' => Illuminate\Support\Facades\View::class,
          'PDF' => Barryvdh\DomPDF\Facade::class,
      
      ],
      
  3. 確認

    1. 下記コマンドをアプリ名ルートディレクトリで実行してライブラリ導入確認のためのコントローラを作成する。

      $ php artisan make:controller PdfController
      
    2. 先のコマンドで作成されたコントローラを下記の様に修正する。

      アプリ名ルートディレクトリ/app/Http/Controllers/pdf.Controller.php
      <?php
      
      namespace App\Http\Controllers;
      
      use Illuminate\Http\Request;
      
      use PDF;
      
      class PdfController extends Controller
      {
          public function test(){
          $pdf = PDF::loadHTML('<h1>test</h1>');
          return $pdf->stream();
          }
      }
      
    3. ルーティングファイルに下記の記載を追記する。

      アプリ名ルートディレクトリ/routes/web.php
      Route::get('/pdf', 'PdfController@test');
      
    4. 下記のリンクにアクセスする。

    5. 下記の様にPDF形式で「test」の文字が表示されていることを確認する。

      スクリーンショット 2020-03-23 17.23.44.png

    6. 上記の様に表示されればLaravelのライブラリ「laravel-dompdf」のインストールは完了である。

参考文献

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