Yii2: Шпаргалка по работе с роутами
Часто приходится работать с различными проверками роутов в Yii2. И практически всегда, я забываю или начинаю путаться где и с помощью каких методов можно получить то или иное значение связанное с роутами и как результат приходится копаться в исходниках. В этом посте я соберу кусочки кода, с объяснением что они возвращают.
Получить текущий controller
1 2 3 |
Yii::$app->controller |
Результат: Object, по-умолчанию это будет инстанс \yii\web\Controller
Получить текущий action
1 2 3 |
Yii::$app->controller->action |
Результат: Object, по-умолчанию это будет инстанс \yii\base\Action
Получить название текущего controller-а
1 2 3 |
Yii::$app->controller->id |
Результат: String. В случае ['site/index', 'param'=>'abc'], это "site".
Получить название текущего action-а
1 2 3 |
Yii::$app->controller->action->id |
Результат: String. В случае ['site/index', 'param'=>'abc'], это "index".
Получить текущий route
1 2 3 |
Yii::$app->controller->route |
Результат: String. В случае ['site/index', 'param'=>'abc'], это "site/index".
Проверить совпадает ли текущий route с указанным
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$url = ['site/index']; $route = Yii::getAlias($url[0]); if ($route[0] !== '/' && Yii::$app->controller) { $route = Yii::$app->controller->module->getUniqueId() . '/' . $route; } if (ltrim($route, '/') === Yii::$app->controller->getRoute()) { // совпадает } |
Обратите внимание, что проверяется только route, без параметров, т.е. в случае сравнения ['site/index'] и ['site/index', 'param'=>1] это сравнение скажет что route-ы идентичны
Получить параметры текущего url
1 2 3 |
Yii::$app->request->getQueryParams(); |
Результат: Array. В случае ['site/index', 'param'=>'abc'], вернет ['param'=>'abc'].
Сравнить параметры текущего url и указанного
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$url = ['site/index', 'param'=>'abc', '#'=>'anchor']; $identicalParams = null; if (isset($url['#'])) unset($url['#']); if (count($url) > 1) { $params = $url; unset($params[0]); $queryParams = Yii::$app->request->getQueryParams(); $identicalParams = true; foreach ($params as $name => $value) { if ($value !== null && (!isset($queryParams[$name]) || $queryParams[$name] != $value)) { $identicalParams = false; break; } } } |
Результат: Null или True или False
Проверить совпадает ли текущий route с указанным включая GET параметры
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public static function isActiveUrl($url){ $isActive = false; if (is_array($url) && isset($url[0])) { $route = Yii::getAlias($url[0]); if ($route[0] !== '/' && Yii::$app->controller) { $route = Yii::$app->controller->module->getUniqueId() . '/' . $route; } if (ltrim($route, '/') === Yii::$app->controller->getRoute()) { unset($url['#']); $matchRoute = true; if (count($url) > 1) { $params = $url; unset($params[0]); $queryParams = Yii::$app->request->getQueryParams(); foreach ($params as $name => $value) { if ($value !== null && (!isset($queryParams[$name]) || $queryParams[$name] != $value)) { $matchRoute = false; break; } } } $isActive = $matchRoute; } } return $isActive; } |
Пример использования:
1 2 3 |
isActiveUrl(['site/index', 'param'=>'abc']); |
Создать объект контроллера из URL
1 2 3 |
Yii::$app->createController(['site/index', 'param'=>'abc']) |
Результат: Null | False | Array. В случае если объект создан, вернет массив [(object) controller, (string) actionId].
Создать объект action-а из URL
1 2 3 4 5 6 7 8 9 10 11 12 |
$controller = Yii::$app->createController(['site/index', 'param'=>'abc']) $controllerObject = null; $actionObject = null; if ($controller) { $controllerObject = $controller[0]; $actionId = $controller[1]; $actionObject = $controllerObject->createAction($actionId); } |
Результат: Null | (Object yii\base\Action). В случае если объект создан, вернет объект \yii\base\Action.
Проверить совпадает ли текущий route с указанными в массиве
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public static function inUrlsArray($url=null, $urlsItems=[]) { if (!$urlsItems) return false; if (is_null($url)) { // use current route $controller = [Yii::$app->controller, Yii::$app->controller->action->id]; } else { $controller = Yii::$app->createController($url); if (!$controller) return false; } $controllerId = $controller[0]->id; $actionId = $controller[1]; $found = false; foreach($urlsItems as $urlItem) { if ($urlItem[0] == '*' || $controllerId == $urlItem[0]) { if ($urlItem[1] == '*' || $actionId == $urlItem[1]) { $found = true; break; } } } return $found; } |
Пример использования:
1 2 3 4 |
isUrlInArray(['site/index'], [['site','*'],['contact','index']]); isUrlInArray(null, [['site','*'],['contact','index']]); |
Вместо controller-а и action-а можно использовать символ "*", в этом случае проверка совпадет с любым controller-ом, action-ом
Пока все, если у Вас есть чем дополнить эту статью, пишите в комментарии.
Author: | Tags: /
| Rating:
Leave a Reply