2017-10-24 2 views
2

私は、このセットアップを持って不正である: -Laravel認可ポリシーAccessDeniedHttpExceptionこのアクションは、

のApp \ポリシー\

\ ObservationPolicy

<?php 

namespace App\Policies; 

use App\Observation; 
use App\User; 
use Illuminate\Auth\Access\HandlesAuthorization; 

class ObservationPolicy 
{ 
    use HandlesAuthorization; 

    /** 
    * Create a new policy instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     // 
    } 

    public function edit(User $user, Observation $observation) 
    { 
     return $user->id == $observation->user_id; 
    } 



} 

認証サービスプロバイダ:私はビューにしようとした

<?php 

namespace App\Providers; 

use Illuminate\Support\Facades\Gate; 
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; 


class AuthServiceProvider extends ServiceProvider 
{ 
    /** 
    * The policy mappings for the application. 
    * 
    * @var array 
    */ 
    protected $policies = [ 
     'App\Model' => 'App\Policies\ModelPolicy', 
     'App\Observation' => 'App\Policies\ObservationPolicy' 
    ]; 

    /** 
    * Register any authentication/authorization services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     $this->registerPolicies(); 

     // 
    } 
} 

この文のファイル: -

@can('edit', $observation) 
@endcan 

問題なく動作しました。

しかし、私は、コントローラで使用する場合:

public function edit($id,Observation $observation) 
    { 
     $this->authorize('edit', $observation); 
     return view('mypage'); 
    } 

を常にエラーを返す: - AccessDeniedHttpException このアクションは、私がアクセスルートがある不正

です: - ルート::ます(」/Observation/{id}/edit '、' ObservationController @ edit ');

答えて

3

コントローラメソッドで間違ったパラメータを受け入れるようです。

あなたが定義したルート:

Route::get('/Observation/{id}/edit', '[email protected]'); 

$idに沿って通過しようとしているが、私はObservation $observationがちょうど観測クラスの新しいインスタンスを作っていると思います。 Laravelはあなたのコントローラメソッドに依存性注入を使用したいと考えているのでそれが起こっている: https://laravel.com/docs/5.5/controllers#dependency-injection-and-controllers

public function edit($id, Observation $observation): 

代わりは、あなたのルートでこれを試してください:あなたの方法として

Route::get('/Observation/{observation}/edit', '[email protected]'); 

と、このパラメータ:

public function edit(Observation $observation): 

ここでは、結束ルートモデルを行うには、ビルドイン機能を使用します。 https://laravel.com/docs/5.5/routing#route-model-binding
あなたはその魔法に頼るしたくない場合は、手動であなたのコントローラのメソッド内の実際の観測を見つけなければならないだろう、例えば$observation = Observation::findOrFail($id);

+0

これはうまくいきました – user2873860

関連する問題