Yii2 url routing to get a string parameter - php

I have a url like this
http://localhost/yii2/category/my-custom-string-parameter
I need to get the text my-custom-string-parameter
And I setup the rules like this
'urlManager' => [
'class' => 'yii\web\UrlManager',
'showScriptName' => false,
'enablePrettyUrl' => true,
'rules' => array(
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'category/<url:>' => 'category/view',
),
],
This always give me 404 error.
What should I do?

replace 'category/<url:>' => 'category/view',, with 'category/<id:\w+>' => 'category/view'
Routing to View need an id and to use a string use w+ not url:

Related

Pretty Url formattion in Yii2

I have a Yii 2 application and I'd like to use some pretty URL. In my config file I already enable the pretty URL with the below rules:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
//'suffix' => '.html',
'rules' => [
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>/<slug:[a-zA-Z0-9_-]+>/' => '<controller>/<action>/<slug>',
'<controller:[\w\-]+>/<action:[\w\-]+>/slug/<slug:\d+>/id/<id:\w+>/itmNo/<itmNo:\w+>' => '<controller>/<action>/<slug>',
],
],
And the URL result is something like this http://192.168.1.101/myproject/item?Id=mens-body-fitted-t-shirt-2018-summer-fashion-2&itmNo=82813720
In the above URL item is the controller while Id and itmNO are queries, I'd like to get something like this below URL http://192.168.1.101/myproject/item/mens-body-fitted-t-shirt-2018-summer-fashion-2/82813720
The query name are replaced with /. How can I do this in Yii2 and still get the query in my controller to make the normal search?
My url creation looks like this
$myurl = \Yii::$app->UrlManager->createUrl(['/item','Id'=>$items['slug'].'-'.$items['product_id'],'itmNo'=>$items['item_number']]);
You need to put the most precise rule at the beginning:
'rules' => [
'<controller:[\w\-]+>/<action:[\w\-]+>/slug/<slug:\d+>/id/<id:\w+>/itmNo/<itmNo:\w+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>/<slug:[a-zA-Z0-9_-]+>/' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'<controller:\w+>/<id:\d+>' => '<controller>/view',
],
And create URL like this:
$myurl = \Yii::$app->UrlManager->createUrl([
'/item/view',
'id' => $items['product_id'],
'slug' => $items['slug'],
'itmNo' => $items['item_number'],
]);
I think, what you are looking for is this rule:
> '<controller:[\w\-]+>/<action:[\w\-]+>/<id:[\w\-]+>/<itmNo:\w+>'=>'<controller>/<action>'
In this case, you should indicate a controller name, id and itmNo as parameters. Don't forget to put this rule before more general ones.
Sample query:
\Yii::$app->UrlManager->createUrl(['item/view','id'=>'slug'.'-'.'2', 'itmNo'=>'12313'])
read this post for better understanding

YII 2 Url Route not working with $_GET parameters

I'm new to Yii2 and their URL ruling is kinda tricky. I have a SiteController with an action like this
public function actionSuccessStories($slug = null)
{
// some codes
}
in my config i have this
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => true,
'rules' => [
// Default routes
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
// page routes
'success-stories/<slug:\w+>' => 'site/success-stories',
// Remove 'site' parameter from URL
'<action:(.*)>' => 'site/<action>',
],
],
in my view i have this to generate my url
Url::to(['site/success-stories', 'slug' => 'slug_value'], true);
my problem is Url::to(); creates success-stories?slug=slug_value
instead of
success-stories/slug/slug_value am i doing this right? What i want to accomplish is the second format.
I've read this question related to mine but it covers only modules
Yii2 url manager don't parse urls with get parameter
Change your rules to:
'rules' => [
// page routes
'success-stories/<slug:\w+>' => 'site/success-stories',
// Default routes
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
// Remove 'site' parameter from URL
'<action:(.*)>' => 'site/<action>',
],
Order of rules is important, Yii2 will try to match rule one by one, if it fits - it will use it.

Url Manager hide controller name and function name in YII

I'm new to the YII framework. I have to hide the default controller name and function name.
For example:
(Existing URL : http://localhost/food/store/home )
(Required URL : http://localhost/food/ )
In the YII framework config page, they have declared the urlManager as:
URL Manage in config page :
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName' => false,
'rules'=>array(
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>'=>'<controller>/index',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
'showScriptName'=>false,
)
Default Controller Declaration :
'defaultController'=>'store'
You can create specific rules without using placeholders like <controller> or <action>, you just need to make sure you add them before the rules for the general cases.
'urlManager' => [
'urlFormat' => 'path',
'showScriptName' => false,
'rules' => [
//Add the rules for the specific cases
'' => 'store/home',
// The general case rules go after the specific cases
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>' => '<controller>/index',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
],
],
use alias will slove the problem
'urlManager' => array(
'urlFormat' => 'path',
'rules' => array(
'admin' => '/admin/default',
'mobile' => '/mobile/default', 'mobile/<alias:fees|aboutus|contactus|terms|policy|faq|aml|legal|news|testimonial>' => 'mobile/default/<alias>',
'<alias:fees|about|contactus|terms|privacypolicy|faq|aml|legal>' => 'site/<alias>',
'<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
),
'showScriptName' => false,
),

Yii2 URL Route for make a Slug Url

I'm learning on yii2,
I have a problem when make a url route.
here's my url configuration
'urlManager' => [
'class' => 'yii\web\UrlManager',
// Disable index.php
'showScriptName' => false,
// Disable r= routes
// 'enableStrictParsing' => false,
'enablePrettyUrl' => true,
'rules' => array(
'category/<id:\S+>' => 'category/detail',
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'request-password-reset' => 'site/request-password-reset',
'reset-password/<token:\S+>' => 'site/reset-password',
'profile/<id:[0-9a-zA-Z\-]+>/?' => 'profile/user',
'logout' => 'site/logout',
'login' => 'site/login',
),
],
The problem is in profile routing.
Here's the case:
http://localhost/myapps/profile/some-url/ -> work with added slash in
the end of url
http://localhost/myapps/profile/some-url -> without slash in end of url isn't working and error 404
http://localhost/myapps/profile/someurl -> not working error 404.
http://localhost/myapps/profile/first-second-third -> with our without slash in the end is working
I'm really confuse, I've been looking for previous question here and try out nothing working with my case.
Can somebody help with my problem?
Just move your Profile alias to the top of the list:
'profile/<id:[0-9a-zA-Z\-]+>/?' => 'profile/user',
'category/<id:\S+>' => 'category/detail',
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'request-password-reset' => 'site/request-password-reset',
'reset-password/<token:\S+>' => 'site/reset-password',
'logout' => 'site/logout',
'login' => 'site/login',
As '<controller:\w+>/<action:\w+>' => '<controller>/<action>' was defined before 'profile/<id:[0-9a-zA-Z\-]+>/?' => 'profile/user', it will never reach profile, because it recognized it as a controller/action.

Urls with multiple parameters not being created properly

I can't seem to get pretty urls to be generated properly. My frontend config is as follows:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'item/<id:\d+>/<slug>' => 'item/view',
'category/<id:\d+>/<slug>' => 'category/view',
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
]
],
The following url array:
['item/view', 'id' => 4, 'slug' => 'shark-chomp-socks']
generates the url http://example.com/item/4?slug=shark-chomp-socks instead of http://example.com/item/4/shark-chomp-socks.
If I manually type in the expected url (http://example.com/item/4/shark-chomp-socks), the url resolves correctly without any errors.
How can I get it to generate the url properly?
The rules in my common config were causing the issue. I removed the urlManager entry in common/config/main.php and the urls were created properly. I had this in common/config/main.php:
'urlManager' => [
'enablePrettyUrl' => true,
'rules' => [
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
]
],
Since, the frontend/config/main.php is merged into common/config/main.php in my frontend/web/index.php, the rules in frontend were appended to those in common and duplicates removed resulting in the following order:
'rules' => [
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'item/<id:\d+>/<slug>' => 'item/view',
'category/<id:\d+>/<slug>' => 'category/view',
]
TL;DR: Remove any rules from any config file that is loaded before the one in which your custom rules are.

Categories