20200728のlaravelに関する記事は17件です。

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_order

Laravelには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のカラムまで引き連れたデータが取れて、意図した挙動になりません。

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

Docker×Laravel×Vue

開発で必要な記事をまとめていきます。
これを参考にして開発始める人の手助けになればいいなと思って
自分が参考にした記事をまとめていきます。

マルチログインの実装

参考記事
https://qiita.com/namizatop/items/5d56d96d4c255a0e3a87?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items

それぞれ別々のディレクトリに分けてあげて判断。

認証に必要な要素を付け加える

https://qiita.com/sasakure-kei@github/items/388a2900557a6079164d

Laravel authで404 nginxが使えない時

https://qiita.com/isaatsu0131/items/f1eafe7522f0bf0ff043

nginxのファイル探索部分がおかしいらしい

Docker

起動中のコンテナ一覧

docker ps

Image起動

docker run -it IMAGE名 bash

Docker起動

https://qiita.com/A-Kira/items/1c55ef689c0f91420e81

Docker Laravel 実行

https://qiita.com/A-Kira/items/1c55ef689c0f91420e81

docker-compose down


docker-compose up -d

Docker 起動してもexitするとき

docker logs コンテナID

https://qiita.com/mom0tomo/items/35dfacb628df1bd3651e

Mysql bin/bashで起動

docker exec -it db-host bin/bash

Dockerのイメージ壊してテーブルのデータが消えた時

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=1

Vue Router 404ERROR対処方法

ルーティング指定
https://sashimistudio.site/rails-vuerouter-history404/

https://blog.hirokiky.org/entry/2019/08/22/111031

解決してくれたもの
https://teratail.com/questions/121182

web.php
Route::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 max

php.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.ini

https://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-missing

Class 'Egulias\EmailValidator\Validation\RFCValidation' not found

https://laracasts.com/discuss/channels/laravel/eguliasemailvalidatoremailvalidator-does-not-exist

同様に困ってる方の質問で
```
rm -rf vendor/*

の後に

composer install --no-dev
```

で万事解決!!

メールが文字化けする。。。

スクリーンショット 2020-06-29 1.22.52.png

右下の文字をUTF-8にしてあげることで解決。。

2hかかった。。。

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

Mac×Laravel×MAMPで環境構築からデータベース接続まで

さっそくタイトルにある通り進めていきましょう。

MAMPのインストール

MAMPの公式サイトにアクセスします。

https://www.mamp.info/en/

Free Downloadをクリックします。

macアイコンの下「MAMP & MAMP PRO 5.~」をクリックするとダウンロードが開始されます。

無事インストールされたら、アプリケーションフォルダ内のMAMPアイコンをクリックして起動します。

MAMPが起動後、Start Servers をクリックすることで、

Apacheサーバー・・Webサーバー
MySQLサーバー・・データベースサーバー
を同時に起動できます。

しばらくすると、Apacheサーバー、MySQLサーバーともに緑色のランプがついたら起動できています。

MAMPの設定

メニュー内 MAMP から Preferences をクリックします。
スクリーンショット 2020-07-28 21.30.02.png

Portsをクリックすると、ApacheやMysqlが使用するポート番号が表示されます。
スクリーンショット 2020-07-28 21.31.20.png

初期設定では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を使ってインストールしますので、下記リンクよりダウンロードしインストールしてください。

https://getcomposer.org/

インストール後、コマンドプロンプトでcomposer --versionと入力してください。

$ composer --version
 Composer version 1.4.2

このようにバージョンが表示されればOKです。

Laravelのインストール

composerがインストールされている状態で、htdocsディレクトリに移動します。

初期設定でインストールした場合は下記フォルダになるかと思います。

$ cd /Application/MAMP/htdocs

htdocsフォルダに移動後、下記のコマンドを入力してください。

$ 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です。

スクリーンショット 2020-07-28 21.42.02.png

phpmyadminでデータベース作成

スクリーンショット 2020-07-28 21.44.36.png
「Open WebStart page」をクリックしてください。すると、以下のようなブラウザに飛びます。
スクリーンショット 2020-07-28 21.47.51.png

下にスクロールして、
スクリーンショット 2020-07-28 21.48.07.png
「phpMyAdmin」をクリック。すると以下のブラウザに飛びますので、
スクリーンショット 2020-07-28 21.52.24.png
ここで、任意の名前のデーターベースを作成しましょう。

MAMPの情報を控える

そうしましたら、先ほどのWelcome to MAMPのページでMAMPの情報をメモしてください。
スクリーンショット 2020-07-28 21.48.09.png

.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'),

以上で環境構築とデータベース接続まで行えるはずです!
では、良き開発ライフを!!!

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

Mac×Laravel×MAMPで開発環境構築からデータベース接続まで

さっそくタイトルにある通り進めていきましょう。

MAMPのインストール

MAMPの公式サイトにアクセスします。

https://www.mamp.info/en/

Free Downloadをクリックします。

macアイコンの下「MAMP & MAMP PRO 5.~」をクリックするとダウンロードが開始されます。

無事インストールされたら、アプリケーションフォルダ内のMAMPアイコンをクリックして起動します。

MAMPが起動後、Start Servers をクリックすることで、

Apacheサーバー・・Webサーバー
MySQLサーバー・・データベースサーバー
を同時に起動できます。

しばらくすると、Apacheサーバー、MySQLサーバーともに緑色のランプがついたら起動できています。

MAMPの設定

メニュー内 MAMP から Preferences をクリックします。
スクリーンショット 2020-07-28 21.30.02.png

Portsをクリックすると、ApacheやMysqlが使用するポート番号が表示されます。
スクリーンショット 2020-07-28 21.31.20.png

初期設定では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を使ってインストールしますので、下記リンクよりダウンロードしインストールしてください。

https://getcomposer.org/

インストール後、コマンドプロンプトでcomposer --versionと入力してください。

$ composer --version
 Composer version 1.4.2

このようにバージョンが表示されればOKです。

Laravelのインストール

composerがインストールされている状態で、htdocsディレクトリに移動します。

初期設定でインストールした場合は下記フォルダになるかと思います。

$ cd /Application/MAMP/htdocs

htdocsフォルダに移動後、下記のコマンドを入力してください。

$ 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です。

スクリーンショット 2020-07-28 21.42.02.png

phpmyadminでデータベース作成

スクリーンショット 2020-07-28 21.44.36.png
「Open WebStart page」をクリックしてください。すると、以下のようなブラウザに飛びます。
スクリーンショット 2020-07-28 21.47.51.png

下にスクロールして、
スクリーンショット 2020-07-28 21.48.07.png
「phpMyAdmin」をクリック。すると以下のブラウザに飛びますので、
スクリーンショット 2020-07-28 21.52.24.png
ここで、任意の名前のデーターベースを作成しましょう。

MAMPの情報を控える

そうしましたら、先ほどのWelcome to MAMPのページでMAMPの情報をメモしてください。
スクリーンショット 2020-07-28 21.48.09.png

.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'),

以上で環境構築とデータベース接続まで行えるはずです!
では、良き開発ライフを!!!

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

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/

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

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/

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

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/

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

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.php
    public 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.php
    Route::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
a.png
・要認証リクエストの左にあるテキストフィールドに何か入力し、要認証リクエストボタンをクリックします
ログインしてくださいとalertがでました
・メールアドレスとパスワードを入力してログインボタンをクリックします
ログインできました
・要認証リクエストの左にあるテキストフィールドに何か入力し、要認証リクエストボタンをクリックします
SampleController.php#api2のレスポンスが表示されました
・ログアウトボタンをクリックします
ログアウトしました

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

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/

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

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:

https://www.positronx.io/laravel-traits-example/

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

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

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上で実行したほうがよさそう
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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')を使用した方がいいかと思います。

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

phpのフレームワークLaravelを触ってみた。

環境構築

※ローカル上で環境構築可能ですが、今回はdocker上で動く様にしてみました。

dockerのディレクトリ、ファイル構成

.(任意の作業ディレクトリ)
├── docker
│   ├── php
│   │   └── Dockerfile
│   └── web
│       └── default.conf
├── docker-compose.yml
├── index.html
├── index.php

phpモジュールのビルド

  • build
$ docker-compose build

Laravelのプロジェクト新規作成

以下コマンドを実行する。

$ cd (任意の作業ディレクトリ)
$ laravel new sample-larabel

※プロジェクト作成後のディレクトリ構成

.(任意の作業ディレクトリ)
├── docker
│   ├── php
│   │   └── Dockerfile
│   └── web
│       └── default.conf
├── docker-compose.yml
├── index.html
├── index.php
├── sample-larabel

Nginxの設定ファイル(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 ```

画面表示確認

新規ページ作成

  • 後日アップします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel×Herokuデプロイ(MySQL) + Cloudinary

はじめに

この記事は既にLaravelアプリを作成済みである状態から説明する。
Herokuコマンドが使用できる状態であることを前提に進めていく。
なるべくHerokuコマンドを使用しないで操作していきます

Laravelアプリフォルダ直下にてProcfileを作成する

Procfileとは

ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。

Procfileファイルの作成

コマンド操作により、アプリ直下に移動したのち、下記のコマンドを実行する

touch Procfile

上記コマンドを実行後、Laravelアプリ直下にProcfileが作成されていることを確認する。

スクリーンショット 2020-07-27 午後8.54.57.png

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
push

Herokuでの作業

サインアップ

こちらをクリックしてherokuへの会員登録を行いましょう。

ログイン後~Heroku上でアプリの作成

Step1 アプリ作成①

ログインすると下記のような画面に遷移できるので、【New】ボタンから【Create new app】を選択しましょう。
スクリーンショット 2020-07-27 午後9.16.01.png

Step2 アプリ作成②

【App name】に任意の名前を入力し、【Create app】を選択します。
【choose a region】は特に変更しなくても構いません。
スクリーンショット 2020-07-27 午後9.18.23.png

Herokuアプリの設定

Step1 ClearDB MySQLの追加

初めて挑戦している方のために、写真を多用しております。
なお、Herokuに今回初めて、サインアップしてこの作業に挑んでいる方は、先にクレジットカードをHerokuに登録しておく必要があります。
登録しておかないと、ClearDB MySQLの追加ができません。
ログイン後、下記の画像にあるアイコン(画面右上)をクリックし、クレジットの登録を行いましょう。

スクリーンショット 2020-07-27 午後9.43.03.png

手順①

先程【Create new app】から作成したアプリをheroku上でクリックすると下記の画像のように、【Overview~Setting】のタブが開けるページへと遷移できる。
【Resources】タブをクリックすると、下記と同じ画面になることが確認できると思います。
【Find more add ons】をクリックします。
スクリーンショット 2020-07-27 午後9.25.25.png

手順②

下記のページへと遷移されるので、【ClearDB MySQL】を探します。
スクリーンショット 2020-07-27 午後9.25.56.png

手順③

手順②で探しだした下記をクリックします。
スクリーンショット 2020-07-27 午後9.26.24.png

手順④

【Install ClearDB MySQL】をクリックします。
その後、手順①のページへと戻りましょう。
スクリーンショット 2020-07-27 午後9.26.35.png

手順⑤

手順①ではなかったClearDB MySQLが追加できたのが確認できます。
スクリーンショット 2020-07-27 午後9.38.41.png

手順①〜⑤はコマンドでも操作できます

heroku addons:add cleardb

Step2 DB情報を確認し、Configにセットする

手順① 【Settings】タブをクリックし、【Reveal Config Vars】をクリックする

スクリーンショット 2020-07-27 午後9.49.12.png

手順② Valueにあたる部分、下記図で言うとmysql以下をメモ帳にメモする

スクリーンショット 2020-07-27 午後9.49.33.png

手順③ 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/Tokyo

Step3 GithubとHerokuの連携

手順① 【Deploy】をクリックし、画面中央の【Github】から該当のリポジトリを選択、最後にDeploy Branchをクリックします

スクリーンショット 2020-07-27 午後10.20.40.png

手順①はコマンドでも操作できます

git push heroku master

マイグレーションの実行

heroku run php artisan migrate

Webサイトを確認

Open app をクリックします
スクリーンショット 2020-07-27 午後10.28.53.png

コマンドでも操作できます

heroku open

CloudinaryとHerokuの連携

既にLaravelアプリを作成済みで、Cloudinaryを使用して写真を保存するなどの処理を書いていることを前提に進めますが、この記事を見てくださっている方の中には、Herokuにデプロイしたものの、これからCloudinaryと連携したアプリを作成しようと考えている方もいると思い、簡単にCloudinaryについて紹介します。

Cloudinaryとは

画像を管理するクラウドサービスで、画像の保存、変換、配信がとても簡単できます。
こちらをクリックし、アカウントを開設してみましょう。

Cloudinaryを使用する目的

本番環境からでもCloudinaryに写真を保存できるように設定し、HerokuからCloudinaryに保存してある写真をとりだせるようにするため。

Cloudinaryへログイン(ここから作業です)

Dashboardを開き、下記の3つをメモする。
Revealをクリックすると値がきちんと表示されます。

Cloud name:
API Key:
API Secret:

スクリーンショット 2020-07-27 午後10.47.54.png

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】は下記のようにセットしてあります

スクリーンショット 2020-07-27 午後11.14.17.png

Herokuでアプリを開き挙動を確認しましょう

写真投稿アプリを作成している場合、本番環境でも写真を投稿したら、Cloudinaryに写真が保存できていることが確認できるかと思います。

おまけ

GUIツールを使用して本番環境のDBを可視化しよう

  • macユーザー
  • windowsユーザー

Sequel pro使用方法

Table plusもやることは同じです。
適宜読み替えてトライしてください。

ダウンロードしたSequel proを立ち上げます

下記の図のように画面が表示されます。

スクリーンショット 2020-07-27 午後11.26.38.png

  • ホスト(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の情報になる訳です。

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

Laravel×Herokuデプロイ(MySQL) + Cloudinary

はじめに

この記事は既にLaravelアプリを作成済みである状態から説明する。
Herokuコマンドが使用できる状態であることを前提に進めていく。
なるべくHerokuコマンドを使用しないで操作していきます

Laravelアプリフォルダ直下にてProcfileを作成する

Procfileとは

ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。

Procfileファイルの作成

コマンド操作により、アプリ直下に移動したのち、下記のコマンドを実行する

touch Procfile

上記コマンドを実行後、Laravelアプリ直下にProcfileが作成されていることを確認する。

スクリーンショット 2020-07-27 午後8.54.57.png

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
push

Herokuでの作業

サインアップ

こちらをクリックしてherokuへの会員登録を行いましょう。

ログイン後~Heroku上でアプリの作成

Step1 アプリ作成①

ログインすると下記のような画面に遷移できるので、【New】ボタンから【Create new app】を選択しましょう。
スクリーンショット 2020-07-27 午後9.16.01.png

Step2 アプリ作成②

【App name】に任意の名前を入力し、【Create app】を選択します。
【choose a region】は特に変更しなくても構いません。
スクリーンショット 2020-07-27 午後9.18.23.png

Herokuアプリの設定

Step1 ClearDB MySQLの追加

初めて挑戦している方のために、写真を多用しております。
なお、Herokuに今回初めて、サインアップしてこの作業に挑んでいる方は、先にクレジットカードをHerokuに登録しておく必要があります。
登録しておかないと、ClearDB MySQLの追加ができません。
ログイン後、下記の画像にあるアイコン(画面右上)をクリックし、クレジットの登録を行いましょう。

スクリーンショット 2020-07-27 午後9.43.03.png

手順①

先程【Create new app】から作成したアプリをheroku上でクリックすると下記の画像のように、【Overview~Setting】のタブが開けるページへと遷移できる。
【Resources】タブをクリックすると、下記と同じ画面になることが確認できると思います。
【Find more add ons】をクリックします。
スクリーンショット 2020-07-27 午後9.25.25.png

手順②

下記のページへと遷移されるので、【ClearDB MySQL】を探します。
スクリーンショット 2020-07-27 午後9.25.56.png

手順③

手順②で探しだした下記をクリックします。
スクリーンショット 2020-07-27 午後9.26.24.png

手順④

【Install ClearDB MySQL】をクリックします。
その後、手順①のページへと戻りましょう。
スクリーンショット 2020-07-27 午後9.26.35.png

手順⑤

手順①ではなかったClearDB MySQLが追加できたのが確認できます。
スクリーンショット 2020-07-27 午後9.38.41.png

手順①〜⑤はコマンドでも操作できます

heroku addons:add cleardb

Step2 DB情報を確認し、Configにセットする

手順① 【Settings】タブをクリックし、【Reveal Config Vars】をクリックする

スクリーンショット 2020-07-27 午後9.49.12.png

手順② Valueにあたる部分、下記図で言うとmysql以下をメモ帳にメモする

スクリーンショット 2020-07-27 午後9.49.33.png

手順③ 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/Tokyo

Step3 GithubとHerokuの連携

手順① 【Deploy】をクリックし、画面中央の【Github】から該当のリポジトリを選択、最後にDeploy Branchをクリックします

スクリーンショット 2020-07-27 午後10.20.40.png

手順①はコマンドでも操作できます

git push heroku master

マイグレーションの実行

heroku run php artisan migrate

Webサイトを確認

Open app をクリックします
スクリーンショット 2020-07-27 午後10.28.53.png

コマンドでも操作できます

heroku open

CloudinaryとHerokuの連携

既にLaravelアプリを作成済みで、Cloudinaryを使用して写真を保存するなどの処理を書いていることを前提に進めますが、この記事を見てくださっている方の中には、Herokuにデプロイしたものの、これからCloudinaryと連携したアプリを作成しようと考えている方もいると思い、簡単にCloudinaryについて紹介します。

Cloudinaryとは

画像を管理するクラウドサービスで、画像の保存、変換、配信がとても簡単できます。
こちらをクリックし、アカウントを開設してみましょう。

Cloudinaryを使用する目的

本番環境からでもCloudinaryに写真を保存できるように設定し、HerokuからCloudinaryに保存してある写真をとりだせるようにするため。

Cloudinaryへログイン(ここから作業です)

Dashboardを開き、下記の3つをメモする。
Revealをクリックすると値がきちんと表示されます。

Cloud name:
API Key:
API Secret:

スクリーンショット 2020-07-27 午後10.47.54.png

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】は下記のようにセットしてあります

スクリーンショット 2020-07-27 午後11.14.17.png

Herokuでアプリを開き挙動を確認しましょう

写真投稿アプリを作成している場合、本番環境でも写真を投稿したら、Cloudinaryに写真が保存できていることが確認できるかと思います。

おまけ

GUIツールを使用して本番環境のDBを可視化しよう

  • macユーザー
  • windowsユーザー

Sequel pro使用方法

Table plusもやることは同じです。
適宜読み替えてトライしてください。

ダウンロードしたSequel proを立ち上げます

下記の図のように画面が表示されます。

スクリーンショット 2020-07-27 午後11.26.38.png

  • ホスト(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の情報ということになります。

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

【初めてのデプロイ】Laravel×Herokuデプロイ(MySQL) + Cloudinary

はじめに

初めてLaravelでMySQLを使用したアプリをデプロイしてみたい方に向けた記事です。
この記事は既にLaravelアプリを作成済みである状態から説明します。
Herokuコマンドが使用できる状態であることを前提に進めていく。
なるべくHerokuコマンドを使用しないで操作していきます

Laravelアプリフォルダ直下にてProcfileを作成する

Procfileとは

ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。

Procfileファイルの作成

コマンド操作により、アプリ直下に移動したのち、下記のコマンドを実行する

touch Procfile

上記コマンドを実行後、Laravelアプリ直下にProcfileが作成されていることを確認する。

スクリーンショット 2020-07-27 午後8.54.57.png

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
push

Herokuでの作業

サインアップ

こちらをクリックしてherokuへの会員登録を行いましょう。

ログイン後~Heroku上でアプリの作成

Step1 アプリ作成①

ログインすると下記のような画面に遷移できるので、【New】ボタンから【Create new app】を選択しましょう。
スクリーンショット 2020-07-27 午後9.16.01.png

Step2 アプリ作成②

【App name】に任意の名前を入力し、【Create app】を選択します。
【choose a region】は特に変更しなくても構いません。
スクリーンショット 2020-07-27 午後9.18.23.png

Herokuアプリの設定

Step1 ClearDB MySQLの追加

初めて挑戦している方のために、写真を多用しております。
なお、Herokuに今回初めて、サインアップしてこの作業に挑んでいる方は、先にクレジットカードをHerokuに登録しておく必要があります。
登録しておかないと、ClearDB MySQLの追加ができません。
ログイン後、下記の画像にあるアイコン(画面右上)をクリックし、クレジットの登録を行いましょう。

スクリーンショット 2020-07-27 午後9.43.03.png

手順①

先程【Create new app】から作成したアプリをheroku上でクリックすると下記の画像のように、【Overview~Setting】のタブが開けるページへと遷移できる。
【Resources】タブをクリックすると、下記と同じ画面になることが確認できると思います。
【Find more add ons】をクリックします。
スクリーンショット 2020-07-27 午後9.25.25.png

手順②

下記のページへと遷移されるので、【ClearDB MySQL】を探します。
スクリーンショット 2020-07-27 午後9.25.56.png

手順③

手順②で探しだした下記をクリックします。
スクリーンショット 2020-07-27 午後9.26.24.png

手順④

【Install ClearDB MySQL】をクリックします。
その後、手順①のページへと戻りましょう。
スクリーンショット 2020-07-27 午後9.26.35.png

手順⑤

手順①ではなかったClearDB MySQLが追加できたのが確認できます。
スクリーンショット 2020-07-27 午後9.38.41.png

手順①〜⑤はコマンドでも操作できます

heroku addons:add cleardb

Step2 DB情報を確認し、Configにセットする

手順① 【Settings】タブをクリックし、【Reveal Config Vars】をクリックする

スクリーンショット 2020-07-27 午後9.49.12.png

手順② Valueにあたる部分、下記図で言うとmysql以下をメモ帳にメモする

スクリーンショット 2020-07-27 午後9.49.33.png

手順③ 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/Tokyo

Step3 GithubとHerokuの連携

手順① 【Deploy】をクリックし、画面中央の【Github】から該当のリポジトリを選択、最後にDeploy Branchをクリックします

スクリーンショット 2020-07-27 午後10.20.40.png

連携コマンド操作

heroku git:remote -a herokuアプリ名;

手順①はコマンドでも操作できます

git push heroku master

マイグレーションの実行

heroku run php artisan migrate

Heroku上でGithubとHerokuを連携したあとに、マイグレーションを実行します
この際にエラーがでてしまうのは、GitとHerokuの連携がうまく行われていないことがおおいです。
その場合は、上記連携コマンド操作git push heroku masterをコマンドで実行しましょう。

Webサイトを確認

Open app をクリックします
ここまででLaravelアプリ(MySQL使用)のデプロイは完了です
スクリーンショット 2020-07-27 午後10.28.53.png

コマンドでも操作できます

heroku open

CloudinaryとHerokuの連携

既にLaravelアプリを作成済みで、Cloudinaryを使用して写真を保存するなどの処理を書いていることを前提に進めますが、この記事を見てくださっている方の中には、Herokuにデプロイしたものの、これからCloudinaryと連携したアプリを作成しようと考えている方もいると思い、簡単にCloudinaryについて紹介します。

Cloudinaryとは

画像を管理するクラウドサービスで、画像の保存、変換、配信がとても簡単できます。
こちらをクリックし、アカウントを開設してみましょう。

Cloudinaryを使用する目的

本番環境からでもCloudinaryに写真を保存できるように設定し、HerokuからCloudinaryに保存してある写真をとりだせるようにするため。

Cloudinaryへログイン(ここから作業です)

Dashboardを開き、下記の3つをメモする。
Revealをクリックすると値がきちんと表示されます。

Cloud name:
API Key:
API Secret:

スクリーンショット 2020-07-27 午後10.47.54.png

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】は下記のようにセットしてあります

スクリーンショット 2020-07-27 午後11.14.17.png

Herokuでアプリを開き挙動を確認しましょう

写真投稿アプリを作成している場合、本番環境でも写真を投稿したら、Cloudinaryに写真が保存できていることが確認できるかと思います。

おまけ

GUIツールを使用して本番環境のDBを可視化しよう

  • macユーザー
  • windowsユーザー

Sequel pro使用方法

Table plusもやることは同じです。
適宜読み替えてトライしてください。

ダウンロードしたSequel proを立ち上げます

下記の図のように画面が表示されます。

スクリーンショット 2020-07-27 午後11.26.38.png

  • ホスト(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の情報ということになります。

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