Роль Namespaces в разработке на Drupal 8 или кто такие неймспейсы;)

Оригинал статьи: http://befused.com/drupal/namespaces

Само понятие Namespaces(Неймспейсы или "пространства имен") чисто ООП-шное, и так как Drupal 8 более тесно связан с Объектно-Ориентированным PHP, то и при переходе с 7-й версии Drupal на 8-ю, для разработки модулей необходимо иметь представление, что это за стек, для чего он нужен, и почему им пугают детей.

Симфонистам или другим спецам, кто прошел тернии ООП программирования понятие неймспейсов хорошо известно, так как встречается чуть ли не на каждом шагу. Для ответа на общий вопрос, "для чего нужны неймспейсы?" в кратце можно сказать, что неймспейсы применяют для предотвращения коллизии имен, для чего создаются отдельные зоны видимости.

Вспомним какой подход применялся в Drupal 7, все функции в PHP должны иметь уникальные(отличные друг от друга) имена. Если встречаются две одинаковые функции, Вы получите фатальную ошибку. Если имя функции не уникальное, система не будет знать, код какой функции ей нужно вызвать.

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

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

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

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

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

Установка простого модуля

Например, мы собираемся создать для демонстрационной цели модуль под названием hello. В директории /module создаем директорию под названием hello.

Наподобие .info файла в Drupal 7, создаем .yml файл конфигурации, содержащий основную информацию, и сообщающий Drupal о том, что модуль существует. Имя файла должно состоять из имени вашего модуля с расширением .info.yml, для данного примера оно будет таким hello.info.yml и будет располагаться в каталоге hello

Содержимое этого файла:

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

Создаем каталог src

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

Создаем внутри каталога hello папку src

Создаем простой контроллер

Нам необходим контроллер для вывода содержимого на странице, для его создания необходимо выполнить следующие шаги:

Создать каталог внутри папки src под названием Controller и затем в нем сам файл контроллера под названием HelloController.phpВ этом файле мы выведем простое сообщение:

<?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'),
  );
  }
}
?>

Давайте более подробно рассмотрим неймспейсы в этом коде

Namespaces

Как вы видите неймспейс был определен как Drupal\hello\Controller

Вы можете подумать, что этот неймспейс не соответствует структуре каталогов, иначе бы о имел вид Drupal|modules|hello|src|Controller.

Причина, по которой modules|src отсутствует в неймспейсе это соглашение, согласно которому пространство имен автоматически отражается на каталог src модуля. Поэтому критически важно следовать этой стандартной структуре каталогов в модулях.
Если вы будете использовать класс HelloController в различных неймспейсах, вы должны включить его с использованием ключевого слова use и неймспеса этого класса

use Drupal\hello\Controller\HelloController

Можно увидеть действие use на примере, когда наш класс HelloController расширяет класс ControllerBase, для того чтобы получить доступ к этому классу добавляется его неймспейс с помощью декларации:

use Drupal\Core\Controller\ControllerBase;

Если оператор use не использовать, то PHP будет искать класс ControllerBase в текущем пространстве имен, и выдаст фатальную ошибку. Таким образом использование оператора use позволяет использовать классы, находящиеся в других пространствах имен.

Добавляем роутинг(маршрут)

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

Для этого создаем файл hello.routing.yml и добавляем в него следующий код:

hello.content:
  path: '/hello'
  defaults:
   _controller: 'Drupal\hello\Controller\FirstController::content'
    _title: 'Hello world'
  requirements:
  _permission: 'access content'

Если мы перейдем по адресу /hello мы увидим сообщение, которое возвращает контроллер.

Неймспейсы в заключение

Неймспейсы это способ организации классов в виртуальные папки при которой гарантируется уникальность имен(имя класса может быть одинаковым, но пространства имен разные). Использование ключевого слова use позволяет использовать, при необходимости, классы из других пространств имен.

Profit

Share this post

Leave a comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To post pieces of code, surround them with <code>...</code> tags. For PHP code, you can use <?php ... ?>, which will also colour it based on syntax.
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.