Gate :: define с параметром конструктора в laravel - PullRequest
1 голос
/ 08 января 2020

Я использую laravel Policy and Gate.

Мне нужно иметь __construct($id) в политике.

Моя политика:

<?php

namespace App\Policies;

use App\Models\Button;
use App\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class BotPolicy
{
    use HandlesAuthorization;

    /**
     * Create a new policy instance.
     *
     * @return void
     */
    public function __construct($id)
    {
        #First Step
        $this->bot = Bot::findOrFail($id);


        #Second Step
        if ( $this->bot->hasRole('admin') )
            return true;


        #Third Step
        if ( $this->bot->status != 1 )
            return false;
    }


    public function button(?User $user, $id)
    {
        #Fourth Step
        if ( $this->bot->account()->max >= $this->bot->button()->count() )
            return true;

        #Fail
        return false;
    }

}


Мой контроллер:


    public function create()
    {
        if ( Gate::denies('bot-button', request('id') ) )
            echo "NO";

        #SOME CODE HERE


    }

AuthServiceProvider:

public function boot()
    {
        $this->registerPolicies();

        Gate::define('bot-button', 'App\Policies\BotPolicy@button');

Но для этого кода в политике

  public function __construct($id)

я даю эту ошибку

неразрешимая разрешение зависимостей [Параметр # 0 [$ id]] в классе App \ Policies \ BotPolicy

1 Ответ

1 голос
/ 08 января 2020

Во-первых, конструкторы - это не метод, с помощью которого вы можете возвращать свойства, это просто метод, который вызывается для вновь создаваемых объектов, часто для установки свойств и тому подобного.

Я считаю, что ваша политика может быть написана так , перемещая __constructor logi c в метод политики. Таким образом, удаляя __constructor все вместе, в Laravel, если загрузка зависимостей загружена следующим образом, он попытается создать параметры конструктора в контейнере.

public function button(?User $user, $id)
{
    #First Step
    $this->bot = Bot::findOrFail($id);

    #Second Step
    if ( $this->bot->hasRole('admin') )
        return true;

    #Third Step
    if ( $this->bot->status != 1 )
        return false;

    #Fourth Step
    if ( $this->bot->account()->max >= $this->bot->button()->count() )
        return true;

    #Fail
    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...