Передача имени класса для просмотра политики в методе index контроллера возвращает ошибку, что было передано слишком мало аргументов - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь проверить политику для метода index моего контроллера.Я передаю имя класса в помощник по авторизации, но я получаю статус 500 и ошибку, которая говорит

1) Tests \ Feature \ FunderFeatureTest :: an_admin_should_be_able_to_view_a_list_of_funders Symfony \ Component \ Debug \ Debug \Исключение \ FatalThrowableError: слишком мало аргументов для функции App \ Policies \ FunderPolicy :: view (), 1 передано в /home/vagrant/code/rtl/vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php длястрока 614 и ровно 2 ожидаемых

Что я делаю не так?Все остальные политики работают (включая методы create () и store (), которые не требуют модели).Я понимаю, что это похоже на многие другие вопросы о SO, однако большинство из них, по-видимому, связано с тем, что люди не передают имя класса методу авторизации или проблема возникает в другом методе контроллера (например, update ()).Приношу свои извинения, если этот конкретный вопрос был задан ранее, я изучал его в течение двух недель и не могу найти ответ, который ищу.

FundersController.php

namespace App\Http\Controllers;

use App\Funder;
use Illuminate\Http\Request;

class FundersController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index()
    {
        $this->authorize('view', Funder::class);

        return view('funders.index', [
            'funders' => Funder::all(),
        ]);
    }
}

FunderPolicy.php

namespace App\Policies;

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

class FunderPolicy
{
    use HandlesAuthorization;
    public function view(User $user, Funder $funder)
    {
        return ($user->isAdmin() || $user->isSuperAdmin());
    }
}

FunderFeatureTest.php (Для справки)

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class FunderFeatureTest extends TestCase
{
    use RefreshDatabase;
    /** @test */
    public function an_admin_should_be_able_to_view_a_list_of_funders()
    {
        $this->withoutExceptionHandling();
        $this->signIn('admin');

        $this->get('/funders')
            ->assertOk();
    }

    /** @test */
     public function a_user_should_not_be_able_to_view_a_list_of_funders()
    {
        $this->signIn();

        $this->get('/funders')
            ->assertStatus(403);
    }
}

1 Ответ

0 голосов
/ 27 января 2019

Я не уверен, является ли это подходящим способом заставить это работать, но передача нового экземпляра модели Фундера вместо имени класса, казалось, добилась цели.

Изменение $this->authorize('view', Funder::class);до $this->authorize('view', new \App\Funder());

...