Docker×Laravel×Vue (Laravel編)

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

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


##SPA認証
###Laravel Airlock -> Sanctumに改名！！

https://stackoverflow.com/questions/54675520/composer-update-the-requested-php-extension-ext-http-missing

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

##マルチ認証

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

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

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

https://qiita.com/tomoeine/items/40a966bf3801633cf90f

これは初知り！！！

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側の認証の有無が確認できます。

https://readouble.com/laravel/5.5/ja/blade.html

##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
```

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

https://www.ritolab.com/entry/52

###Middleware

https://tech-blog.optim.co.jp/entry/2019/08/13/173000

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

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

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

https://blog.capilano-fw.com/?p=5002

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

```
composer dump-autoload
```
で対応！！

https://qiita.com/WebSysRider/items/e41f211f8c913e008d03


##バリデーション

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

https://www.ritolab.com/entry/40#aj_3

###Httpsで入力してもらいたい！！

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

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

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

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


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

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

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

https://qiita.com/kazuhei/items/935257b0d72fa314d461


##フォームリクエスト

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

その際に出た
This action is unauthorized

```
    public function authorize()
    {
        return false;
    }

```
を

```
    public function authorize()
    {
        return true;
    }
```

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


https://nekorokkekun.hatenablog.com/entry/2019/07/13/223834

###

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


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

```
    protected function prepareForValidation(): void
{
}
```
いけるみたいです。助かった〜
チェックボックスの複数選択バリデーションで困ってました！

https://qiita.com/fuubit/items/45466742d1b74e3f9be6


##登録画面

```
 // 入力画面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'));
    }
```


http://cly7796.net/wp/php/take-over-the-value-when-you-redirect-in-laravel-of-form/


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

```

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

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

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

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

https://blog.capilano-fw.com/?p=556


##エラー関係

###TOO Large

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

https://qiita.com/kangyoosam/items/609b6eb1a262dee9f547

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

https://qiita.com/sano1202/items/b2babd55a6b11109de9a


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


まじか！！！！

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

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

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

https://gray-code.com/php/setting-for-file-upload-by-phpini/

##シンボリックリンク

```php
php artisan strage:link
```

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

storage/ap/public
から触れる。

```php
src ="{{asset('/storage/company/description/first/'.$companyDescription["img_1"])}}"
```
みたいに自分はアクセスした。

##認可

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



##画面

##Flash Message
https://qiita.com/usaginooheso/items/6a99e565f16de2f9ddf7

###ページネーション

なんとか対応完了

https://qiita.com/rorensu2236/items/abf5706f56a124e50640

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

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

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

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

###403 This Action is unauthorized

<img width="503" alt="スクリーンショット 2020-05-12 21.01.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432086/92517f57-135c-b929-e074-cd407bd9011f.png">

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

```
  public function authorize()
    {
        return true;
    }
```
になっていない可能性を疑う。
全部自分の場合はこれでした。

https://hiroslog.com/post/173

##Eloquent

###　（複数条件OR）　AND　（複数条件OR）
https://qiita.com/Hwoa/items/542456b63e51895f9a55

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

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

```php
   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()
```

を使う！！

https://qiita.com/kajihara-kenji/items/3fe6c589d744a46912ae


##DB周り

###SeedでDBにデータを流す

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

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

https://qiita.com/Ioan/items/a851ef1099718d079c8c

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


##エラー画面の追加 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!!