20211010のlaravelに関する記事は5件です。

Laravel8 Jetstream / Fortify のURLを変更する

やりたいこと 認証とかのURLを変更したい やりかた Fortify FortifyServiceProviderのregisterメソッドにFortify::ignoreRoutes();を追加。 ~略~ class FortifyServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { Fortify::ignoreRoutes(); } ~略~ routesフォルダ内にfortify.phpを作成する。 vendor\laravel\fortify\routes\routes.phpの中身をコピーして先ほど作成したfortify.phpに貼り付ける。 (fortifyはなぜかpublishが用意されていない) あとはRouteServiceProvideにルーティングとして登録する。 class RouteServiceProvider extends ServiceProvider { ~ 省略 ~ /** * Define your route model bindings, pattern filters, etc. * * @return void */ public function boot() { $this->configureRateLimiting(); $this->routes(function () { Route::prefix('api') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php')); Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); // 追加 Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/fortify.php')); }); } あとはよしなにルーティングをいじる。 JetStream JetstreamServiceProviderのregisterメソッドにJetstream::ignoreRoutes();を追加。 ~省略~ class JetstreamServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { Jetstream::ignoreRoutes(); } Jetstreamのルーティングファイルを公開する。 php artisan vendor:publish --tag=jetstream-routes あとはRouteServiceProvideにルーティングとして登録する。 class RouteServiceProvider extends ServiceProvider { ~ 省略 ~ /** * Define your route model bindings, pattern filters, etc. * * @return void */ public function boot() { $this->configureRateLimiting(); $this->routes(function () { Route::prefix('api') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php')); Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/fortify.php')); // 追加 Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/jetstream.php')); }); } あとはよしなにルーティングをいじる。 認証系のルーティングでauthにして1ファイルにまとめたりしても良いかも
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】Route::resourceを使ってみよう

はじめに 今回は、Route::resourceを使ってCRUDのルーティングを一度に行う方法を見ていきましょう。 version:Laravel8 Route::resourceを使わない場合 以下のように、1機能につき最大8個のルーティングを記述する必要があります。 web.php Route::get('/menus', [MenuController::class, 'index']); Route::get('/menus/create', [MenuController::class, 'create']); Route::post('/menus', [MenuController::class, 'store']); Route::get('/menus/{theMenu}', [MenuController::class, 'show']); Route::get('/menus/{theMenu}/edit', [MenuController::class, 'edit']); Route::put('/menus/{theMenu}', [MenuController::class, 'update']); Route::get('/menus/[theMenu]', [MenuController::class, 'destroy']); Route::resourceを使うと 以下のように1行で記述することができます。 web.php Route::resource('menus', MenuController::class); 一部のメソッドのみ使いたい場合 onlyで使うメソッドを宣言 web.php Route::resource('menus', MenuController::class)->only([ 'index', 'show' ]); exceptで使わないメソッドを宣言 web.php Route::resource('menus', MenuController::class)->except([ 'create', 'store', 'update', 'destroy' ]);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel+Amazon S3 画像をアップする方法

はじめに  Laravelでアプリを作ったのでHerokuで公開してホッとしたのも束の間、どうやらHerokuでは画像の保存ができないらしい・・・。 ということで今回はS3へ画像を保存する方法を取りたいと思います! 初心者の備忘録ですので、理解不足はご容赦ください。 AWSアカウントの作成  公式を参考にアカウントを作成しましょう。その際、access keyとsecret access keyが発行されるのでメモっておきましょう。 忘れた場合はこちらを参考にしてみてください。 S3のバケットを作る  こちらを参考にバケットを作成してください。ここに画像ファイルが保存されていきます。  その際に、ブロックパブリックアクセスをオフにしてください。 これでAWSの設定は完了です! パッケージのインストール  最初にAWS SDK for PHPをインストールします。 $ composer install aws/aws-sdk-php または $ composer require aws/aws-sdk-php 次に、flysystem-aws-s3-v3をインストールしていきます。 $ composer require league/flysystem-aws-s3-v3 laravel8の場合は $ composer require league/flysystem-aws-s3-v3:^1.0 このようにすることでインストールできます。 この辺りがうまくいかない場合はcomposer.jsonやcomposer.lockをゴニョゴニョする必要があるみたいです。エラーメッセージをよく読んで戦っていきましょう。 Laravelの設定  次に.envファイルを編集していきます。 このように書きます。 AWS_ACCESS_KEY_ID=最初に生成されたアクセスキー AWS_SECRET_ACCESS_KEY=最初に生成されたシークレットアクセスキー AWS_DEFAULT_REGION=バケットのリージョン AWS_BUCKET=バケット名 AWS_USE_PATH_STYLE_ENDPOINT=false これで設定は完了です。 コントローラーとビューの作成 次に、コントローラーに画像をアップする処理、ビューに画像を表示する処理を書いていきます。 controller.php public function store(Request $request) { $item = new Item(); if(empty($errors)){ $img = $request->file('img'); $path = Storage::disk('s3')->putFile('/test', $img,'public'); $item->img = $path; $item->save(); } return redirect()->route('home'); } データベースにはS3に保存された画像のパスが保存されます。 表示はこんな感じです。 index.blade.php {{ Storage::disk('s3')->url("$item->img") }}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelのRequestを使ったuniqueバリデーションで自分自身を除く方法

こんにちは、くりぱんです。 説明 Laravelのユーザー情報編集のRequestにて、メールアドレスをunique設定しました。 しかし、メールアドレスを変更せずに他の項目を変更し、編集ボタンをクリックすると「すでにこのメールアドレスが登録されています」とのバリデーションが出てしまいました。 理由は簡単で、自身のメールアドレスがすでにDBへ登録されているため、Laravel側で重複していると判断されてしまったためです。 今回はその解決法を説明します。 この記事で実現できること Requestにて自分自身を除く方法 実装 今回はUsersテーブルのカラム名がemailであるパターンで説明していきます。 unique:ユニークチェックをしたいテーブル名,ユニークチェックをしたいカラム名,ユニークチェックを除外したい値,ユニークチェックを除外したいカラム名 という感じで記述していきます。 ログインユーザーのメールアドレスを重複バリデーションから除きたい場合 UserUpdateRequest.php <?php namespace App\Http\Requests\Admin; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Auth; class UserUpdateRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'name' => ['required', 'between:2,150'], 'email' => ['required', 'string', 'email:strict,dns', 'max:255', 'unique:users,email,'.Auth::user()->email.',email'], 'support_end_at' => ['required', 'date', 'date_format:Y-m-d'], ]; } } ログインユーザーのメールアドレスを重複バリデーションから除きたい場合は、 ユニークチェックをしたいテーブル名:users ユニークチェックをしたいカラム名:email ユニークチェックを除外したい値:Auth::user()->email ユニークチェックを除外したいカラム名:email となります。 ちなみに、Auth::user()->emailとすることで、ログインユーザーのメールアドレスを取得できます。 管理画面などで、ユーザー一覧から選択したユーザーのメールアドレスを重複バリデーションから除きたい場合 UserUpdateRequest.php <?php namespace App\Http\Requests\Admin; use App\Models\User; use Illuminate\Foundation\Http\FormRequest; class UserUpdateRequest extends FormRequest { public function authorize() { return true; } public function rules() { $user = User::find($this->id); return [ 'name' => ['required', 'between:2,150'], 'email' => ['required', 'string', 'email:strict,dns', 'max:255', 'unique:users,email,'.$user->email.',email'], 'support_end_at' => ['required', 'date', 'date_format:Y-m-d'], ]; } } 一方で、管理画面などで、ユーザー一覧から選択したユーザーのメールアドレスを重複バリデーションから除きたい場合は、 ユニークチェックをしたいテーブル名:users ユニークチェックをしたいカラム名:email ユニークチェックを除外したい値:$user->email ユニークチェックを除外したいカラム名:email となります。 まず、$user = User::find($this->id);で選択したユーザーの情報を変数$userに格納します。 その後、そのユーザーのメールアドレス情報を$user->emailで取得します。 最後に 少しでも役に立った!という時は、LGTMをポチッと、、、笑 1つでもLGTMが付くとその日がハッピーになるんです! 役に立たなかった時は、怒らないでコメント頂けると幸いです笑 Twitterもやってます! プログラミングや金融知識について、エンジニアの現実についてつぶやいています! よかったら見てみてくださいね!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel8のパスワードバリデーションとその日本語化

Laravelのバリデーションオブジェクト Laravelにはデフォルトでバリデーションルールがあり、これを用いることで容易に簡潔なコードでバリデーションができます。 しかし、「記号を1文字以上含むパスワード」のような複雑なルールに対応しようとすると、長く読みづらいコードになってしまいます。 複雑な要件のバリデーションに対応したい場合は、パスワードルールオブジェクトが便利です。 パスワードルールオブジェクト 通常のバリデーションと同じように定義が可能です。 FormRequest.php use Illuminate\Validation\Rules\Password; public function rules() { return [ 'password' => ['required', 'max: 128', Password::min(8)], ]); 定義できるルールには以下があり、これらを組み合わせることも可能です。 ルール一覧 // 最低8文字必要 Password::min(8) // 最低1文字の文字が必要 Password::min(8)->letters() // 最低大文字小文字が1文字ずつ必要 Password::min(8)->mixedCase() // 最低一文字の数字が必要 Password::min(8)->numbers() // 最低一文字の記号が必要 Password::min(8)->symbols() // パスワードリストに登録されているか確認 Password::min(8)->uncompromised() 最後のuncompromised()は過去にデータ漏洩したことがあるかを確認してくれます。 例えば、脆弱なパスワードである "password" や "qwerty" などを入力すると引っかかります。ですので、パスワードの要件を縛りすぎることなく一部の危険なパスワードを回避することができます。さらに、半角全角英数字記号も満たしてるが脆弱な "Passw0rd!" などの設定も防ぐことが可能です。 また、引数に数値を入れることで、同一のデータリークにおいて、パスワードの出現回数がn回以下であることを確認することができます。 内部的には、have i been pwned のAPIを利用しているそうです。 日本語化する 次に、日本語化の方法です。 実際に使うとこのような英語のメッセージが帰ってきます。パスワードが日本語なのはvalidation.phpの設定によるものです。 英語になっているバリデーション文はvendor/laravel/framework/src/lluminate/Validation/Rules/Password.phpに直に書かれており、validation.phpでは設定できません。 そこで、以下をresources/lang/ja.jsonに追加します。ja.jsonがない場合は作ってください。 resources/lang/ja.json { "The :attribute must contain at least one uppercase and one lowercase letter.":":attributeは、少なくとも大文字と小文字を1つずつ含める必要があります。", "The :attribute must contain at least one letter.":":attributeは、少なくとも1つの文字が含まれていなければなりません。", "The :attribute must contain at least one symbol.":":attributeは、少なくとも1つの記号が含まれていなければなりません。", "The :attribute must contain at least one number.":":attributeは、少なくとも1つの数字が含まれていなければなりません。", "The given :attribute has appeared in a data leak. Please choose a different :attribute.":"この:attributeは過去に漏洩したことのある脆弱な:attributeです。別の:attributeを入力してください。" } ※翻訳内容は適時調整していただいて構いません。 はい、無事に日本語化が完了しました!! 便利な機能なので使っていない方はぜひ使ってみてください! 参考サイト バリデーション方法 https://readouble.com/laravel/8.x/ja/validation.html https://haveibeenpwned.com/Passwords 言語の設定方法 https://www.magutti.com/blog/laravel-8-password-rule
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む