- 投稿日:2022-02-01T21:23:00+09:00
Laravelでデータを扱う方法
Collection PHPの配列を拡張したもので、多数の専用メソッドがある(all, combine, countなど)。 use App\Models\Owner; を読み込み。 例として、 $c_test = collect([ 'name' => 'てすと' ]); 返り値としてCollectionや、standardClassなどがある。 参考 https://readouble.com/laravel/8.x/ja/collections.html https://techplay.jp/column/630 QueryBuilder SQLに近いかたちで、selectやwhereなどを使ってDBのデータを扱う。 use Illuminate\Support\Facades\DB; を読み込み。 例として、 $q_get = DB::table('テーブル名')->select('name', 'created_at')->get(); とすると、指定したテーブルからnameと作成日時のデータを取得することができる。 また、 $q_first = DB::table('テーブル名')->select('name')->first(); とすると、指定したテーブルのカラムの1番目を取得することができる。 行全体が必要ない場合は、valueメソッドを使用してレコードから単一の値を抽出できる。 $email = DB::table('users')->where('name', 'John')->value('email'); id列の値で単一の行を取得するには、findメソッドを使用する。 //配列で取得 $user = DB::table('users')->find(3); Eloquent(モデル) データ型が少し異なり、Illuminate\Database\Eloquent\Collectionとなり、SupportのCollectionを継承してさらに機能が増えている。Eloquentモデルを作っておけば、それを使ってQueryBuilderよりも簡単にデータを取得できる。例えば、 $e_all = モデル名::all(); とすると、指定したモデル名のデータを全て取得することができる。 QueryBuilderとEloquentの違いについて https://cloudsmith.co.jp/blog/backend/laravel/2021/06/1817294.html
- 投稿日:2022-02-01T20:21:31+09:00
40 代おっさん EC2にmariadbをダウンロードをしてlaravelで使用してみる
本記事について 本記事は AWS 初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。 もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。 構築環境 ・EC2:Amazon Linux2 ・PHP7.3 ・Laravel 5.8 ・mariadb mariadb以外の構築環境は https://qiita.com/kou1121/items/638c7052f44b8d1b1766 参照してください mariadb mariadbのダウンロード sudo yum install -y mariadb-server mariadbの起動 sudo systemctl start mariadb mariadbのパスワードを設定 sudo mysql_secure_installation Enter current password for root (enter for none): このように聞いてくるがEnterでおk! ついぎに Set root password? と聞いてくるので y を 自分のパスワードを入れてください。 再度パスワード入れてと来るので再度入れる。 次は色々聞かれますがすべて y で対応!! Thanks for using MariaDB! とでたら大丈夫です。 mariadbの自動起動を有効化 sudo systemctl enable mariadb Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service. と出ました。 起動してるか確かめる sudo systemctl is-enabled mariadb enabled となっていれば大丈夫です。 laravelの.eneでデータベースの設定をする。 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=自分のUSERNAME DB_PASSWORD=自分のPASSWORD mariadbに入ってデータベースを作る。 mysql -u root -p Enter password: と聞かれますので自分のパスワードを mariadbに入りましたら create database laravel; 出来たか確認 show databases; +--------------------+ | Database | +--------------------+ | information_schema | | laravel | | mysql | | performance_schema | +--------------------+ laravelのデータベースが出来ています。 exit 出てください。 phpMyAdminをブラウザ上で見れるように設定する。 laravel の public に必要なファイルを入れる publicに移動 cd public 移動したら wget https://files.phpmyadmin.net/phpMyAdmin/4.8.3/phpMyAdmin-4.8.3-all-languages.zip ファイルをダウンロードしたら解凍 unzip phpMyAdmin-4.8.3-all-languages.zip ファルダ名が長いのでphpMyAdminにする。 出来ましたら phpMyAdmin/index.php をURLの後ろにつけるとphpMyAdminの画面が出てくる。 できました~~ 久しぶりに頑張って見ました。 ゆっくりながらも勉強頑張ります。 参考資料
- 投稿日:2022-02-01T20:13:09+09:00
�【PHPで学ぶ】オブジェクト思考って何で大事なの?
はじめに エンジニアを1年やって何となく使ってたオブジェクト思考をしっかり理解したい! そう思い基礎から勉強し直したので備忘録として残します。 サンプルコードはPHPを使いますが他のオブジェクト思考言語にも応用できるかと思います。 注意点としては、コードを乗せていますが全部理解する必要はなく、「このメソッドでこういう事をしてるのか」 ぐらいのざっくり理解で問題ないです! できる限りシンプルに解説しますが言葉足らずや間違いがあればご指摘お願いします では行きましょう! なぜオブジェクト思考は理解しづらいのか それはズバリ「何が良いか分からないから」です。 わざわざ抽象的な概念であるオブジェクト思考を使わずともプログラムは作れるしなんかやたらファイルも多くなって逆によく分からない! そう思う初学者の人もいると思います。(実際私も同じ事を考えてました) オブジェクト思考のメリットはたくさんありますが、最も良さを感じられるのが「拡張性」だと思ってます。 保守性とか再利用性とかって実務で働いたりしないと実感しにくい部分でもあるので初学者でもオブジェクト思考の良さを実感できる拡張性にフォーカスを当てて解説しようと思います。 今回の記事を見てなんとなくでも良いのでオブジェクト思考のメリットを感じて頂ければ幸いです。 実際のコードの違い プレイヤー同士が1~10のカードを引いて数字の大きい方が勝利というシンプルなプログラムを例とします。 オブジェクト思考を使わないコード メインプログラムが全ての責務を負っている状態 function makePlayer() { $name1 = 'プレイヤー1'; $name2 = 'プレイヤー2'; $player1 = [ 'name' => $name1, 'score' => 0 ]; $player2 = [ 'name' => $name2, 'score' => 0 ]; return [$player1, $player2]; } function draw($players) { $cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // プレイヤー1がランダムで1枚引く $arrKey1 = array_rand($cards, 1); $score1 = $cards[$arrKey1]; $players[0]['score'] = $score1; // プレイヤー2がランダムで1枚引く $arrKey2 = array_rand($cards, 1); $score2 = $cards[$arrKey2]; $players[1]['score'] = $score2; return $players; } function juge($playerScoreArr) { // 勝敗判定 if ($playerScoreArr[0]['score'] > $playerScoreArr[1]['score']) { echo '勝者は' . $playerScoreArr[0]['name'] . 'です'; } elseif ($playerScoreArr[1]['score'] > $playerScoreArr[0]['score']) { echo '勝者は' . $playerScoreArr[1]['name'] . 'です'; } elseif ($playerScoreArr[0]['score'] === $playerScoreArr[1]['score']) { echo '引き分けです'; } } // 関数呼び出し $players = makePlayer(); $playerScoreArr = draw($players); juge($playerScoreArr); 着目点はここだけでOKです // 関数呼び出し $players = makePlayer(); $playerScoreArr = draw($players); juge($playerScoreArr); オブジェクト思考を使ったコード メインプログラム(Gameクラスのstart関数)が各アクターに責務を委譲してる状態。 実際にはインターフェースで処理をまとめたり、アクターをさらに分割した方が良いと思いますが今回は割愛 class Card { private array $cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; public function draw() { $arrKey = array_rand($this->cards, 1); return $this->cards[$arrKey]; } } class player { private int $drawCard = 0; public function draw(Card $card) { $this->drawCard = $card->draw(); } public function getDrawCard() { return $this->drawCard; } } class TwoPlayerRule { private $player1 = ''; private $player2 = ''; public function __construct() { $this->player1 = new Player(); $this->player2 = new Player(); } public function draw() { $card1 = new Card(); $card2 = new Card(); $this->player1->draw($card1); $this->player2->draw($card2); } public function juge() { $score1 = $this->player1->getDrawCard(); $score2 = $this->player2->getDrawCard(); if ($score1 > $score2) { echo 'プレイヤー1の勝利です'; exit; } elseif ($score2 > $score1) { echo 'プレイヤー2の勝利です'; } elseif ($score1 === $score2) { echo '引き分けです'; } } } class Game { private int $playerNum = 0; public function __construct(int $playerNum) { $this->playerNum = $playerNum; } public function start() { $rule = $this->getRule(); $rule->draw(); $rule->juge(); } public function getRule() { $rule = ''; if ($this->playerNum === 2) { $rule = new TwoPlayerRule(); } return $rule; } } // Gameクラスの引数には参加人数を入力 $game = new Game(2); $game->start(); ちなみにメインプログラムはここだけ↓ ①ルールを取得 ②カードを引く ③勝敗を判定 public function start() { $rule = $this->getRule(); $rule->draw(); $rule->juge(); } 多分コード数が多くてオブジェクト思考を使った方が分かりにくい! そう思った人もいると思いますが、オブジェクト思考の強みは拡張性の高さです。 ここから機能追加をしていきます プレイヤー数を追加 オブジェクト思考を使わないコード 判定ロジックが少々複雑なのと処理の内容は重要ではないので今回は割愛させて頂きました <?php function makePlayer() { $name1 = 'プレイヤー1'; $name2 = 'プレイヤー2'; $name3 = 'プレイヤー3'; $player1 = [ 'name' => $name1, 'score' => 0 ]; $player2 = [ 'name' => $name2, 'score' => 0 ]; $player3 = [ 'name' => $name3, 'score' => 0 ]; return [$player1, $player2, $player3]; } function draw($players) { $cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // プレイヤー1がランダムで1枚引く $arrKey1 = array_rand($cards, 1); $score1 = $cards[$arrKey1]; $players[0]['score'] = $score1; // プレイヤー2がランダムで1枚引く $arrKey2 = array_rand($cards, 1); $score2 = $cards[$arrKey2]; $players[1]['score'] = $score2; // プレイヤー3がランダムで1枚引く $arrKey3 = array_rand($cards, 1); $score3 = $cards[$arrKey3]; $players[2]['score'] = $score3; return $players; } function juge($playerScoreArr) { // 勝敗判定 if ($playerScoreArr[0]['score'] > $playerScoreArr[1]['score'] && $playerScoreArr[0]['score'] > $playerScoreArr[2]['score']) { echo '勝者は' . $playerScoreArr[0]['name'] . 'です'; } elseif ($playerScoreArr[1]['score'] > $playerScoreArr[0]['score'] && $playerScoreArr[1]['score'] > $playerScoreArr[2]['score']) { echo '勝者は' . $playerScoreArr[1]['name'] . 'です'; } elseif ($playerScoreArr[2]['score'] > $playerScoreArr[1]['score'] && $playerScoreArr[2]['score'] > $playerScoreArr[0]['score']) { echo '勝者は' . $playerScoreArr[2]['name'] . 'です'; } elseif () { // 以下割愛 } } $players = makePlayer(); $playerScoreArr = draw($players); juge($playerScoreArr); オブジェクト思考を使ったコード こちらもロジックは省略しますね class ThreePlayerRule { // 追加 private $player3 = ''; public function draw() { // 追加 // 省略 } public function juge() { // 追加 // 省略 } 両者の違い この二つの大きな違いは既存プログラムを変更してるのかという点です。 (正確にはGameクラスのgetRuleメソッドの分岐処理は必要ですが、ほぼ修正なし) オブジェクト思考を使用してるプログラムは仕様変更がある度にメインプログラムを変更してるのに対してオブジェクト思考を使ったコードはThreePlayerRuleクラスというクラスを新規に追加しただけで既存のコードには触れていません。 このように一つの仕様変更に対して新しくコードを追加するだけで対応できるオブジェクト思考プログラミングはシステムの拡張性が高いと言われる理由です。 現実世界で例えると自転車のタイヤが壊れたら自転車本体を1から作り直すのが非オブジェクト思考でタイヤのみを交換するのがオブジェクト思考というイメージです。 非オブジェクト思考のコードの問題点 問題点はいくつかありますが、重要なのはプログラム同士が密に結合してる事です。 人数を増やしたい場合makePlayerメソッドを修正する必要があり、drawメソッドも修正が必要になり、さらにはjugeメソッドも修正する必要があります。 プログラムが大きくなればなるほど一つの追加機能で他の多くの箇所を修正しなければいけなくなります。 さらに一つの修正で他のプログラムでバグが起こりやすくなり、あっという間に技術的負債の完成といった感じになるのです。 既存コードをできる限り修正せずに開発ができるようしっかり設計をすることが重要になってきますね! まとめ オブジェクト思考はシステムの拡張性が高い オブジェクト思考は既存コードの修正を最小限にしてくれる メインプログラムのコードがシンプルになり可読性が上がる 最後に 私自身エンジニアとしては1年程ですがオブジェクト思考をほとんど使わずに無理やりif文などで実装してる案件に数回アサインした経験があるのですが、1つのファイルで何千行というファイルを見たときは絶望しましたし、そういった状態になると修正するのが難しくなりどんどん技術的負債となってしまします。数日間ソースを読み解くだけみたいな日々で本当に苦しかったです笑 この記事を見て少しでもオブジェクト思考に興味を持って、開発してくれる方が増えると嬉しいです!
- 投稿日:2022-02-01T18:34:30+09:00
laravel sendgrid メール送信 ファイル添付も
インスコ composer require "sendgrid/sendgrid" apikey取得 ① sendgrid にログイン ② 左側メニュー Settings > API Keys > Create API Key ③ .env に記載 SENDGRID_API_KEY=SG.youryour ① 送信するだけ HogesController.php use SendGrid; use SendGrid\Mail\Mail; use \Symfony\Component\HttpFoundation\Response; class HogesController extends Controller { public static function test(request $request) { $email = new Mail(); $email->setFrom('from@from.com', '送信元名'); $email->setSubject("メールのタイトル"); $email->addTo("to@to.com"); $email->addContent("text/plain", "これがコンテンツです"); $sendgrid = new SendGrid(env('SENDGRID_API_KEY')); $response = $sendgrid->send($email); if ($response->statusCode() == Response::HTTP_ACCEPTED) { print_r("送信 できました"); } else { print_r("送信 NG"); } } } OK ② ファイルを添付 public static function test(request $request) { $email = new Mail(); $email->setFrom('from@from.club', '送信元名'); $email->setSubject("メールのタイトル"); $email->addTo("to@to.com"); $email->addContent("text/plain", "これがコンテンツです"); $path = public_path("img/gal.jpg"); $file_encoded = base64_encode(file_get_contents($path)); $email->addAttachment( $file_encoded, mime_content_type($path),//image/jpeg "gal.jpg",//送信されるファイル名 "attachment"//固定 ); $sendgrid = new SendGrid(env('SENDGRID_API_KEY')); $response = $sendgrid->send($email); if ($response->statusCode() == Response::HTTP_ACCEPTED) { print_r("送信 できました"); } else { print_r("送信 NG"); } } OK
- 投稿日:2022-02-01T18:34:30+09:00
laravel sendgrid メール送信 ファイル添付、テンプレートも
インスコ composer require "sendgrid/sendgrid" apikey取得 ① sendgrid にログイン ② 左側メニュー Settings > API Keys > Create API Key ③ .env に記載 SENDGRID_API_KEY=SG.youryour ① 送信するだけ HogesController.php use SendGrid; use SendGrid\Mail\Mail; use \Symfony\Component\HttpFoundation\Response; class HogesController extends Controller { public static function test(request $request) { $email = new Mail(); $email->setFrom('from@from.com', '送信元名'); $email->setSubject("メールのタイトル"); $email->addTo("to@to.com"); $email->addContent("text/plain", "これがコンテンツです"); $sendgrid = new SendGrid(env('SENDGRID_API_KEY')); $response = $sendgrid->send($email); if ($response->statusCode() == Response::HTTP_ACCEPTED) { print_r("送信 できました"); } else { print_r("送信 NG"); } } } OK ② ファイルを添付 HogesController.php $path = public_path("img/gal.jpg"); $file_encoded = base64_encode(file_get_contents($path)); $email->addAttachment( $file_encoded, mime_content_type($path),//image/jpeg "gal.jpg",//送信されるファイル名 "attachment"//固定 ); OK ③ テンプレートを利用 HogesController.php $data = [ "hoge" => 'ほげ', "name" => 'たろう' ]; $email->addContent( "text/plain",// "text/html"//plain にしないとblade.phpの改行が有効ならない strval( view( 'emails/test',//view/emails/test.blade.php compact('data') ) ) ); /view/emails/test.blade.php テストメールテンプレート 変数{{ $data['hoge'] }}も{{ $data['name'] }}も渡せます OK 以上
- 投稿日:2022-02-01T17:41:42+09:00
【Laravel】「 php artisan make:model 」コマンドのオプション解説
make:model のオプションを活用する Laravel では php artisan make:model モデル名 をコマンド入力することで、モデルファイルを作成します。その際に、オプションを一緒に付け加えることで、モデルファイルに付随して便利な機能やファイルを同時に出力できます。 オプションは --(2連続のハイフン) の後にオプション名を付け加える形となっています。 また、ショートカットが用意されているオプションも存在します。 例として、以下のコマンドを打つと seed オプションを付け加えることとなります。 seedオプション付きでモデルを作成するコマンド例 $ php artisan make:model model_name --seed ショートカット仕様のオプションの場合は以下のようになります。 seedオプション(ショートカット)付きでモデルを作成するコマンド例 $ php artisan make:model model_name -s また、複数のオプションを組み合わせて、コマンド入力することも可能です。以下の例では、seed オプションと factory オプションを同時に入力しています。 複数オプションの入力例 // seedオプション と factoryオプションを付ける $ php artisan make:model model_name --seed --factory // seedオプション と factoryオプションを付ける(ショートカット仕様) $ php artisan make:model model_name -sf make:model で使用できる各種オプション解説 --all オプション モデルのマイグレーション、シーダー、ファクトリー、フォームリクエスト、ポリシー、及びリソース仕様のコントローラーを生成します。 ショートカット -a 生成ファイル: [name].php(モデル) [name]Controller.php(コントローラ) Store[name]Request.php(フォームリクエスト) Update[name]Request.php(フォームリクエスト) [name]Policy.php(ポリシー) [name]Factory.php(ファクトリー) 2022_xx_xx_xxxxxx_create_[name]s_table.php(マイグレーション) [name]Seeder.php(シーダー) --controller オプション モデルの新しいコントローラーを作成します。素早く CRUD を作成したい場合等は --resource オプションも検討してください。 ショートカット -c 生成ファイル: [name].php(モデル) [name]Controller.php(コントローラ) --factory オプション モデルの新しいファクトリを作成します。 ショートカット -f 生成ファイル: [name].php(モデル) [name]Factory.php(ファクトリー) --force オプション もし同名のモデルが存在する場合、すでに存在するモデルを上書きして、新規にモデルを作成します。以前のモデル内容は上書きされてしまうので注意してください。 ショートカット なし 生成ファイル: [name].php(モデル) --migration オプション モデルの新しいマイグレーションファイルを作成します。 ショートカット -m 生成ファイル: [name].php(モデル) 2022_xx_xx_xxxxxx_create_[name]s_table.php(マイグレーション) --policy オプション モデルの新しいポリシーを作成します。 ショートカット なし 生成ファイル: [name].php(モデル) [name]Policy.php(ポリシー) --seed オプション モデルの新しいシーダーを作成します。 ショートカット -s 生成ファイル: [name].php(モデル) [name]Seeder.php(シーダー) --pivot オプション 生成されたモデルをカスタム中間テーブルモデルにする必要があるかどうかを示します。 ショートカット -p 生成ファイル: [name].php(ピボット) --resource オプション 生成されたコントローラーをリソースコントローラーにする必要があるかどうかを示します。CRUD を作成するアプリケーションに便利なオプションです。 ショートカット -r 生成ファイル: [name].php(モデル) [name]Controller.php(コントローラ) --api オプション 生成されたコントローラーをAPIコントローラーにする必要があるかどうかを示します。 --requests オプション 新しいフォームリクエストクラスを作成し、リソースコントローラーで使用します。 注意 requests オプションを使用する際は、一緒に リソースフルなコントローラーを一緒に作成してください。 【例】$ php artisan make:model Name -rR ショートカット -R 生成ファイル: [name].php(モデル) [name]Controller.php(コントローラ) Store[name]Request.php(フォームリクエスト) Update[name]Request.php(フォームリクエスト) --test オプション モデルに付随する PHPUnit のテストファイルを生成します。 ショートカット なし 生成ファイル: [name].php(モデル) [name]Test.php(テストファイル) --pest オプション モデルに付随する Pest用 のテストファイルを生成します。この「Pest」 は、PHPUnit をベースとして作成されたPHPフレームワークでシンプルな記述でテストコードを記述することができます。 ショートカット なし 生成ファイル: [name].php(モデル) [name]Test.php(テストファイル) --help オプション 指定されたコマンドのヘルプを表示します。コマンドが指定されていない場合は、listコマンドのヘルプを表示します。 ショートカット -h 生成ファイル: なし --quiet オプション メッセージを出力しません。 ショートカット -q 生成ファイル: 他のオプションによる --version オプション このアプリケーションのバージョンを表示します。 ショートカット -V 生成ファイル: なし --ansi | --no-ansi オプション ANSI出力を強制(または無効化)します。コマンド出力の際に、テキストに色がついたりします。 --no-interaction オプション インタラクティブな質問を表示しません。 --env[=ENV] オプション 引数に指定した環境設定ファイルが存在すれば、それを読み込みます。指定したファイルがない場合は、デフォルトの .env ファイルを読み込もうとします。 -v | vv | vvv, --verbose オプション メッセージの詳細度を上げます、「-v」は通常の出力用、「-vv」はより詳細な出力用、「-vvv」はデバッグ用です。 参考文献
- 投稿日:2022-02-01T11:48:16+09:00
DockerでLaravel-Mix(Laravel8×Vue3)環境構築
はじめに 今回は、Laravel8をメインとして、その中でVue3を使う環境の構築方法をご紹介します。 環境 Docker version 20.10.12 Docker Compose version v2.2.3 Laravel Framework 8.81.0 Vue 3.2.29 構成 以下の構成を想定しています。 project ├── environment │ └── development │ ├── docker │ │ ├── mysql │ │ │ ├── Dockerfile │ │ │ ├── my.cnf │ │ │ └── sql │ │ │ └── create-database.sql │ │ ├── nginx │ │ │ └── default.conf │ │ ├── node │ │ │ └── Dockerfile │ │ └── php │ │ ├── Dockerfile │ │ └── php.ini │ └── docker-compose.yml └── server 構築 1. 全体(Docker) 1-1. docker-compose.yml作成 今回は、PHP, nginx, mysql, nodeの4つのコンテナを想定しておりますので、以下のようになります。 docker-compose.yml version: '3.9' services: php: container_name: php build: docker/php volumes: - ./../../server:/var/www:cached node: container_name: node build: docker/node volumes: - ./../../server:/project:cached tty: true # command: bash -c " # npm install; # npm run watch; # " nginx: image: nginx container_name: nginx ports: - 80:80 volumes: - ./../../server:/var/www:cached - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:cached depends_on: - php - node mysql: build: docker/mysql container_name: mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: sample TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci restart: on-failure volumes: - mysql:/var/lib/mysql:cached - ./docker/mysql/sql:/docker-entrypoint-initdb.d:cached ports: - 3306:3306 volumes: mysql: 1-2. PHP Dockerfile作成 phpコンテナ構築時に使われるDockerfileをdocker/php/に作成します。 Dockerfile FROM php:8.0-fpm COPY php.ini /usr/local/etc/php/ RUN apt-get update \ && apt-get install -y zlib1g-dev libzip-dev mariadb-client libpng-dev unzip RUN docker-php-ext-install zip pdo_mysql gd #Composer install COPY --from=composer:latest /usr/bin/composer /usr/bin/composer ENV COMPOSER_ALLOW_SUPERUSER 1 ENV COMPOSER_HOME /composer ENV PATH $PATH:/composer/vendor/bin WORKDIR /var/www RUN composer global require "laravel/installer" PHP設定ファイル作成 PHPの設定ファイルをdocker/php/に作成します。以下、最低限の設定ですのでプロジェクトに応じて変更してください。 php.ini zend.exception_ignore_args = off expose_php = on max_execution_time = 60 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 = /dev/stderr default_charset = UTF-8 [Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.language = "Japanese" 1-3. nginx 設定ファイル作成 niginxの設定ファイルをdocker/nginx直下に作成します。以下はLaravelでの運用を前提に記載しています。 default.conf server { listen 80; root /var/www/public; index index.php; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } } 1-4. MySQL Dockerfile FROM mysql:8 COPY my.cnf /etc/mysql/conf.d/ RUN chmod 644 /etc/mysql/conf.d/my.cnf 設定ファイル my.cnf [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci [client] default-character-set=utf8mb4 SQL docker/mysql/sql/create-database.sqlにてデータベースを作成するSQLを用意します。 CREATE DATABASE IF NOT EXISTS sample CREATE DATABASE IF NOT EXISTS sample_test 1-5. Node Dockerfile FROM node:16.0.0 WORKDIR /project RUN npm install -g agentkeepalive --save RUN npm install -g npm@8.4.0 RUN npm cache clean -f 1-6. Docker起動 dockerを起動して、Laravelプロジェクトを作成してみましょう。 docker-compose.ymlがあるディレクトリに移動して下記でdockerを起動してみましょう。 cd environment/development docker-compose up -d 2. Laravel 2-1. プロジェクト作成 コンテナに入って、Laravelプロジェクトを作成します。 cd environment/development # phpコンテナに入ります docker-compose exec php bash # Laravelプロジェクト作成 composer create-project --prefer-dist laravel/laravel ./ server以下にLaravelの各ディレクトリやファイルができています。 2-2. 動作確認 ブラウザからlocalhostにアクセスしてみましょう。以下のようにLaravelの画面が立ち上がっていれば成功です。 3. MySQL MySQLのコンテナへ接続しましょう。 3-1. .env設定 MySQLコンテナ及びデータベースへの接続情報を.envに記載します。 DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=sample DB_USERNAME=root DB_PASSWORD=root 3-2. マイグレーションの実行 cd environment/development # phpコンテナに入ります docker-compose exec php bash # マイグレーションの実行 root@de1e51270b2b:/var/www# php artisan migrate Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (38.74ms) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (26.03ms) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (29.34ms) Migrating: 2019_12_14_000001_create_personal_access_tokens_table Migrated: 2019_12_14_000001_create_personal_access_tokens_table (40.38ms) 4. Vue 4-1. Vueインストール cd environment/development # nodeコンテナに入る docker-compose exec node bash # vueをインストール npm install vue@next vue-loader@next @vue/compiler-sfc 4-2. webpack.min.jsを修正 下記のようにvue()を追加します。 server/webpack.mix.js mix.js('resources/js/app.js', 'public/js') .postCss('resources/css/app.css', 'public/css', [ // ]).vue(); 4-3. Vueコンポーネント作成 server/resources/jsの配下にcomponentsのディレクトリを作成して、resources/js/components/TestVue.vueを作成します。 server/resources/js/components/TestVue.vue <template> Hello Vue !! </template> <script> import { onMounted } from 'vue' export default ({ setup() { console.log("start vue") onMounted(() => { console.log('start mounted !') }) }, }) </script> 4-4. Vueのマウント server/resources/js/app.jsを下記のように編集します。 server/resources/js/app.js require('./bootstrap'); import { createApp } from 'vue' import TestVue from './components/TestVue.vue'; const app = createApp({}) app.component('test-vue', TestVue); app.mount('#app') 4-5. ビルド cd environment/development docker-compose exec node bash -c "npm run dev" 4-6. Laravelビューファイルを作成する server/resources/views/app.blade.phpを作成します。 server/resources/views/app.blade.php <!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel</title> <link href="{{ asset('css/app.css') }}" rel="stylesheet"/> <script src="{{ asset('js/app.js') }}" defer="defer"></script> </head> <body> <div id="app"> <test-vue></test-vue> </div> </body> </html> 4-7. Laravelのルーティング修正 server/routes/web.phpを以下のように修正します。 Route::get('/', function () { return view('app'); }); 4-8. Laravelキャッシュクリア 上記の手順で一度ビューやルーティングのキャッシュファイルが作成されていますので、以下のコマンドでキャッシュクリアしましょう。(不要なものも含まれていますが。。。) cd environment/development docker-compose exec php bash -c " php artisan cache:clear && php artisan config:clear && php artisan config:cache && php artisan route:clear && php artisan view:clear && php artisan clear-compiled && php artisan optimize && composer dump-autoload && rm -f bootstrap/cache/config.php" 4-9. 動作確認 おまけ nodeコンテナのコマンドのコメントアウトを外すと、ファイル変更のたびにnpm run devをする必要がなくなるので開発は楽になります! docker-compose.yml version: '3.9' services: php: container_name: php build: docker/php volumes: - ./../../server:/var/www:cached node: container_name: node build: docker/node volumes: - ./../../server:/project:cached tty: true command: bash -c " npm install; npm run watch; " nginx: image: nginx container_name: nginx ports: - 80:80 volumes: - ./../../server:/var/www:cached - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:cached depends_on: - php - node mysql: build: docker/mysql container_name: mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: sample TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci restart: on-failure volumes: - mysql:/var/lib/mysql:cached - ./docker/mysql/sql:/docker-entrypoint-initdb.d:cached ports: - 3306:3306 volumes: mysql: Laravel Mixで環境に合わせて出力ファイルを変える方法 Laravel Mixを利用する場合に、本番環境と開発環境で出力されるJSファイルやCSSファイルを分けたいと思います。 その方法については、以下の記事で紹介しています。 詳細 おわりに SPAはSEOに弱いということで、SSRで構築することがありますが、個人的にはかなり構築しづらかったので、SEOこだわるなら今回紹介した構成でいいのでは?と、思っていますがみなさんはいかがでしょうか? 成果物はGithubにありますので、必要な方はご覧ください。 参考 LaravelでVue.js(v3)を使う方法!
- 投稿日:2022-02-01T10:32:36+09:00
CarbonPeriodで今日から月末までの日付の配列を作ろうとしたら日付が足りない
Laravelで開発中、CarbonPeriodで今日から今月の月末までの日付の配列を作ろうとした。 2022年2月1日 ~ 2022年2月28日 $from_day = Carbon::now(); $to_day = Carbon::create($from_day)->lastOfMonth(); dd($from_day, $to_day,CarbonPeriod::create($from_day, $to_day)->toArray()); 28日分だから28個の配列が出来ると思っていた。27日までしかあらへん。 時間が中途半端だから何かおかしいのか。 0時0分にしよう $from_day = Carbon::now()->startOfDay(); $to_day = Carbon::create($from_day)->lastOfMonth(); dd($from_day, $to_day,CarbonPeriod::create($from_day, $to_day)->toArray()); ちゃんと28日分出来た。 日付の指定配列作る際は時間に気を付けましょう
- 投稿日:2022-02-01T04:26:45+09:00
[laravel]php artisan migrate が通らないときの解決例
エラー内容 $ php artisan migrate Migrating: 2022_01_29_163203_create_projects_table Illuminate\Database\QueryException SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'projects' already exists (SQL: create table `projects` (`id` bigint unsigned not null auto_increment primary key) default character set utf8mb4 collate 'utf8mb4_unicode_ci') at vendor/laravel/framework/src/Illuminate/Database/Connection.php:712 708▕ // If an exception occurs when attempting to run a query, we'll format the error 709▕ // message to include the bindings with SQL, which will make this exception a 710▕ // lot more helpful to the developer instead of just the database's errors. 711▕ catch (Exception $e) { ➜ 712▕ throw new QueryException( 713▕ $query, $this->prepareBindings($bindings), $e 714▕ ); 715▕ } 716▕ } +9 vendor frames 10 database/migrations/2022_01_29_163203_create_projects_table.php:32 Illuminate\Support\Facades\Facade::__callStatic("create") +21 vendor frames 32 artisan:37 Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) まず結論(解決方法) mysqlに既に他のlaravelプロジェクトでテーブル出来上がっているため、そのテーブルを消すことでmigrateが通るようになります。 なぜ記事を書いたのか 久しぶりにdockerを使わないでlaravelの環境構築したところ、みたことのない種類のエラーに出会い躓きました。 そのためぱっと見どこにエラー文が書いてあるかわからず、解決まで時間がかかったので備忘録の意味も含めて記載しようと思いました。 エラー文はどこにあるのか 筆者は最初は ➜ 712▕ throw new QueryException( を見て、その文字で検索して結局解決できず、試行錯誤して偶然解決までたどり着きました。 解決後にエラーをよくよくみたところ SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'projects' already exists ~ というエラー文があり、「既にテーブルが入っている」と言っていたことに気づきました。 結論ですが、エラー文はSQLSTATE[42S01]:~ の部分に書いてあります。 まとめ 今回の記事でお伝えしたかったことは下記の2点です。 エラー解決の具体例を探している場合:DBに他のプロジェクトのテーブルが入っていないか確認する エラー文が何を言っているかわからず困っている場合:SQLSTATE[42S01]:~の部分を読んでみる