- 投稿日:2022-01-25T23:19:56+09:00
DockerからLaravel環境構築メモ 〜PHP8.0 Apache2 MySQL8.0.20〜
構築する環境 PHP8.0 Apatch2 MySQL8.0.20 Laraval8 Docker ディレクトリ構造 プロジェクトフォルダ ┣━ docker ┃ ┣━ MySQL ┃ ┃ ┗━ Dockerfile ┃ ┗ php ┃ ┣━ 000-default.conf ┃ ┣━ Dockerfile ┃ ┗━ php.ini ┗━ docker-compose.yml Dockerfile 000-default.conf Dockerfile php.ini docker-compose.yml の4つのファイルを作っていきます。 以下、コピペでOKです。 Dockerfile(MySQL) FROM mysql:8.0.20 Dockerfile(PHP) # どんなdockerイメージを利用して構築をするか FROM php:8.0-apache RUN cd /etc/apache2/mods-enabled \ && ln -s ../mods-available/rewrite.load # 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる ADD php.ini /usr/local/etc/php/ ADD 000-default.conf /etc/apache2/sites-enabled/ # Composerのインストール RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer # ミドルウェアインストール RUN apt-get update \ && apt-get install -y \ git \ zip \ unzip \ libzip-dev \ vim \ libpng-dev \ libpq-dev \ libfreetype6-dev \ libjpeg-dev \ libonig-dev \ && docker-php-ext-install pdo pdo_mysql mysqli zip RUN docker-php-ext-configure gd \ --with-freetype=/usr/include/ \ --with-jpeg=/usr/include \ && docker-php-ext-install -j$(nproc) gd ENV COMPOSER_ALLOW_SUPERUSER 1 ENV COMPOSER_HOME /composer ENV PATH $PATH:/composer/vendor/bin COPY --from=composer:latest /usr/bin/composer /usr/bin/composer RUN composer self-update --2 RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN rm -rf node_modules RUN apt-get install -y nodejs RUN npm install npm -g n --save-dev cross-env RUN npm cache clear --force RUN npm install webpack --save RUN npm install node-sass --nodedir=/usr/bin/node WORKDIR /var/www/ 000-default.conf docker/php/000-default.conf <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory /var/www/public> AllowOverride All Require all granted </Directory> </VirtualHost> php.ini こちらの記事を参照させていただきました。 docker/php/php.ini [PHP] zend.exception_ignore_args = off expose_php = on max_execution_time = 30 max_input_vars = 1000 upload_max_filesize = 64M post_max_size = 128M memory_limit = 256M error_reporting = E_ALL display_errors = on display_startup_errors = on log_errors = on error_log = /var/log/php/php-error.log default_charset = UTF-8 [Date] date.timezone = Asia/Tokyo [mysqlnd] mysqlnd.collect_memory_statistics = on [Assertion] zend.assertions = 1 [mbstring] mbstring.language = Japanese docker-compose.yml docker-compose.yml version: '2' services: db: build: ./docker/mysql ports: - "33306:3306" environment: MYSQL_ROOT_PASSWORD: root MYSQL_USER: root MYSQL_PASSWORD: root MYSQL_DATABASE: tsurikomi volumes: - ./docker/mysql/data:/var/lib/mysql - ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d php: build: ./docker/php ports: - "8080:80" volumes: - ./src:/var/www depends_on: - db Docker コンテナのビルドと起動 ビルド docker compose build 起動 docker compose up phpコンテナに入る docker compose exec php bash Laravel8のインストール 以下、phpコンテナ内でのコマンドです composer create-project "laravel/laravel=8.*" ./ 最後、./とすればsrcの直下にLaravelのファイル群を作成することができる php artisan -V でLaravelのバージョン確認 インストールできているか確認できたら、localhostで動くか確認する http://localhost:8080/ この画面が出たら成功! もしエラーが出たら、この辺の記事を参考に。 最後に この後、プロジェクトを進める手順をまとめる予定です。 ポートフォリオを作りながらちょくちょく進めていきます。
- 投稿日:2022-01-25T22:49:38+09:00
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メソッドに行き着きます!(ここに来て省略で申し訳ないですが笑) おわり ということで深堀りはこれで以上です。 ライブラリは中身を知らなくても利用できてしまいますが、深堀りをするとより使いこなせますし、何よりも勉強になりました。 あまりライブラリやフレームワークの中身を読んだことない方はぜひ読んでみてください! 最後まで読んでくださりありがとうございました!!
- 投稿日:2022-01-25T22:49:38+09:00
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メソッドに行き着きます!(ここに来て省略で申し訳ないですが笑) おわり ということで深堀りはこれで以上です。 ライブラリは中身を知らなくても利用できてしまいますが、深堀りをするとより使いこなせますし、何よりも勉強になりました。 あまりライブラリやフレームワークの中身を読んだことない方はぜひ読んでみてください! 最後まで読んでくださりありがとうございました!!
- 投稿日:2022-01-25T21:35:59+09:00
Laravelでマイグレーションしようとすると「Class "Doctrine\DBAL\Driver\AbstractMySQLDriver" not found」と出る
備忘録として。 エラー内容 テーブルのカラム内容を変更しようとして、変更用のマイグレーションファイルを作成しました。 しかし、マイグレーションを実行しようとするとなぜかそこファイルだけ実行時にコケてしまう。 $ php artisan migrate Migrating: 2022_01_11_205136_change_work_statuses_table_column Error Class "Doctrine\DBAL\Driver\AbstractMySQLDriver" not found at vendor/laravel/framework/src/Illuminate/Database/PDO/MySqlDriver.php:8 解決策 該当のライブラリを新しくする $ composer require doctrine/dbal 再度マイグレーションを行う $ php artisan migrate Database seeding completed successfully.
- 投稿日:2022-01-25T21:01:32+09:00
Laravelのディレクティブや変数をVueコンポーネントに入れたいときはslotを使う
Laravel側のディレクティブや変数をVueのコンポーネントの中に入れたいときはslotを使う。 ↓こんな感じ(必要な個所以外は省略しています) blade側 <side-menu> @auth <ul class="side-menu-inner"> <li><a href='{{ route("users.show", ["uid" => Auth::user()->uid]) }}'>マイページ</a></li> <li><a href='{{ route("users.info") }}'>通知</a></li> @endauth @guest <ul class="side-menu-inner"> <li><a href=''>新規登録</a></li> <li><a href="">ログイン</a></li> </ul> @endguest </side-menu> SideMenu.vue <template> <div> <slot></slot> </div> </template>
- 投稿日:2022-01-25T19:27:48+09:00
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 の中の役割など理解していれば吸収が早いと思います。
- 投稿日:2022-01-25T16:08:36+09:00
【Laravel】tinkerコマンド1行で目的のモデル情報を出力する小技
ある日、こんなツイートを見つけた… Laravel productivity tip! Add this little function to your bash profile to quickly execute anything with the Tinker command and get the results instantly. pic.twitter.com/qIB9pQCTWt— Philo Hermans (@Philo01) October 16, 2021 1行のコマンドでtinkerが使えるだと…!? tinker 関数を bash プロファイルに追加し、コマンド実行すれば、結果を即座に取得できる! という旨の内容でした。ツイートの添付画像を見ると、とても分かりやすい内容で便利そうだったので自分でもやってみました。 PC環境 Windows 10 pro VSCode Git Bash 1, ホームディレクトリに .bash_profile ファイルを作成 Git Bash 環境なので、ホームディレクトリに .bash_profile ファイルがあれば自動的にそのファイルを読み込んでくれます。ファイル内に関数などを定義していればそのまま使えちゃいます。ちなみに、 Windows 10 のホームディレクトリは C:\Users\ユーザー名 となっています。(「プロジェクトルート」と混合しないように注意) 2, 作成した .bash_profile ファイルに関数を定義 コマンド tinker を利用できるように、関数を定義して保存します。これで、VSCode を立ち上げて Git Bash ターミナルを使用すると tinker コマンドが使えるようになります。 function tinker() { if [ -z "$1" ] then php artisan tinker else php artisan tinker --execute="dd($1);" fi } 3, Git Bash ターミナルからコマンドを打つ VSCode を立ち上げて、ターミナルを Git Bash に設定しましょう。そして、Laravel のプロジェクトルートに移動して、以下のコマンドを入力します。 $ tinker 'User::first()' 予め、Userモデル情報が保存してある場合は、Userモデルの情報がターミナル上に出力されると思います。このように、1行だけで目的のモデル情報を簡単に取得することができました。 insertした内容を手軽に確認したいと思ったら、この方法を試してみるのも良いかもしれません。
- 投稿日:2022-01-25T14:29:11+09:00
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でビルドしたらすぐに開けるものかと思ってた、、
- 投稿日:2022-01-25T01:35:48+09:00
amazon linux(EC2)でlaravel+Dockerの環境を作りたい
最近インフラ周りの勉強を始めたのでdocekr+laravelの環境をEC2上に実現したいと思い奮闘しています。 参考になった記事を貼っていきます。 記事 【AWS 入門】EC2とDockerでHello Worldしよう 【シンプル解説】docker-composeを使ってLaravel,nginx,MySQL環境構築する https://simablog.net/docker-laravel-nginx-mysql/ SSH接続後 phpをインストールする https://qiita.com/nagahama/items/2fdc820791bee5d564ca composer install https://qiita.com/kawanet/items/30c1acd4bc90ee0e535d composer installの際のエラー(/usr/local/bin/docker-compose: line 1: Not: command not found) https://github.com/docker/compose/issues/6268 amazon linux内でcomposerのpathを通す(どこでもcomposerコマンドを使えるようにする) https://qiita.com/miriwo/items/b25f9d4d74b7103f6ff6
- 投稿日:2022-01-25T00:40:58+09:00
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 プロジェクトに設定するにはこれらの方法で実現可能かと思います。自身が実装したいアプリケーションや参画しているプロジェクトに応じて、これらの方法を使い分けてみてください。 参考元