LoginSignup
2
0

More than 3 years have passed since last update.

Docker×Laravel×Vue (Laravel編)

Last updated at Posted at 2020-05-16

こちら側ではタイトルにあるように

Docker×Laravel×Vue 開発における
(Laravel部分)のお話をしていきます。

SPA認証

Laravel Airlock -> Sanctumに改名!!

これでは実装できなかったので諦めてLaravelのweb版で対応することにしました。

マルチ認証

この記事に死ぬほどお世話になりました!!
https://qiita.com/namizatop/items/5d56d96d4c255a0e3a87?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items#controller

RouteServiceProviderの値でlogin後の挙動が変わることは初知りでした!!

マルチ認証時の Auth::user()

これは初知り!!!

config.auth.php

'defaults' => [
'guard' => 'user',
'passwords' => 'Users',
],

で呼び出されてるものが標準で呼び出される。
なのでguardで仮にadmin側のデータ取得したいなってなった際は

Auth('admin')->user();

でadminガードを適用させる!!!!

Auth::routeって??

middlewareの認証されてるかされてないか

blade.php
@guest('admin')
//認証されていない場合表示させるもの!!
@endguest
blade.php
@auth('admin')
 //認証されてる場合表示させるもの 
@endauth

でadminのmiddleware側の認証の有無が確認できます。

Remember me 機能

基本的に

php artisan make:auth
時に自動的に生成される機能です。

<img width="1342" alt="スクリーンショット 2020-06-27 14.17.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432086/93e0ba70-ec4c-58e8-d768-ad7128b400b2.png">

これがログイン画面に付与されるのですが

これをクリックしてログインすると
当該ログインユーザのテーブルのremember_tokenに値が保持されます・
これをもとにセッションが切れそうになると再度自動でログインしてくれるようです。

で、このデフォルトの期間がなんと5年だそうです。。。

変更したい場合は下記の記事が参考になりそうです。
https://tech.arms-soft.co.jp/entry/2019/05/08/090000

パスリマインダー画面

php artisan make:auth

で全部の認証周りできるのですが
パスリマインダー部分変えたいよって方はオーバライドで対応しちゃいましょう!!

Middleware

承認したユーザのみログインできる

カラムで判断かつlogin時に予備ダサsれるメソッドの場所に
DB参照するメソッドで条件切り分ける。

新規登録時に管理者側に新規登録があった旨のメールを送信する。

Class消してるのに Cannot declare class Illuminate\Support\Facades\App\User, because the name is already in use が出てくる

composer dump-autoload

で対応!!

バリデーション

Requestクラス説明
https://www.ritolab.com/entry/41

Httpsで入力してもらいたい!!

ユーザによってはHttpのURLでは画面が表示されないことがあるので
バリデーションでHttpsを強制させる。

Laravelのバリデーションでstarts_withを用いる。

   public function rules()
    {
        return [   
            'site_url' => 'nullable|url|starts_with:https',
        ];
    }

starts_withで接頭の文字をhttpsで指定してあげることで
登録するサイトはhtttpを強制させることができます!!

ルーティングで名前指定した時にどうやって値渡す??

{{ route('user.profile', ['id' => 1]) }}

こんな感じで第一引数にルーティング名指定して上げて、第二引数で連想配列で値を渡してあげるみたいです!!
これでパラメータ指定してURL渡せそうです!!

フォームリクエスト

Controller内にValidationロジックを書くのは保守運用上あまり良くない。
→Requestクラス内に切り出してあげる。

その際に出た
This action is unauthorized

    public function authorize()
    {
        return false;
    }

    public function authorize()
    {
        return true;
    }

に変更することで対応完了!!

バリデーションが走る前に入力されたデータを加工。
助かりました。

メソッドのオーバライドで

    protected function prepareForValidation(): void
{
}

いけるみたいです。助かった〜
チェックボックスの複数選択バリデーションで困ってました!

登録画面

 // 入力画面post時
    public function postIndex()
    {
        // postデータ取得
        $data = Request::all();

        // エラーチェックなどの処理

        // 確認画面へリダイレクト
        return redirect('/form/confirm')->withInput();
    }

    // 確認画面
    public function getConfirm()
    {
        // post内容を取得
        $postdata = Session::get('_old_input');

        return view('form.confirm', compact('postdata'));
    }

$validationCode = request()->session()->get('validation_code', '');

組み合わせで前ページの値持ってける。

Routing書くの面倒なんでグルーピング

middleware ・・・ ミドルウェアでグループ化し適用する
namespace ・・・ ネームスペースでグループ化
domain ・・・ サブドメインをグループ化
prefix ・・・ URLが始まる文字列でグループ化
name ・・・ ルーティング名でグループ化

ブログから拝借しましたが→これで対応できそうです。

エラー関係

TOO Large

自分の場合localのphp.iniの設定ファイルと同じようにdocker内のphpが読みこまれていたのでローカルの
php.iniを変更して対応しました。

ファイルアップロードが失敗する場合

Laravel ファイルがアップロードできない

まじか!!!!

調子に乗ってupload_max_filesizeを1024Mにしたのが原因でした。。。

アップロードできるサイズに直接関係するのは「upload_max_filesize」と「memory_limit」です。
「memory_limit」は「upload_max_filesize」よりも大きい値を設定するようにします。

upload_max_filesize > memory_limit になったらエラーになる!!

シンボリックリンク

php artisan strage:link

で作ることができるリンク
publicからファイルを取得するのに使うんやけど
アップロードされたファイルは基本Storageに入ってくるからここにアクセスするためのコマンド。

storage/ap/public
から触れる。

src ="{{asset('/storage/company/description/first/'.$companyDescription["img_1"])}}"

みたいに自分はアクセスした。

認可

自分が投稿した記事しか編集できないようにする。
https://tech.windii.jp/backend/laravel/authorization-basic

画面

Flash Message

ページネーション

なんとか対応完了

ページネーション先にデータ持っていく
https://qiita.com/n_oshiumi/items/4893abeff7e0b85ee2a2

Eloquentの検索結果がからかどうか判定するメソッド

if($blogs->isEmpty()){
//なんらかの処理
}

if($blogs->first()){
//なんらかの処理
}

403 This Action is unauthorized

スクリーンショット 2020-05-12 21.01.16.png

この画面になった時は大概 Requestクラス内の

  public function authorize()
    {
        return true;
    }

になっていない可能性を疑う。
全部自分の場合はこれでした。

Eloquent

 (複数条件OR) AND (複数条件OR)

これで検索条件が複数あっても
絞り込めて表示できますね。

自分はこんな感じで複数条件が画面から渡された場合に実装しました。

   if ($request->has('taste')) {
            if ($requestTaste === 0) {
            } else {
                $query->where(function ($query) use ($request) {
                    foreach ($request->taste as $index => $taste) {
                        $query->orwhere('asking_taste', $taste);
                    }
                });
            }
        }


        if ($request->has('region')) {
            if ($requestRegion === 0) {
            } else {
                $query->where(function ($query) use ($request) {
                    foreach ($request->region as $index => $region) {
                        $query->orWhere('asking_region', $region);
                    }
                });
            }
        }

Eloquentで重複除く

OrderByっていう便利メソッド!!
https://qiita.com/shosho/items/9ce87c30dfa3b0fb7dd8

Vueに値渡す際にcollectionの形式にする。

これをしてあげないと{{ $array }}
$arrayには配列が入る。

bladeのhtmlspexial~~~

に引っかかるため渡すことができない・・・
https://larapet.hinaloe.net/2017/03/10/vue-bind-entity/

Field 'company_id' doesn't have a default value

これはModelのfillableに値を書き忘れた時に起こるエラー。

NameSpace定義したのに反映されない

composer dump-autoload

このコマンドで再定義されました。。。

Mail

アールエフェクトさんの記事です。
このサイトには何度お世話になっているか。
今回もメール送信でお力添えいただきました。
https://reffect.co.jp/laravel/laravel-send-email

Sessionが消えない時

return view()

ではなく

return redirect()

を使う!!

DB周り

SeedでDBにデータを流す

seedで便利にデータをいじることができるっす。
https://qiita.com/niiyz/items/c36191fc2c5d48e7e544

チェックボックス送信後に複数POSTしたチェックボックスの値を取得して選択値を保持したい。

頭パンクになりそうながら理解!!

エラー画面の追加 400と500 マルチ認証で。

https://kkznch.hatenablog.com/entry/2018/08/26/213314
の記事と
prefixに関してマルチ認証の場合の記事どこかにあったが消えた!!

app/Exceptions/Handlerファイルを変更してあげて場面に応じて画面切り分け!!

Handler.php
  public function render($request, Throwable $e)
    {

       $prefix = 'user.';
        if ($request->is('company*')) {
            $prefix = 'company.';
        } elseif ($request->is('admin*')) {
            $prefix = 'admin.';
        }

        if ($this->isHttpException($e)) {
            //403
            if ($e->getStatusCode() === 403) {
                return response()->view($prefix . 'errors.400', ['message' => '権限がありません']);
            }
            // 404
            if ($e->getStatusCode() == 404) {

                return response()->view($prefix . 'errors.400', ['message' => 'ご指定のページが存在しません。']);
            }
        }

        if ($e instanceof ErrorException) {
            return response()->view($prefix .'errors.500', ['message' => 'お時間を置いてお試しください。'], 500);
        }

        return parent::render($request, $e);

    }

こんな感じでrenderメソッド変更してあげて
それぞれのviewをresources配下に追加してあげて対応done!!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0