Laravel - как мне автоматически вводить в конструкции правила проверки?

Я не могу ввести эти переменные через Laravel:

//...class AllowedUsername implements Rule...

public function __construct(Router $router, Filesystem $files, Repository $config)
{
    $this->router = $router;
    $this->files = $files;
    $this->config = $config;
}

Я получаю сообщение об ошибке:

 Type error: Too few arguments to function ... 0 passed in.

Почему Laravel не делает это автоматически?

$request->validate([
            'username' => ['required', new AllowedUsername],           
        ]);

Один из способов обойти это - избавиться от инъекций и использовать вместо них resolve() ... так что удачи $this->router = resolve(Router::class);.

Kyslik 11.03.2018 17:51

Это сработало! @Kyslik Но мне любопытно, почему нет "волшебной" инъекции. Хотелось бы понять это больше.

Philipp Mochine 11.03.2018 17:56

Вы можете сделать это по-другому; resolve(AllowedUser::class) и инъекция (старый код) будут работать. Вы видите, что инъекция работает только в том случае, если вы позволяете Laravel обрабатывать «часть обновления». см. laravel.com/docs/5.6/container#binding-basics

Kyslik 11.03.2018 18:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
3
1 136
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы использовать магию инъекций Laravel, вам нужно использовать Laravel API, который по сути:

  • resolve($class), который является оберткой вокруг app($class)
  • app($class, $params = []), который является оберткой вокруг:

Note: I've changed $abstract for $class

if (is_null($class)) {
    return Container::getInstance();
}

return Container::getInstance()->make($class, $parameters);

Классы, которые вы хотите разрешить вне контейнера (как показано в вашем примере кода):

public function __construct(Router $router, Filesystem $files, Repository $config)

может быть разрешено только потому, что разработчики Laravel уже определили привязку для Router::class, Filesystem:class (пример: FilesystemServiceProvider).

Repository::class, похоже, является классом просто, который не требует параметров (или требует параметров, которые контейнер уже знает, как разрешить) во время «нововведения» - таким образом, Laravel может решить его без проблем.

There is no need to bind classes into the container if they do not depend on any interfaces. The container does not need to be instructed on how to build these objects, since it can automatically resolve these objects using reflection.

Вот почему resolve(AllowedUser::class) или resolve(Router::class) ... работают.


Чтобы Laravel знал, какие параметры конструктора должны быть отправлены во время «обновления», вы используете привязки, упомянутые в документация.

Другие вопросы по теме