Article

Yii2 модуль

0 Что это и зачем?

Модуль - самостоятельная часть приложения, которую хотелось бы вынести в отдельное место, и переносить с проэкта на проэкт.
Пример: на фирме у нас создали свою форму, которая настроена, и её просто переносить:

Тоеть, сделали себе удобную часть функционала, запаковали в модуль, и потом его просто запаять в новый проэкт и немного поднастроить.

1 Как создать, за счет чего работает?

1) Cоздать модуль

  1. Gii -> create module
  2. Самому, создав директорию, в которой в корне будет лежать класс, наследованный от yii\base\Module**

**На Linux при Gii генерации может возникнуть ошибка, потому что недостаточно прав.

2) Подключить модуль к проэкту в конфигах

'modules' =>[
   'form1' => [
      'class' => 'app\modules\form1\Module'
   ],
.........................

2 Как с ним работать? Особенности, фишки

1) Модуль доступен по своему имени, которое мы присвоили в конфигах, в моём случае www.siteName.com/form1
При этом, полный путь по дефолту, вот такой: www.siteName.com/form1/default/index

И мы знакомимся с первым свойством - public $defaultRoute = 'default'

Если меняем например в модульном файле public $defaultRoute = 'site/about', то теперь при вызове www.siteNAme.com/form1 мы переходим на www.siteName.com/form1/site/about

Итак, какие свойства имеет yii\base\Module вообще?

  • id
  • defaultRoute
  • params
  • module
  • layout
  • controllerMap
  • controllerNamespace

id
Идентификатор, он и в африке идентификатор. В модуле public $id служит для того, чтобы различать несколько можулей, которые имеют общие корни, и есть вероятность, что мы используем не тот, к примеру: версия модуля формы 1,0 и 1.1. Данное свойство задаётся автоматом при подключении в конфигах:

'modules' =>[ 
   'form1' => [ // вот здесь, теперь в приложении id данного модуля - form1.
      'class' => 'app\modules\form1\Module'
   ],
.........................

Просто переопределить свойство в файле самого модуля не получится, зато можно изменить прямо в конфигурации:

'modules' =>[
   'form1' => [
      'class'             => 'app\modules\form1\Module',
      'id'                => 'form_ver_1.0'
   ],

или в init модуля:

public function init() 
  {
        parent::init();
        $this->id='module2_8881';

Теперь при вызове, например в контроллере:

 public function actionIndex()
{
   $module=\Yii::$app->getModule('form1');
   die(var_dump($module->id)); // получим нужный нам id модуля
}

params ==> список параметров, которые мы можем передать. Да, благодаря configurable мы можем задать публичные свойства, и нагнать их при конфигурации тоже. Данное свойство отлично заходит, если нужно передать большой массив, и нам откровенно пох**й на их содержимое(например: нам нужно собрать с массива А jsonLd строку Б на выходе

$layoutMicrodata = [
'context' => 'http://schema.org/',
'type' => 'Organization',
'url' => Url::home(true),
'logo' => Url::home(true) . 'images/logo_joule_03.svg',
'contactPoint' => [
'@type' => 'ContactPoint',
'contactType' => "customer service",
'telephone' => '+38 (067) 619-87-30',
],
];

) -> писать 100500 свойств будет неуместно и дорого по времени в таком случае(если думаете что тут не много, то это самый простой пример с реальной практики, тут могут быть ещё много мерные массивы ), тем более что к этот код нельзя поменять извне

module ==> обьект родительского модуля

# app\controllers\SiteController -> actionIndex
 Yii::$app->controller->module->id; //basic

# пробуем получить обьект родителя модуля приложения
 Yii::$app->controller->module->module;  // NULL

# а теперь го к нашему модулю
$module=Yii::$app->getModule('form1);
echo $module->id; //form1 
echo $module->module->id; // basic
echo $module->module->module->id; //NOTICE ERROR   

public $module позволяет нам работать с родительскими свойствами и методами

layuot ==> отвечает за шаблон, которым будет пользоватся модуль.
Изначально он не задан, и выбирает шаблон родителя.
Если задан false, то шаблон будет отключен для модуля.
Или, сами переопределите название файла, которое приложение будет искать во moduleName\views\layouts\fileName.php

# в файле модуля:
public $layout='my_layout'; // ожидается, что файл будет в @app/modules/form1/views/layouts/my_layout.php

ОК , но что если я хочу вызвать шаблон с именем my_layout, но с другого места, прим с вьюх приложения,
Для этого есть приватная private $_layoutPath, и геттеры/сеттеры для их установки, благодаря чему в init модуля можно сделать вот такую замену:

$this->layoutPath="@app/views/layouts";


public $controllerMap ==> то, же самое, что и controllerMap приложения. На практике ооооочень крутая вещь: настраивание названий для контроллеров внутри модуля.
Если у нас модуль служит для полноценного отображения, с урлами, и всем из этого выходящим, то мы не лезем в конфиги приложения, что бесценно с точки зрения архитектуры.
Прим:

public $controllerMap =[
'product' => [
'class' => 'app\modules\form1\controllers\SiteController',

]
]; # теперь site/index модуля ==> www.siteName.com/form1/product


public $controllerNamespace ==> изменение default значения для поиска контроллеров модуля. Хз зачем такое нужно на практике, ибо мы создали единую структуру, а контроллера перенесли в другое место, но такая возможность есть.







Third-party source 2

No data here

Dropdown
test 123