20220125のPHPに関する記事は5件です。

LaravelのMail送信処理を深堀りする!

ある日Laravelでメール送信の実装をしようと思った時のこと、Laravelの公式ドキュメントを見て簡単に実装できることを知りました(以下のような書き方で実装可能です)。 Mail::send(/*引数省略*/); // Mailファサードのみで送信 Mail::to($user)->send($mailable); // Mailableクラスを使用してメールを送信 「すごい便利!」と思ったのですが、簡単すぎてなんかいまいち理解しきれていない。まあライブラリなので完全に理解する必要はないのですが、ちょっと気になるなともやもやが起きました笑 ということで、そんなもやもやを解消するために、Mailファサードについて深堀りをしようと思います。 同じもやもやを抱えてしまった方、一緒にもやもやを解消していきましょう!(「おっと、この部分は違うぞ!」と思った方はコメントで教えてください) 著者の環境 Laravel 8.78.1 PHP 8.0.8 MailerはAmazon SESを使用 Mailファサードについて まずはMailファサードについてみていきます。 Mailファサードのファイルは以下のようになっています。 Mail.php <?php namespace Illuminate\Support\Facades; use Illuminate\Support\Testing\Fakes\MailFake; /** * @method static \Illuminate\Mail\PendingMail to($users) * @method static \Illuminate\Mail\PendingMail bcc($users) * @method static void raw(string $text, $callback) * @method static void send(\Illuminate\Contracts\Mail\Mailable|string|array $view, array $data = [], \Closure|string $callback = null)    // 中略 * * @see \Illuminate\Mail\Mailer * @see \Illuminate\Support\Testing\Fakes\MailFake */ class Mail extends Facade { // 中略 /** * Get the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'mailer'; } } アノテーション(@method)がたくさん書いてありますね。 これらのメソッドはMailファサードが静的メソッドっぽく使うことができるものです。 例えばMail::send();のような形で使うことができます。 facadeクラスを継承しているので、クラスには実装されていないメソッドが静的メソッドように使用することができるんですね。 実際には\Illuminate\Mail\Mailerがnewされており、そのインスタンスのメソッドが実行されています。 この辺りの依存解決はIlluminate\Mail\MailServiceProviderでなされています。 参考 ファサードについて詳しく知りたいとはという方は【Laravel】ファサードとは?何が便利か?どういう仕組みか?がかなりわかりやすいのでおすすめです。 ということで、Mailファサードのメソッドは実質Mailerクラスの動的メソッドであるため、ここからは\Illuminate\Mail\Mailerを見ていきます。 ※ Mail::fake()とするとMailFakeクラスが使えるのですが、このクラスはテストの時に使用するものなので、一旦今回は割愛します。 Mailerクラスについて ファイルの内容については、かなり多いのでMail::send(/*引数省略*/);に出てくるsendからみていこうと思います。 ちなみにMail::send(/*引数省略*/);について、引数を省略しないと以下のような実装になります。 Mail::send('emails.test_content', [ "test" => "テストメッセージ" ], function($message) { $message ->to('test@example.com') ->subject("メールのタイトル"); }); Mailerクラスの送信処理 それでは、Mailerクラスのsendメソッドを見ていきましょう。 処理全体はこんな感じです。 Mailableクラスを使った送信処理と、送信以外の処理はコメントアウトで何をしているか書いてみました。 Mailer.php <?php namespace Illuminate\Mail; class Mailer implements MailerContract, MailQueueContract { * Send a new message using a view. * * @param \Illuminate\Contracts\Mail\Mailable|string|array $view * @param array $data * @param \Closure|string|null $callback * @return void */ public function send($view, array $data = [], $callback = null) { // Mailableクラスを用いた時の送信処理 if ($view instanceof MailableContract) { return $this->sendMailable($view); } // $viewの中身がstringかarrayか、arrayであったら連想配列かどうかによって、$view, $plain, $rawに格納する値を分けている。 [$view, $plain, $raw] = $this->parseView($view); // Messageクラスのインスタンスを作成し、各変数に格納している。 $data['message'] = $message = $this->createMessage(); // 第3引数のコールバック関数を実行 $callback($message); // メールのbody等を作成 $this->addContent($message, $view, $plain, $raw, $data); // $messageにToのアドレスをセット if (isset($this->to['address'])) { $this->setGlobalToAndRemoveCcAndBcc($message); } // Swift_Messageのインスタンスをゲッターで取得 $swiftMessage = $message->getSwiftMessage(); if ($this->shouldSendMessage($swiftMessage, $data)) { $this->sendSwiftMessage($swiftMessage); $this->dispatchSentEvent($message, $data); } } ということで、if文を含めた最後の3行で送信が行われています。 この部分を深堀りしてみます。 if文の条件であるshouldSendMessage($swiftMessage, $data)についてですが、今回はtrueになります。  (詳細は割愛します) それではif文の中身を見ていきます。 メソッドは以下の2つですね。 Mailer.php $this->sendSwiftMessage($swiftMessage); $this->dispatchSentEvent($message, $data); 今回のメール送信では、上のsendSwiftMessageにてメールが送信されるます。 dispatchSentEventについては、queueを使用したとき処理されるため、今回は特に何も起きません。 そのため今回はsendSwiftMessageのみ扱います。 Mailer.phpのメール送信処理の詳細 sendSwiftMessageMailerクラスのメソッドで詳細はこのようになっています。 Mailer.php protected function sendSwiftMessage($message) { $this->failedRecipients = []; try { return $this->swift->send($message, $this->failedRecipients); } finally { $this->forceReconnection(); } } この時$this->swiftにはSwift_Mailerクラスのインスタンスが入っています。 Swift_Mailerのsendメソッドでメールが送信されているんですね。 このSwift_Mailerのsendメソッドの内容は以下の通りです。 Swift_Mailer.php public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null) { $sent = 0; try { $sent = $this->transport->send($message, $failedRecipients); } catch (Swift_RfcComplianceException $e) { foreach ($message->getTo() as $address => $name) { $failedRecipients[] = $address; } } return $sent; } sendメソッドの中にさらにsendメソッドがありました。 今回はMailerにAmazon SESを用いているので、$this->transportにはSesTransportのインスタンスが格納されています。 それでは、SesTransportのsendメソッドを見ていきましょう。 ```php:SesTransport.php public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null) { $this->beforeSendPerformed($message); $result = $this->ses->sendRawEmail( array_merge( $this->options, [ 'Source' => key($message->getSender() ?: $message->getFrom()), 'RawMessage' => [ 'Data' => $message->toString(), ], ] ) ); // 後略 } `` ようやく、送信処理の最深部にたどり着きました! このsendRawEmailメソッドによって、Amazon SESにメールの送信処理がリクエストされています($this->sesにはSesClient`のインスタンスが入っています)。 ※実際には、さらにSesClientのexecuteメソッド(AwsClientTraitにて実装)が処理されたりするのですが、キリがないので一旦ここを最深部とさせてください笑 ということで、Mailを送信する処理はかなり階層が深くなっていました。 次にMailableを使用する場合について、書いてきます。 Mailableを使用する場合について Mailableを使用する場合についても、実はMailerクラスのsenderメソッドが使用されます。 それでは見ていきましょう。 冒頭でも記載しましたが、以下のようなコードでメールを送信することができます。 // $mailableはMailableクラスを継承したクラスのインスタンスです // $userにはメールアドレスやメールアドレスが格納されている配列が入ります。 Mail::to($user)->send($mailable); まずはMail::to($user)の部分から見ていきます。 Mailer.php public function to($users) { return (new PendingMail($this))->to($users); } PendingMailのインスタンスを生成し、PendingMailのtoメソッドの返り値を返しています。 ちなみにPendingMailのtoメソッドは以下の通りで、$userをメンバー変数に格納してPendingMailのインスタンスを返しているだけです。 PendingMail.php public function to($users) { $this->to = $users; if (! $this->locale && $users instanceof HasLocalePreference) { $this->locale($users->preferredLocale()); } return $this; } ということで、Mail::to($user)->send($mailable);はPendingMailのsendメソッドが実行されているのでした。 PendingMailのsendメソッドは以下のようにMailerのsendメソッドが使用されています。 ※ $this->fill($mailable)はMailableのインスタンスを返しています。 PendingMail.php public function send(MailableContract $mailable) { $this->mailer->send($this->fill($mailable)); } Mailer.phpのsendの処理の冒頭3行でMailableを使用したときの送信処理が書かれていました。 Mailer.php if ($view instanceof MailableContract) { return $this->sendMailable($view); } sendMailableメソッドは次のように実装されています。 Mailer.php protected function sendMailable(MailableContract $mailable) { return $mailable instanceof ShouldQueue ? $mailable->mailer($this->name)->queue($this->queue) : $mailable->mailer($this->name)->send($this); } 今回、MailableはShouldQueueではないので$mailable->mailer($this->name)->send($this);が実行されます。 これをたどると、最終的に、Mailerクラスのsendメソッドに行き着きます!(ここに来て省略で申し訳ないですが笑) おわり ということで深堀りはこれで以上です。 ライブラリは中身を知らなくても利用できてしまいますが、深堀りをするとより使いこなせますし、何よりも勉強になりました。 あまりライブラリやフレームワークの中身を読んだことない方はぜひ読んでみてください! 最後まで読んでくださりありがとうございました!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelのMailファサードを深堀りする!

ある日Laravelでメール送信の実装をしようと思った時のこと、Laravelの公式ドキュメントを見て簡単に実装できることを知りました(以下のような書き方で実装可能です)。 Mail::send(/*引数省略*/); // Mailファサードのみで送信 Mail::to($user)->send($mailable); // Mailableクラスを使用してメールを送信 「すごい便利!」と思ったのですが、簡単すぎてなんかいまいち理解しきれていない。まあライブラリなので完全に理解する必要はないのですが、ちょっと気になるなともやもやが起きました笑 ということで、そんなもやもやを解消するために、Mailファサードについて深堀りをしようと思います。 同じもやもやを抱えてしまった方、一緒にもやもやを解消していきましょう!(「おっと、この部分は違うぞ!」と思った方はコメントで教えてください) 著者の環境 Laravel 8.78.1 PHP 8.0.8 MailerはAmazon SESを使用 Mailファサードについて まずはMailファサードについてみていきます。 Mailファサードのファイルは以下のようになっています。 Mail.php <?php namespace Illuminate\Support\Facades; use Illuminate\Support\Testing\Fakes\MailFake; /** * @method static \Illuminate\Mail\PendingMail to($users) * @method static \Illuminate\Mail\PendingMail bcc($users) * @method static void raw(string $text, $callback) * @method static void send(\Illuminate\Contracts\Mail\Mailable|string|array $view, array $data = [], \Closure|string $callback = null)    // 中略 * * @see \Illuminate\Mail\Mailer * @see \Illuminate\Support\Testing\Fakes\MailFake */ class Mail extends Facade { // 中略 /** * Get the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'mailer'; } } アノテーション(@method)がたくさん書いてありますね。 これらのメソッドはMailファサードが静的メソッドっぽく使うことができるものです。 例えばMail::send();のような形で使うことができます。 facadeクラスを継承しているので、クラスには実装されていないメソッドが静的メソッドように使用することができるんですね。 実際には\Illuminate\Mail\Mailerがnewされており、そのインスタンスのメソッドが実行されています。 この辺りの依存解決はIlluminate\Mail\MailServiceProviderでなされています。 参考 ファサードについて詳しく知りたいとはという方は【Laravel】ファサードとは?何が便利か?どういう仕組みか?がかなりわかりやすいのでおすすめです。 ということで、Mailファサードのメソッドは実質Mailerクラスの動的メソッドであるため、ここからは\Illuminate\Mail\Mailerを見ていきます。 ※ Mail::fake()とするとMailFakeクラスが使えるのですが、このクラスはテストの時に使用するものなので、一旦今回は割愛します。 Mailerクラスについて ファイルの内容については、かなり多いのでMail::send(/*引数省略*/);に出てくるsendからみていこうと思います。 ちなみにMail::send(/*引数省略*/);について、引数を省略しないと以下のような実装になります。 Mail::send('emails.test_content', [ "test" => "テストメッセージ" ], function($message) { $message ->to('test@example.com') ->subject("メールのタイトル"); }); Mailerクラスの送信処理 それでは、Mailerクラスのsendメソッドを見ていきましょう。 処理全体はこんな感じです。 Mailableクラスを使った送信処理と、送信以外の処理はコメントアウトで何をしているか書いてみました。 Mailer.php <?php namespace Illuminate\Mail; class Mailer implements MailerContract, MailQueueContract { * Send a new message using a view. * * @param \Illuminate\Contracts\Mail\Mailable|string|array $view * @param array $data * @param \Closure|string|null $callback * @return void */ public function send($view, array $data = [], $callback = null) { // Mailableクラスを用いた時の送信処理 if ($view instanceof MailableContract) { return $this->sendMailable($view); } // $viewの中身がstringかarrayか、arrayであったら連想配列かどうかによって、$view, $plain, $rawに格納する値を分けている。 [$view, $plain, $raw] = $this->parseView($view); // Messageクラスのインスタンスを作成し、各変数に格納している。 $data['message'] = $message = $this->createMessage(); // 第3引数のコールバック関数を実行 $callback($message); // メールのbody等を作成 $this->addContent($message, $view, $plain, $raw, $data); // $messageにToのアドレスをセット if (isset($this->to['address'])) { $this->setGlobalToAndRemoveCcAndBcc($message); } // Swift_Messageのインスタンスをゲッターで取得 $swiftMessage = $message->getSwiftMessage(); if ($this->shouldSendMessage($swiftMessage, $data)) { $this->sendSwiftMessage($swiftMessage); $this->dispatchSentEvent($message, $data); } } ということで、if文を含めた最後の3行で送信が行われています。 この部分を深堀りしてみます。 if文の条件であるshouldSendMessage($swiftMessage, $data)についてですが、今回はtrueになります。  (詳細は割愛します) それではif文の中身を見ていきます。 メソッドは以下の2つですね。 Mailer.php $this->sendSwiftMessage($swiftMessage); $this->dispatchSentEvent($message, $data); 今回のメール送信では、上のsendSwiftMessageにてメールが送信されるます。 dispatchSentEventについては、queueを使用したとき処理されるため、今回は特に何も起きません。 そのため今回はsendSwiftMessageのみ扱います。 Mailer.phpのメール送信処理の詳細 sendSwiftMessageMailerクラスのメソッドで詳細はこのようになっています。 Mailer.php protected function sendSwiftMessage($message) { $this->failedRecipients = []; try { return $this->swift->send($message, $this->failedRecipients); } finally { $this->forceReconnection(); } } この時$this->swiftにはSwift_Mailerクラスのインスタンスが入っています。 Swift_Mailerのsendメソッドでメールが送信されているんですね。 このSwift_Mailerのsendメソッドの内容は以下の通りです。 Swift_Mailer.php public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null) { $sent = 0; try { $sent = $this->transport->send($message, $failedRecipients); } catch (Swift_RfcComplianceException $e) { foreach ($message->getTo() as $address => $name) { $failedRecipients[] = $address; } } return $sent; } sendメソッドの中にさらにsendメソッドがありました。 今回はMailerにAmazon SESを用いているので、$this->transportにはSesTransportのインスタンスが格納されています。 それでは、SesTransportのsendメソッドを見ていきましょう。 ```php:SesTransport.php public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null) { $this->beforeSendPerformed($message); $result = $this->ses->sendRawEmail( array_merge( $this->options, [ 'Source' => key($message->getSender() ?: $message->getFrom()), 'RawMessage' => [ 'Data' => $message->toString(), ], ] ) ); // 後略 } `` ようやく、送信処理の最深部にたどり着きました! このsendRawEmailメソッドによって、Amazon SESにメールの送信処理がリクエストされています($this->sesにはSesClient`のインスタンスが入っています)。 ※実際には、さらにSesClientのexecuteメソッド(AwsClientTraitにて実装)が処理されたりするのですが、キリがないので一旦ここを最深部とさせてください笑 ということで、Mailを送信する処理はかなり階層が深くなっていました。 次にMailableを使用する場合について、書いてきます。 Mailableを使用する場合について Mailableを使用する場合についても、実はMailerクラスのsenderメソッドが使用されます。 それでは見ていきましょう。 冒頭でも記載しましたが、以下のようなコードでメールを送信することができます。 // $mailableはMailableクラスを継承したクラスのインスタンスです // $userにはメールアドレスやメールアドレスが格納されている配列が入ります。 Mail::to($user)->send($mailable); まずはMail::to($user)の部分から見ていきます。 Mailer.php public function to($users) { return (new PendingMail($this))->to($users); } PendingMailのインスタンスを生成し、PendingMailのtoメソッドの返り値を返しています。 ちなみにPendingMailのtoメソッドは以下の通りで、$userをメンバー変数に格納してPendingMailのインスタンスを返しているだけです。 PendingMail.php public function to($users) { $this->to = $users; if (! $this->locale && $users instanceof HasLocalePreference) { $this->locale($users->preferredLocale()); } return $this; } ということで、Mail::to($user)->send($mailable);はPendingMailのsendメソッドが実行されているのでした。 PendingMailのsendメソッドは以下のようにMailerのsendメソッドが使用されています。 ※ $this->fill($mailable)はMailableのインスタンスを返しています。 PendingMail.php public function send(MailableContract $mailable) { $this->mailer->send($this->fill($mailable)); } Mailer.phpのsendの処理の冒頭3行でMailableを使用したときの送信処理が書かれていました。 Mailer.php if ($view instanceof MailableContract) { return $this->sendMailable($view); } sendMailableメソッドは次のように実装されています。 Mailer.php protected function sendMailable(MailableContract $mailable) { return $mailable instanceof ShouldQueue ? $mailable->mailer($this->name)->queue($this->queue) : $mailable->mailer($this->name)->send($this); } 今回、MailableはShouldQueueではないので$mailable->mailer($this->name)->send($this);が実行されます。 これをたどると、最終的に、Mailerクラスのsendメソッドに行き着きます!(ここに来て省略で申し訳ないですが笑) おわり ということで深堀りはこれで以上です。 ライブラリは中身を知らなくても利用できてしまいますが、深堀りをするとより使いこなせますし、何よりも勉強になりました。 あまりライブラリやフレームワークの中身を読んだことない方はぜひ読んでみてください! 最後まで読んでくださりありがとうございました!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel radio ボタンを保持させる

はじめに Laravel 初学者の私が学習した内容をアウトプットしていく記事になります。 冗長している点や軽い書き方などあれば御指南お願いいたします。。。 Laravel radio ボタンを保持させる 前提:boolean カラムのデータを Radio ボタンで切り替えを実装する。 実際のコード edit.php <div class="form-group"> <div class="form-check"> <input class="form-check-input" type="radio" name="is_published" value="1" {{ (bool)old('is_published',$portfolio->is_published) ? 'checked' : ''}}> <label class="form-check-label" for="flexRadioDefault1">公開</label> </div> <div class="form-check"> <input class="form-check-input" type="radio" name="is_published" value="0" {{ (bool)old('is_published',$portfolio->is_published) ? '' : 'checked'}}> <label class="form-check-label" for="flexRadioDefault2">下書き</label> </div> </div> コードの概要 Bootstrap Radiosを引用しています。validation がかかった際の以前の入力した値をold methodが保持してくれます。old() の前に (bool) をつける事で boolean カラムを キャストしています。そして、一番の肝が 三項演算子 です。{{ ( 条件 ) ? 'ture の挙動' : 'false の挙動' }}になります。Radio ボタンの場合、ボタンにチェックがつく動きを input タグ内のcheckedが行っています。上の form-check 内での三項演算子は、true の際に挙動し、下の form-check 内での三項演算子は、false の際に挙動します。書き方や class の中の役割など理解していれば吸収が早いと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GitHubでcloneしたLaravelプロジェクトをDockerを使ってローカル環境構築するまでの手順

はじめに GitHubでcloneしたLaravelプロジェクトをDockerで環境構築したい人に向けて簡潔に手順を解説します 5分程度で終わります 1.リモートリポジトリをローカルにcloneしてbuildする #GitHubからcloneする $ git clone {リポジトリURL(https://〜.git} # イメージを作成 $ docker-compose build #cloneしたディレクトリに移動してbuild $ docker-compose up -d 2.パッケージのインストール ・Dockerコンテナ内に入って以下のコードを実行 $ docker-compose exec {サービス名} bash $ composer install 3.APP_KEYの作成 $ chmod 777 -R storage/ $ cp .env.example .env $ php artisan key:generate 4.localhostでウェルカムページを確認 localhost 上記の画像が表示されたら完了です! おわりに GitHubからcloneしたLaravelプロジェクトはDockerでビルドしたらすぐに開けるものかと思ってた、、
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel に任意の favicon を追加する

はじめに 以前、Laravel で作成した Web アプリケーションに favicon を追加する方法を Laravel 公式ドキュメントから参照しようとしましたが、記載がなく調べました。その備忘録としてまとめさせていただきます。 環境 OS: Ubuntu-20.04 (Windows 10 の WSL2 上に設置) PHP: 8.0.10 Laravel: 8.61.0 事前準備 検証のために、favicon を事前に2つ作成しておきます。favicon の作成自体はフリーのサイトを用いて、PNG や JPEG を ICO 形式に変換することで可能です。 今回私は Favicon ジェネレーター様を用いました。 https://favicon-generator.mintsu-dev.com/ また、変換対象の画像としては、いらすとや様の地球儀とノートパソコンの画像を用いました。 地球儀の画像 https://www.irasutoya.com/2013/02/blog-post_3995.html ノートパソコンの画像 https://www.irasutoya.com/2020/11/blog-post_25.html 作成した favicon は以下の通りになります。 1. すべてのページに同一の favicon を設置したい場合 Laravel の Web アプリケーションすべてのページに favicon を設置したい場合は、public ディレクトリ下にある favicon.ico を、自身が作成した favicon.ico に変更することによって反映されます。 例えば、 ここに設定されている favicon.ico を先ほど作成した 地球儀の favicon に変更すると、 地球儀の favicon に変更されていることを確認できます。 また、新しく"localhost/top"ページを作成してみます。 routes/web.php <?php use App\Http\Controllers\TopController; use Illuminate\Support\Facades\Route; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::get('/top', [TopController::class, 'index']); app/Http/Controllers/TopController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class TopController extends Controller { public function index() { return view('top.index'); } } resources/views/top/index.blade.php <!DOCTYPE html> <html lang="ja"> <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>Top Page</title> </head> <body> <div>Hello Laravel!</div> </body> </html> 新しく作成した Top ページの favicon も地球儀の画像になっていることを確認できます。 注意点としては、この場合に指定する画像は、"public/favicon.ico" として入れないといけないというところです。 例えば、"public/images/favicon_earth.ico" のように画像を置いても、favicon としては認識されません。 任意のディレクトリ下に favicon のファイルを置きたいときは次項のような対応が必要です。 2. ページごとに favicon を使い分けたいとき このページには地球儀の画像を、別のページにはパソコンの画像を favicon として使いたいということがあるかもしれません。 もしくは、public ディレクトリの任意のディレクトリ下に、任意のファイル名の画像を favicon として用いたいということがあるかもしれません。 その場合は、HTML の head に link タグを入れることで実現可能です。 例えば、"public/images/favicon/favicon_pc.ico"として、favicon 用のパソコンの画像を入れ、パソコンの画像を、先ほど作成した Top ページの favicon にするとします。このとき、それ以外のページの favicon は、先ほど追加した地球儀の画像とします。 今回は、Top ページの favicon のみ PC の画像としたいため、index.blade.php の head に、public ディレクトリから任意の画像を取得して favicon として設定するための link タグを設定します。 このとき、public ディレクトリ内のファイルを読み取るために asset ヘルパを使用しています。 resources/views/top/index.blade.php <!DOCTYPE html> <html lang="ja"> <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"> <!-- 追加箇所 --> <link rel="icon" href="{{ asset('images/favicon/favicon_pc.ico') }}"> <!-- 追加箇所 ここまで --> <title>Top Page</title> </head> <body> <div>Hello Laravel!</div> </body> </html> 再度、Top ページにアクセスすると、favicon がパソコンの画像に変わっていることを確認できます。 このように、ページごとに、かつ任意のファイル名で favicon を設定することが可能です。 現実的には、「画像の類は public ディレクトリに保管しておきたい」、「画像は AWS S3 や Azure Storage などのクラウドサービスのストレージから参照したい」などがあるため、こちらのパターンが多く使われるかと思います。 favicon 反映の優先順位 先ほどの例を見るに、"public/favicon.ico"は入ったままのため、favicon の優先順位としては、 ① public ディレクトリに入れられており、link タグでディレクトリから参照されたファイル ② public/favicon.ico ということがわかります。 最後に favicon を Laravel プロジェクトに設定するにはこれらの方法で実現可能かと思います。自身が実装したいアプリケーションや参画しているプロジェクトに応じて、これらの方法を使い分けてみてください。 参考元
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む