2015-07-15 2 views
8

Согласно Yii2 documentation, я должен быть строить URL, как следующие:Yii2 - createUrl() с массивом параметров?

$appUrl = Yii::$app->urlManager->createUrl([Yii::$app->controller->id . '/' . Yii::$app->controller->action->id,'p1' => 'v1','p2' => 'v2'] , null); 

Он выводит:

/index.php?r=users%2Findex & p1 = v1 & p2 = v2

Какой правильный выход. Теперь, что, если у меня есть массив параметров, которые я прямо хочу передать методу createUrl()? Следующий код объясняет мою проблему:

$arrayParams = ['p1' => 'v1' , 'p2' => 'v2']; 
$appUrl = Yii::$app->urlManager->createUrl([Yii::$app->controller->id . '/' . Yii::$app->controller->action->id,$arrayParams] , null); 

Выход в этом случае:

/index.php?r=users/index & 1 [p1] = v1 & 1 [p2] = v2

В то время как выход должен быть:

index.php г = пользователей/индекс & p1 = v1 & p2 = v2

Пожалуйста, обратите внимание, что $arrayParams порождается другим способом, и я не могу извлечь все ключи и значения и передать их по одному в createUrl(). Это будет очень дорогостоящим ИМО. Как достичь этого, используя api?

+0

Для только один параметр: 'urlManager-> createUrl ([ "пост/просмотр"," идентификатор "=> $ post-> id])?>' –

+0

Полезно использовать '' '' Url :: to() '' 'вместо' '' Yii :: $ app-> urlManager-> createUrl() '' ' –

+0

@ ГерманХохлов согласен. Я был относительно новым для Yii 2, когда я спросил об этом. Я понятия не имел, что у нас есть метод Url :: to(). Он короткий и не связан с $ app, который мне нравится. – Gogol

ответ

14

Используйте array_merge для создания требуемой структуры массива.

$controller = Yii::$app->controller; 
$arrayParams = ['p1' => 'v1' , 'p2' => 'v2']; 

$params = array_merge(["{$controller->id}/{$controller->action->id}"], $arrayParams); 

Yii::$app->urlManager->createUrl($params); 
+0

Сладкое спасибо. Именно то, что я искал. Отметьте свой ответ как принято :) – Gogol

1

Тот же результат можно достичь с помощью Yii::$app->controller->route

$route = Yii::$app->controller->route; 
$arrayParams = ['p1' => 'v1' , 'p2' => 'v2']; 
$params = array_merge([$route], $arrayParams); 
Yii::$app->urlManager->createUrl($params); 
Смежные вопросы