HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 10.05.2022, 21:22
Mex-Vision
Постоянный
Регистрация: 01.03.2016
Сообщений: 828
С нами: 5368054

Репутация: 448


По умолчанию

В общем поверхностно ознакомился с DI, хотелось бы узнать как лучше организовать проект и внедрить зависимости в контексте PHP. Возможно имеются какие-то хорошие примеры кода и т.п. Было бы интересно познать как с этим паттерном работают и с чем его едят.

Основная цель: Правильно работать с зависимостями и их организацией.

Цель: собрать небольшой проект с использованием Slim, PHP DI, Illuminate db, fenom и т.п.

Теоретических знаний в сети достаточно, а вот практических особо не нашел. Всё заканчивается на демонстрации того что и так есть в доках.

Первое недоумение возникло на моменте обращения к содержимому контейнера по ключам, что не дает возможности банально видеть публичные свойства и методы объекта. Как обычно решают данную проблему? Ведь крайне неудобно работать вслепую оО.
 
Ответить с цитированием

  #2  
Старый 10.05.2022, 21:35
Mex-Vision
Постоянный
Регистрация: 01.03.2016
Сообщений: 828
С нами: 5368054

Репутация: 448


По умолчанию

В общем есть вопросы, некому задать(
 
Ответить с цитированием

  #3  
Старый 10.05.2022, 21:59
EasyGameProtection
Постоянный
Регистрация: 13.07.2021
Сообщений: 415
С нами: 2545922

Репутация: 253
По умолчанию

Цитата:
Сообщение от Mex-Vision  

В общем поверхностно ознакомился с DI, хотелось бы узнать как лучше организовать проект и внедрить зависимости в контексте PHP. Возможно имеются какие-то хорошие примеры кода и т.п. Было бы интересно познать как с этим паттерном работают и с чем его едят.
DI является лишь частным случаем IoC. В качестве примера можете посмотреть реализацию в Symfony The DependencyInjection Component (Symfony Docs)

Цитата:
Сообщение от Mex-Vision  

Первое недоумение возникло на моменте обращения к содержимому контейнера по ключам
Покажите пример, так как по описанию выглядит подозрительно, будто Вы реализовали не DI, а Service Locator.

Предметная область не должна ничего знать о том, как Вы управляете зависимостями.
 
Ответить с цитированием

  #4  
Старый 10.05.2022, 22:15
Mex-Vision
Постоянный
Регистрация: 01.03.2016
Сообщений: 828
С нами: 5368054

Репутация: 448


По умолчанию

Цитата:
Сообщение от EasyGameProtection  

DI является лишь частным случаем IoC. В качестве примера можете посмотреть реализацию в Symfony The DependencyInjection Component (Symfony Docs)

Покажите пример, так как по описанию выглядит подозрительно, будто Вы реализовали не DI, а Service Locator.
Предметная область не должна ничего знать о том, как Вы управляете зависимостями.
Ну к примеру вот кусок кода с документации php-di.

PHP:


Код:
$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 не видит публичных методов, свойств и т.п. Приходится работать вслепую, либо при каждом использовании дописывать аннотации. Как обычно решают данную проблему?
 
Ответить с цитированием

  #5  
Старый 10.05.2022, 22:50
EasyGameProtection
Постоянный
Регистрация: 13.07.2021
Сообщений: 415
С нами: 2545922

Репутация: 253
По умолчанию

Цитата:
Сообщение от Mex-Vision  

Метод get не имеет представление какой тип данных возвращается, и поэтому ide не видит публичных методов, свойств и т.п.
Этот момент решается индивидуально для каждого из языков.

Для PHP можно юзать что-то типа

PHP:


Код:
/** @var FooClass */
$foo
=
$container
-
>
get
(
'foo'
)
;
Или же с версии 7.4 для свойств классов можно указывать тип

PHP:


Код:
private
FooClass
$foo
;
Конкретно в моем случае все немного проще, я могу указать какой тип возвращается из контейнера
 
Ответить с цитированием

  #6  
Старый 10.05.2022, 23:03
Mex-Vision
Постоянный
Регистрация: 01.03.2016
Сообщений: 828
С нами: 5368054

Репутация: 448


По умолчанию

Цитата:
Сообщение от EasyGameProtection  

Этот момент решается индивидуально для каждого из языков.
Для PHP можно юзать что-то типа

PHP:


Код:
/** @var FooClass */
$foo
=
$container
-
>
get
(
'foo'
)
;
Или же с версии 7.4 для свойств классов можно указывать тип

PHP:


Код:
private
FooClass
$foo
;
Конкретно в моем случае все немного проще, я могу указать какой тип возвращается из контейнера
Ну вот мне было интересно как с этим работают в контексте php. Каждый раз при использовании писать аннотацию не сильно прикольно. Хорошим ли тоном будет создать фасад, например App.php, в нем сделать статик методы которые будут брать из контейнера компоненты, например:

PHP:


Код:
class
App
extends
Facade
{
public
static
function
getFoo
(
)
:
FooInterface
{
return
static
:
:
$app
-
>
get
(
'foo'
)
;
}
}
$foo
=
App
:
:
getFoo
(
)
;
И обращаться всегда через фасад, метод которого знает тип возвращаемого значения.
 
Ответить с цитированием

  #7  
Старый 10.05.2022, 23:31
EasyGameProtection
Постоянный
Регистрация: 13.07.2021
Сообщений: 415
С нами: 2545922

Репутация: 253
По умолчанию

Цитата:
Сообщение от Mex-Vision  

Каждый раз при использовании писать аннотацию не сильно прикольно.
В реальном проекте не придется слишком много дергать get()

Для примера в Symfony контейнер конфигурируется через отдельный конфиг, не надо дергать контейнер напрямую:

Цитата:
Сообщение от Mex-Vision  

И обращаться всегда через фасад, метод которого знает тип возвращаемого значения.
И в итоге превратится это в подобие глобального Service Locator'а, почти как в том же Yii. Лично я бы не рекомендовал.

Попробуйте просто использовать Symfony для своих проектов, Вам должно понравиться.
 
Ответить с цитированием

  #8  
Старый 11.05.2022, 00:15
Mex-Vision
Постоянный
Регистрация: 01.03.2016
Сообщений: 828
С нами: 5368054

Репутация: 448


По умолчанию

Цитата:
Сообщение от EasyGameProtection  

Попробуйте просто использовать Symfony для своих проектов, Вам должно понравиться.
Присматривался и к Symfony и к Laravel. Ну хоть убейте, не нравится мне структура приложения, разбросанные шаблоны, стили в public, шаблоны в другой директории, тонна конфигурации, веб сервер направлять в папку, и т.п. Хотелось собрать что-то простое, залил - работает. А не конфигурировать каждый раз веб сервер, за ним еще около десятка конфигов самого сайта и т.п. Понимаю что для большого проекта фреймворк это необходимость, но для меня прям хз.
 
Ответить с цитированием

  #9  
Старый 11.05.2022, 02:57
kick
Флудер
Регистрация: 20.01.2015
Сообщений: 7,201
С нами: 5952720

Репутация: 6527


По умолчанию

Цитата:
Сообщение от Mex-Vision  

Slim
В нем уже используется DI.

Dependency Container

www.slimframework.com


Там же и ссылки на доки по ним
 
Ответить с цитированием

  #10  
Старый 11.05.2022, 03:39
Mex-Vision
Постоянный
Регистрация: 01.03.2016
Сообщений: 828
С нами: 5368054

Репутация: 448


По умолчанию

Цитата:
Сообщение от kick  

В нем уже используется DI.



Dependency Container

www.slimframework.com


Там же и ссылки на доки по ним
Угу, как раз PHP-DI и используется, потому выбор на него и пал)
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.