Я не могу ввести эти переменные через 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],
]);
Это сработало! @Kyslik Но мне любопытно, почему нет "волшебной" инъекции. Хотелось бы понять это больше.
Вы можете сделать это по-другому; resolve(AllowedUser::class) и инъекция (старый код) будут работать. Вы видите, что инъекция работает только в том случае, если вы позволяете Laravel обрабатывать «часть обновления». см. laravel.com/docs/5.6/container#binding-basics






Чтобы использовать магию инъекций Laravel, вам нужно использовать Laravel API, который по сути:
resolve($class), который является оберткой вокруг app($class)app($class, $params = []), который является оберткой вокруг:Note: I've changed
$abstractfor$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 знал, какие параметры конструктора должны быть отправлены во время «обновления», вы используете привязки, упомянутые в документация.
Один из способов обойти это - избавиться от инъекций и использовать вместо них
resolve()... так что удачи$this->router = resolve(Router::class);.