使用@can Blade指令时参数计数错误

问题描述

尝试使用策略检查权限时出现以下错误:

Too few arguments to function App\Policies\AnswerPolicy::view(),1 passed in /Users/georgio/Projects/Laravel/municipality-app/vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php on line 710 and exactly 2 expected (View: /Users/georgio/Projects/Laravel/municipality-app/resources/views/layouts/loggedin.blade.php)

AnswerPolicy

<?php

namespace App\Policies;

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

class AnswerPolicy
{
    use HandlesAuthorization;


    public function view(User $user,Answer $answer)
    {
      return true;
    }

    public function edit(User $user)
    {
      return true;
    }

    public function create(User $user)
    {
      return true;
    }

    public function delete(User $user)
    {
      return true;
    }

    public function update(User $user)
    {
      return true;
    }
}

AnswersController

<?php

namespace App\Http\Controllers;

use App\Question;
use App\Answer;


use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AnswersController extends Controller
{
  public function index()
  {
    $this->authorize('view');
    return view('answers.show')->with('questions',Question::all());
  }

  public function create($questionId)
  {
    $this->authorize('view-submit-answer');
    return view('answers.create')->with('question',Question::find($questionId));
  }

  public function store()
  {
    $this->authorize('');
    $this->validate(request(),[

      'answer' => 'required',]);

    $data = request()->all();

    $answer = new Answer();
    $answer->answer = $data['answer'];
    $answer->question_id = $data['question_id'];
    $answer->user_id = Auth::id();




    $answer->save();

    return redirect('/questions/answers');

  }

  public function edit($answerId)
  { $this->authorize('view-edit-answer');
    return view('answers.edit')->with('answer',Answer::find($answerId));
  }


  public function update($answerId)
  {
    $this->validate(request(),]);

    $data = request()->all();

    $answer = Answer::find($answerId);
    $answer->answer = $data['answer'];


    $answer->save();

    return redirect('/answers-question');
  }

  public function destroy($questionID)
  {
    $this->authorize('delete-answer');
    $answer = Answer::where('question_id',$questionID)->where('user_id',Auth()->id());
    $answer->delete();

    return redirect('/questions/answers');
  }



}

loggedin.blade.php 这只是我的代码中导致错误的部分

@can('view',App\Answer::class)
 <li>
   <a href="/questions/answers">
     <span><i class="fa fa-pencil"></i></span>
     <span>Answer Question</span>
   </a>
 </li>
@endcan

我什至尝试将$answer替换为App\Answer::class,但仍然有完全相同的错误。

您可以在以下位置查看完整的错误堆栈: https://flareapp.io/share/xPQQQXP1#F66

解决方法

The documentation says

在定义不接收模型实例的策略方法(例如创建方法)时,它将不接收模型实例。相反,您应该将方法定义为仅期望通过身份验证的用户

在您的Answer语句中没有看到@can实例。是否存在?如果是这样,您应该这样做:

@can('view',$answer)

或者,如果那时还不存在,请像这样定义您的方法

public function view(User $user)

并这样称呼它:

@can('view',\App\Answer::class)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...