Обзор MVCFactory в Joomla 5

от автора

Класс Joomla\CMS\MVC\Factory\MVCFactory используется в Joomla для создания экземпляров классов компонентов Controller, View, Model и Table.

Каждый компонент имеет свой собственный экземпляр класса MVCFactory, который создается путем передачи префикса пространства имен этого компонента.

В классе MVCFactory есть методы для создания контроллера, представления, модели и тацлицы (createController, createView, createModel, createTable).

Например, если ваш компонент — com_example с префиксом пространства имен \Mycompany\Component\Example, то внутри вашего класса Controller вы можете использовать код:

$model = $this->factory->createModel('Example', 'Administrator');

а метод MVCFactory попытается создать экземпляр \Mycompany\Component\Example\Administrator\Model\ExampleModel.

А класс библиотеки MVC BaseController делает эту задачу еще проще, и вам просто нужно вызвать:

$model = $this->getModel('example', 'administrator');

Обратите внимание, что теперь на фронте вы можете создавать и использовать модели из админки и наоборот. Ограничений нет.

Создание экземпляра класса MVCFactory​

Экземпляр MVCFactory вашего компонента создается путем определения его как зависимости в файле services/provider.php, но вам не обязательно понимать все тонкости внедрения зависимостей Joomla, чтобы использовать его эффективно.

Создание экземпляра класса контроллера

Класс Controller создается в функции диспетчеризации класса ComponentDispatcher. Он имеет переменную экземпляра, указывающую на класс MVCFactory, и вызовет:

$controller = $this->mvcFactory->createController($name, $client, ..);

передавая $name из первой части параметра task (или 'display', если параметра задачи нет), а $client устанавливая на 'site' или 'administrator', в зависимости от того, выполняется ли это на фронтенде или бэкенде.

Instantiating the Controller

Instantiating the Controller

На этой диаграмме (и на следующей):

  • классы «Factory» выделены синим цветом, а обычные классы «MVC» — желтым;

  • пунктирные синие линии указывают на то, что один класс имеет переменную экземпляра, которая указывает на экземпляр другого класса;

  • сплошные черные линии представляют вызовы методов;

  • толстые сплошные красные линии обозначают место, где класс Factory создает экземпляр класса.

Создание экземпляров классов View, Model и Table​

Instantiating View, Model, Table

Создание экземплятов View, Model, Table

С парадигмой Joomla MVC Factory:

  • контроллер отвечает за создание экземпляров Представления и Модели и может вызывать getView и getModel для этого;

  • модель отвечает за создание экземпляра Таблицы и может вызвать getTable, чтобы сделать это.

Представление также может получить Модель через вызов getModel, но только если Контроллер настроил это, сначала получив экземпляр Модели и передав его в Представление:

$view->setModel($model);

Имена по умолчанию для классов View, Model и Table

В то время как имя для контроллера берётся из параметра task, имена по умолчанию для классов View, Model и Table берутся из параметра view. Эти классы по умолчанию — будут созданы, если вы просто вызовете getView(), getModel() и getTable() без каких-либо параметров.

Так, например, имена классов, созданных для запроса с URL-запросом «?option=com_example&view=viewname» и без параметра task, будут следующими:

  • <namespace>\Controller\DisplayController

  • <namespace>\View\Viewname\HtmlView

  • <namespace>\Model\ViewnameModel

  • <namespace>\Table\ViewnameTable

Резюме​

В этом материале мы поверхностно рассмотрели принципы работы с классами MVC.

В контроллере вы можете создать представление и модель, а также дать представлению ссылку на модель:

$model = $this->getModel();           // to get the default Model, based on the view= parameter $foomodel = $this->getModel('foo');   // to get the Model\FooModel $view = $this->getView();             // to get the default View, based on the view= parameter $fooview = $this->getView('foo');     // to get the View\Foo\HtmlView $view->setModel($model, true);        // to set the view's default model, accessible inside the view by $this->getModel() $view->setModel($foomodel);           // make the $foomodel accessible to the view by $this->getModel('foo')

Для создания нескольких моделей, передайте имя каждой из них в метод getModel:

$foomodel = $this->getModel('foo'); $barmodel = $this->getModel('bar');   

Если ваш компонент работает на фронте, но вы хотите получить его модель администратора, просто передайте второй параметр $prefix:

$model = $this->getModel('foo', 'administrator');

В своем представлении вы можете получить доступ к модели, настроенной контроллером:

$model = $this->getModel();           // to get the default model $foomodel = $this->getModel('foo');   // to get the foo model

В модели вы можете создать таблицу:

$table = $this->getTable();           // if your Table class matches the view= parameter in the HTTP request $table = $this->getTable('example');  // to get the ExampleTable class

Проблемы

Основной причиной введения класса MVCFactory было избавление от использования вызовов static::getInstance() для получения экземпляра одного из классов MVC. Однако вы можете обнаружить одну или две проблемы с этим подходом.

Например, при сохранении записи базы данных в классе Table (например, в Joomla\CMS\Table\Content::store()), Joomla получает другой экземпляр этого класса Table, чтобы проверить, что псевдоним, который будет сохранен, уникален. Однако при создании экземпляра Table ему не передается указатель на экземпляр MVCFactory, поэтому он не может создать другой экземпляр с помощью метода createTable MVCFactory. В Joomla 4 решением было использование устаревшей функции getInstance():

$table = Table::getInstance('Content', 'JTable', ['dbo' => $this->getDbo()]);

В Joomla 5 он просто создает новую версию себя:

$table = new self($this->getDbo(), $this->getDispatcher());

Таким образом, вы можете использовать аналогичный подход, чтобы избежать использования устаревшего метода getInstance (или просто выполнить SQL-запрос непосредственно к таблице базы данных).


ссылка на оригинал статьи https://habr.com/ru/articles/895634/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *