20201104のlaravelに関する記事は11件です。

Laravelで、急に「Malformed communication packet」エラーでSQLに接続できなくなった際の対応メモ

さっきまで動いていたLaravelが下記エラーで動かなくなった。。:sob:

image.png

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],
// 〜省略〜

これで無事エラーはなくなりました。。:smile:

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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();
のようにしてHogemethod()を呼び出すことができます。

use App\Facades\Hoge;
と名前空間を記述しなくてもいいのは楽ですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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の作成

image.png

image.png

1個のパブリックサブネットを持つVPCを作成します。
プライベートなサブネットを作りたいときは下のパブリックとプライベートサブネットを持つVPCを作ります。
このとき、IPv4 CIDRブロックは10.0.0.0/16
パブリックサブネットのIpv4 10.0.0.0/24にしておきましょう。
image.png

VPC
image.png

EC2インスタンスの作成

EC2をコンソールから選択してインスタンスを起動をクリック
image.png

Ubuntu 18.04を選択
ステップ2でt2.microを選択
image.png

ステップ3 インスタンスの詳細の設定では先程作成したVPCを選択.自動割当パブリックIPも無効から有効にしましょう。
image.png

ステップ6 セキュリティグループ設定ではHTTPの80ポートを使用するので、ルールの追加で追加する。
image.png

ステップ7 で起動をクリック。
      SSH接続するための、キーペア(mykey.pem)はダウンロードしておきましょう。

image.png

この間で、mykey.pemの認証をしましょう。

ダウンロードフォルダに移動して下記のコマンド実行しましょう
そうしたら認証が変わります。
chmod 400 mykey.pem
詳しくはawsの認証ページに書いてあります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html

しばらくしたらインスタンスがrunnningになるので、EC2ダッシュボード⇒実行中のインスタンスをクリック⇒作成したインスタンスIDをクリック
右上にある接続をクリック
image.png

SSH接続する場合は下にあるところ(コピーされたコマンドをクリック)したらいいです。

image.png

ターミナルを開いて
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-compose
exit

でrootから抜け出す

Laradocをgit cloneする。

https://laradock.io/

git clone https://github.com/Laradock/laradock.git

lsでgit cloneされているか確認しましょう。
image.png

$ 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=secret

Laravelで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で固定にしてもいいですが、今回はしません。)

image.png

いけますね。疑い深いんで、ローカルじゃなくグローバルになってるか確認するために、iphoneで動くか確認してもいけてます。

image.png

EC2再起動したときの注意事項

1)EC2再起動するたびにdocker-compose再起動しましょう。
EC2停止すると再起動するらしいとのことなので、
EC2起動のたびdocker-compose立ち上げないといけないので、
下記のコマンド実行します。

sudo su
cd laradock/
docker-compose up -d nginx mysql phpmyadmin

2)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も勉強しようとおもいます。

なにか、みなさまの参考になれば幸いです。

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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の作成

image.png

image.png

1個のパブリックサブネットを持つVPCを作成します。
プライベートなサブネットを作りたいときは下のパブリックとプライベートサブネットを持つVPCを作ります。
このとき、IPv4 CIDRブロックは10.0.0.0/16
パブリックサブネットのIpv4 10.0.0.0/24にしておきましょう。
image.png

VPC
image.png

EC2インスタンスの作成

EC2をコンソールから選択してインスタンスを起動をクリック
image.png

Ubuntu 18.04を選択
ステップ2でt2.microを選択
image.png

ステップ3 インスタンスの詳細の設定では先程作成したVPCを選択.自動割当パブリックIPも無効から有効にしましょう。
image.png

ステップ6 セキュリティグループ設定ではHTTPの80ポートを使用するので、ルールの追加で追加する。
image.png

ステップ7 で起動をクリック。
      SSH接続するための、キーペア(mykey.pem)はダウンロードしておきましょう。

image.png

この間で、mykey.pemの認証をしましょう。

ダウンロードフォルダに移動して下記のコマンド実行しましょう
そうしたら認証が変わります。
chmod 400 mykey.pem
詳しくはawsの認証ページに書いてあります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html

しばらくしたらインスタンスがrunnningになるので、EC2ダッシュボード⇒実行中のインスタンスをクリック⇒作成したインスタンスIDをクリック
右上にある接続をクリック
image.png

SSH接続する場合は下にあるところ(コピーされたコマンドをクリック)したらいいです。

image.png

ターミナルを開いて
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-compose
exit

でrootから抜け出す

Laradocをgit cloneする。

https://laradock.io/

git clone https://github.com/Laradock/laradock.git

lsでgit cloneされているか確認しましょう。
image.png

$ 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=secret

Laravelで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で固定にしてもいいですが、今回はしません。)

image.png

いけますね。疑い深いんで、ローカルじゃなくグローバルになってるか確認するために、iphoneで動くか確認してもいけてます。

image.png

EC2再起動したときの注意事項

1)EC2再起動するたびにdocker-compose再起動しましょう。
EC2停止すると再起動するらしいとのことなので、
EC2起動のたびdocker-compose立ち上げないといけないので、
下記のコマンド実行します。

sudo su
cd laradock/
docker-compose up -d nginx mysql phpmyadmin

2)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も勉強しようとおもいます。

なにか、みなさまの参考になれば幸いです。

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel:Auth認証の設定

【概要】

1.手順

2.どのようにコーディングするか

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.phpusersテーブルが作成されます。

❹作成されたusersをマイグレーション
下記の通りマイグレーションを実行します。

$ php artisan migrate

するとDBにuserテーブルが作成されます。

❺Controllerにコーディング
use Illuminate\Support\Facades\Auth;
$user = Auth::user();
を記述して完了です。

app/Http/Controllers/xxxxController.php
use 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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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の学習をしておけばよかった
  • 使うフレームワークや言語がわかったら、どんなに期間が短くても深く学んでおけばよかった
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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」とする。
  • 本記事の作業完了したソースは下記にアップしてある。

概要

  1. データベースの作成
  2. Laravelアプリ作成
  3. .envファイルの修正とシンボリックリンクの作成
  4. ルーティング情報の記載
  5. マイグレーションファイルの記載とマイグレート
  6. モデルファイルの修正
  7. コントローラファイルの作成と記載
  8. ビューファイルの作成と記載
  9. 確認

詳細

  • 下記の説明で実行するコマンドはすべてMacのローカルのターミナルで実行するものとする。
  1. データベースの作成

    1. 下記コマンドを実行してMySQLにログインする。(MySQLのパスワードがわからなくなってしまった方はこちら→Mac ローカル環境の MySQL 8.x のrootパスワードを忘れた時のリセット方法

      $ mysql -u root -p
      
    2. 下記SQLを実行してデータベース「Laravel6_image」を作成する。

      create database laravel6_image;
      
    3. 下記SQLを実行して結果に「laravel6_image」があることを確認してMySQLからログアウトする。

      show databases;
      
  2. Laravelアプリ作成(下記のアプリ作成実行直後のソースはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/01_create_app

    1. Laravelアプリのファイルを作成したいディレクトリで下記コマンドを実行する。

      $ composer create-project "laravel/laravel=6.*" laravel6_image
      $ cd laravel6_image
      
  3. .envファイルの修正とシンボリックリンクの作成

    1. 下記コマンドを実行してLaravelの設定ファイルを開く。

      $ vi .env
      
    2. 下記のように内容を記載修正する。

      APP_NAME=laravel6_image
      
      DB_DATABASE=laravel6_image
      DB_USERNAME=root
      DB_PASSWORD=皆さんのMySQLのrootユーザのパスワード
      
      FILESYSTEM_DRIVER=public
      
    3. 記載修正した筆者の.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}"
      
    4. 下記コマンドを実行してデフォルトマイグレーションファイルのマイグレートを実行する。

      $ php artisan migrate;
      
    5. 下記コマンドを実行してシンボリックリンクの作成を行う。

      $ php artisan storage:link
      
    6. 下記コマンドを実行してローカルサーバを起動する。

      $ php artisan serve
      
    7. 下記にアクセスして下記画像の画面が表示されることを確認する。

  4. ルーティング情報の記載(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/02_route

    1. 下記コマンドを実行してルーティングファイルを開く。

      $ vi routes/web.php
      
    2. 下記の内容を追記する。

      laravel6_image/routes/web.php
      // 画像アップロードページ用
      Route::get('/input', 'ImageController@input')->name('input');
      
      // 画像アップロード処理用
      Route::post('/upload', 'ImageController@upload')->name('upload');
      
    3. 記載後のルーティングファイルの全内容を下記に記載する。

      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');
      // 上記までを追記
      
  5. マイグレーションファイルの記載とマイグレート(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/03_migrate

    1. 下記コマンドを実行してモデルファイルとマイグレーションファイルを一緒に作成する。

      $ php artisan make:model Models/Image -m
      
    2. 下記コマンドを実行してマイグレーションファイルを開く。(YYYY_MM_DD_XXXXXXはマイグレーションファイルの作成日時)

      $ vi database/migrations/YYYY_MM_DD_XXXXXX_create_images_table.php
      
    3. upメソッドの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();
      
    4. 記載後のマイグレーションファイルの全内容を下記に記載する。

      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');
          }
      }
      
      
    5. 下記コマンドを実行してマイグレートする。

      $ php artisan migrate
      
  6. (本作業の意図はこちら→Laravel テーブル内のデータ削除を論理削除にする)(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/04_model

    1. 下記コマンドを実行してモデルファイルを開く。

      $ vi app/Models/Image.php
      
    2. 下記の内容を追記する。

      laravel6_image/app/Model/Image.php
      use Illuminate\Database\Eloquent\SoftDeletes;
      // Imageクラス内に下記を追記
      use SoftDeletes;
      
    3. 記載後のモデルファイルの全内容を下記に記載する。

      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;
      }
      
  7. コントローラファイルの作成と記載(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/05_controller

    1. 下記コマンドを実行してコントローラファイルを作成する。

      $ php artisan make:controller ImageController
      
    2. 下記コマンドを実行して作成したコントローラファイルを開く。

      $ vi app/Http/Controllers/ImageController.php
      
    3. 下記のようにコントローラファイルの内容を追記・修正する。追記修正後のコントローラファイルの全体の内容を下記に記載する。(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'));
              }
      
          }
          // 上記までを追記する
      }
      
  8. ビューファイルの作成と記載(本作業完了後のソースコードはこちら→

    1. 下記コマンドを実行してビューファイルを格納するディレクトリを作成する。

      $ mkdir -p resources/views/images
      
    2. 下記コマンドを実行してビューファイルを作成して開く。

      $ vi resources/views/images/input.blade.php
      
    3. 下記の内容をビューファイルに記載する。

      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>
      
  9. 確認

    1. 下記コマンドを実行してローカルサーバを起動する。

      $ php artisan serve 
      
    2. 下記にアクセスする。

    3. 下記のページが表示されたことを確認する。

      127_0_0_1_8000_input.png

    4. 「ファイルを選択」をクリック後任意の画像ファイルを選択し「送信」をクリックする。

      127_0_0_1_8000_input.png

    5. エラーが出ずhttp://127.0.0.1:8000にリダレクトされることを確認する。

      Laravel.png

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者向け】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.php
class 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.php
class 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

以上

テーブルが作成されているか、確認してみてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む