質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

0回答

701閲覧

Laravel 認可処理のエラーを解決したいです

yuina711

総合スコア9

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2021/06/05 03:49

編集2021/06/05 06:42

現在、laravelの日本語訳ドキュメントを参考にして認可について学習している初学者です。

初めて認可(ポリシー)の実装を試みている為、根本的に誤解している可能性がございます。
その際はご指摘のほどよろしくお願いいたします。

##分からないこと
Laravel DebugbarのGate欄にて、下記のエラーが発生しており、どのように解決すべきかを知りたく質問させていただきます。

array:4 [▼ "ability" => "update" "result" => null "user" => 1 "arguments" => "[0 => Model]" ]

##試したこと
過去の質問を参考に、回答欄に書かれていることを試しましたが解決に至りませんでした。

認可を実装し、アプリケーション上でログイン済みの状態でログインユーザーのidと投稿のuser_idが一致している投稿の更新を行ったところエラーは発生しませんでした。

開発環境
laravel 6.20.16
php 7.4.15

下記にポリシーを実装した手順と詳細を記載いたします。

###1.ArticlePolicyを作成
php artisan make:policy PostPolicy --model=ArticleでArticlePolicyを作成。

updateメソッドで、ログインしているユーザーのIDとArticle(投稿)のuser_idが一致している場合のみ更新できるように設定。

<?php namespace App\Policies; use App\Models\Article; use App\Models\User; use Illuminate\Auth\Access\HandlesAuthorization; class ArticlePolicy { use HandlesAuthorization; /** * Determine whether the user can view any articles. * * @param \App\Models\User $user * @return mixed */ public function viewAny(?User $user) { return true; } /** * Determine whether the user can view the article. * * @param \App\Models\User $user * @param \App\Models\Article $article * @return mixed */ public function view(?User $user, Article $article) { return true; } /** * Determine whether the user can create articles. * * @param \App\Models\User $user * @return mixed */ public function create(User $user) { return true; } /** * Determine whether the user can edit the article. * * @param \App\Models\User $user * @param \App\Models\Article $article * @return mixed */ public function update(User $user, Article $article) { return $user->id === $article->user_id; } /** * Determine whether the user can delete the article. * * @param \App\Models\User $user * @param \App\Models\Article $article * @return mixed */ public function delete(User $user, Article $article) { return $user->id === $article->user_id; } /** * Determine whether the user can restore the article. * * @param \App\Models\User $user * @param \App\Models\Article $article * @return mixed */ public function restore(User $user, Article $article) { // } /** * Determine whether the user can permanently delete the article. * * @param \App\Models\User $user * @param \App\Models\Article $article * @return mixed */ public function forceDelete(User $user, Article $article) { // } }
//App\Models\Article.phpのuserモデルとのリレーション設定 public function user(): BelongsTo { return $this->belongsTo('App\Models\User'); } //App\Models\User.phpのArticleモデルとのリレーション設定 public function articles(): HasMany { return $this->hasMany('App\Models\Article'); }

###2.AuthServiceProviderに登録

<?php namespace App\Providers; use App\Models\Article; use App\Policies\ArticlePolicy; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Gate; class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ Article::class => ArticlePolicy::class, ]; //略 }

###3.ArticleControllerで認可を使用
リソースコントローラを活用している為、コントローラのコンストラクタの中でauthorizeResourceメソッドを使用

<?php namespace App\Http\Controllers; use App\Models\Article; use App\Models\Tag; use Illuminate\Http\Request; use App\Http\Requests\Article\StoreRequest; use App\Http\Requests\Article\UpdateRequest; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Auth; class ArticleController extends Controller { public function __construct() { $this->authorizeResource(Article::class, 'article'); } // public function update(UpdateRequest $request, Article $article) { $article->fill($request->validated())->save(); return redirect()->route('articles.index')->with('msg_success', '投稿を編集しました'); } //
//web.php ArticleControllerに関するルーティング Route::resource('/articles', 'ArticleController')->except(['create'])->middleware('auth'); Route::post('/articles/create', 'ArticleController@create')->name('articles.create')->middleware('auth');

初歩的な質問で申し訳ございませんが、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問