0 follower

Псевдонім маршруту та простір імен

Псевдоніми шляху широко використовуються в Yii. Псевдонім асоціюється із директорією або шляхом до файлу. При його вказуванні використовується точковий синтаксис, подібний із широко використовуваним форматом просторів імен:

RootAlias.path.to.target

де RootAlias — псевдонім існуючої директорії.

За допомого YiiBase::getPathOfAlias() ми можемо перетворити псевдонім у відповідний йому шлях. наприклад, system.web.CController буде перетворений у yii/framework/web/CController.

Також, ми можемо використовувати YiiBase::setPathOfAlias() для визначення нових кореневих псевдонімів.

1. Кореневий псевдонім

Для зручності, наступні системні псевдоніми вже визначені:

Крім того, якщо додаток використовує модулі, то у кожного модуля є співпадаючий з його ID кореневий псевдонім, який вказує на корінь модуля. Наприклад, якщо додаток використовує модуль з ID users, то буде визначений кореневий псевдонім users.

2. Імпорт класів

Використовуючи псевдоніми, дуже зручно імпортувати описи класів. Наприклад, для підключення класа CController можна викликати:

Yii::import('system.web.CController');

Використання методу import більш ефективно, ніж include та require, оскільки опис імпортуємого класу не буде включено до першого звертання (реалізовано через механізм автозавантаження класів PHP). Імпорт одного і того ж простору імен також відбувається набагато швидше, ніж при використанні include_once та require_once. Зверніть увагу, що імпорт каталогу не імпортує будь-який із його підкаталогів.

Підказка: Якщо ми посилаємося на клас фреймворку, то немає необхідності імпортувати або включати їх. Всі системні класи Yii уже імпортовані заздалегідь.

Використання таблиці класів

Починаючи із версії 1.1.5, Yii дозволяє попередньо імпортувати класи через той же механізм, що використовується для класів ядра. Такі класи можуть використовуватися де завгодно у додатку без необхідності іх попереднього імпорту або підключення. Дана можливість відмінно підходить для фреймворку або бібліотеки, які використовує Yii.

Для імпорту набору класів, виконайте наступний код до виклику CWebApplication::run():

Yii::$classMap=array(
    'ClassName1' => 'path/to/ClassName1.php',
    'ClassName2' => 'path/to/ClassName2.php',
    ......
);

3. Імпорт директорій

Можна використовувати наступний синтаксис для того, щоб імпортувати цілу директорію, а файли класів, які містяться у директорії, будуть підключені автоматично при необхідності.

Yii::import('system.web.*');

Окрім import, псевдоніми також використовуються у багатьох інших місцях, де є посилання на класи. Наприклад, псевдонім може бути переданий методу Yii::createComponent() для створення екземпляру відповідного класу, навіть якщо цей клас не був попередньо включений.

4. Простір імен

Простори служать для логічного групування імен класів, щоб їх можна було відрізнити від інших, навіть якщо їх імена співпадають. Не плутайте псевдонім шляху із простором імен. Псевдонім шляху — всього навсього зручний спосіб іменування файлів та директорій. До простору імен він не має ніякого відношення.

Підказка: Так як версії PHP до 5.3.0 не підтримують простори імен, ви не можете створити екземпляри класів з однаковими іменами, аде різними описами. По цій причині всі назви класів Yii-фреймворка мають префікс 'C' (який означає 'class'), щоб їх можна було відрізнити від користувальницьких класів. Для користувальницьких класів рекомендується використовувати інші префікси, зберігши префікс 'C' зарезервованим для Yii-фреймворка.

5. Класи у просторах імен

Клас у просторі імен — будь-який клас, описаний у неглобальному просторі імен. Наприклад, клас application\components\GoogleMap описаний у просторі імен application\components. Використання простору імен вимагає PHP 5.3.0 і вище.

Починаючи із версії 1.1.5 стало можливим використання класу з простору імен без його попереднього підключення. Наприклад, ми можемо створити новий екземпляр application\components\GoogleMap без явного підключення відповідного файлу. Це реалізується за допомогою покращеного завантажувача класів Yii.

Для того, щоб автоматично довантажити клас із простору імен, простір імен повинен бути названий у тому ж стилі, що і псевдоніми шляхів. Наприклад, клас application\components\GoogleMap повинен зберігатися у файлі, якому відповідає псевдонім application.components.GoogleMap.

Таким чином, для використання користувальницьких просторів імен, що починаються, наприклад із \mynamespace, де класи розташовані у /var/www/common/mynamespace/, єдине, що ви повинні зробити це визначити шлях псевдоніму, як наприклад:

Yii::setPathOfAlias('mynamespace', '/var/www/common/mynamespace/');

6. Контролери у просторах імен

За замовчуванням Yii використовує контролери із глобального простору імен. Ці класи знаходяться у protected/controllers. Ви можете змінити дану поведінку двома способами: використовуючи controllerMap та використовуючи controllerNamespace. Перший дозволяє використовувати контролери із різних просторів імен. Другий легше налаштовується, але задає один простір імен для всіх контролерів.

Використання controllerMap

Краще всього змінювати дану властивість через файл конфігурації (protected/config/main.php):

// додаємо простір імен "mynamespace"
Yii::setPathOfAlias('mynamespace', '/var/www/common/mynamespace/');
 
return array(
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
    'name'=>'My Web Application',
 
    'controllerMap' => array(
        'test' => '\mynamespace\controllers\TestController',
    ),

Коли користувач намагається завантажити будь-який із контролерів, визначених у controllerMap, Yii завантажує вказані класи, минаючи звичайний метод завантаження контролера. У випадку із test, Yii буде завантажувати класс із простору імен \mynamespace\controllers\TestController розташованного у /var/www/common/mynamespace/controllers/TestController.php.

Зверніть увагу, що код контролера повинен бути належним чином призначений до простору імен:

// визначаємо простір імен:
namespace mynamespace\controllers;
 
// відколи клас тепер знаходиться у просторі імен, звертання до глобального простору імен
// повинно відбуватися явно із використанням "\":
class TestController extends \CController
{
    public function actionIndex()
    {
        echo 'Це TestController із \mynamespace\controllers';
    }
}

Використання controllerNamespace

Так як додаток є модулем, то ви можете використовувати controllerNamespace так, як це описано далі у підрозділі "Модулі у просторах імен".

7. Модулі у просторах імен

Іноді корисно визначити простір імен для цілого модуля. Наприклад, якщо ви хочете помістити testmodule у простір імен \mynamespace\modules\testmodule, який вказує на /var/www/common/mynamespace/modules/testmodule, вам потрібно спочатку створити наступну файлову структуру:

/var/www/common/mynamespace/modules
  testmodule
    controllers
      DefaultController.php
    views
      default
        index.php
    TestmoduleModule.php

Представлення index.php таке саме, як і у звичайного модуля. TestmoduleModule.php та DefaultController.php знаходяться у просторі імен.

TestmoduleModule.php:

// визначаємо простір імен:
namespace mynamespace\modules\testmodule;
 
// відколи клас тепер знаходиться у просторі імен, звертання до глобального простору імен
// повинно відбуватися явно із використанням "\":
class TestmoduleModule extends \CWebModule
{
    // налаштування неглобального простору імен контролерів (також можна зробити за допомогою конфігурації)
    public $controllerNamespace = '\mynamespace\modules\testmodule\controllers';
 
    // звичайний код модуля
}

DefaultController.php:

<?php
// визначаємо простір імен:
namespace mynamespace\modules\testmodule\controllers;
 
// відколи клас тепер знаходиться у просторі імен, звертання до глобального простору імен
// повинно відбуватися явно із використанням "\":
class DefaultController extends \Controller
{
    public function actionIndex()
    {
        $this->render('index');
    }
}

Тепер залишилося тільки додати наш модуль до додатку. Найкращий спосіб зробити це, щоб вказати його у файлі конфігурації додатку (protected/config/main.php):

// додаємо простір імен "mynamespace"
Yii::setPathOfAlias('mynamespace', '/var/www/common/mynamespace/');
 
return array(
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
    'name'=>'My Web Application',
 
    'modules'=>array(
        'testmodule' => array(
            'class' => '\mynamespace\modules\testmodule\TestModuleModule',
        ),
    ),

Found a typo or you think this page needs improvement?
Edit it on github !