Yii2 enablePrettyUrl only for modules - php

I have a yii2 project which is using a default URL rule (http://example.com?r=controller/action&id=1)
I want to add a REST API module in the project and enable the pretty URL format (http://example.com/controller/action?id=1) only for this module.
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule',
'controller' => [
'api/default',
]
],
],
]
When I configure UrlManager enablePrettyUrl=>true, that also changes the URL format project wide. We have hardcoded URLs in default URL format in the frontend which cannot be changed now as the codebase has grown exponentially.
Is there a way to configure the URL rules only for REST API module and use default URL format for other modules.

Related

Yii2 urlmanager rules for pretty urls fails

I have the following url manager path
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'<controller:(\w|-)+>/' => 'site/index',
'<module:api\w+>/<controller:\w+>/<action:(\w|-)+>' => '<module>/<controller>/<action>',
],
]
What am looking for is all urls not rendered via api module paths to run via site/index but all other paths having api/* to be executed via module paths.
The above works for urls like /login, /auth but when i run urls like
/administrative/uom
It fails
SO basically i want all urls to be redirrected via site/index but all urls having api as the prefix like api/auth/login to be run via their respective controllers.
I have added an api module which should handle this.
What else do i need to add to make this work?
When adding rules always start from more detailed to less detailed. And you added general rule for controller only so no URL with action is matched. Do this
'rules' => [
'api/<controller:\w+>/<action:[\w\-]+>' => 'api/<controller>/<action>',
'<controller:[\w\-]+>/<action:[\w\-]+>' => 'site/index',
'<controller:[\w\-]+>/' => 'site/index',
],

YII2 - Unable to access submodule's DefaultController action

I'm trying to figure this out how to access other actions inside the DefaultController of a module. I have this module structure.
--module
--website
--module
--hub
hubmodule is a submodule inside the website module, I can access this url website/default/index no problem there, the problem is this website/hub/default/index its not accessible.
but with this website/hub/default it all good, but i can't have that. Tried a new action actionTest its inaccessible also. Here the config i have
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => true,
'rules' => [
// Default ruling for module/controller/action route to work
'<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
],
],
I kinda solve my own problem with this, configuration
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => true,
'rules' => [
// Default ruling for module/controller/action route to work
'<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
'<module:\w+>/<submodule:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<submodule>/<controller>/<action>',
],
],
format should be <module>/<submodule>/<controller>/<action> I didn't know that submodule was a reserve word in Yii URL config, but i still have this issue.
When you create an action like actionThisExample the url should be like this website/hub/default/this-example, but it goes to 404 page. When i do it like this actionThisexample this url website/hub/default/thisexample works. but its not that good to have url s like that in my case.

use static url in url routing yii2

I have an old website, now I have written it with new version of yii framework and I want change the urls, but because of SEO problems I want to keep my old urls.
Now when the user enters www.mysite.pre/car/details/10908 I want application renders www.mysite.pre/site/show_detail/10908 how could I handle it in yii2 Routing?
Assuming you have got this action in your SiteController class
public function actionShow_detail($id) {}
Add this in your configuration file:
// ...
'components' => [
// ...
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
// ...
'car/details/<id:\d+>' => 'site/show_detail',
],
],
],
More details and information about Yii 2 routing can be found in "Routing and URL Creation" section of The Definitive Guide to Yii 2.0.

Yii2 UrlManager REST API GET 404 error when giving id parameter

I've made a REST API with the Yii2 basic template. I've made some changes to the webconfig so I could use links like web/users and web/users/1. It works fine but I couldn't access the web/index anymore. So i've added some more rules to the UrlManager.
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
//basic/web
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:[\w\-]+>/<action:[\w\-]+>/<id:[\d]+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
//basic/web/users
['class' => 'yii\rest\UrlRule', 'controller' => ['user', 'car']],
//basic/web/countries
//Id is een string, vandaar de tokens
['class' => 'yii\rest\UrlRule', 'controller' => 'country', 'tokens' => ['{id}' => '<id:\\w+>']],
],
],
With the above code I can acces web/index. I could also access web/users to get a list with users. but I can't acces web/users/1. it gives an 404 error.
edit:
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
//basic/web
/*
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:[\w\-]+>/<action:[\w\-]+>/<id:[\d]+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
*/
//basic/web/users
['class' => 'yii\rest\UrlRule', 'controller' => ['user', 'car', 'site']],
//basic/web/countries
//Id is een string, vandaar de tokens
['class' => 'yii\rest\UrlRule', 'controller' => 'country', 'tokens' => ['{id}' => '<id:\\w+>']],
],
],
I've changed it like this. Now I can acces web/sites because of pluralize.
But if I go to web/sites/about for example, it will give an 404 error again. So it's not the best solution
I think it won't be easy to maintain a REST API and HTML webpages within the same config file. For example cookies and session usually are disabled with REST as recommended by its stateless nature while you may need both to authenticate a user within a classic HTML page.
I would recommend modifying your app structure and having your REST API implemented as an independent module with its own routing configuration and maybe its own Entry Script without missing with the web entry.
A better structure may look like this : (from the tutorial linked below)
+ web
+ config
+ controllers
...
+ api
+ config
+ modules
+ v1
+ controllers
.htaccess
index.php
Then you'll be able to open your HTML files within web/sites/about while retrieving your resources within api/users/1. Each entry may host its own controllers and own models or they may both share #app/models. Check this step by step tutorial to see how to implement it :
Creating a REST API for
Yii2-basic-template
- by Joachim Werner
You may also check api and auth folders in this app where both are independent REST APIs.

url management in Yii 2

I have this url
http://example.com/index.php/controller_name/action_name?queryString=123
This url is working fine but when I am trying to use the queryString like in the old version of Yii
http://example.com/index.php/controller_name/action_name/queryString/123
I get an "unable to solve request" error.
I 've already enable prettyurl in my config file and the following url is working
http://example.com/index.php/controller_name/action_name.
My config looks like :
'urlManager' => [
'class' => 'yii\web\UrlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'module/<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
],
],
What am I missing?
Unfortunately this feature didn't migrate to Yii2, you can still define such rules manually
'books/view/queryString/<queryString:\w+>' => 'books/view',
Link on github with this issue
Because of many client API and Oauth servers don't work without encode
Sam Dark answer

Categories