- 投稿日:2020-07-28T23:55:38+09:00
Eloquentでリレーション先のカラムを条件に並び替える
課題
リレーション先のカラムに表示順序が指定されていてそれを元にリレーション元にデータを並び替えたい(ソートしたい)ときがあります。
例えば、次のようなケースを考えてみます。
countires
id name dsp_order 1 日本 1 2 アメリカ 5 3 中国 3 4 韓国 4 5 台湾 2 users
id name country_id 1 張 5 2 木村 1 3 クレア 2 4 金 4 5 李 3 望ましい順序
1. 木村
2. 張
3. 李
4. 金
5. クレアこのとき発行するSQLは次のようになります。
SELECT users.name FROM users LEFT JOIN countries ON countries.id = users.country_id ORDER BY countries.dsp_orderLaravelにはGlobalScopeと言って、そのモデルにアクセスするときに自動で付加するクエリをあらかじめ定義しておくことが可能な機能があります。Userモデルにアクセスしたときに上記のようなSQLを自動で発行させるにはどのようなGlobalScopeを書くといいでしょうか。
解決策
protected static function boot() { parent::boot(); static::addGlobalScope('order', function (Builder $builder) { $builder->select('users.*') ->join('countries', 'contries.id', '=', 'users.id') ->orderBy('countries.dsp_order', 'asc') }); }
select('自分のテーブル.*')
を先頭につけておくのがポイントです。さもないと、joinしたcountriesのカラムまで引き連れたデータが取れて、意図した挙動になりません。
- 投稿日:2020-07-28T22:07:04+09:00
Docker×Laravel×Vue
開発で必要な記事をまとめていきます。
これを参考にして開発始める人の手助けになればいいなと思って
自分が参考にした記事をまとめていきます。マルチログインの実装
それぞれ別々のディレクトリに分けてあげて判断。
認証に必要な要素を付け加える
https://qiita.com/sasakure-kei@github/items/388a2900557a6079164d
Laravel authで404 nginxが使えない時
https://qiita.com/isaatsu0131/items/f1eafe7522f0bf0ff043
nginxのファイル探索部分がおかしいらしい
Docker
起動中のコンテナ一覧
docker psImage起動
docker run -it IMAGE名 bashDocker起動
https://qiita.com/A-Kira/items/1c55ef689c0f91420e81
Docker Laravel 実行
https://qiita.com/A-Kira/items/1c55ef689c0f91420e81
docker-compose down docker-compose up -dDocker 起動してもexitするとき
docker logs コンテナIDhttps://qiita.com/mom0tomo/items/35dfacb628df1bd3651e
Mysql bin/bashで起動
docker exec -it db-host bin/bashDockerのイメージ壊してテーブルのデータが消えた時
ERROR 1812 (HY000): Tablespace is missing for table `engineerMatching`.`companies`.https://qiita.com/___uhu/items/74168be48c05638c7ac5
まず以下を実行する
ALTER TABLE example_table DISCARD TABLESPACE; ALTER TABLE example_table IMPORT TABLESPACE; 復活!Docker 全て終了させる
https://qiita.com/shisama/items/48e2eaf1dc356568b0d7
docker rmi $(docker images -q)Docker再構築
https://qiita.com/shisama/items/48e2eaf1dc356568b0d7
Docker Mysql起動
起動時の初期設定参照URL
https://qiita.com/pugiemonn/items/b17288494e4b627f4475
docker exec -it db-host bin/bash のコマンドの際に Error response from daemon: Container 5d83ac9a96ef971c5016b2a6559e75f43bfd71fa71909e89c3c04fd22ff89b94 is not runningと出たので
docker start 5d83ac9a96ef971c5016b2a6559e75f43bfd71fa71909e89c3c04fd22ff89b94で普通に入れました。
自分の場合 DBのデータが入っているディレクトリごと消すとうまくいきました。
→これはおそらく最終手段なので本番環境でやると致命的になるので注意。Tablespace is missing for table
https://qiita.com/___uhu/items/74168be48c05638c7ac5
Nginx 413 Request Entity Too Large
Nginxのconfファイルに
server{ client_max_body_size 30M; }みたいに最大許容量を指定してあげれば対応可能です。
https://qiita.com/takecian/items/639deeae094466de6546
SPAの実装
非同期での認証
https://blog.capilano-fw.com/?p=3458
画面
https://giga-log.com/material-icons-use/
コンパイル時のエラー
there are multiple modules with names that only differ in casing” but modules referenced are identical
大文字小文字が入っている時に出るっぽい
https://stackoverflow.com/questions/47534267/webpack-there-are-multiple-modules-with-names-that-only-differ-in-casing-but?rq=1Vue Router 404ERROR対処方法
ルーティング指定
https://sashimistudio.site/rails-vuerouter-history404/https://blog.hirokiky.org/entry/2019/08/22/111031
解決してくれたもの
https://teratail.com/questions/121182web.phpRoute::get('/{any}',function(){ return view('./company/home'); })->where('any','.*');この記述で画面リロードしてもページ表示されるっす。
ルーティングの一番前に持ってきてあげる必要あり!!!!開発時に使えそうなもの
ホットリロード
https://vue-loader-v14.vuejs.org/ja/features/hot-reload.html変更すべきPHP.ini確認方法
echo $(php -r 'echo php_ini_loaded_file();')読み込まれているファイルを確認できるコマンド
最大投稿可能サイズ確認
php -i|grep maxphp.ini設定変更
post_maxこれをdockerファイルに記述してあげたところ成功
RUN echo "file_uploads = On\n" \ "memory_limit = 500M\n" \ "upload_max_filesize = 500M\n" \ "post_max_size = 500M\n" \ "max_execution_time = 600\n" \ > /usr/local/etc/php/conf.d/uploads.inihttps://web-memo-s.hatenablog.com/entry/2019/02/21/182815
さくらサーバにデプロイ
非常に感謝しています。簡潔でわかりやすい。
https://arrown-blog.com/laravel-sakura-deploy/
デプロイ時に Class 'Collective\Html\HtmlServiceProvider' not found
composerのアップデートしていないのが原因
https://stackoverflow.com/questions/54675520/composer-update-the-requested-php-extension-ext-http-missingClass 'Egulias\EmailValidator\Validation\RFCValidation' not found
https://laracasts.com/discuss/channels/laravel/eguliasemailvalidatoremailvalidator-does-not-exist
同様に困ってる方の質問で
```
rm -rf vendor/*の後に
composer install --no-dev
```で万事解決!!
メールが文字化けする。。。
右下の文字をUTF-8にしてあげることで解決。。
2hかかった。。。
- 投稿日:2020-07-28T22:06:13+09:00
Mac×Laravel×MAMPで環境構築からデータベース接続まで
さっそくタイトルにある通り進めていきましょう。
MAMPのインストール
MAMPの公式サイトにアクセスします。
Free Downloadをクリックします。
macアイコンの下「MAMP & MAMP PRO 5.~」をクリックするとダウンロードが開始されます。
無事インストールされたら、アプリケーションフォルダ内のMAMPアイコンをクリックして起動します。
MAMPが起動後、Start Servers をクリックすることで、
Apacheサーバー・・Webサーバー
MySQLサーバー・・データベースサーバー
を同時に起動できます。しばらくすると、Apacheサーバー、MySQLサーバーともに緑色のランプがついたら起動できています。
MAMPの設定
メニュー内 MAMP から Preferences をクリックします。
Portsをクリックすると、ApacheやMysqlが使用するポート番号が表示されます。
初期設定ではApacheのポート番号が8888、MySQLのポート番号が8889になっていますが、
一般的には、
Apacheのポート番号は80
MySQLのポート番号は3306
を使うことが多いですので、特に問題がなければ、画面中央の「Set Web & MySQL ports to 80 & 3306」をクリックします。
Apacheのポート番号は80
MySQLのポート番号は3306
になっていればOKです。以上でMAMPのインストールおよび設定が完了です。
composerのインストール
PHPのライブラリやパッケージを管理するcomposerというツールがあります。
Laravelもcomposerを使ってインストールしますので、下記リンクよりダウンロードしインストールしてください。
インストール後、コマンドプロンプトでcomposer --versionと入力してください。
$ composer --version Composer version 1.4.2このようにバージョンが表示されればOKです。
Laravelのインストール
composerがインストールされている状態で、htdocsディレクトリに移動します。
初期設定でインストールした場合は下記フォルダになるかと思います。
$ cd /Application/MAMP/htdocshtdocsフォルダに移動後、下記のコマンドを入力してください。
$ composer create-project --prefer-dist laravel/laravel 任意のアプリケーション名Laravelの起動
作成したプロジェクトフォルダへ移動して、簡易サーバーを立ち上げてみます。
$ php artisan serveと入力し、
$ php artisan serve Laravel development server started: <http://127.0.0.1:8000> [Tue Apr 23 20:24:32 2019] 127.0.0.1:51707 [200]: /favicon.icoと表示されたら、グーグルクロムなどのブラウザでhttp://127.0.0.1:8000
と入力します。こんな画面が表示されればOKです。
phpmyadminでデータベース作成
「Open WebStart page」をクリックしてください。すると、以下のようなブラウザに飛びます。
下にスクロールして、
「phpMyAdmin」をクリック。すると以下のブラウザに飛びますので、
ここで、任意の名前のデーターベースを作成しましょう。MAMPの情報を控える
そうしましたら、先ほどのWelcome to MAMPのページでMAMPの情報をメモしてください。
.envの修正
デフォルトだと以下のようになっています。
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_USERNAME=root DB_PASSWORD=これを、MAMPの情報を元に、以下のように変えます。
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock DB_DATABASE=先ほど作ったデータベース名 DB_USERNAME=root DB_PASSWORD=root次はdatabase.phpです。
database.phpの修正
デフォルトのdatabase.phpはこうなっています。
'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''),それを、以下のように変えます。
'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', '先ほど作ったデータベース名'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', 'root'),以上で環境構築とデータベース接続まで行えるはずです!
では、良き開発ライフを!!!
- 投稿日:2020-07-28T22:06:13+09:00
Mac×Laravel×MAMPで開発環境構築からデータベース接続まで
さっそくタイトルにある通り進めていきましょう。
MAMPのインストール
MAMPの公式サイトにアクセスします。
Free Downloadをクリックします。
macアイコンの下「MAMP & MAMP PRO 5.~」をクリックするとダウンロードが開始されます。
無事インストールされたら、アプリケーションフォルダ内のMAMPアイコンをクリックして起動します。
MAMPが起動後、Start Servers をクリックすることで、
Apacheサーバー・・Webサーバー
MySQLサーバー・・データベースサーバー
を同時に起動できます。しばらくすると、Apacheサーバー、MySQLサーバーともに緑色のランプがついたら起動できています。
MAMPの設定
メニュー内 MAMP から Preferences をクリックします。
Portsをクリックすると、ApacheやMysqlが使用するポート番号が表示されます。
初期設定ではApacheのポート番号が8888、MySQLのポート番号が8889になっていますが、
一般的には、
Apacheのポート番号は80
MySQLのポート番号は3306
を使うことが多いですので、特に問題がなければ、画面中央の「Set Web & MySQL ports to 80 & 3306」をクリックします。
Apacheのポート番号は80
MySQLのポート番号は3306
になっていればOKです。以上でMAMPのインストールおよび設定が完了です。
composerのインストール
PHPのライブラリやパッケージを管理するcomposerというツールがあります。
Laravelもcomposerを使ってインストールしますので、下記リンクよりダウンロードしインストールしてください。
インストール後、コマンドプロンプトでcomposer --versionと入力してください。
$ composer --version Composer version 1.4.2このようにバージョンが表示されればOKです。
Laravelのインストール
composerがインストールされている状態で、htdocsディレクトリに移動します。
初期設定でインストールした場合は下記フォルダになるかと思います。
$ cd /Application/MAMP/htdocshtdocsフォルダに移動後、下記のコマンドを入力してください。
$ composer create-project --prefer-dist laravel/laravel 任意のアプリケーション名Laravelの起動
作成したプロジェクトフォルダへ移動して、簡易サーバーを立ち上げてみます。
$ php artisan serveと入力し、
$ php artisan serve Laravel development server started: <http://127.0.0.1:8000> [Tue Apr 23 20:24:32 2019] 127.0.0.1:51707 [200]: /favicon.icoと表示されたら、グーグルクロムなどのブラウザでhttp://127.0.0.1:8000
と入力します。こんな画面が表示されればOKです。
phpmyadminでデータベース作成
「Open WebStart page」をクリックしてください。すると、以下のようなブラウザに飛びます。
下にスクロールして、
「phpMyAdmin」をクリック。すると以下のブラウザに飛びますので、
ここで、任意の名前のデーターベースを作成しましょう。MAMPの情報を控える
そうしましたら、先ほどのWelcome to MAMPのページでMAMPの情報をメモしてください。
.envの修正
デフォルトだと以下のようになっています。
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_USERNAME=root DB_PASSWORD=これを、MAMPの情報を元に、以下のように変えます。
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock DB_DATABASE=先ほど作ったデータベース名 DB_USERNAME=root DB_PASSWORD=root次はdatabase.phpです。
database.phpの修正
デフォルトのdatabase.phpはこうなっています。
'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''),それを、以下のように変えます。
'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', '先ほど作ったデータベース名'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', 'root'),以上で環境構築とデータベース接続まで行えるはずです!
では、良き開発ライフを!!!
- 投稿日:2020-07-28T18:51:07+09:00
How to Install and Use Summernote Editor in Laravel ?
This tutorial demonstrates how to install and use Summernote WYSIWYG Code Editor with Laravel. I will show you step by step process of summernote editor example.
click here to read more:
https://www.positronx.io/how-to-install-and-use-summernote-editor-in-laravel/
- 投稿日:2020-07-28T18:47:53+09:00
Laravel7 Database Seeder Tutorial: Database Seeder in Laravel
In general, this tutorial shed light on the foundational and most asked topic in laravel domain, which is database seeders in laravel 7. No wonder we will write a detailed memoir, in the form of Laravel 7 Database Seeder.
click here to read more:
https://www.positronx.io/laravel-database-seeder-tutorial-example/
- 投稿日:2020-07-28T18:44:56+09:00
Laravel 7 Multi Auth: Create Multi Auth (Authentication) in Laravel
how to create multiple auth (Authentication) in Laravel 7 using middleware.
click here to read more:
https://www.positronx.io/create-multi-auth-authentication-in-laravel/
- 投稿日:2020-07-28T18:41:37+09:00
Laravelの認証(JWT)
前提条件
eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っていますLaravelでデータベースを扱う準備をする
Laravelでテーブル作成
Laravelで初期データ投入
Laravelでデータベースを操作する(Eloquent編)
本記事は上記ので作成したデータベースとレコード、PHPファイルを使用します認証に必要なソース生成
コマンドラインで
cd sample
composer require tymon/jwt-auth
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押しますコマンドラインで
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"eclipseプロジェクトを右クリック→リフレッシュ
/sample/config/jwt.phpが現れますコマンドラインで
php artisan jwt:secret
eclipseプロジェクトを右クリック→リフレッシュ
/sample/.envにJWT_SECRETが記載されますModel修正
/sample/app/Models/User.php修正
(1) use文追記
use Tymon\JWTAuth\Contracts\JWTSubject;
追記
(2) implementsにJWTSubject追加
class User extends Authenticatable implements MustVerifyEmail , JWTSubject
(3) メソッド追加
public function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims()
{
return [];
}
auth.php修正
/sample/config/auth.php修正
guards->apiを修正auth.php‥‥ 'guards' => [ ‥‥ 'api' => [ 'driver' => 'jwt', 'provider' => 'users', ], ], ‥‥Controller
(1) AuthController作成
コマンドラインで
cd sample
php artisan make:controller AuthController
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押します
eclipseプロジェクトを右クリック→リフレッシュ
/sample/app/Http/Controllers/AuthController.phpが現れます
/sample/app/Http/Controllers/AuthController.phpを下記に修正しますAuthController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class AuthController extends Controller { public function __construct() { $this->middleware('auth:api', ['except' => ['login']]); } public function login() { $credentials = request(['email', 'password']); if (! $token = auth('api')->attempt($credentials)) { return response()->json(['error' => 'メールアドレス、またはパスワードが間違っています'], 401); } return $this->respondWithToken($token); } public function me() { return response()->json(auth('api')->user()); } public function logout() { auth('api')->logout(); return response()->json(['message' => 'Successfully logged out']); } public function refresh() { return $this->respondWithToken(auth('api')->refresh()); } protected function respondWithToken($token) { return response()->json([ 'access_token' => $token, 'token_type' => 'bearer', 'expires_in' => auth('api')->factory()->getTTL() * 60 ]); } }jwt-authの公式ドキュメントとほとんど同じですが、違っている箇所があります。
auth()関数に引数'api'を渡しています
jwt-authの公式ドキュメントではauth.phpのdefaultsのguardをapiにしているので、auth()に引数を渡さなくてもjwtのguardが取れますが、今回はdefaultsのguardはwebのままにしますので、auth()関数に引数'api'を渡すようにします
また、コンストラクタでmiddlewareを指定しています。middlewareは/sample/routes/web.phpや/sample/routes/api.phpの中でRoute::getやRoute::postの戻り値に対して指定することもできますが、コンストラクタで指定することもできます。この場合$this->middleware('auth:api', ['except' => ['login']]);
なので、loginメソッドを除いて、メソッドにリクエストが来るとguard->apiの認証が必要になります(2) SampleController.php修正
/sample/app/Http/Controllers/SampleController.php修正
api1メソッド、api2メソッド追加SampleController.phppublic function api1() { return view('sample.api'); } public function api2(Request $request) { $data = [ 'a' => 'a_value', 'b' => 'b_value', 'c' => $request->input('c') ]; return $data; }(3) /sample/routes/api.php修正
下記を追記api.phpRoute::post('auth/login', 'AuthController@login'); Route::post('auth/logout', 'AuthController@logout'); Route::post('auth/refresh', 'AuthController@refresh'); Route::post('auth/me', 'AuthController@me'); Route::post('sample/api2', 'SampleController@api2')->middleware('auth:api');/sample/routes/api.phpにルーティングを書いた場合、app/Providers/RouteServiceProvider.php#mapApiRoutesによって自動的に/apiがURLの先頭につきます
AuthControllerの各メソッドはAuthControllerのコンストラクタ内で認証の要、不要が設定されていますが、SampleControllerのapi2はここで認証が必要なようにmiddlewareを付けました(4) /sample/routes/web.php修正
下記を追記
Route::get('sample/api1', 'SampleController@api1');
要ログインURLへ未認証ユーザーがアクセスした場合のエラーメッセージ修正
/sample/app/Http/Middleware/Authenticate.php修正
unauthenticatedメソッド追加protected function unauthenticated($request, array $guards) { throw new AuthenticationException( 'ログインしてください', $guards, $this->redirectTo($request) ); }view作成
/sample/resources/views/sample/api.blade.php
api.blade.php<html> <head> <title>sample</title> <script type="text/javascript"> function login(){ var form = document.getElementById("sampleForm1"); var reqData = {"email": null, "password": null}; reqData.email = form.email.value; reqData.password = form.password.value; var req = new XMLHttpRequest(); req.open(form.method, form.action); req.setRequestHeader('Content-Type', 'application/json; charset=utf-8'); req.responseType = 'json'; req.send(JSON.stringify(reqData)); req.onload = function () { var json = req.response; if (json['error']) { alert("error:" + json['error']); } else { localStorage.setItem('access_token', json['access_token']); alert('ログイン'); } } } function ajax(){ var form = document.getElementById("sampleForm2"); var reqData = {"c": null}; reqData.c = form.c.value; var req = new XMLHttpRequest(); req.open(form.method, form.action); req.setRequestHeader('Authorization', 'Bearer ' + localStorage.getItem('access_token')); req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); req.setRequestHeader('Accept', 'application/json'); req.setRequestHeader('Content-Type', 'application/json; charset=utf-8'); req.responseType = 'json'; req.send(JSON.stringify(reqData)); req.onload = function () { var json = req.response; if (json['message']) { alert("message:" + json['message']); } else { alert("a:" + json['a'] + "\n" + "b:" + json['b']+ "\n" + "c:" + json['c']); } } } function logout(){ var form = document.getElementById("sampleForm3"); var req = new XMLHttpRequest(); req.open(form.method, form.action); req.setRequestHeader('Authorization', 'Bearer ' + localStorage.getItem('access_token')); req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); req.setRequestHeader('Accept', 'application/json'); req.setRequestHeader('Content-Type', 'application/json; charset=utf-8'); req.responseType = 'json'; req.send(); req.onload = function () { var json = req.response; alert("message:" + json['message']); } } </script> </head> <body> <form id="sampleForm1" action="{{ url('api/auth/login') }}" method="post" onsubmit="login(); return false;" style="border: #000000 solid 1px; padding: 10px;"> <div>email:<input type="text" name="email" ></div> <div>password:<input type="password" name="password" ></div> <input type="submit" value="ログイン"> </form> <br> <br> <form id="sampleForm2" action="{{ url('api/sample/api2') }}" method="post" onsubmit="ajax(); return false;" style="border: #000000 solid 1px; padding: 10px;"> <input type="text" name="c" > <input type="submit" value="要認証リクエスト"> </form> <br> <br> <form id="sampleForm3" action="{{ url('api/auth/logout') }}" method="post" onsubmit="logout(); return false;" style="border: #000000 solid 1px; padding: 10px;"> <input type="submit" value="ログアウト"> </form> </body> </html>動作確認
http://localhost/laravelSample/sample/api1
・要認証リクエストの左にあるテキストフィールドに何か入力し、要認証リクエストボタンをクリックします
ログインしてくださいとalertがでました
・メールアドレスとパスワードを入力してログインボタンをクリックします
ログインできました
・要認証リクエストの左にあるテキストフィールドに何か入力し、要認証リクエストボタンをクリックします
SampleController.php#api2のレスポンスが表示されました
・ログアウトボタンをクリックします
ログアウトしました
- 投稿日:2020-07-28T18:41:32+09:00
Laravel 7 Highcharts Example: Using Highcharts in Laravel
Create charts in Laravel 7 with Highcharts. We will gradually look into the entire process of working with laravel 7 and highcharts with example.
click here to read more:
https://www.positronx.io/laravel-highcharts-example/
- 投稿日:2020-07-28T18:39:26+09:00
Laravel7 Traits Example: Create & Use Trait in Laravel
Learn about Trait, how to create Trait in Laravel, and how to use Trait in the Laravel 7 application. Traits allow us to develop a reusable piece of code and inject it in controller and modal in a Laravel application.
click here to read more:
- 投稿日:2020-07-28T17:30:22+09:00
Laravel 論理削除の実装方法と論理削除されているデータを取得しない
概要
Laravelで論理削除の実装方法です。
$table->softDeletes();を追加すれば論理削除を実装できる
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateTasksTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('tasks', function (Blueprint $table) { $table->id(); $table->integer('user_id')->unsigned(); $table->text('task'); $table->timestamps(); $table->softDeletes(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('tasks'); } }deleted_atが追加されたことを確認
+------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | user_id | int(10) unsigned | NO | | NULL | | | task | text | NO | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | | deleted_at | timestamp | YES | | NULL | | +------------+---------------------+------+-----+---------+----------------+modelの設定
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Task extends Model { use SoftDeletes; protected $dates = ['deleted_at']; protected $fillable = [ 'task', ]; }モデルの削除
$task = Task::find(1); $task->delete();以下のようにuser_idとjoin結合をすると論理削除済みのデータも取得してしまう。
$tasks = User::join('tasks', 'users.id', '=', 'tasks.user_id')->get();以下のようにwhere句でdeleted_atカラムがnullのものを指定すれば、論理削除済みのデータ以外を取得できます。
$tasks = User::join('tasks', 'users.id', '=', 'tasks.user_id')->where('deleted_at', null)->get();
- 投稿日:2020-07-28T11:55:15+09:00
Homestead環境でPHPUnitを実行しようとすると、`/usr/bin/env: ‘sh\r’: No such file or directory`というエラーが出た
環境
- Windows10 pro
- Virtualbox Version 6.1.10
- Vagrant 2.2.9
- Homestead v10.12.0
経緯
vagrant up
にてHomestead環境を作成し、以下のようにフォルダをマップした。folders: - map: C:\Users\user_name\Documents\project_folder\ to: /home/vagrant/code
/
のエンドポイントにブラウザアクセスするとページが表示され、Homestead上でLaravelのアプリケーションは正常に動作している状態。発生したエラー
phpunit ./tests/
を実行すると下記のようなエラーが発生した。vagrant@homestead:~/code$ phpunit ./tests/Unit/ExampleTest.php /usr/bin/env: ‘sh\r’: No such file or directory原因と解決方法
vendor/
以下のファイルが "CRLF" の改行コードになっていたのが原因だった。以下コマンドを発行し、
vendor/
含むコンテンツの改行コードをすべて "CRLF" から "LF" に置き換えた。find ./project_folder/ | grep -v 'node_modules' | xargs dos2unix確認していないので断言はできないが、おそらく
vendor/
以下のファイルをすべて削除し、再度Homestead上でcomposer install
を実行してpackageを再インストールすれば、同様に問題は解決すると思う。DOSフォーマットでインストールしてくれるはずなので。
dos2unix
での置換は時間がかかったので、以下をおすすめする。rm -rf vendor/ composer install経緯としては、
1. powershell等で事前にcomposer install
してvendor/
を作成した
2.vendor/
以下パッケージファイルがDOSフォーマットで生成された
4. 生成されたvendor/
を含むフォルダをマップした
5. Homestead環境上で、vendor/bin/phpunit
を実行した
5. 改行コードが "LF" でないことが原因でエラーが発生したというところだと思う。
学び
- windows側で
composer install
すると、パッケージファイルのファイルフォーマットはDOSフォーマットになる- 仮想環境のLinux上で開発をする予定であれば、
composer install
は仮想環境のLinux上で実行したほうがよさそう
- 投稿日:2020-07-28T11:09:12+09:00
【Laravel】.envファイルの値を取得する
はじめに
if文で本番環境か開発環境かどうかを判定する場合などに、
envの値を取得する必要があったので、その方法をまとめました。
「.env」ファイルの値の取得方法
php$environment = App::environment();指定した値と一致する環境であるかを確認するために、
environment
メソッドへ引数を渡すこともできます。必要であれば、複数の値を
environment
メソッドへ渡せます。値のどれかと一致すれば、メソッドは
true
を返します。php// 環境が「local」だった場合true if (App::environment('local')) { // ...省略 } // 環境が「local」か「staging」だった場合true if (App::environment('local', 'staging')) { // ...省略 }また、下記のような書き方でも同じ結果になります。
php// 環境値を取得 $environment = app()->environment(); // 環境が「local」だった場合true if (app()->environment('local')) { // ...省略 } // 環境が「local」か「staging」だった場合true if (app()->environment('local', 'staging')) { // ...省略 }おすすめしない書き方
php$environment = app('env'); $environment = config('app.env'); $environment = config('APP_ENV');上記3種類の書き方でも値は正常に取得することができますが、
基本的に
environment
の値はこのような書き方ではなく、
App::environment()
やapp()->environment()
と書いた方がいいです。おすすめしない理由
本番環境で
config:cache
コマンドを実行した際、.env
ファイルを読み込まないからです。
.env
ファイルは、Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables
クラスのbootstrap()
で読み込まれるのですが、読み込む前にconfigのキャッシュの有無を確認し、キャッシュがあった場合は.env
ファイルを読み込まない仕様になっています。ですので、
config('APP_ENV')
やapp('env')
を使用すると、
キャッシュの状態しだいでは正常に取得されないことがありますので、非常に危険です。直接
.env
ファイルにアクセスするのではなく、必ずconfigを経由してアクセスしましょう。
config('APP_ENV')
はconfigを経由しているように見えますが、これは.env
ファイルに直接アクセスしています。使用するならせめて
config('app.env')
としましょう。ただ、envの値を取得する場合は
App::environment()
やapp()->environment()
を使用し、
その他の設定ファイルの値を取得したいときにconfig('app.hoge')
を使用した方がいいかと思います。
- 投稿日:2020-07-28T07:55:38+09:00
phpのフレームワークLaravelを触ってみた。
環境構築
※ローカル上で環境構築可能ですが、今回はdocker上で動く様にしてみました。
dockerのディレクトリ、ファイル構成
.(任意の作業ディレクトリ) ├── docker │ ├── php │ │ └── Dockerfile │ └── web │ └── default.conf ├── docker-compose.yml ├── index.html ├── index.phpphpモジュールのビルド
- build
$ docker-compose buildLaravelのプロジェクト新規作成
以下コマンドを実行する。
$ cd (任意の作業ディレクトリ) $ laravel new sample-larabel※プロジェクト作成後のディレクトリ構成
.(任意の作業ディレクトリ) ├── docker │ ├── php │ │ └── Dockerfile │ └── web │ └── default.conf ├── docker-compose.yml ├── index.html ├── index.php ├── sample-larabelNginxの設定ファイル(default.conf)の修正
※rootディレクトリの修正
server { listen 80; root /var/www/html/my-laravel-app/public; index index.php index.html index.htm; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }コンテナ起動及び動作確認
- コンテナ起動
$ docker-compose up -d
- 起動確認
$ docker-compose ps※この様に表示されればOK。
Name Command State Ports ---------------------------------------------------------------------------------------------------------- docker-compose-laravel_app_1 docker-php-entrypoint php-fpm Up 9000/tcp docker-compose-laravel_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp docker-compose-laravel_web_1 nginx -g daemon off; Up 0.0.0.0:8000->80/tcp ```画面表示確認
- http://localhost:8000/にアクセスして、正常に画面が表示される事を確認します。
新規ページ作成
- 後日アップします。
- 投稿日:2020-07-28T00:43:36+09:00
Laravel×Herokuデプロイ(MySQL) + Cloudinary
はじめに
この記事は既にLaravelアプリを作成済みである状態から説明する。
Herokuコマンドが使用できる状態であることを前提に進めていく。
なるべくHerokuコマンドを使用しないで操作していきますLaravelアプリフォルダ直下にてProcfileを作成する
Procfileとは
ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。
Procfileファイルの作成
コマンド操作により、アプリ直下に移動したのち、下記のコマンドを実行する
touch Procfile上記コマンドを実行後、Laravelアプリ直下にProcfileが作成されていることを確認する。
Procfileファイルの編集
Procfileには、何もコードが記載されていない状態である。
ここに下記のコードを記載する。web: vendor/bin/heroku-php-apache2 public/varchar型の文字数を191に制限
app\Providers\AppServiceProvider.phpを編集する
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Schema; //この一行を追加 class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); // この一行を追加 } }上記のコードで変更箇所は二箇所である。
変更と言っても2行追加したのみで、他は何も変更は要らない。
この記載が必要になる理由は、本番環境のDBを用意する際、つまりherokuでマイグレーションを実行する際にエラーが出るのを防ぐためである。Githubに変更を保存しよう
この記事でGitについては詳しく解説はしない。
Githubにデータの変更を全て反映させておきましょう。add commit pushHerokuでの作業
サインアップ
こちらをクリックしてherokuへの会員登録を行いましょう。
ログイン後~Heroku上でアプリの作成
Step1 アプリ作成①
ログインすると下記のような画面に遷移できるので、【New】ボタンから【Create new app】を選択しましょう。
Step2 アプリ作成②
【App name】に任意の名前を入力し、【Create app】を選択します。
【choose a region】は特に変更しなくても構いません。
Herokuアプリの設定
Step1 ClearDB MySQLの追加
初めて挑戦している方のために、写真を多用しております。
なお、Herokuに今回初めて、サインアップしてこの作業に挑んでいる方は、先にクレジットカードをHerokuに登録しておく必要があります。
登録しておかないと、ClearDB MySQLの追加ができません。
ログイン後、下記の画像にあるアイコン(画面右上)をクリックし、クレジットの登録を行いましょう。手順①
先程【Create new app】から作成したアプリをheroku上でクリックすると下記の画像のように、【Overview~Setting】のタブが開けるページへと遷移できる。
【Resources】タブをクリックすると、下記と同じ画面になることが確認できると思います。
【Find more add ons】をクリックします。
手順②
下記のページへと遷移されるので、【ClearDB MySQL】を探します。
手順③
手順④
【Install ClearDB MySQL】をクリックします。
その後、手順①のページへと戻りましょう。
手順⑤
手順①ではなかったClearDB MySQLが追加できたのが確認できます。
手順①〜⑤はコマンドでも操作できます
heroku addons:add cleardbStep2 DB情報を確認し、Configにセットする
手順① 【Settings】タブをクリックし、【Reveal Config Vars】をクリックする
手順② Valueにあたる部分、下記図で言うとmysql以下をメモ帳にメモする
手順③ Reveal Config Varsにkeyとvalueを追加する
メモ帳にメモしたものを参照しながら入力していく。
手順②でメモした値は下記の情報となっています。CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true上記、[ユーザー名][パスワード][ホスト名][データベース名]の他、デプロイする際には下記の情報も追加で、Reveal Config Varsに入力するとよいでしょう。
// Reveal Config Varsに入力しておくもの(データベース情報をもとに入力) DB_DATABASE = データベース名 DB_HOST = ホスト名 DB_PASSWORD = パスワード DB_USERNAME = ユーザー名 // 追加でいれておくもの DB_CONNECTION = mysql APP_ENV = heroku APP_KEY = ここはローカルのenv.ファイルにあるAPP_KEYの値を入れる(php artisan key:generateで生成される) APP_NAME = 任意の名前 LANG = ja_JP.UTF-8 TZ = Asia/Tokyo手順②はコマンドでも操作できます
heroku config | grep CLEARDB_DATABASE_URL手順③はコマンドでも操作できます
heroku config:set DB_DATABASE= データベース名 heroku config:set DB_HOST= ホスト名 heroku config:set DB_USERNAME= ユーザー名 heroku config:set DB_PASSWORD= パスワード heroku config:set APP_KEY=$(php artisan key:generate --show) heroku config:set APP_ENV=heroku heroku config:set LANG=ja_JP.UTF-8 heroku config:set TZ=Asia/TokyoStep3 GithubとHerokuの連携
手順① 【Deploy】をクリックし、画面中央の【Github】から該当のリポジトリを選択、最後にDeploy Branchをクリックします
手順①はコマンドでも操作できます
git push heroku masterマイグレーションの実行
heroku run php artisan migrateWebサイトを確認
コマンドでも操作できます
heroku openCloudinaryとHerokuの連携
既にLaravelアプリを作成済みで、Cloudinaryを使用して写真を保存するなどの処理を書いていることを前提に進めますが、この記事を見てくださっている方の中には、Herokuにデプロイしたものの、これからCloudinaryと連携したアプリを作成しようと考えている方もいると思い、簡単にCloudinaryについて紹介します。
Cloudinaryとは
画像を管理するクラウドサービスで、画像の保存、変換、配信がとても簡単できます。
こちらをクリックし、アカウントを開設してみましょう。Cloudinaryを使用する目的
本番環境からでもCloudinaryに写真を保存できるように設定し、HerokuからCloudinaryに保存してある写真をとりだせるようにするため。
Cloudinaryへログイン(ここから作業です)
Dashboardを開き、下記の3つをメモする。
Revealをクリックすると値がきちんと表示されます。Cloud name: API Key: API Secret:Configにセットする
Herokuに戻り、【Setting】タブをクリック、Reveal Config Varsをクリックし、下記のようにkeyとvalueをセットする
CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値 CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値 CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値コマンドでも操作できます
heroku config:set CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値 heroku config:set CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値 heroku config:set CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値ここまでの【Reveal Config Vars】は下記のようにセットしてあります
Herokuでアプリを開き挙動を確認しましょう
写真投稿アプリを作成している場合、本番環境でも写真を投稿したら、Cloudinaryに写真が保存できていることが確認できるかと思います。
おまけ
GUIツールを使用して本番環境のDBを可視化しよう
- macユーザー
- Sequel proをダウンロード
- windowsユーザー
- Table Plusをダウンロード
Sequel pro使用方法
Table plusもやることは同じです。
適宜読み替えてトライしてください。ダウンロードしたSequel proを立ち上げます
下記の図のように画面が表示されます。
- ホスト(hostname)
- ユーザー名(username)
- パスワード(password)
- データベース(dbname)
これらの項目にCLEARDB_DATABASE_URLのそれぞれの値を入力しましょう
CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true入力後、接続テストを行い、問題なければ【お気に入りに追加】を押した後に、接続を押しましょう
本番環境のデータが可視化できることを確認します。
まとめ
Laravelではデータベースとの接続情報は、.envに記載されている。つまりGithubにデータベースとの接続情報はアップロードされません。
そのため、本番環境用にデータベースとの接続情報を記載してやる何かが必要です。
それが今回でいうConfigです。
コマンドでも操作できますが、今回はherokuのwebサイト上から操作してみました。
もう一つ大事なことはherokuではClearDB MySQLを使用できるということです。
注意点として.envに記載のDB情報をconfigの中に書かないことをあげておきます。
configにセットするDB情報は、本番環境用のDB情報です。つまり今回でいうとClearDB MySQLの情報になる訳です。
- 投稿日:2020-07-28T00:43:36+09:00
Laravel×Herokuデプロイ(MySQL) + Cloudinary
はじめに
この記事は既にLaravelアプリを作成済みである状態から説明する。
Herokuコマンドが使用できる状態であることを前提に進めていく。
なるべくHerokuコマンドを使用しないで操作していきますLaravelアプリフォルダ直下にてProcfileを作成する
Procfileとは
ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。
Procfileファイルの作成
コマンド操作により、アプリ直下に移動したのち、下記のコマンドを実行する
touch Procfile上記コマンドを実行後、Laravelアプリ直下にProcfileが作成されていることを確認する。
Procfileファイルの編集
Procfileには、何もコードが記載されていない状態である。
ここに下記のコードを記載する。web: vendor/bin/heroku-php-apache2 public/varchar型の文字数を191に制限
app\Providers\AppServiceProvider.phpを編集する
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Schema; //この一行を追加 class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); // この一行を追加 } }上記のコードで変更箇所は二箇所である。
変更と言っても2行追加したのみで、他は何も変更は要らない。
この記載が必要になる理由は、本番環境のDBを用意する際、つまりherokuでマイグレーションを実行する際にエラーが出るのを防ぐためである。Githubに変更を保存しよう
この記事でGitについては詳しく解説はしない。
Githubにデータの変更を全て反映させておきましょう。add commit pushHerokuでの作業
サインアップ
こちらをクリックしてherokuへの会員登録を行いましょう。
ログイン後~Heroku上でアプリの作成
Step1 アプリ作成①
ログインすると下記のような画面に遷移できるので、【New】ボタンから【Create new app】を選択しましょう。
Step2 アプリ作成②
【App name】に任意の名前を入力し、【Create app】を選択します。
【choose a region】は特に変更しなくても構いません。
Herokuアプリの設定
Step1 ClearDB MySQLの追加
初めて挑戦している方のために、写真を多用しております。
なお、Herokuに今回初めて、サインアップしてこの作業に挑んでいる方は、先にクレジットカードをHerokuに登録しておく必要があります。
登録しておかないと、ClearDB MySQLの追加ができません。
ログイン後、下記の画像にあるアイコン(画面右上)をクリックし、クレジットの登録を行いましょう。手順①
先程【Create new app】から作成したアプリをheroku上でクリックすると下記の画像のように、【Overview~Setting】のタブが開けるページへと遷移できる。
【Resources】タブをクリックすると、下記と同じ画面になることが確認できると思います。
【Find more add ons】をクリックします。
手順②
下記のページへと遷移されるので、【ClearDB MySQL】を探します。
手順③
手順④
【Install ClearDB MySQL】をクリックします。
その後、手順①のページへと戻りましょう。
手順⑤
手順①ではなかったClearDB MySQLが追加できたのが確認できます。
手順①〜⑤はコマンドでも操作できます
heroku addons:add cleardbStep2 DB情報を確認し、Configにセットする
手順① 【Settings】タブをクリックし、【Reveal Config Vars】をクリックする
手順② Valueにあたる部分、下記図で言うとmysql以下をメモ帳にメモする
手順③ Reveal Config Varsにkeyとvalueを追加する
メモ帳にメモしたものを参照しながら入力していく。
手順②でメモした値は下記の情報となっています。CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true上記、[ユーザー名][パスワード][ホスト名][データベース名]の他、デプロイする際には下記の情報も追加で、Reveal Config Varsに入力するとよいでしょう。
// Reveal Config Varsに入力しておくもの(データベース情報をもとに入力) DB_DATABASE = データベース名 DB_HOST = ホスト名 DB_PASSWORD = パスワード DB_USERNAME = ユーザー名 // 追加でいれておくもの DB_CONNECTION = mysql APP_ENV = heroku APP_KEY = ここはローカルのenv.ファイルにあるAPP_KEYの値を入れる(php artisan key:generateで生成される) APP_NAME = 任意の名前 LANG = ja_JP.UTF-8 TZ = Asia/Tokyo手順②はコマンドでも操作できます
heroku config | grep CLEARDB_DATABASE_URL手順③はコマンドでも操作できます
heroku config:set DB_DATABASE= データベース名 heroku config:set DB_HOST= ホスト名 heroku config:set DB_USERNAME= ユーザー名 heroku config:set DB_PASSWORD= パスワード heroku config:set APP_KEY=$(php artisan key:generate --show) heroku config:set APP_ENV=heroku heroku config:set LANG=ja_JP.UTF-8 heroku config:set TZ=Asia/TokyoStep3 GithubとHerokuの連携
手順① 【Deploy】をクリックし、画面中央の【Github】から該当のリポジトリを選択、最後にDeploy Branchをクリックします
手順①はコマンドでも操作できます
git push heroku masterマイグレーションの実行
heroku run php artisan migrateWebサイトを確認
コマンドでも操作できます
heroku openCloudinaryとHerokuの連携
既にLaravelアプリを作成済みで、Cloudinaryを使用して写真を保存するなどの処理を書いていることを前提に進めますが、この記事を見てくださっている方の中には、Herokuにデプロイしたものの、これからCloudinaryと連携したアプリを作成しようと考えている方もいると思い、簡単にCloudinaryについて紹介します。
Cloudinaryとは
画像を管理するクラウドサービスで、画像の保存、変換、配信がとても簡単できます。
こちらをクリックし、アカウントを開設してみましょう。Cloudinaryを使用する目的
本番環境からでもCloudinaryに写真を保存できるように設定し、HerokuからCloudinaryに保存してある写真をとりだせるようにするため。
Cloudinaryへログイン(ここから作業です)
Dashboardを開き、下記の3つをメモする。
Revealをクリックすると値がきちんと表示されます。Cloud name: API Key: API Secret:Configにセットする
Herokuに戻り、【Setting】タブをクリック、Reveal Config Varsをクリックし、下記のようにkeyとvalueをセットする
CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値 CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値 CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値コマンドでも操作できます
heroku config:set CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値 heroku config:set CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値 heroku config:set CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値ここまでの【Reveal Config Vars】は下記のようにセットしてあります
Herokuでアプリを開き挙動を確認しましょう
写真投稿アプリを作成している場合、本番環境でも写真を投稿したら、Cloudinaryに写真が保存できていることが確認できるかと思います。
おまけ
GUIツールを使用して本番環境のDBを可視化しよう
- macユーザー
- Sequel proをダウンロード
- windowsユーザー
- Table Plusをダウンロード
Sequel pro使用方法
Table plusもやることは同じです。
適宜読み替えてトライしてください。ダウンロードしたSequel proを立ち上げます
下記の図のように画面が表示されます。
- ホスト(hostname)
- ユーザー名(username)
- パスワード(password)
- データベース(dbname)
これらの項目にCLEARDB_DATABASE_URLのそれぞれの値を入力しましょう
CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true入力後、接続テストを行い、問題なければ【お気に入りに追加】を押した後に、接続を押しましょう
本番環境のデータが可視化できることを確認します。
まとめ
Laravelではデータベースとの接続情報は、.envに記載されています。
つまりGithubにデータベースとの接続情報はアップロードされません。
そのため、本番環境用にデータベースとの接続情報を記載してやる何かが必要です。
それが今回でいうConfigです。
コマンドでも操作できますが、今回はherokuのwebサイト上から操作してみました。
もう一つ大事なことはherokuではClearDB MySQLを使用できるということです。
注意点として.envに記載のDB情報をconfigの中に書かないことをあげておきます。
configにセットするDB情報は、本番環境用のDB情報です。
つまり今回でいうとClearDB MySQLの情報ということになります。
- 投稿日:2020-07-28T00:43:36+09:00
【初めてのデプロイ】Laravel×Herokuデプロイ(MySQL) + Cloudinary
はじめに
初めてLaravelでMySQLを使用したアプリをデプロイしてみたい方に向けた記事です。
この記事は既にLaravelアプリを作成済みである状態から説明します。
Herokuコマンドが使用できる状態であることを前提に進めていく。
なるべくHerokuコマンドを使用しないで操作していきますLaravelアプリフォルダ直下にてProcfileを作成する
Procfileとは
ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。
Procfileファイルの作成
コマンド操作により、アプリ直下に移動したのち、下記のコマンドを実行する
touch Procfile上記コマンドを実行後、Laravelアプリ直下にProcfileが作成されていることを確認する。
Procfileファイルの編集
Procfileには、何もコードが記載されていない状態である。
ここに下記のコードを記載する。web: vendor/bin/heroku-php-apache2 public/varchar型の文字数を191に制限
app\Providers\AppServiceProvider.phpを編集する
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Schema; //この一行を追加 class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); // この一行を追加 } }上記のコードで変更箇所は二箇所である。
変更と言っても2行追加したのみで、他は何も変更は要らない。
この記載が必要になる理由は、本番環境のDBを用意する際、つまりherokuでマイグレーションを実行する際にエラーが出るのを防ぐためである。Githubに変更を保存しよう
この記事でGitについては詳しく解説はしない。
Githubにデータの変更を全て反映させておきましょう。add commit pushHerokuでの作業
サインアップ
こちらをクリックしてherokuへの会員登録を行いましょう。
ログイン後~Heroku上でアプリの作成
Step1 アプリ作成①
ログインすると下記のような画面に遷移できるので、【New】ボタンから【Create new app】を選択しましょう。
Step2 アプリ作成②
【App name】に任意の名前を入力し、【Create app】を選択します。
【choose a region】は特に変更しなくても構いません。
Herokuアプリの設定
Step1 ClearDB MySQLの追加
初めて挑戦している方のために、写真を多用しております。
なお、Herokuに今回初めて、サインアップしてこの作業に挑んでいる方は、先にクレジットカードをHerokuに登録しておく必要があります。
登録しておかないと、ClearDB MySQLの追加ができません。
ログイン後、下記の画像にあるアイコン(画面右上)をクリックし、クレジットの登録を行いましょう。手順①
先程【Create new app】から作成したアプリをheroku上でクリックすると下記の画像のように、【Overview~Setting】のタブが開けるページへと遷移できる。
【Resources】タブをクリックすると、下記と同じ画面になることが確認できると思います。
【Find more add ons】をクリックします。
手順②
下記のページへと遷移されるので、【ClearDB MySQL】を探します。
手順③
手順④
【Install ClearDB MySQL】をクリックします。
その後、手順①のページへと戻りましょう。
手順⑤
手順①ではなかったClearDB MySQLが追加できたのが確認できます。
手順①〜⑤はコマンドでも操作できます
heroku addons:add cleardbStep2 DB情報を確認し、Configにセットする
手順① 【Settings】タブをクリックし、【Reveal Config Vars】をクリックする
手順② Valueにあたる部分、下記図で言うとmysql以下をメモ帳にメモする
手順③ Reveal Config Varsにkeyとvalueを追加する
メモ帳にメモしたものを参照しながら入力していく。
手順②でメモした値は下記の情報となっています。CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true上記、[ユーザー名][パスワード][ホスト名][データベース名]の他、デプロイする際には下記の情報も追加で、Reveal Config Varsに入力するとよいでしょう。
// Reveal Config Varsに入力しておくもの(データベース情報をもとに入力) DB_DATABASE = データベース名 DB_HOST = ホスト名 DB_PASSWORD = パスワード DB_USERNAME = ユーザー名 // 追加でいれておくもの DB_CONNECTION = mysql APP_ENV = heroku APP_KEY = ここはローカルのenv.ファイルにあるAPP_KEYの値を入れる(php artisan key:generateで生成される) APP_NAME = 任意の名前 LANG = ja_JP.UTF-8 TZ = Asia/Tokyo手順②はコマンドでも操作できます
heroku config | grep CLEARDB_DATABASE_URL手順③はコマンドでも操作できます(下記コマンドは1行ずつ実行します)
heroku config:set DB_DATABASE= データベース名 heroku config:set DB_HOST= ホスト名 heroku config:set DB_USERNAME= ユーザー名 heroku config:set DB_PASSWORD= パスワード heroku config:set APP_KEY=$(php artisan key:generate --show) heroku config:set APP_ENV=heroku heroku config:set LANG=ja_JP.UTF-8 heroku config:set TZ=Asia/TokyoStep3 GithubとHerokuの連携
手順① 【Deploy】をクリックし、画面中央の【Github】から該当のリポジトリを選択、最後にDeploy Branchをクリックします
連携コマンド操作
heroku git:remote -a herokuアプリ名;手順①はコマンドでも操作できます
git push heroku masterマイグレーションの実行
heroku run php artisan migrateHeroku上でGithubとHerokuを連携したあとに、マイグレーションを実行します
この際にエラーがでてしまうのは、GitとHerokuの連携がうまく行われていないことがおおいです。
その場合は、上記連携コマンド操作
とgit push heroku master
をコマンドで実行しましょう。Webサイトを確認
Open app をクリックします
ここまででLaravelアプリ(MySQL使用)のデプロイは完了です
コマンドでも操作できます
heroku openCloudinaryとHerokuの連携
既にLaravelアプリを作成済みで、Cloudinaryを使用して写真を保存するなどの処理を書いていることを前提に進めますが、この記事を見てくださっている方の中には、Herokuにデプロイしたものの、これからCloudinaryと連携したアプリを作成しようと考えている方もいると思い、簡単にCloudinaryについて紹介します。
Cloudinaryとは
画像を管理するクラウドサービスで、画像の保存、変換、配信がとても簡単できます。
こちらをクリックし、アカウントを開設してみましょう。Cloudinaryを使用する目的
本番環境からでもCloudinaryに写真を保存できるように設定し、HerokuからCloudinaryに保存してある写真をとりだせるようにするため。
Cloudinaryへログイン(ここから作業です)
Dashboardを開き、下記の3つをメモする。
Revealをクリックすると値がきちんと表示されます。Cloud name: API Key: API Secret:Configにセットする
Herokuに戻り、【Setting】タブをクリック、Reveal Config Varsをクリックし、下記のようにkeyとvalueをセットする
CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値 CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値 CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値コマンドでも操作できます
heroku config:set CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値 heroku config:set CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値 heroku config:set CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値ここまでの【Reveal Config Vars】は下記のようにセットしてあります
Herokuでアプリを開き挙動を確認しましょう
写真投稿アプリを作成している場合、本番環境でも写真を投稿したら、Cloudinaryに写真が保存できていることが確認できるかと思います。
おまけ
GUIツールを使用して本番環境のDBを可視化しよう
- macユーザー
- Sequel proをダウンロード
- windowsユーザー
- Table Plusをダウンロード
Sequel pro使用方法
Table plusもやることは同じです。
適宜読み替えてトライしてください。ダウンロードしたSequel proを立ち上げます
下記の図のように画面が表示されます。
- ホスト(hostname)
- ユーザー名(username)
- パスワード(password)
- データベース(dbname)
これらの項目にCLEARDB_DATABASE_URLのそれぞれの値を入力しましょう
CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true入力後、接続テストを行い、問題なければ【お気に入りに追加】を押した後に、接続を押しましょう
本番環境のデータが可視化できることを確認します。
まとめ
Laravelではデータベースとの接続情報は、.envに記載されています。
つまりGithubにデータベースとの接続情報はアップロードされません。
そのため、本番環境用にデータベースとの接続情報を記載してやる何かが必要です。
それが今回でいうConfigです。
コマンドでも操作できますが、今回はherokuのwebサイト上から操作してみました。
もう一つ大事なことはherokuではClearDB MySQLを使用できるということです。
注意点として.envに記載のDB情報をconfigの中に書かないことをあげておきます。
configにセットするDB情報は、本番環境用のDB情報です。
つまり今回でいうとClearDB MySQLの情報ということになります。