20210608のlaravelに関する記事は14件です。

N + 1 問題 Eagerloadによる解決

はじめに SQLを触っていると必ず目に入るN+1問題。 なんとなくは分かっているが整理のためにもN+1問題について自分なりのメモを残しておく。 N+1問題 N+1問題は端的に言うと、SQLがたくさん発行されてしまい動作が遅くなる問題のことですね。 もう少し詳しくいうと ・N件のデータ行を持つテーブルを読みだすのに1回 ・別のテーブルから、先述のテーブルの各行に紐づくデータを(1件ずつ)読み出すのに計N回 なのでNが増えれば増えるほど処理が重くなってしまうんですね。 例を挙げますと、下記のようなBookモデルがあって、各Bookと1対1のAuthorモデルと繋げるリレーションメソッド authorが定義されていたとします。 Book.モデル <?php namespace App; use Illuminate\Database\Eloquent\Model; class Book extends Model { /** * この本を書いた著者を取得 */ public function author() { return $this->belongsTo('App\Author'); } } 次のように、全BookのAuthorの名前を取得する場合、次のように書くと N+1 問題にぶつかります。 $books = App\Book::all(); foreach ($books as $book) { echo $book->author->name; } このコードのSQLの中身は SELECT * FROM books; SELECT * FROM authors WHERE book_id = 1; SELECT * FROM authors WHERE book_id = 2; SELECT * FROM authors WHERE book_id = 3; . . Book が全部で100 レコードあるとしたら、100+1で合計101ものクエリが発行されてしまう。 このうち大部分の SQL は book_id が違うだけなので無駄が多い。 処理も重くなってしまいますね。 これをLaravelではEagerLoad で削減できます。 全Bookを取得し、authorをEagerLoadしておく $books = App\Book::with('author')->get(); foreach ($books as $book) { echo $book->author->name; } $books = App\Book::with('author')->get()のwithの部分がEagerLoadです。 あらかじめauthorを行ったものを入れているわけですね! 処理はこのようにスッキリとなりました。 with(author)を.用いた場合 SELECT * FROM books; SELECT * FROM authors WHERE id IN (1, 2, 3, 4, 5, ...) いろいろなEagerLoad さっき使ったwith。複数のリレーションに使用できる。 複数のリレーションに.対するEagerLoad $books = App\Book::with(['author', 'publisher'])->get(); ↓リレーションで取得した先のモデルからさらに別のリレーションに繋げる場合に使う ネストした.EagerLoad $books = App\Book::with('author.contacts')->get(); ↓親のモデルを取得した後に、ある条件によって eagerload するかを決めたいときなど。 with の代わりに load を使う。 遅延.EagerLoad $books = App\Book::all(); if ($someCondition) { $books->load('author', 'publisher'); } ↓使用するリレーションにさらに制約をかける場合。 例では、postのtitleにfirst という言葉を含むという制約をかけた。 where だけでなく orderBy など他のクエリビルダも使える。 User.モデル <?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * ユーザーの全ポストの取得 */ public function posts() { return $this->hasMany('App\Post'); } /** * タイトルにfirstの文字が入るPostを取得する */ public function postsInTitleFirst() { return $this->posts()->where('title', 'like', '%first%'); } } EagerLoadへの.制約 $user = App\User::with('postsInTitleFirst')->find(1); $posts = $user->postsInTitleFirst; foreach ($posts as $post) { echo $post->title; } まとめ 投稿一覧とかなんらかの一覧を取得する時にはこのN+1問題が必ず発生すると思います。 LaravelではEagerLoadによってこれを防ぐことができるので、 特にリレーションメソッドを使う際には注意をする。 ま、要するにリレーションメソッドを使用したものを再度入れ込んでいきましょうってことですね!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel post課題・ルーティングパラメータ

ルーティング /アプリ名/routes/web.php <?php Route::get('/items/{id}', 'SampleController@showItem'); コントローラー /アプリ名/app/Http/Controllers/showItem.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class SampleController extends Controller{ public function showItem($id){ $items = [ [ 'name' => 'みかん', 'price' => 200, ], [ 'name' => 'バナナ', 'price' => 100, ], [ 'name' => 'キウイ', 'price' => 150, ], [ 'name' => 'イチゴ', 'price' => 500, ], ]; $title = '課題:ルーティングパラメータ'; if( !isset($items[$id]) ){ return view('samples.show_item', ['title' => $title,]); } if (array_key_exists('name', $items[$id])){ $name = $items[$id]['name']; $price = $items[$id]['price']; return view('samples.show_item', [ 'title' => $title, 'name' => $name, 'price' => $price , ]); } } } ビュー /アプリ名/resources/views/samples/show_item.blade.php @extends('layouts.logged_in') @section('title', $title) @section('content') <h1>{{ $title }}</h1> @if (isset($name)) <dl> <dt>商品名</dt> <dd>{{ $name }}</dd> <dt>価格</dt> <dd>{{ $price }}</dd> </dl> @else <p>該当の商品は存在しません。</p> @endif @endsection ログイン後のレイアウト /アプリ名/resources/views/layouts/logged_in.blade.php @extends('layouts.default') @section('header') <header> <ul class="header_nav"> <li>このサイトについて</li> <li>ユーザー設定</li> <li>プライバシーポリシー</li> <li>ログアウト</li> </ul> </header> @endsection 共通レイアウトファイル <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>@yield('title')</title> <style> .header_nav { display: flex; list-style: none; padding-left: 0; } .header_nav li { margin-right: 30px; } </style> </head> <body> @yield('header') @yield('content') </body> </html>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel課題・ルーティングパラメータ

ルート /items/{id} に GET でアクセスすると、 商品の配列 $items のうち、該当のインデックス(配列のキー)の商品の商品名, 価格が表示させる。 該当のインデックスの商品が存在しない場合は「該当の商品は存在しません。」と表示させる。 該当のインデックスが配列内に存在するかを確認するにはarray_key_existsを活用する。 @ifを使って、商品が取得できた場合とできなかった場合の表示切り替えを行う。 リクエストメソッド: GET URL: /items/{id} アクション: SampleController@showItem ビュー: samples.show_item ルーティング /アプリ名/routes/web.php <?php Route::get('/items/{id}', 'SampleController@showItem'); コントローラー /アプリ名/app/Http/Controllers/showItem.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class SampleController extends Controller{ public function showItem($id){ $items = [ [ 'name' => 'みかん', 'price' => 200, ], [ 'name' => 'バナナ', 'price' => 100, ], [ 'name' => 'キウイ', 'price' => 150, ], [ 'name' => 'イチゴ', 'price' => 500, ], ]; if (array_key_exists($id, $items)) { $name = $items[$id]['name']; $price = $items[$id]['price']; return view('samples.show_item', [ 'name' => $name, 'price' => $price , ]); } else { return view('samples.show_item', ['id' => $id,]); } // if(!isset($items[$id]) ){ // return view('samples.show_item', ['id' => $id,]); // } // if(isset($items[$id]) ){ // $name = $items[$id]['name']; // $price = $items[$id]['price']; // return view('samples.show_item', [ // 'name' => $name, // 'price' => $price , // ]); // } } } ビュー /アプリ名/resources/views/samples/show_item.blade.php @extends('layouts.logged_in') @section('content') <h1>課題:ルーティングパラメータ</h1> @if (isset($name)) <dl> <dt>商品名</dt> <dd>{{ $name }}</dd> <dt>価格</dt> <dd>{{ $price }}</dd> </dl> @else <p>{{ $id }}:は該当の商品は存在しません。</p> @endif @endsection ログイン後のレイアウト /アプリ名/resources/views/layouts/logged_in.blade.php @extends('layouts.default') @section('header') <header> <ul class="header_nav"> <li>このサイトについて</li> <li>ユーザー設定</li> <li>プライバシーポリシー</li> <li>ログアウト</li> </ul> </header> @endsection 共通レイアウトファイル /laravel_bbs/resources/views/layouts/default.blade.php <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>@yield('title')</title> <style> .header_nav { display: flex; list-style: none; padding-left: 0; } .header_nav li { margin-right: 30px; } </style> </head> <body> @yield('header') @yield('content') </body> </html>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel 時間を指定してバッチを実行する 個人メモ

目的 laravelにて時間を指定してバッチを実行する方法をメモ的にまとめる 方法 下記ファイルを開く。 アプリ名ディレクトリ/app/Console/Kernel.php Kernelクラスのschedule()メソッドに時間で実行したいバッチの情報を記載する。 アプリ名ディレクトリ/app/Console/Kernel.php /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->command('command:バッチ名')->実行タイミングの指定; } 例えば毎日12:00に実行指定ほしいバッチを登録する場合下記のように記載する。 アプリ名ディレクトリ/app/Console/Kernel.php /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->command('command:バッチ名')->dailyAt('12:00'); } 参考文献 Laravel 6.x タスクスケジュール
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

さくらvps独自ドメイン設定備忘録

自分でサービスを公開する際URLを「サービス名.com」にしたかったので以下のサイトたちを参考にして独自ドメイン取得、セッティングしました。自分の行った設定通りに記事を残したかったのですが、ログが残っていないので参考になるURLの記載。 完全に自分用の備忘録です。 自分はドメインもサーバーもさくらインターネットなので簡単でした。他の会社でドメインを取得した場合の手順は分かりません、、 ~さくらインターネットで独自ドメイン取得サイト~ https://domain.sakura.ad.jp/?utm_source=vps&utm_medium=cp ~さくらインターネットで取得した独自ドメインを自身のサーバーにセットする方法参考~ https://webkaru.net/vps/sakura-domain-setting/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

さくらvps独自ドメイン設定https構築の備忘録

自分でサービスを公開する際URLを「https://サービス名.com」にしたかったので以下のサイトたちを参考にして独自ドメイン取得、セッティングしました。自分の行った設定通りに記事を残したかったのですが、ログが残っていないので参考になるURLの記載。 https通信の構築もしたかったのですがなかなかにハードでした、、 その時にかなり助けとなったサイトや記事を貼ります。 完全に自分用の備忘録です。 レンタルサーバーからwebサービスの公開をした者からするとvpsでの環境設定は結構大変だと感じましたし、そう感じてる方もいらっしゃると思うので是非参考にしてみてはどうでしょう。https通信に関してはレンタルサーバーだと自身でSSL証明書を準備する必要がないので安易でした。 自分はドメインもサーバーもさくらインターネットなので簡単でした。他の会社でドメインを取得した場合の手順は分かりません、、 自身の利用ツール サーバー:さくらのVPS ドメイン:さくらインターネット SSL証明書:さくらのSSL 参考記事一覧 ~さくらインターネットで独自ドメイン取得サイト~ https://domain.sakura.ad.jp/?utm_source=vps&utm_medium=cp ~さくらインターネットで取得した独自ドメインを自身のサーバーにセットする方法参考~ https://webkaru.net/vps/sakura-domain-setting/ ~自分のサービスをhttps通信にするために~ https://qiita.com/yoshizaki_91/items/e6f39a5bfb99900b44b2 https://webdirector-blog.com/c_3/p_35/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

さくらvpsララベルデプロイした大まかな流れ一覧(備忘録)~vps契約~#1

約半年前ほどからwebアプリを作成しており、レンタルサーバーにまでデプロイ完了、 実際に公開しております(機能自体はまだまだしょぼい、、)。 ただ、レンタルサーバーだけでは入れられないライブラリやもジュールがかなりあり、 不便だと感じたため今後新しい機能が追加し、今後ユーザーが増える事を視野に入れてvpsに移行する事を決めました。 ユーザーが利用した際DBのバックアップ、移項に自信がなかったためvpsでリスタートすることにしました。 やった事の大まかな流れ 1vps申し込み(今回はこれを説明する。) 詳細は以下になります。 とりあえずユーザー数が増えたらスペックを増やそうと思ったのでとりあえずは1GのCOREを申し込み。 石狩り、大阪、東京の東京(990円)を選択しました。どこがでチラッとみた情報なので間違いかもしれませんが、サーバが配置されている都市だと聞きました。自分はシティボーイなので距離が近い東京にしましたww 応募方法などはサイトに従っていただければ可能なのでここでは端折ります。 なんやかんやで申し込みが完了して画面にログインします。idやパスワードは登録したメールに記載されますのでそちらを入力します。後述する方法で変更する方が良いかもしれません!!セキュリティ的にも良くないと思ったので自分は変えました。 ログイン後以下の画面に遷移します。少し見辛いですが、名称未設定というところが今回契約したサーバーとなります。追加していくとこの概要が増えます、 次回は便利なスタートスクリプトを使ってCentOSをインストールしていきたいと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mixhostのSOFTACULOUS APPS INSTALLERでLaravelをインストール

はじめに mixhostのコントロールパネルの一番下にあるインストーラが、以前から気になっていたので使ってみました。 操作 今回は、Laravelをインストールしてみます。 「今すぐインストール」をクリック。 ディレクトリを設定してインストールします。既に存在しているディレクトリは設定できないとのことなので、今回は「test01」としました。 インストールに3、4分かかります・・・のようなメッセージが出ていたような気がしますが、スクリーンショットを撮ろうとした瞬間終わりました。体感では10秒経っていないくらいなので、成功したのか少し心配になります。 なお、この画面からツイートもできるようです。(やりませんでした) 問題なく動作しました! おわりに インストールは簡単ですが、バージョン指定ができないので注意が必要です。 (2021/06/08現在は、バージョン8です。)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでタイトル共通化+ページごとに個別設定する方法

タイトルを共通化したいとき ①.envファイルの変更 共通タイトルを「taro」とする場合、 .env APP_NAME=taro 上記のように記述します。 なお、半角スペースを入れるとエラーになります。 上記「taro」としていますが、例えば「test taro」みたいにするとエラーになるということです。 ②bladeファイルを編集 app.blade.php <title>{{ config('app.name') }}</title> これでソースのtitleおよびブラウザのタブ内を見ると、先ほど設定した「taro」になります。 ちなみに、上記app.nameはconfig/app.phpのnameを読み込んでいます。 さて、そのnameはというと config/app.php 'name' => env('APP_NAME', 'Laravel'), ここでの'APP_NAME'は.envファイルの’APP_NAME’を読み込んで、 空欄であればLaravelと表示するという意味です。 ページごとにタイトルを設定したいとき bladeファイルのtitleタグ内に以下のように記述します。 <title>@yield('title')</title> また、各ブレードファイルには以下のように記述します。 @section('title', 'ページごとのタイトル') 個別設定もしたいけど共通タイトルも使いたいとき 条件分岐を使います。 各bladeファイルに@section('title')があればそれを表示し、ない場合はconfig('app.name')のみ表示させるよう記述していきます。 @hasSection('title') <title>@yield('title')</title> @else <title>{{ config('app.name') }}</title> @endif これで個別タイトルが記述されていればそれを表示し、なければ.envファイルのAPP_NAMEで設定した共通タイトルを表示するようになります。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelのマイグレーションで長い名前のカラムに外部キー制約を付けるときにはconstraint()ではなくforeign()を使う

長い名前のカラムに対してつけようとしたところエラーになりました。 migrations/test.php $table->foreignId( 'something_tooooooo_much_logn_column_name_and_foreign_table_name_id' ) ->nullable() ->constrained( 'foreign_table' )->onUpdate( 'cascade' )->onDelete( 'cascade' ); Laravelではカラム名と外部テーブル名を使って自動的に外部キー制約名を付けるのですが、その長さの制約に引っかかってしまっています。 migration/hoge.php $table->foreignId( 'something_tooooooo_much_logn_column_name_and_foreign_table_name_id' )->nullable(); // constrainedで外部キー制約を作ると自動で名前付けされるが、その場合には外部キー制約の名前が長すぎてエラーとなる。 // そのため手動で制約名を付ける $table->foreign( 'something_tooooooo_much_logn_column_name_and_foreign_table_name_id', env( 'DB_TABLE_PREFIX' ) . 'too_much_long' )->references( 'id' )->on( 'foreign_table' )->onUpdate( 'cascade' )->onDelete( 'cascade' ); ※わかりやすいようにカラム名を長くしすぎたので、もしかしたらカラム名の長さ制約に引っかかるかもしれません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CSVファイルをDBにインポートする

概要 容量の大きいCSVファイルをMySQLに流し込む処理を作ることがあり、調べた内容をメモしておく。 ミドルウェア構成 dockerで Apache + PHP + MadiaDB のローカル環境を作ってテストしてみる。 docker-compose.yml version: '3' services: httpd: image: local/apache:2.4 build: ./docker/httpd/ ports: - '8080:80' volumes: - app:/var/www/www.example.com:cached php: image: local/php:7.3 build: context: ./ dockerfile: ./docker/php/Dockerfile ports: - '9000:9000' volumes: - app:/var/www/www.example.com:cached depends_on: - mariadb mariadb: image: local/mariadb:10.2 build: ./docker/mariadb/ environment: - MYSQL_DATABASE=mysql - MYSQL_ROOT_PASSWORD=password ports: - '3306:3306' volumes: - mariadb-data:/var/lib/mysql volumes: mariadb-data: app: driver_opts: type: none device: ${PWD}/ o: bind アプリケーションについて インポートコマンドを作る際の方針は以下の通りです。 Laravelのコマンドとして構築する 一時テーブルを作って、そちらにデータを一括流し込みする Load Data Local Infileを使ってインポートする ※ PHPで1行ごと読んで処理していると時間かかるため 準備 Laravelで LOAD DATA LOCAL INFILE を使うには、DBとLaravelの設定が必要なようです。 my.cnf [server] local_infile=true config/database.php 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'mariadb'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'example'), 'username' => env('DB_USERNAME', 'mysql'), 'password' => env('DB_PASSWORD', 'password'), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, 'options' => [ PDO::ATTR_EMULATE_PREPARES => true, PDO::MYSQL_ATTR_LOCAL_INFILE => true, // ← ここ!! ], ], 実装してみる まず、コマンドを追加する。 $ php artisan make:command ImportCsv サンプルなので、コマンドにすべて直書きしたいと思います。 <?php namespace App\Console\Commands; use Illuminate\Console\Command; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; class ImportCsv extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'import:csv'; /** * The console command description. * * @var string */ protected $description = 'import data from csv file.'; public function handle() { $this->info('start'); // ファイルを指定する $file = '/var/www/www.example.com/hoge.csv'; // 一時テーブルを作成する $this->createTemporaryTable(); // 一次テーブルにCSVファイルのデータを流し込む $this->importData($file); // その他登録処理などを記述する // ... $this->info('complete'); } private function createTemporaryTable() { Schema::create('tmp_hoge', function (Blueprint $table) { $table->bigIncrements('id')->comment('id'); $table->string('title', 50)->comment('タイトル'); $table->string('description', 255)->comment('説明'); $table->integer('price')->comment('金額'); $table->integer('tax_rate')->comment('税率'); $table->string('memo')->comment('備考'); $table->temporary(); }); } private function importData(string $file) { DB::statement("SET CHARACTER_SET_DATABASE=sjis;"); // エンコード指定 DB::statement(" LOAD DATA LOCAL INFILE ? INTO TABLE `tmp_hoge` FIELDS TERMINATED BY ? ENCLOSED BY ? LINES TERMINATED BY ? (@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26,@27,@28,@29,@30) SET title=@1, description=@2, price=@5, tax_rate=@6, memo=@30 ; ", [ $file, ',', '"', "\r\n" ]); } } 実行するときは、こんな感じでしょうか。 $ php artisan import:csv こんな感じでインポートできました。 まとめ ローカルのdocker環境で、800万件のデータを取り込んで見たときは、 だいたい90秒(1分30秒)ぐらいだったでしょうか。 入力検証などはできないかったりするので、その点はデメリットです。 しかし、信頼できるデータをまとめて大量に流し込む場合には便利かもしれませんね。 参考サイト LaravelでLOAD DATA LOCAL INFILEできない Creating Temporary table in laravel/lumen and insert data MySQLの”LOAD DATA INFILE”などでCSVファイル入出力時の文字コード、権限などの注意点 MysqlでCSVから特定列だけインポートする 【MySQL】LOAD DATA INFILE するときのファイルの文字コード 以上
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker × Laravel】browsersyncの設定方法

環境 docker 20.10.6 docker-compose 1.29.1 composer 2.0.14 laravel 8.42.1 laravel Mix 6.0.19 php 8.0.7 browser-sync 2.26.14 手順 browser-syncをインストール webpack.mix.jsを編集 起動 browser-syncをインストール 以下のコマンドでグローバルにbrowser-syncをインストール(今後使わなそうなら開発環境のみでもOK) zsh npm install -g browser-sync browser-sync-webpack-plugin webpack.mix.jsを編集 webpack.mix.js mix.js("resources/js/app.js", "public/js") .postCss("resources/css/app.css", "public/css", [ require("postcss-import"), require("tailwindcss"), require("autoprefixer"), ]) // ここから下 .browserSync({ proxy: { target: "http://localhost:10080", }, files: ["./resources/**/*", "./public/**/*"], open: true, reloadOnRestart: true, }); webpack.mix.js proxy: { target: "http://localhost:10080", }, targetにはwebサーバのホスト側ポート番号を設定 docker-compose.yml version: "3.9" services:         (省略) web: image: nginx:1.20-alpine ports: - 10080:80 //ここの左側の値のこと volumes: - ./backend:/work - ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf working_dir: /work         (省略) webpack.mix.js files: ["./resources/**/*", "./public/**/*"], ここで、各自変更を検知してほしいディレクトリを設定 今回で言うとresources、public配下のファイルに編集が加わるたびにブラウザに自動で反映してくれる webpack.mix.js open: true, これはbrowser-syncを起動したときに自動でブラウザを開くかの設定 tureにすると自動で開く webpack.mix.js reloadOnRestart: true, これはbrowser-syncを再起動したときに、開いているブラウザをリロードするかの設定 動作確認 laravelのプロジェクトルートで以下のコマンドを打つと npm run watch browser-syncが起動して (open: trueにしていれば)http://localhost:3000でブラウザが開かれます
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker × Laravel】browser-syncの設定方法

環境 docker 20.10.6 docker-compose 1.29.1 composer 2.0.14 laravel 8.42.1 laravel Mix 6.0.19 php 8.0.7 browser-sync 2.26.14 手順 browser-syncをインストール webpack.mix.jsを編集 起動 browser-syncをインストール 以下のコマンドでグローバルにbrowser-syncをインストール(今後使わなそうなら開発環境のみでもOK) zsh npm install -g browser-sync browser-sync-webpack-plugin webpack.mix.jsを編集 webpack.mix.js mix.js("resources/js/app.js", "public/js") .postCss("resources/css/app.css", "public/css", [ require("postcss-import"), require("tailwindcss"), require("autoprefixer"), ]) // ここから下 .browserSync({ proxy: { target: "http://localhost:10080", }, files: ["./resources/**/*", "./public/**/*"], open: true, reloadOnRestart: true, }); webpack.mix.js proxy: { target: "http://localhost:10080", }, targetにはwebサーバのホスト側ポート番号を設定 docker-compose.yml version: "3.9" services:         (省略) web: image: nginx:1.20-alpine ports: - 10080:80 //ここの左側の値のこと volumes: - ./backend:/work - ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf working_dir: /work         (省略) webpack.mix.js files: ["./resources/**/*", "./public/**/*"], ここで、各自変更を検知してほしいディレクトリを設定 今回で言うとresources、public配下のファイルに編集が加わるたびにブラウザに自動で反映してくれる webpack.mix.js open: true, これはbrowser-syncを起動したときに自動でブラウザを開くかの設定 tureにすると自動で開く webpack.mix.js reloadOnRestart: true, これはbrowser-syncを再起動したときに、開いているブラウザをリロードするかの設定 動作確認 laravelのプロジェクトルートで以下のコマンドを打つと npm run watch browser-syncが起動して (open: trueにしていれば)http://localhost:3000でブラウザが開かれます
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel チェックボックス checked バリデーション

チェックボックスのバリデーションと初期値設定(checked属性)にハマったので、備忘録として残します。 以下が参考になりました。 Laravelで配列の必須バリデーション Laravel チェックボックスのchecked="checked"はどうやって表示させるの?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む