Мне нужно инициализировать объект, который будет внедрен в некоторые сервисы. Некоторые из его аргументов могут быть получены во время выполнения из параметров запроса.
Как мне работать с такими динамическими объектами?
Первый способ, который я нашел, - создавать сеттеры и передавать аргументы службам, использующим объект. Но я думаю, что это плохо пахнет.
Второй подход - пометить мой объект как "синтетический сервис". Поэтому я должен подготовить объект в конструкторе и установить его в контейнер службы.
Я не уверен, что это лучший подход. Может ли кто-нибудь подсказать мне, как действовать в таких ситуациях?
Пример псевдокода первого подхода:
class Storage {
private $path;
private $project;
public function __construct($path) {
$this->path = $path;
}
public function setProject($project): void {
$this->project = $project;
}
public function showFullPath() {
echo "Full path: {$this->path}/{$this->project}";
}
}
class Service {
private $storage;
public function __construct(Storage $storage) {
$this->storage = $storage;
}
public function doSomething($project) {
$this->storage->setProject($project);
$this->storage->showFullPath();
}
}
// in controller
$service = $container->get('Service');
$service->doSomething($project);
Пример псевдокода второго подхода:
class Storage {
private $path;
private $project;
public function __construct($path, $project) {
$this->path = $path;
$this->project = $project;
}
public function showFullPath() {
echo "Full path: {$this->path}/{$this->project}";
}
}
class Service {
private $storage;
public function __construct(Storage $storage) {
$this->storage = $storage;
}
public function doSomething() {
$this->storage->showFullPath();
}
}
// in controller
$storage = new Storage($path, $project);
$container->set('Storage', $storage);
$service = $container->get('Service');
$service->doSomething();