こちら側ではタイトルにあるように
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の認証されてるかされてないか
@guest('admin')
//認証されていない場合表示させるもの!!
@endguest
@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/usaginooheso/items/6a99e565f16de2f9ddf7
###ページネーション
なんとか対応完了
ページネーション先にデータ持っていく
https://qiita.com/n_oshiumi/items/4893abeff7e0b85ee2a2
###Eloquentの検索結果がからかどうか判定するメソッド
if($blogs->isEmpty()){
//なんらかの処理
}
if($blogs->first()){
//なんらかの処理
}
###403 This Action is unauthorized
この画面になった時は大概 Requestクラス内の
public function authorize()
{
return true;
}
になっていない可能性を疑う。
全部自分の場合はこれでした。
##Eloquent
### (複数条件OR) AND (複数条件OR)
https://qiita.com/Hwoa/items/542456b63e51895f9a55
これで検索条件が複数あっても
絞り込めて表示できますね。
自分はこんな感じで複数条件が画面から渡された場合に実装しました。
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
このコマンドで再定義されました。。。
アールエフェクトさんの記事です。
このサイトには何度お世話になっているか。
今回もメール送信でお力添えいただきました。
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ファイルを変更してあげて場面に応じて画面切り分け!!
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!!