Здравствуйте! В процессе написания бота вк пришел таки к структуре MVC, во многом оглядываясь на Yii2, поэтому возник вопрос, как же связать все компоненты между собой? Например, запрос попадает в индексную страницу, где запускается экземпляр приложения App, который, в свою очередь, вызывает внутри себя же метод, соответствующий типу Callback-события (например, метод message_new). Класс App содержит внутри себя необходимые классы и конфиги. Так как мое приложение основано на сообщениях-командах, то в методе message_new я разбираю, что же там пришло и уже начинаю классический роутинг, то есть ищу контроллер и вызываю, и тут собственно проблема: как передать controller-у, да и модели экземпляр класса? В Yii2 это реализовано, как я понял, глобальным контейнером со статическим свойством $app, но я читал что глобальный доступ это плохо.
Как же всё-таки правильно это сделать, какие способы решения этой задачи существуют? И станет ли лучше, если я реализую тот же самый глобальный статик класс в виде Singleton?
Антон Р., не помню где, а по-моему даже на хабре, читал что Yii2 создан из сплошных антипаттернов (Синглтон тоже назвали антипаттерном). Понятно, что это лишь мнение, но я решил уточнить, чтобы избежать неочевидных проблем в дальнейшем
как передать controller-у, да и модели экземпляр класса?
- экземпляр какого класса ты имеешь в виду?
А по поводу "где то читал что вот так то плохо..." - если так и будешь водить жалом и слушать мнения других но никогда ничего не сделаешь, нужно иметь волю иногда идти против идиотских мнений кого то там.
Антон Р., Экземпляр класса App, чтобы и контроллер и модель имели доступ к, например, конфигу или определенным методам. Я, в принципе, уже начал пилить в сторону глобального статического класса
66demon666 бот на вебхуках? приходит событие от вк и потом что то делается? или это типа админка - управление со вьюхами и всем-всем-всем?
Если первое то контроллеры вообще можно выкинуть, в php-vk-api насколько я помню уже реализованы все методы типа OnNewMessage и handler.
Если второе, почему бы не написать Service для работы в вк, В контроллерах дергать этот сервис. ну тут как душе угодно.
И помоему di есть в yii2. Типа в конструкторе контроллера можно указывать. Хотя может надо что пошаманить перед этим
class CatController extends Controller
{
private $productService;
public function __construct($id, $module, ProductService $productService, $config = [])
{
$this->productService = $productService;
parent::__construct($id, $module, $config);
}
}
MVC это про идею, не про реализацию.
Вы можете реализовать через глобальный контейнер, если приложение не предполагается развивать и поддерживать большой командой. Можете упороться и сделать гибкую, продуманную конфигурацию оркестрации контроллерами, моделями и вьюхами и получить свой вариант Симфони. Техническая правильность решений уступает целесообразности их реализации.