DI является лишь частным случаем IoC. В качестве примера можете посмотреть реализацию в SymfonyВ общем поверхностно ознакомился с DI, хотелось бы узнать как лучше организовать проект и внедрить зависимости в контексте PHP. Возможно имеются какие-то хорошие примеры кода и т.п. Было бы интересно познать как с этим паттерном работают и с чем его едят.
Покажите пример, так как по описанию выглядит подозрительно, будто Вы реализовали не DI, а Service Locator.Первое недоумение возникло на моменте обращения к содержимому контейнера по ключам
Ну к примеру вот кусок кода с документации php-di.DI является лишь частным случаем IoC. В качестве примера можете посмотреть реализацию в SymfonyВы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками Вход или Регистрация
Покажите пример, так как по описанию выглядит подозрительно, будто Вы реализовали не DI, а Service Locator.
Предметная область не должна ничего знать о том, как Вы управляете зависимостями.
$container = new Acclimate\Container\CompositeContainer();
// Add Symfony's container
$container->addContainer($acclimate->adaptContainer($symfonyContainer));
// Configure PHP-DI container
$builder = new \DI\ContainerBuilder();
$builder->wrapContainer($container);
// Add PHP-DI container
$phpdiContainer = $builder->build();
$container->addContainer($phpdiContainer);
// Good to go!
$foo = $container->get('foo');
Этот момент решается индивидуально для каждого из языков.Метод get не имеет представление какой тип данных возвращается, и поэтому ide не видит публичных методов, свойств и т.п.
/** @var FooClass */
$foo = $container->get('foo');
private FooClass $foo;
Ну вот мне было интересно как с этим работают в контексте php. Каждый раз при использовании писать аннотацию не сильно прикольно. Хорошим ли тоном будет создать фасад, например App.php, в нем сделать статик методы которые будут брать из контейнера компоненты, например:Этот момент решается индивидуально для каждого из языков.
Для PHP можно юзать что-то типа
PHP:/** @var FooClass */ $foo = $container->get('foo');
Или же с версии 7.4 для свойств классов можно указывать тип
PHP:private FooClass $foo;
Конкретно в моем случае все немного проще, я могу указать какой тип возвращается из контейнера
Посмотреть вложение 42470
class App extends Facade
{
public static function getFoo(): FooInterface
{
return static::$app->get('foo');
}
}
$foo = App::getFoo();
В реальном проекте не придется слишком много дергать get()Каждый раз при использовании писать аннотацию не сильно прикольно.
И в итоге превратится это в подобие глобального Service Locator'а, почти как в том же Yii. Лично я бы не рекомендовал.И обращаться всегда через фасад, метод которого знает тип возвращаемого значения.
Присматривался и к Symfony и к Laravel. Ну хоть убейте, не нравится мне структура приложения, разбросанные шаблоны, стили в public, шаблоны в другой директории, тонна конфигурации, веб сервер направлять в папку, и т.п. Хотелось собрать что-то простое, залил - работает. А не конфигурировать каждый раз веб сервер, за ним еще около десятка конфигов самого сайта и т.п. Понимаю что для большого проекта фреймворк это необходимость, но для меня прям хз.Попробуйте просто использовать Symfony для своих проектов, Вам должно понравиться.
В нем уже используется DI.
Угу, как раз PHP-DI и используется, потому выбор на него и пал)В нем уже используется DI.
Вы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками Вход или РегистрацияТам же и ссылки на доки по ним
Нет там же написаноУгу, как раз PHP-DI и используется, потому выбор на него и пал)
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?