- 投稿日:2020-11-04T23:35:26+09:00
Laravelで、急に「Malformed communication packet」エラーでSQLに接続できなくなった際の対応メモ
さっきまで動いていたLaravelが下記エラーで動かなくなった。。
SQLSTATE[HY000]: General error: 1835 Malformed communication packet原因がわからないが、dockerのローカル環境と、別途用意している外部サーバーのテスト環境で同じDBサーバーに接続しており、両方とも同じタイミングで同じエラーになったので、
起因はDBサーバー側にありそうな。
追って余力があれば情報追記します。対処...
laravelの
config/database.php
に、'options' => [PDO::ATTR_EMULATE_PREPARES => true],を追加する。
↓
config/database.php// 〜省略〜 'connections' => [ 'sqlite' => [ 'driver' => 'sqlite', 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', ], 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST_MASTER', '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' => '', 'strict' => false, 'engine' => null, 'options' => [PDO::ATTR_EMULATE_PREPARES => true], // 〜省略〜これで無事エラーはなくなりました。。
ATTR_EMULATE_PREPARES はfalseの方が良さげですが、
色々言及しているサイトがあるのでそちらを参考にした方が良いかと思います。
参考:https://teratail.com/questions/233051参考サイト:
https://teratail.com/questions/233051
https://stackoverflow.com/questions/64678367/laravel-mysql-error-sqlstatehy000-general-error-1835-malformed-communicat環境
- PHP 7.3.19
- Laravel Framework 5.5.48
- 10.2.35-MariaDB-log
- 投稿日:2020-11-04T23:19:12+09:00
Lumenでファサードのエイリアスを登録する
はじめに
Laravelをベースとした軽量フレームワークであるLumen。
軽くて速いため、小さなサービスなどで利用されることもありますが、
Laravelと同等の機能を使うには独自の設定が必要となります。今回はLumenでファサード機能を実装する際の、
エイリアスの設定方法を記します。※Lumenでのファサード実装の流れはまた後日記事を書こうと思います。
エイリアスの登録
Facadeクラスは
app/Facades/Hoge.php
に作成されているとします。
bootstrap/app.php
に、以下のコードを追記します。bootstrap/app.php$app->withFacades(true, [ App\Facades\Hoge::class => 'Hoge', ]);これにより、どこからでも
\Hoge::method();
のようにしてHoge
のmethod()
を呼び出すことができます。
use App\Facades\Hoge;
と名前空間を記述しなくてもいいのは楽ですね。
- 投稿日:2020-11-04T20:13:56+09:00
EC2/Docker/LaravelでHelloWorld
経緯
Laradocを使ったWebアプリの開発の勉強を始めています.
AWSとLaravel,docker,docker-compose勉強し始めて、1ヶ月ほどたって、
Docker/Doker Compose/AWSの使い方にはなれてきたので、Laradocでデプロイしてみたいなぁと思って、自分の勉強のために残しておきます。(2020年11月4日時点)参考にさせていただいたのサイトは下記のところです。
https://laraweb.net/tutorial/6578/
https://noumenon-th.net/programming/2019/06/16/laradock/参考にした本は「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版」です。
docker,docker-composeの基礎知識は下記のudemy講座で勉強しました。
https://www.udemy.com/course/aidocker/
色々な知識与えてくれた上記の作者の方々に感謝です。
では早速やっていきましょう
ゴール
AWSでどこからでもアクセスできるLaravelのWebアプリをデプロイする。
本来はローカルでLaradoc作って、Webアプリ開発してそれをgit cloneするのだと思いますが、
全部AWSで完結します。laravelの実行環境
Ubuntu:18.04
PHP : 7.3
mysql : 5.4
Docker : 19.03.13
Docker-compose : 1.17.1リージョンの選定
東京リージョンで作成しましょう
VPCの作成
1個のパブリックサブネットを持つVPCを作成します。
プライベートなサブネットを作りたいときは下のパブリックとプライベートサブネットを持つVPCを作ります。
このとき、IPv4 CIDRブロックは10.0.0.0/16
パブリックサブネットのIpv4 10.0.0.0/24にしておきましょう。
EC2インスタンスの作成
Ubuntu 18.04を選択
ステップ2でt2.microを選択
ステップ3 インスタンスの詳細の設定では先程作成したVPCを選択.自動割当パブリックIPも無効から有効にしましょう。
ステップ6 セキュリティグループ設定ではHTTPの80ポートを使用するので、ルールの追加で追加する。
ステップ7 で起動をクリック。
SSH接続するための、キーペア(mykey.pem)はダウンロードしておきましょう。この間で、mykey.pemの認証をしましょう。
ダウンロードフォルダに移動して下記のコマンド実行しましょう
そうしたら認証が変わります。
chmod 400 mykey.pem
詳しくはawsの認証ページに書いてあります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.htmlしばらくしたらインスタンスがrunnningになるので、EC2ダッシュボード⇒実行中のインスタンスをクリック⇒作成したインスタンスIDをクリック
右上にある接続をクリック
SSH接続する場合は下にあるところ(コピーされたコマンドをクリック)したらいいです。
ターミナルを開いて
mykey.pemのあるディレクトリに移動(cd)先程AWSでコピーした
ssh ~~~
をターミナルに貼り付け。Enterそしたら先程作成したEC2に入れます。
その後、
yes
と入力
ここまででEC2の起動は終わりです。EC2の中で、Docker,Git,Docker-composeをインストール
ubuntu@ip-10-0-0-205:~$ sudo su root@ip-10-0-0-205:/home/ubuntu#以下root内での作業
じゃんじゃん下のコマンド打っていきましょう
apt-getのアップデートして,gitをインストール
apt-get update
apt-get install git
dockerとdocker-composeをインストール
$ apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ apt-key fingerprint 0EBFCD88 $ add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" $ apt-get install docker-ce docker-ce-cli containerd.io $ apt install docker-composeexitでrootから抜け出す
Laradocをgit cloneする。
git clone https://github.com/Laradock/laradock.git
$ cd laradock
として
$ cp env-example .env
とりあえず、PHP=7.3
mysqlで実行することにしてみましょう。
実行。docker-compose up -d apache2 mysqlしてapace2 mysqlのdockerを起動。
10分ほどまちます。Youtubeでも見ながらゆっくりしましょう。workspaceコンテナに入ります。
dockerのインストールが終了したら、下記コマンド実行して、
workspaceで作業しましょう。docker-compose exec --user=laradock workspace bashでworkspace内で、docker-compose 起動します。
そうすると、
var/www$
に移動します。
laradockフォルダがあるので、
$ cd laradoock
として、.envファイルを編集します。
$ cp env-example .env
しましょう下記を
.env
に追加
vi .env
実行して下記追加。DB_HOST=mysql DB_DATABASE=default DB_USERNAME=default DB_PASSWORD=secretLaravelでWebアプリの作成
今回はサンプル用のアプリ名をSampleProjectとします。
laradock@e00afef1d36e:/var/www$ composer create-project laravel/laravel SampleProject "5.5.*"そしたらSampleProjectができます。
var/www --- laradock |_ SampleProjectという構成になります。
SampleProjectに入って.envを編集。
DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=default DB_USERNAME=default DB_PASSWORD=secretとしてDB_HOSTをmysqlにします。
そして,Laradock内の.envを下記の通り編集して、起動するlaravelアプリを選択。
ここを記述しないと認識されないんだと思います。APP_CODE_PATH_HOST=../SampleProjectとりあえずの設定は終わりました。
laradocのファルダに移動して、docker-compose再起動して、変更を読み込み。
docker-compose up -d nginx mysql phpmyadminあと少しでラストです。
Laravelの初期画面表示
EC2のパブリックIpv4 DNSをコピーして、
ブラウザのURLバーに貼り付け。(URLはElastic IPで固定にしてもいいですが、今回はしません。)いけますね。疑い深いんで、ローカルじゃなくグローバルになってるか確認するために、iphoneで動くか確認してもいけてます。
EC2再起動したときの注意事項
1)EC2再起動するたびにdocker-compose再起動しましょう。
EC2停止すると再起動するらしいとのことなので、
EC2起動のたびdocker-compose立ち上げないといけないので、
下記のコマンド実行します。sudo su cd laradock/ docker-compose up -d nginx mysql phpmyadmin2)EC2停止したときは、Ipアドレス変わっているので、
Elastic IPで固定化しましょう。3) Laradockのファイル変更したら
docker-compose up -d mysql phpmyadmin
しましょう。
編集するファイルはもちろんSampleProject。所感とこれから
EC2使って立ち上げるのに、すごい便利だなと思いましたし、デプロイできると嬉しいですね、
ただ、EC2再起動したあとのDocker-composeの立ち上げとか、
EC2立ち上げたときに、gitとかDocker/Docker-compose入れるの手間だなと思っちゃいました。これからは発展的な内容としてEC2の冗長化とECS(Fargate),CI/CDも勉強しようとおもいます。
なにか、みなさまの参考になれば幸いです。
以上
- 投稿日:2020-11-04T20:13:56+09:00
EC2/Docker/Laravelでデプロイ
経緯
Laradocを使ったWebアプリの開発の勉強を始めています.
AWSとLaravel,docker,docker-compose勉強し始めて、1ヶ月ほどたって、
Docker/Doker Compose/AWSの使い方にはなれてきたので、Laradocでデプロイしてみたいなぁと思って、自分の勉強のために残しておきます。(2020年11月4日時点)参考にさせていただいたのサイトは下記のところです。
https://laraweb.net/tutorial/6578/
https://noumenon-th.net/programming/2019/06/16/laradock/参考にした本は「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版」です。
docker,docker-composeの基礎知識は下記のudemy講座で勉強しました。
https://www.udemy.com/course/aidocker/
色々な知識与えてくれた上記の作者の方々に感謝です。
では早速やっていきましょう
ゴール
AWSでどこからでもアクセスできるLaravelのWebアプリをデプロイする。
本来はローカルでLaradoc作って、Webアプリ開発してそれをgit cloneするのだと思いますが、
全部AWSで完結します。laravelの実行環境
Ubuntu:18.04
PHP : 7.3
mysql : 5.4
Docker : 19.03.13
Docker-compose : 1.17.1リージョンの選定
東京リージョンで作成しましょう
VPCの作成
1個のパブリックサブネットを持つVPCを作成します。
プライベートなサブネットを作りたいときは下のパブリックとプライベートサブネットを持つVPCを作ります。
このとき、IPv4 CIDRブロックは10.0.0.0/16
パブリックサブネットのIpv4 10.0.0.0/24にしておきましょう。
EC2インスタンスの作成
Ubuntu 18.04を選択
ステップ2でt2.microを選択
ステップ3 インスタンスの詳細の設定では先程作成したVPCを選択.自動割当パブリックIPも無効から有効にしましょう。
ステップ6 セキュリティグループ設定ではHTTPの80ポートを使用するので、ルールの追加で追加する。
ステップ7 で起動をクリック。
SSH接続するための、キーペア(mykey.pem)はダウンロードしておきましょう。この間で、mykey.pemの認証をしましょう。
ダウンロードフォルダに移動して下記のコマンド実行しましょう
そうしたら認証が変わります。
chmod 400 mykey.pem
詳しくはawsの認証ページに書いてあります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.htmlしばらくしたらインスタンスがrunnningになるので、EC2ダッシュボード⇒実行中のインスタンスをクリック⇒作成したインスタンスIDをクリック
右上にある接続をクリック
SSH接続する場合は下にあるところ(コピーされたコマンドをクリック)したらいいです。
ターミナルを開いて
mykey.pemのあるディレクトリに移動(cd)先程AWSでコピーした
ssh ~~~
をターミナルに貼り付け。Enterそしたら先程作成したEC2に入れます。
その後、
yes
と入力
ここまででEC2の起動は終わりです。EC2の中で、Docker,Git,Docker-composeをインストール
ubuntu@ip-10-0-0-205:~$ sudo su root@ip-10-0-0-205:/home/ubuntu#以下root内での作業
じゃんじゃん下のコマンド打っていきましょう
apt-getのアップデートして,gitをインストール
apt-get update
apt-get install git
dockerとdocker-composeをインストール
$ apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ apt-key fingerprint 0EBFCD88 $ add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" $ apt-get install docker-ce docker-ce-cli containerd.io $ apt install docker-composeexitでrootから抜け出す
Laradocをgit cloneする。
git clone https://github.com/Laradock/laradock.git
$ cd laradock
として
$ cp env-example .env
とりあえず、PHP=7.3
mysqlで実行することにしてみましょう。
実行。docker-compose up -d nginx mysqlしてnginx mysqlのdockerを起動。
10分ほどまちます。Youtubeでも見ながらゆっくりしましょう。workspaceコンテナに入ります。
dockerのインストールが終了したら、下記コマンド実行して、
workspaceで作業しましょう。docker-compose exec --user=laradock workspace bashでworkspace内で、docker-compose 起動します。
そうすると、
var/www$
に移動します。
laradockフォルダがあるので、
$ cd laradoock
として、.envファイルを編集します。
$ cp env-example .env
しましょう下記を
.env
に追加
vi .env
実行して下記追加。DB_HOST=mysql DB_DATABASE=default DB_USERNAME=default DB_PASSWORD=secretLaravelでWebアプリの作成
今回はサンプル用のアプリ名をSampleProjectとします。
laradock@e00afef1d36e:/var/www$ composer create-project laravel/laravel SampleProject "5.5.*"そしたらSampleProjectができます。
var/www --- laradock |_ SampleProjectという構成になります。
SampleProjectに入って.envを編集。
DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=default DB_USERNAME=default DB_PASSWORD=secretとしてDB_HOSTをmysqlにします。
そして,Laradock内の.envを下記の通り編集して、起動するlaravelアプリを選択。
ここを記述しないと認識されないんだと思います。APP_CODE_PATH_HOST=../SampleProjectとりあえずの設定は終わりました。
laradocのファルダに移動して、docker-compose再起動して、変更を読み込み。
docker-compose up -d nginx mysql phpmyadminあと少しでラストです。
Laravelの初期画面表示
EC2のパブリックIpv4 DNSをコピーして、
ブラウザのURLバーに貼り付け。(URLはElastic IPで固定にしてもいいですが、今回はしません。)いけますね。疑い深いんで、ローカルじゃなくグローバルになってるか確認するために、iphoneで動くか確認してもいけてます。
EC2再起動したときの注意事項
1)EC2再起動するたびにdocker-compose再起動しましょう。
EC2停止すると再起動するらしいとのことなので、
EC2起動のたびdocker-compose立ち上げないといけないので、
下記のコマンド実行します。sudo su cd laradock/ docker-compose up -d nginx mysql phpmyadmin2)EC2停止したときは、Ipアドレス変わっているので、
Elastic IPで固定化しましょう。3) Laradockのファイル変更したら
docker-compose up -d mysql phpmyadmin
しましょう。
編集するファイルはもちろんSampleProject。所感とこれから
EC2使って立ち上げるのに、すごい便利だなと思いましたし、デプロイできると嬉しいですね、
ただ、EC2再起動したあとのDocker-composeの立ち上げとか、
EC2立ち上げたときに、gitとかDocker/Docker-compose入れるの手間だなと思っちゃいました。これからは発展的な内容としてEC2の冗長化とECS(Fargate),CI/CDも勉強しようとおもいます。
なにか、みなさまの参考になれば幸いです。
以上
- 投稿日:2020-11-04T20:10:54+09:00
Laravel:Auth認証の設定
【概要】
1.手順
3.開発環境
1.手順
備忘録も兼ねてアウトプットしておきます。
❶Node.jsをダウンロード
❷laravel/ui
をインストール
❸Auth関連ファイルの生成
❹作成されたusersをマイグレーション
❺Controllerにコーディング2.どのようにコーディングするか
❶Node.jsをダウンロード
ここからNode.jsをインストールします。❷
laravel/ui
をインストール
ターミナルで下記を記述してインストールします。$ composer require laravel/ui❸Auth関連ファイルの生成
同じくターミナルで下記を記述して実行します。$ php artisan ui vue --auth $ npm install && npm run devすると
user.php
とusers
テーブルが作成されます。❹作成されたusersをマイグレーション
下記の通りマイグレーションを実行します。$ php artisan migrateするとDBにuserテーブルが作成されます。
❺Controllerにコーディング
use Illuminate\Support\Facades\Auth;
$user = Auth::user();
を記述して完了です。app/Http/Controllers/xxxxController.phpuse Illuminate\Support\Facades\Auth; public function index(Request $requsest) { $user = Auth::user(); return view('xxx.index'); //(i) }(i)は、
$param = []
を記述している際はreturn view('xxx.index', $param);
と記述してデータを渡してください。以上のことをすると、
localhost:8000/register
,localhost:8000/login
で新規登録機能・ログイン機能を実装できます。3.開発環境
PHP 7.4.10
Laravel 8.9
Apache 2.4.41
Mysql 5.6.47
Sequl Pro 1.1.2
- 投稿日:2020-11-04T15:21:31+09:00
npm 最新版 インストール 方法
最新のnpmを簡単にインストールする方法伝授してゆく!!!
n packageとかいうのを使う!
sudo apt-get update sudo apt-get install nodejs sudo apt-get install npm次にキャッシュをクリアしてから、n packageを導入する
sudo npm cache clean sudo npm install n -g最新版(安定してるverとるよー)
sudo n stable パス通す sudo ln -sf /usr/local/bin/node /usr/bin/nodeこれからはn packageで管理するための最初に入れたnodeは使わないから消しておく!
sudo apt-get purge -y nodejs npmバージョン確認
npm-v node-vこのサイトにあるNode.jsのversionとnpmのバージョンが"Fermium"のやつになってれば成功!
https://nodejs.org/ja/download/releases/
- 投稿日:2020-11-04T14:38:10+09:00
[Laravel]DBより抽出したデータをクエリビルダでとれなかったときの話
エラー文
Property [id] does not exist on this collection instance.
このコレクションインスタンスにはidプロパティはありませんとのこと。
該当ソース
$data = DB::table('users')->where('id',1)->get();これをview側で$data->idとしたときに上記エラーが起こった。
->get()の返り値はCollectionクラス。
Collectionの中身はModelの各データで構成されている。data->idで取るデータはModelの中のプロパティ変数を取るものなので、データが1件しかなくとも、各Modelの集合体の配列であるCollectionからは$data->idという取り方ではエラーが出た。解決方法
$data = DB::table('students')->where('id',1)->first();->first()の返り値はmodelオブジェクト
まとめ
view側で$data->idというように単純に一件だけデータを取りたいときは、->first()や->find()などで、Modelのオブジェクトを返すようにする必要がある。
参考文献
【Laravel】Property [id] does not exist on this collection instance.
- 投稿日:2020-11-04T11:34:02+09:00
【3ヶ月】未経験転職したエンジニアが自社開発企業で行なったこと【そこから見えるやっておくべきこと】
自己紹介
yukiと申します。DMMWEBCAMPにお世話になって、今はWEBエンジニアをしつつ、自分で仲間を集めてサービス開発したり、プログラミングの家庭教師したり毎日エンジニアライフをエンジョイしています。
本日は未経験エンジニアとして、自社開発企業に就職して3ヶ月の間に何をしたか紹介します。
勤務先にもSNSで身分を明らかにすることは承諾を得ているので、その部分もお伝えします。会社の紹介
私は現在、株式会社ダイアログという物流×ITの会社に勤務しております。
2020年9月現在、エンジニアの募集はしていませんが、他にも様々な職種を募集しているので、Wantedlyのページをご覧ください。いつか自分のQiitaきっかけで応募してくださる方がいたら、嬉しいなと思います。さて、ではそんなダイアログで行なったことをまとめます。
1ヶ月目
プログラミングの部分
- 環境構築
- 自社サービスの使用方法、ファイルの場所などの研修
- 【Laravel】CSVファイルの書き出しの際の簡単なロジックの追加
- 【HTML/CSS/JS】でプロダクトのモックを作成
それ以外の部分
- エンジニアの先輩方、部署を跨いだメンターとの1on1面談
- 興味があったので、お客様とのMTGに参加
1ヶ月目は環境構築を終えたのち、大変ありがたいことにサービスの操作方法や関連するファイルの場所などの研修がありました。プログラミングに関してはある程度研修が終わったのち、Laravelを用いてCSVファイルの出力の際に、
こういう値がきたらこうする
といった簡単な処理の追加をOJT形式で行わせていただきました。また、個人の案件としてはこれまで学習した知識を生かし、HTML/CSS/JSでモック(DBの複雑な処理などはないが、見た目としてはできているプロダクト)の作成をしました。それ以外の部分では、メンター制度が手厚く、エンジニアの先輩方に質問しやすい1on1面談があっただけではなく、他部署の先輩が一人ずっとメンターとしてついてくださるので会社の精度などの質問ができました。また、お仕事の部分では開発だけではなく、早いうちからお客様の意見を直接お聞きしたかったので、ミーティングに参加希望を出したところ承認していただきました。
2ヶ月目
プログラミングの部分
- 【Laravel】APIを作成、Service層の切り分け
- 【AngularJS】APIに連携させるフロントエンドの処理を作成
- 【SQL】20行くらいのSQLを教えていただき、理解しながらLalavelの処理の中に組み込む
それ以外の部分
- Qiitaのプロジェクト提案&開始
2ヶ月目に入ると少しだけ難易度が上がり、フロントエンドとバックエンドを分けた開発に携わることになりました。LaravelでAPIを作成し、フロント側のAngularJSと連携させるような実装です。他にも、スクールでは学習しなかった【Service層】という概念を知り、ロジックを切り分けることの大切さを確認しました。また、自社サービスとなると複雑なDBがつきもので、これまで見たことのない(自分にとっては)長いSQLを扱うようになりました。ただSQLがわかるだけではなく、Railsにもアクティブレコードなんかがありますが、LaravelでのORMも同時に学ぶ必要があったので少し大変でした。
プログラミング以外の部分では、社内でこれまでにQiitaを運用したいができていなかったという課題をお聞きできたので、投稿経験もあったため、メリットデメリットをまとめ、スケジュールをひき、自分主体で投稿サイクルを作成するQiitaプロジェクトを提案し、無事まかせていただきました。(まさにこの記事もその一環なので、ぜひLGTMお願いしますっ)
3ヶ月目
プログラミングの部分
- 【Laravel】モデル以外の場所に、より細かいバリデーション(削除の際の制御など)追加
- 【AngularJS】カスタムディレクティブのメリット理解と作成
- ER図の離れたデータの取得の仕方を学習 ### それ以外の部分
- 社内の懇親会企画
3ヶ月目は、これまでの実装の他に削除制御について機能を実装しました。スクールで学習するレベルだと、モデルに簡単なバリデーションを書くだけでしたが、もっと細かい処理を書く必要があったのでいい経験になりました。フロントエンドの方では、カスタムディレクティブという概念を学び、コードをより短く書くなどリファクタリングと所謂コンポーネントの役割をしっかり決める必要性を学びました。大きいER図を見ながらデータを取りに行くことがあるのですが、その際テーブル同士の関係は非常に重要で、3ヶ月経過した今でも無駄なくそこにアクセスできるように頑張っています。企業にもよりますが、弊社にはER図のまとめがあったので印刷して暇な時に眺めています。
全く話が変わりますが、大学生の頃にボードゲームでたくさん遊んでいた経験があったので、メンターの方と協力して社内の懇親会を企画しました。オンラインが多い現状ですが、いろいろ考えながら引き続きやっていきたいと思います。
やっておいてよかったこと
- 質問の仕方をしっかり身につける まだまだわかりにくい質問をしてしまっていると思いますが、スクールで学習する際にここだけはしっかりと意識していました。
大体以下のような形で質問しています。
#【何がやりたくて】 #【今どうやってて】 #【どこでエラーが起きて】 #【自分ではこうだと思ったのだけど】 #【うまくいかないのでアドバイスをください】+【あれば参考にした記事】相手が答えやすい質問をすることはとても大切だと思うので、この辺は早いうちから意識した方がいいと思います。
- フロントとバックを分けた開発を経験していた
ポートフォリオを作る段階で、RailsでAPIを作って、フロントエンドのフレームワークNuxt.jsを使ってバックフロントを分けた開発をしていたので、その辺の合流は思っていたよりスムーズにできていたのかなと思います。これは、他の記事でもまとめておりますので、よければご覧ください。後でリンク貼ります。反省
以下、反省点です。精進します。
- もっとSQLやDBの学習をしておけばよかった
- 使うフレームワークや言語がわかったら、どんなに期間が短くても深く学んでおけばよかった
- 投稿日:2020-11-04T10:26:28+09:00
Laravel ローカルに画像をアップロードするアプリを作成する
目次
- Macのローカルで作成したLaravelアプリで画像ファイルをアプリのローカルにアップロードする方法をまとめる
実施環境
- ハードウェア環境
項目 情報 OS macOS Catalina(10.15.5) ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) プロセッサ 2 GHz クアッドコアIntel Core i5 メモリ 32 GB 3733 MHz LPDDR4 グラフィックス Intel Iris Plus Graphics 1536 MB
- ソフトウェア環境
項目 情報 備考 PHP バージョン 7.4.8 Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする Laravel バージョン 6.X commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする 前提条件
- MacのローカルでLaravelのアプリが作成できる状態になっていること。
- コマンド
$ composer
が実行できる状態になっていること。前提情報
- 本記事はMacのローカルで作成されたLaravelアプリから
アプリ名ディレクトリ/storage/app/public/images
にファイルをアップロードする機能を作る。- この記事ではアップロードを最終目標としアップロードしたファイルを表示する機能は別の記事で紹介する。
- Laravelアプリを作成する部分から説明する。
- 作成するLaravelアプリは「laravel6_image」とし使用するデータベース名を「laravel6_image」とする。
- 本記事の作業完了したソースは下記にアップしてある。
概要
- データベースの作成
- Laravelアプリ作成
- .envファイルの修正とシンボリックリンクの作成
- ルーティング情報の記載
- マイグレーションファイルの記載とマイグレート
- モデルファイルの修正
- コントローラファイルの作成と記載
- ビューファイルの作成と記載
- 確認
詳細
- 下記の説明で実行するコマンドはすべてMacのローカルのターミナルで実行するものとする。
データベースの作成
下記コマンドを実行してMySQLにログインする。(MySQLのパスワードがわからなくなってしまった方はこちら→Mac ローカル環境の MySQL 8.x のrootパスワードを忘れた時のリセット方法)
$ mysql -u root -p下記SQLを実行してデータベース「Laravel6_image」を作成する。
create database laravel6_image;下記SQLを実行して結果に「laravel6_image」があることを確認してMySQLからログアウトする。
show databases;Laravelアプリ作成(下記のアプリ作成実行直後のソースはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/01_create_app)
Laravelアプリのファイルを作成したいディレクトリで下記コマンドを実行する。
$ composer create-project "laravel/laravel=6.*" laravel6_image $ cd laravel6_image.envファイルの修正とシンボリックリンクの作成
下記コマンドを実行してLaravelの設定ファイルを開く。
$ vi .env下記のように内容を記載修正する。
APP_NAME=laravel6_image DB_DATABASE=laravel6_image DB_USERNAME=root DB_PASSWORD=皆さんのMySQLのrootユーザのパスワード FILESYSTEM_DRIVER=public記載修正した筆者の.envの内容を下記に記載する。(MySQLのrootパスワードは伏せる)
APP_NAME=laravel6_image APP_ENV=local APP_KEY=base64:UCrvlsgbU4qjd5H8rRSm67u1yur1lG/dmgUYOwM49YQ= APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel6_image DB_USERNAME=root DB_PASSWORD=************* FILESYSTEM_DRIVER=public BROADCAST_DRIVER=log CACHE_DRIVER=file QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=null MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"下記コマンドを実行してデフォルトマイグレーションファイルのマイグレートを実行する。
$ php artisan migrate;下記コマンドを実行してシンボリックリンクの作成を行う。
$ php artisan storage:link下記コマンドを実行してローカルサーバを起動する。
$ php artisan serve下記にアクセスして下記画像の画面が表示されることを確認する。
ルーティング情報の記載(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/02_route)
下記コマンドを実行してルーティングファイルを開く。
$ vi routes/web.php下記の内容を追記する。
laravel6_image/routes/web.php// 画像アップロードページ用 Route::get('/input', 'ImageController@input')->name('input'); // 画像アップロード処理用 Route::post('/upload', 'ImageController@upload')->name('upload');記載後のルーティングファイルの全内容を下記に記載する。
laravel6_image/routes/web.php<?php /* |-------------------------------------------------------------------------- | 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('/input', 'ImageController@input')->name('input'); // 画像アップロード処理用 Route::post('/upload', 'ImageController@upload')->name('upload'); // 上記までを追記マイグレーションファイルの記載とマイグレート(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/03_migrate)
下記コマンドを実行してモデルファイルとマイグレーションファイルを一緒に作成する。
$ php artisan make:model Models/Image -m下記コマンドを実行してマイグレーションファイルを開く。(YYYY_MM_DD_XXXXXXはマイグレーションファイルの作成日時)
$ vi database/migrations/YYYY_MM_DD_XXXXXX_create_images_table.phpupメソッドのcreateの中に下記を記載する。
database/migrations/YYYY_MM_DD_XXXXXX_create_images_table.php$table->string('file_path')->default('default'); $table->string('file_name')->default('default'); $table->softDeletes();記載後のマイグレーションファイルの全内容を下記に記載する。
database/migrations/YYYY_MM_DD_XXXXXX_create_images_table.php<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateImagesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('images', function (Blueprint $table) { $table->bigIncrements('id'); // 下記を追記 $table->string('file_path')->default('default'); $table->string('file_name')->default('default'); $table->softDeletes(); // 上記までを追記 $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('images'); } }下記コマンドを実行してマイグレートする。
$ php artisan migrate(本作業の意図はこちら→Laravel テーブル内のデータ削除を論理削除にする)(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/04_model)
下記コマンドを実行してモデルファイルを開く。
$ vi app/Models/Image.php下記の内容を追記する。
laravel6_image/app/Model/Image.phpuse Illuminate\Database\Eloquent\SoftDeletes; // Imageクラス内に下記を追記 use SoftDeletes;記載後のモデルファイルの全内容を下記に記載する。
laravel6_image/app/Models/Image.php<?php namespace App\Model; use Illuminate\Database\Eloquent\Model; // 下記を追記 use Illuminate\Database\Eloquent\SoftDeletes; class Image extends Model { //下記を追記 use SoftDeletes; }コントローラファイルの作成と記載(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/05_controller)
下記コマンドを実行してコントローラファイルを作成する。
$ php artisan make:controller ImageController下記コマンドを実行して作成したコントローラファイルを開く。
$ vi app/Http/Controllers/ImageController.php下記のようにコントローラファイルの内容を追記・修正する。追記修正後のコントローラファイルの全体の内容を下記に記載する。(Storageファサードを使用するときにdiskを処理中で指定しているドキュメントが多くあるが.envファイルで
FILESYSTEM_DRIVER=public
を一括指定しているので本方法だと処理中にdiskメソッドで指定することはない。)laravel6_image/app/Http/Controllers/ImageController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; // 下記を追記する use App\Models\Image; use Illuminate\Support\Facades\Storage; // 上記までを追記する class ImageController extends Controller { // 下記を追記する public function input() { return view('images/input'); } public function upload(Request $request) { $this->validate($request, [ 'file' => [ // 空でないこと 'required', // アップロードされたファイルであること 'file', // 画像ファイルであること 'image', // MIMEタイプを指定 'mimes:jpeg,png', ] ]); if ($request->file('file')->isValid([])) { $file_name = $request->file('file')->getClientOriginalName(); // オリジナルファイルのファイル名の取得 $file_path = Storage::putFile('/images', $request->file('file'), 'public'); // ファイルのアップロードとアップロードパスの取得 $image_info = new Image(); $image_info->file_path = $file_path; $image_info->file_name = $file_name; $image_info->save(); return redirect('/'); }else{ return redirect(route('input')); } } // 上記までを追記する }ビューファイルの作成と記載(本作業完了後のソースコードはこちら→)
下記コマンドを実行してビューファイルを格納するディレクトリを作成する。
$ mkdir -p resources/views/images下記コマンドを実行してビューファイルを作成して開く。
$ vi resources/views/images/input.blade.php下記の内容をビューファイルに記載する。
laravel6_image/resources/views/images/input.blade.php<h1>画像ファイルのアップロード</h1> <form action="{{route('upload')}}" method="POST" enctype="multipart/form-data"> @csrf @error('file') {{$message}} <br> @enderror <label for="photo">画像ファイル:</label> <input type="file" class="form-control" name="file"> <br> <input type="submit"> </form>確認
下記コマンドを実行してローカルサーバを起動する。
$ php artisan serve下記にアクセスする。
下記のページが表示されたことを確認する。
「ファイルを選択」をクリック後任意の画像ファイルを選択し「送信」をクリックする。
エラーが出ずhttp://127.0.0.1:8000にリダレクトされることを確認する。
参考文献
- 投稿日:2020-11-04T03:04:10+09:00
【Laravel】MySQLでのユニットテストの環境設定
環境
Laravel Framework 5.8.38
My SQL 5.6テスト用データベースの作成
まずテスト用データベースを作成する必要があるので、MySQLに入ります。
$ mysql -u root;以下のコマンドで新しいテスト用データベースを作成。
今回はデータベース名をtest_laravel_db とします。$ create database test_laravel_db;作成後は一旦、MYSQLから出ます。
次に中身のテーブルを作成する必要があります。
テーブルは実際に使っているデータベースをmigrateによってコピーして使います。
その前準備としてプロジェクト直下にある.envファイルを同じ階層に複製して
ファイル名を.env.testing にしてください。
このファイルを作成する事によって、テスト実行時だけDBなどの環境がこちらのテストファイルに切り替わるようになります。.env.testingファイルの内容を一部変更します。
変更する項目は以下の通りです。APP_ENV=test_laravel_db APP_KEY= (↑空にします) DB_DATABASE=test_laravel_db尚、.envや.env.testingファイルの内容を変更した時はターミナルにてconfigキャッシュをクリアして下さい。
$ php artisan config:clear先ほどAPP_KEYを空にした理由は、新しいAPP_KEYを発行すると自動で入力されるからです。
新しくAPP_KEYを発行するには以下のコードをターミナルで打ちます。$ php artisan key:generate --env=testing後ろに --env=testing を入れないと.env.testingの方にAPP_KEYが入りません。
上記の設定が完了したら、test_laravel_dbに向けてmigrateをします。
$ php artisan migrate --env=testingターミナルに成功結果が表示されると思いますが、念のためMySQL内で作れているか確認しましょう。
$ mysql -u root; $ use test_laravel_db; $ show tables;実際のテーブルと同じ内容だったら、テスト用のデータベースの作成が完了です。
テストを正常に作動させるにはあと2つファイルを変更します。
プロジェクト直下にある phpunit.xmlを開きます。
下記のようにコードを追加します。<server name="APP_ENV" value="testing"/> <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"/> <server name="DB_CONNECTION" value="test_laravel_db"/>尚、開発環境によってserverタグをenvタグに変えなくてはいけないケースがあるようですが
私はserverタグのままで大丈夫でした。次にconfig/database.phpを開きます。
'connections'の配列の中に'sqlite'や'mysql'などがありますが
'mysql'の内容を全てコピーして、'connections'内の中に以下のように収めます。'test_laravel_db' => [ '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'), ]) : [],設定が完了したら、ターミナルでテストを動かしてみます。
$ ./vendor/bin/phpunit
- 投稿日:2020-11-04T00:04:47+09:00
【初心者向け】Laravelのmigrateでテーブル作成する方法
こんにちは!! ふうがと言います!プログラミング勉強中の犬です。
今回は、Laravelでartisanを使ってテーブル作成を行います。ご覧頂く前に
著者の備忘録ともなっておりますので言葉足らずな部分もございます。
ご容赦いただければと思います。公式サイト(ご参考までに)
?公式
https://readouble.com/laravel/テーブル作成の順序
①マイグレーション ファイルを作成
②マイグレーション ファイルを編集
③実行
となります。①マイグレーション ファイルを作成
下記のコマンドを叩いて、migration用のファイルを作成しましょう。
(この際のファイル名はなんでもOKです。今回はcreate_usersで作成します!)php artisan make:migration {ファイル名}下記のような結果が出れば成功です。
Created Migration: 2020_11_03_140428_create_users //日付はその日の日付になる②マイグレーション ファイルを編集
先ほどのコマンドで下記のファイルが作成されているはずです。/database/migrations/2020_11_03_140428_create_users.phpclass Create_users extends Migration { /** * Run the migrations. * * @return void */ public function up() { // } /** * Reverse the migrations. * * @return void */ public function down() { // } }こちらにテーブル情報を記載していきます。
function upにはテーブル作成情報を、
function downにはrollbackした時の情報を記載します。
今回はid,名前,年齢,作成日のカラムを登録してみましょう。
※コメントは見辛いので削除しています書き方は、こんな感じ!
$table->データ型('テーブル名');/database/migrations/2020_11_03_140428_users.phpclass Create_users extends Migration { public function up() { Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->integer('age'); $table->timestamps(); //created_at,updated_atの作成 }); } public function down() { $table->dropIfExists('users'); //テーブル削除 } }③実行
下記のコマンドを叩いてください。
※コマンドをたたく場所は、databaseの上のプロジェクト直下です。php artisan migrate下記のように出れば、作成成功です!
Migrating: 2020_11_03_140428_users Migrated: 2020_11_03_140428_users以上
テーブルが作成されているか、確認してみてください。