Drupal 8. Введение в пространства имен.

Drupal 8. Введение в пространства имен.

Drupal 8 широко использует классы PHP вместо простых функций. Два класса могут иметь одинаковые имена, так как они имеют
разные пространства имен.

Вы можете думать об этом как о способе организации классов в папки и подпапки, а пространство имен – как путь к файлу. Если вы попытаетесь создать один и тот же файл с тем же именем в той же папке, вы получите ошибку. Вы можете изменить имя файла, но если вы действительно хотите сохранить то же имя файла, вы, скорее всего, создадите подпапку и поместите туда файл. Это делает файл уникальным, потому что он имеет другой путь. Пространство имен работает таким же образом.

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

Создайте простой модуль

Создайте модуль с именем hello для демонстрационных целей. В папке / module создайте каталог с именем hello.

Создайте файл info .yml
Файл info .yml сообщает Drupal, что ваш модуль существует.

Создайте hello.info.yml в корне каталога hello .

name: Hello Word
description: An experimental module to build our first Drupal 8 module
package: Custom
type: module
version: 1.0
core: 8.x

Создайте каталог src
В Drupal 8 большинство модулей могут иметь контроллеры, плагины, формы, шаблоны и / или тесты. Они хранятся в папке с
именем src , что сокращенно от source.

Создайте в папке hello module папку с именем src

Создать базовый контроллер
Нам нужен контроллер страницы для вывода контента на страницу.
Вот шаги для создания основного контроллера для модуля:

  • Создайте в src папку с именем Controller.
  • В папке Controller создайте файл с именем HelloController.php.
  • В HelloController.php мы создадим простое сообщение «hello world», чтобы мы знали, что оно работает.
<?php
/** 

* @file
* Contains \Drupal\hello\Controller\HelloController. 

*/
namespace Drupal\hello\Controller;
use Drupal\Core\Controller\ControllerBase;
class HelloController extends ControllerBase {
public function content() {
return array(
'#type' => 'markup',
'#markup' => t('Hello world'),
);
}
}

Давайте рассмотрим строку пространства имен в этом коде.

Пространства имен

Из приведенного выше кода видно, что пространство имен определено как Drupal \ hello \ Controller .
Вы можете подумать, что это не совсем соответствует структуре папок, потому что, если это так, пространство имен будет Drupal \modules \ hello \ src \ Controller .
Причина, по которой modules \ src отсутствует в пространстве имен, заключается в том, что пространства имен для модулей Drupal автоматически сопоставляются с папкой src модуля. Вот почему так важно следовать этой стандартной структуре папок в модулях.
Если бы вы использовали этот класс HelloController в разных пространствах имен, вы бы включили его в ключевое слово use и его
пространство имен.
use Drupal\hello\Controller\HelloController
Вы можете сделать это с помощью оператора use в примере выше. HelloController расширяет другой класс, называемый ControllerBase. Чтобы получить доступ к этому классу, он был добавлен с его пространством имен через следующий оператор использования:
use Drupal\Core\Controller\ControllerBase;
Если этот оператор не был включен, то PHP будет искать ControllerBase в текущем пространстве имен (Drupal \ hello \Controller). Там его не найти, поэтому вы получите фатальную ошибку. Таким образом, оператор use позволяет вам использовать классы из других пространств имен.

Добавить файл маршрута

Контроллер, который мы создали выше, на этом этапе ничего не сделает. Давайте исправим это, заставив возвращать строку, когда вы перейдете по определенному URL.
Чтобы такой контроллер вызывался и выполнялся, ему необходимо сопоставить маршрут от URL-адреса к контроллеру.

  • Создайте файл с именем hello.routing.yml в корне папки hello
  • Добавьте следующий код в hello.routing.yml
hello.content:
path: '/hello'
defaults:
_controller: 'Drupal\hello\Controller\HelloController::content'
_title: 'Hello world'
requirements:
_permission: 'access content'

Посмотреть содержание

Если вы еще этого не сделали, включите модуль hello и очистите кеш. Если вы сейчас перейдете по пути http://example.com / hello, вы увидите сообщение Hello World, которое возвращается из контроллера.

Пространства имен в двух словах

Пространство имен является способом организации ваших классов в виртуальные папки и гарантирует, что ваш класс не конфликтует с другим классом с таким же именем (имя класса может быть таким же, но пространство имен уникально). Ключевое слово use
позволяет вам использовать классы из других пространств имен, когда они вам нужны.

Статья была полезной? Поделитесь с друзьями!
Метки: ,