Класс 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'
, в зависимости от того, выполняется ли это на фронтенде или бэкенде.

На этой диаграмме (и на следующей):
-
классы «Factory» выделены синим цветом, а обычные классы «MVC» — желтым;
-
пунктирные синие линии указывают на то, что один класс имеет переменную экземпляра, которая указывает на экземпляр другого класса;
-
сплошные черные линии представляют вызовы методов;
-
толстые сплошные красные линии обозначают место, где класс Factory создает экземпляр класса.
Создание экземпляров классов 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/
Добавить комментарий