kimono
@kimono
Web developer

Как узнать, есть ли запрашиваемый экшен в контроллере?

На сайте есть главное меню. В меню есть ссылки. Вроде бы все просто, ведь так у всех.
Для подстветки активного пункта меню используется проверка:
$liCssClass = Yii::$app->controller->id == 'news' ? 'menu-item-active' : 'menu-item';

И далее:
<li class="<?php echo $liCssClass ?>">Новости</li>

Для общего случая мне необходимо хранить пункты меню в базе и при запросе парсить url ссылки и подсвечивать активный пункт меню автоматом.
Для этого пишу код:
$currentController = \Yii::$app->controller;
$currentAction     = $currentController->action;
foreach($links as $link){
    list($controller, $actionId) = \Yii::$app->createController($link->url);
    if ($controller && $actionId) {
        if ($currentController->id == $controller && $actionId == $currentAction->id){
            $cssClass = 'menu-item-active';
        }
        else {
            $cssClass = 'menu-item';
        }
        $ul[] = Html::tag('li', $link->title, ['class' => $cssClass]);
    }
}


Загвоздка в том, что $controller может вернуться false, а $actionId может отсутствовать в $controller (ведь ссылки берутся из базы, а там можно ошибиться, и вставить битую ссылку).
Как это проверить? Достаточно ли такого кода: $controller->hasMethod('action'.$actionId), или это говнокод?
  • Вопрос задан
  • 130 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы