Как ввести запрос в класс фасадов в Laravel? - PullRequest
0 голосов
/ 30 апреля 2019

Итак, у меня есть следующий класс, это фасад:

namespace App\Helpers;

use App\Http\Requests\HomepageRequest;

class Params {

    public function __construct(HomepageRequest $request) {

    }

Тогда у меня есть класс ParamsServiceProvider, который создает экземпляр класса фасада при запуске скрипта:

public function register()
{
    //
    App::bind('params', function() {
        return new Params();
    });
}

edit: вот фактический фасад для класса Params

use Illuminate\Support\Facades\Facade;

class Params extends Facade {
    protected static function getFacadeAccessor() {
        return 'params';
    }
}

Все это прекрасно работает, класс создается правильно, однако, он, похоже, не внедряет объект запроса в конструктор, как это было бы в классе контроллера. Есть ли способ внедрить запрос в класс фасада, как в контроллере? С текущим кодом я получаю следующую ошибку:

Слишком мало аргументов для функции App \ Helpers \ Params :: __ construct (), 0 передается в /var/www/v4api/html/app/Providers/ParamsServiceProvider.php в строке 21 и ровно 1 ожидается

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

Ответы [ 3 ]

0 голосов
/ 30 апреля 2019

Класс, который вы опубликовали , не на самом деле Фасад - это просто обычный класс.

Поскольку вы намекали на типизацию его зависимостей, вам не нужно указывать Laravel, как создать его экземпляр, - он может сам все решить.

Вы можете либо вставить этот класс в метод контроллера (где Laravel создаст его для вас), либо вы можете вызвать app(App\Helpers\Params::class), и он вернет вам новый экземпляр класса.

Узнайте больше о создании классов фасадов, если вы хотите создать реальный фасад. В качестве альтернативы вы можете создать фасад реального времени - где вместо этого вы будете ссылаться на Facades\App\Helpers\Params::foo(), и Laravel позволит вам использовать метод, как если бы у вас был экземпляр этого класса.

0 голосов
/ 01 мая 2019

У вас есть несколько вариантов здесь - направьте фасад прямо на базовый класс и позвольте Laravel решить, как его построить, явно привязать его к контейнеру или использовать фасад в реальном времени.Давайте пройдемся по каждому из них.

class Params extends Facade 
{
    protected static function getFacadeAccessor() 
    {
        return \App\Helpers\Params::class;
    }
}

Этот параметр указывает фасад прямо на класс, для которого вы хотите, чтобы он был фасадом, а Laravel разработает остальное.

В качестве альтернативы вы можете сохранитьэто как params и вместо этого исправить привязку в контейнере.

В первом примере используется контейнер Laravel для создания экземпляра класса и его возврата.Laravel может автоматически отражать класс и внедрять его зависимости.

App::bind('params', function ($app) {
    return $app->make(Params::class);
});

Второй пример явно строит экземпляр так, как вы хотите, и это просто дополнительный код для вас.

App::bind('params', function() {
    return new Params(new HomepageRequest);
});

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

0 голосов
/ 30 апреля 2019

Похоже, это сработало:

В ParamsServiceProvider вместо использования App :: bind для создания экземпляра класса Params сделайте это вместо:

public function register()
{
    App::alias(Params::class, 'params');
}

тогда объект запроса будет правильно введен в фасад.

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