Я хочу разрешить экземпляр класса с помощью string
, конструктор которого зависит от контейнера. Я хочу передать зависимость конструктора при разрешении класса.
Простой пример, который я тестировал: Foo
— класс, который я хочу разрешить, а $id
— аргумент конструктора:
class Foo
{
public function __construct(public $id)
{}
}
Обвязка в служебном контейнере:
$this->app->bind('foo', function($app, $id) {
return new Foo($id);
});
И разрешение из контейнера:
$foo = App::makeWith('foo', ['id' => 1]);
$foo
затем разрешается как
Foo
{
+id: ["id" => 1],
}
Что показывает, что общедоступное свойство $id
задано как массив.
Однако, что, если я хочу иметь $id
не массив, а целое число?
Я должен сделать привязку следующим образом:
App::bind('foo', function($app, $arg) {
return new Foo($arg['id']);
});
Это кажется крайне хакерским. Является ли это злоупотреблением сервисным контейнером?
Некоторые могут возразить, что не стоит передавать аргумент конструктора при разрешении из сервисного контейнера, лучше сделать его без состояния или использовать установщик. Но если многие методы в Foo
будут использовать, скажем, $id
, наиболее удобно и лучше всего передать $id
в качестве конструктора, верно?
Если вы уверены в том, где вам нужны эти конкретные
$id=1
, вы можете использовать контекстную привязку сwhen()->needs()->give()
.