Cекреты Admin Routing в CakePHP

В CakePHP администратор маршрутов (admin routing) довольно прост: вы можете включить его, вы можете отключить его, вы можете изменить преффикс для него.  Но это не все действия, которые вы можете провести с ним. Правильно?

Я собираюсь рассказать маленький секрет про этот кусок кода:

Configure::write('Routing.admin', 'admin');

Это в значительной степени не важно.

Изначально(т.е 1.1 версии и ниже), администратор маршрутов был довольно статичным. Однако,  был переработан в 1.2 так, что вы можете создавать администраторов маршрута (сейчас они называются  "prefix routes" или "префикс пути") тем же путем, что создаете нормальные маршруты. Была поддержана сама конфигурация для обратной совместимости, поэтому они почти функционально идентичны:

Router::connect('/admin/:controller/:action/*', array(
'action' => null, 'prefix' => 'admin', 'admin' => true
));

Я говорю "почти" потому что есть одна вещь в коде что не поддерживает часть, которой являются плагины, но это может быть исправлено так же просто:

if ($plugins = Configure::listObjects('plugin')) {
$pluginMatch = implode('|', array_map(array('Inflector', 'underscore'), $plugins));
Router::connect(
"/admin/:plugin/:controller/:action/*",
array('action' => null, 'prefix' => 'admin', 'admin' => true),
array('plugin' => $pluginMatch)
);
}

Быстрое объяснение параметров:

  • 'prefix' => 'admin' - это специальный ключ маршрутизации определяющий приставку(т.е. префикс), который добавляется к действию. Так как этот ключ изменяет путь, в котором запрос отправляется, а не сам запрос, это не учитывается при обратной маршрутизации. Что приводит нас к следующему ключу ...
  • 'admin' => true - потому что "префикс" не учитывается при обратной маршрутизации, мы нуждаемся в использовании пользовательского флага, чтобы дифференцировать маршрут, и дать нам что-то проверить, когда запрос достигает этого маршрута. Хотя имя этого ключа совпадает со значением "префикс" по соглашению, этот флаг действительно может быть чем угодно, пока не изменяется пользователем (то есть, не существует непосредственно в шаблоне URL ).
  • "action" => null -  позволяет маршруту соответствовать с или без определяемого действия(в том случае где по умолчанию используется "index" действие происходит как обычно).
  • "plugin'=> $ pluginMatch - в маршруте для плагина, этот ключ присутствует как третий параметр, для того чтобы определить для :plugin набор только действительных названий плагинов.

Использования эти параметры, вы можете создавать столько префиксов маршрутов, сколько вам потребуется. Однако, имейте в виду, что эти флаги не сохраняются по умолчанию. Но вы можете сказать Cake для сохранения определенных параметров автоматически, как в этом примере с PaginatorHelper:

$paginator->options(array('url' => array('admin' => true)));
echo $paginator->link('Page 2', array('page' => 2));

Однако, это относится только к URL генерируемый PaginatorHelper. Чтобы обобщить его для всех помощников ("helpers"), вы можете реализовать простую проверку в AppHelper, работающую следующим образом:

App::import('Core', 'Helper');
class AppHelper extends Helper {
function url($url = null, $full = false) {
if (isset($this->params['admin']) && is_array($url) && !isset($url['admin'])) {
$url['admin'] = $this->params['admin'];
}
return parent::url($url, $full);
}
}

Этот код может экстраполироваться вне сохранения каких-либо параметров Вашего приложения.

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

Взято и переведено с bakery.cakephp.org

Поделиться @
aaa, 28 мая 2022 в 21:14