03 - Определение префикса вашего пространства имен
Компоненты
Когда вы разрабатываете расширение Joomla, вы определяете пространство имен, которое хотите использовать в своем файле манифеста, например, для com_example
:
<namespace path="src">Mycompany\Component\Example</namespace>
Давайте рассмотрим различные части этого:
-
Mycompany – вы можете указывать здесь все, что вам нравится - обычно указывается название компании, разработавшей расширение.
-
Component – для этого параметра должно быть установлено значение Component, если ваше расширение Joomla является component
-
Example – это должно соответствовать названию компонента, который вы разрабатываете
-
src – это подпапка, в которой вы храните файлы вашего класса. Вам не обязательно называть это так, но это обычная практика.
Из этого файла манифеста Joomla создаст 2 префикса пространства имен:
- 'Mycompany\Component\Example\Site' будет указывать на components/com_example/src
- 'Mycompany\Component\Example\Administrator' будет указывать на administrator/components/com_example/src
(Предполагая, что в вашем компоненте есть аспекты site и administrator).
Модули
Вы бы сделали то же самое для модулей:
<namespace path="src">Mycompany\Module\Example</namespace> <files> <filename module="mod_example">mod_example.php</filename> <folder>src</folder> <folder>tmpl</folder> </files>
Необязательно сопоставлять "Example" в пространстве имен с "mod_example" – именем модуля, – но вам, вероятно, будет проще это сделать.
Если это модуль сайта, то Joomla создаст префикс пространства имен:
'Mycompany\Module\Example\Site' будет указывать на modules/mod_example/src
Если это модуль администрирования, то Joomla создаст префикс пространства имен:
'Mycompany\Module\Example\Administrator' будет указывать на administrator/modules/mod_example/src
Плагины
Для плагинов:
<namespace path="src">Mycompany\Plugin\Content\Example</namespace> <files> <filename plugin="example">example.php</filename> <folder>src</folder> </files>
Здесь есть дополнительная часть пространства имен, которой необходимо присвоить тип плагина – 'Content' в примере выше.
И снова сегмент 'Example' в пространстве имен не обязательно должен точно соответствовать имени плагина plugin= "example" плагина.
Для приведенного выше Joomla создала бы префикс пространства имен:
'Mycompany\Plugin\Content\Example' будет указывать на plugins/content/example/src
Капитализация
Будьте осторожны, чтобы заглавные буквы в частях полного имени класса совпадали с заглавными буквами в названиях каталогов и файлов! Если вы разрабатываете в Windows, но вашей целевой системой является Linux, вы можете обнаружить, что ваше расширение работает на вашей машине разработки, но не в вашей целевой системе. Это связано с тем, что Windows прощает, если вы неправильно пишете заглавные буквы в именах файлов или каталогов – она все равно откроет файл для вас, – но Linux - нет.
Поиск своих занятий
После того как вы определились со своими пространствами имен, вы можете определить, где будут располагаться файлы вашего класса. Компоненты Joomla используют довольно плоскую структуру каталогов в src
, но вы этого не придерживаетесь. Пока вы придерживаетесь рекомендации PSR4 по сопоставлению полных имен классов с путями к файлам, Joomla найдет исходные файлы для ваших классов. Прошли те времена, когда вам приходилось угадывать, в каком каталоге хранить ваш вспомогательный файл и какое имя присвоить файлу!
Однако есть один случай, когда вам нужно протянуть Joomla руку помощи - в форме XML-файлов.
- если вы определяете пользовательское поле, вам нужно указать Joomla, где найти класс, который определяет это пользовательское поле
- если вы определяете пользовательское правило проверки, вам нужно указать Joomla, где найти класс, который определяет это правило
Поскольку XML-файлы не содержат операторы PHP <namespace>
, которые вы должны предоставить, эквивалентны, и проще всего сделать это, включив атрибут addfieldprefix
или addruleprefix
внутри XML-элемента, который указывает, где вы их используете, например:
<?xml version="1.0" encoding="utf-8"?> <form addruleprefix="Mycompany\Component\Example\Administrator\Rule" addfieldprefix="Mycompany\Component\Example\Administrator\Field" >
Глобальное пространство имен PHP
Если у вас есть <namespace>
оператор в вашем исходном файле PHP, тогда PHP по умолчанию предположит, что любые имена классов, на которые вы ссылаетесь в своем коде, будут находиться в этом пространстве имен. Поэтому, если вы используете какие-либо стандартные классы PHP, такие как Exception
, вам придется предварять их обратной косой чертой \Exception
. Обратная косая черта в начале указывает PHP, что это полное имя класса, и поскольку в этом FQN есть только один сегмент, он будет найден в глобальном пространстве имен.
Аналогично, если вы используете функцию, PHP попытается найти эту функцию в вашем пространстве имен. Но в отличие от classes, если он не найдет функцию в вашем пространстве имен, он вернется к поиску ее в глобальном пространстве имен. Так что это немного повысит производительность, если вы скажете PHP не утруждать себя поиском в вашем пространстве имен, добавив к имени функции обратную косую черту, например \strlen(...)
. Иногда вы увидите, что это присутствует в PHP-коде Joomla.