- 投稿日:2020-03-24T20:18:52+09:00
【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参考書籍
環境構築
(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はなんなんだ。。。)
ただ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)
これでやっとアプリ制作に取り掛かれるようになった。。。泣
- 投稿日:2020-03-24T20:13:56+09:00
【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の実装ができなかったので嬉しい!!
- 投稿日:2020-03-24T17:34:42+09:00
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=prod5.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のマイグレーション実行コマンドはバージョンによって異なる。
- 使用できないオプションをヘルプに書いてはいけない。
参考
- 投稿日:2020-03-24T16:29:42+09:00
【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に設定されたと思います。
- 投稿日:2020-03-24T16:05:35+09:00
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.phpRoute::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分後に実行すると言う処理の実装をしました次に
resources
にmain
ファルだを作成して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はMainController
のindex()
アクションでジョブの発行の際に引数で渡してあげたUserになります
受け取ったUserをプロパティで管理しています
そのUserを使用し、もしUserのnameに[JOB]が含まれていればそれを削除し
含まれていなければ、名前に追加してDBに登録する処理を書いています
これがジョブ自体の処理になります
このジョブの処理を実行したければ先ほどのMainController
のindex()
メソッドで行ったように
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()を利用してジョブを使用する
- 投稿日:2020-03-24T11:54:06+09:00
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=utf8mb4database.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 mysqlmysqlコンテンに入り文字コードを確認する
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の文字化けしていた部分を確認すると、日本語で表示されていることが確認できました
- 投稿日:2020-03-24T11:46:22+09:00
Laravel Auditingでデータベースの変更を監視する
『誰がいつ、データをいじったか知りたい』というデータの監視が必要な時に、Laravel Auditingが便利です。
概要
Laravel Auditingはデータベース上の指定した監視対象のテーブルに追加・更新・削除などの変更が行われた場合に、誰がどのような変更を行ったかを自動でログ保存するパッケージです。
インストール & 設定
インストール
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.phpreturn [ '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;
- 投稿日:2020-03-24T00:08:12+09:00
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 product3.OPCache有効か
OPcache はコンパイル済みのバイトコードを共有メモリに保存し、PHP がリクエストのたびにスクリプトを読み込み、パースする手間を省くことでパフォーマンスを向上させます。
php -v or phpinfo()でページで確認無効だったら有効化させる
4.View Cache
bladeから普通のphpにコンパイルされるがそれが初回アクセス時なので、先にやっておく
php artisan view:cache5.Configキャッシュ
設定値等々を事前にキャッシュしておく
php artisan config:cache6.オートローダー最適化
プロダクションへデプロイする場合、Composerのクラスオートローダマップを最適し、Composerが素早く指定されたクラスのファイルを確実に見つけ、ロードできるようにします。
composer install --optimize-autoloader --no-dev7.ルートキャッシュ
リクエスト毎にルーティング確認しに行き、Controllerを精査するのでキャッシュしておく
Controller
を使わず、クロージャなどで処理してると使えないのでinvoke
のコントローラーでも作って処理させる
view
返すだけならRoute::view
を使用するphp artisan route:cache8.SetCacheHeadersミドルウェアの使用
あんまり情報がないミドルウェア
レスポンスをキャッシュできる
ApacheとかいじらなくていいのでGetメソッドでキャッシュして問題ないものにつけておくとよい100秒キャッシュ
web.phpRoute::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.php
のaliases
配列から消していく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していないか
- 投稿日:2020-03-24T00:06:48+09:00
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 実施方法概要
- インストール
- 設定
- 確認
実施方法詳細
- ローカル開発環境を前提に説明を記載する。
インストール
下記コマンドを実行してライブラリ「laravel-dompdf」をインストールする。
$ composer require barryvdh/laravel-dompdf設定
下記コマンドを実行して設定を記載するファイルを開く。
$ vi アプリ名ディレクトリ/app.php先のコマンドを実行後、viのコマンドモードにて下記のコマンドを入力して設定を追記する行を検索する。
/'providers' => [検索にヒットした部分が下記の様な記載になっていることを確認する。
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, ],先に「app.php」ファイルを検索したファイルの
App\Providers\RouteServiceProvider::class,
の後に下記の内容を追記する。Barryvdh\DomPDF\ServiceProvider::class,先の内容を追記後、下記の様に「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, ],先のコマンドを実行後、viのコマンドモードにて下記のコマンドを入力して設定を追記する行を検索する。
/'aliases' => [検索にヒットした部分が下記の様な記載になっていることを確認する。
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, ],先に「app.php」ファイルを検索したファイルの
'View' => Illuminate\Support\Facades\View::class,
の後に下記の内容を追記する。'PDF' => Barryvdh\DomPDF\Facade::class,先の内容を追記後、下記の様に「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, ],確認
下記コマンドをアプリ名ルートディレクトリで実行してライブラリ導入確認のためのコントローラを作成する。
$ php artisan make:controller PdfController先のコマンドで作成されたコントローラを下記の様に修正する。
アプリ名ルートディレクトリ/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(); } }ルーティングファイルに下記の記載を追記する。
アプリ名ルートディレクトリ/routes/web.phpRoute::get('/pdf', 'PdfController@test');下記のリンクにアクセスする。
下記の様にPDF形式で「test」の文字が表示されていることを確認する。
上記の様に表示されればLaravelのライブラリ「laravel-dompdf」のインストールは完了である。
参考文献