2

Есть ли способ сразу получить внутренний путь в виде строки типа controller/action.

Знаю, что можно сделать так:

$internalRoute = 

  Yii::$app->controller->id . '/' . Yii::$app->controller->action->id

Или так, если в view:

$internalRoute = 

  $this->context->id . '/' . $this->context->action->id

Но что-то мне подсказывает, что можно и сразу получить строку controller/action?

  • Не проще тебе написать статичную функцию, которая будет выводить?) – Urmuz Tagizade May 04 '16 at 13:10
  • Интернет нам подксказывает что можно и так Yii::app()->urlManager->parseUrl(Yii::app()->request) – koks_rs May 04 '16 at 13:21
  • @UrmuzTagizade, не совсем понял о чём вы. В общем, так как мне нужен был внутренний путь в шаблоне, то я просто пока (так как учусь ещё :)) определил (define()) константу. – Roman Grinyov May 04 '16 at 13:53
  • @koks_rs, как я понял, так можно было делать в Yii, а в Yii2 такое работать не будет. – Roman Grinyov May 04 '16 at 13:55

2 Answers2

2

Чтобы получить внутренний маршрут в виде строки (controller/action) в «любом» месте приложения, нужно обратиться к свойству route класса yii\base\Controller:

Yii::$app->controller->route

В самом контроллере можно обращаться так:

$this->route

А в представлении так:

$this->context->route
0

Если использовать:

yii\helpers\Url;

то можно обращаться так:

Url::toRoute([]);

или

Url::to([]);

а если нужно получиться адрес страницы, который преобразуется для пользователя, то так:

Url::to();
MasterAlex
  • 6,177
  • 1
  • 12
  • 23
  • У вас ошибка: если просто передать пустой массив ([]), как для toRoute(), так и для to(), то выскочит Undefined offset: 0. А вот если передать массив с одним элементом, для обоих методов, — пустой строкой (['']) или просто пустую строку, то вернётся абсолютный (от корня сайта) URL, хотя в документации сказано, что должен route (?) ... Метод to() при вызове без аргументов также возвращает URL. Всё вышесказанное можно легко проверить, если определить правила для urlManager'а. Мне нужен именно внутренний маршрут: controller/action (его можно получить как описано в моём ответе). – Roman Grinyov May 22 '16 at 17:36
  • У меня в рабочем проекте при Url::toRoute([]); и Url::to([]); ошибок никаких нет, но вообще да, метод выдаёт немного не то что нужно :) – MasterAlex May 22 '16 at 18:09
  • Странно конечно, что у вас не вываливается Undefined offset: 0, так как если глянуть в исходный код, то можно увидеть, что сначала (представляем, что мы передали пустой массив) переданный (первый) аргумент преобразовывается в массив: $route = (array) $route; — получаем всё тот же пустой массив. Затем мы обрабатываем элемент с нулевым индексом: $route[0] = static::normalizeRoute($route[0]); ... Упс — а нет-то элемента с нулевым индексом. Упрощённый пример: http://sandbox.onlinephpfunctions.com/code/d6dd24dd40296dd9e5c4b6760948008932239136. – Roman Grinyov May 22 '16 at 20:30