Yii中的友好URL

时间:2016-12-07 19:16:28

标签: php url yii

我正在Yii写一个项目。

我需要创建显示类别的规则。

网址必须类似于:http://localhost/frontend/web/c/category1/category2

我可以使用以下网址访问正确的网页:http://localhost/frontend/web/categorias/view?id=category1/category2

我已阅读文档,但找不到正确的指南。

我试过了:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        '<c:\w+><id:\d+>'=>'<categorias>/view',
    ]
],

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        'c/<id:\d+>'=>'categorias/view',
    ]
],

但它不起作用,我收到错误

  

处理其他错误时出错:   异常'yii \ base \ ViewNotFoundException',消息'视图文件不存在:[project_route] /error.php

我该怎么做?

由于

3 个答案:

答案 0 :(得分:1)

您的问题不清楚'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ 'c/<categories>'=>'categorias/view', ] ], 部分。我会根据对它的不同解释给你答案。

1)它是多个类别名称或ID(一个或多个)的列表

actionView

您应该在CategoriasController中准备public function actionView($categories) { $categoryList = explode('/', $categories); // ...the rest of action } ,如下所示:

$categoryList

现在$categories是传递'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ 'c/<name1:[\w\-]+>/<name2:[\w\-]+>'=>'categorias/view', ] ], 数组的名称或ID,具体取决于您使用的内容。

2)它是两个类别名称的列表(不多也不少)

actionView

您应该在CategoriasController中准备public function actionView($name1, $name2) { // ...the rest of action } ,如下所示:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        'c/<id1:\d+>/<id2:\d+>'=>'categorias/view',
    ]
],

传递的类别是带有可选短划线的单词。

3)它是两个类别ID的列表(不多也不少)

actionView

您应该在CategoriasController中准备public function actionView($id1, $id2) { // ...the rest of action } ,如下所示:

sql

传递的类别是integeres。

答案 1 :(得分:0)

非常感谢你的帮助。

我的问题可以通过您的选项1(一个或多个类别的列表)得到更好的回答。

如果我写了一个类别(Error: (SystemJS) parentAnnotations is undefined CustomComponent/<@http://localhost:3000/app/customCompo.js:8:13 DecorateConstructor@http://localhost:3000/node_modules/reflect-metadata/Reflect.js:531:29 decorate@http://localhost:3000/node_modules/reflect-metadata/Reflect.js:115:20 __decorate<@http://localhost:3000/app/app.component.js:4:84 AppComponent<@http://localhost:3000/app/app.component.js:16:20 @http://localhost:3000/app/app.component.js:12:21 @http://localhost:3000/app/app.component.js:1:31 @http://localhost:3000/app/app.component.js:1:2 @http://localhost:3000/app/app.module.js:13:23 @http://localhost:3000/app/app.module.js:1:31 @http://localhost:3000/app/app.module.js:1:2 @http://localhost:3000/app/main.js:3:20 @http://localhost:3000/app/main.js:1:31 @http://localhost:3000/app/main.js:1:2 ZoneDelegate.prototype.invoke@http://localhost:3000/node_modules/zone.js/dist/zone.js:229:17 Zone.prototype.run@http://localhost:3000/node_modules/zone.js/dist/zone.js:113:24 scheduleResolveOrReject/<@http://localhost:3000/node_modules/zone.js/dist/zone.js:509:52 ZoneDelegate.prototype.invokeTask@http://localhost:3000/node_modules/zone.js/dist/zone.js:262:21 Zone.prototype.runTask@http://localhost:3000/node_modules/zone.js/dist/zone.js:151:28 drainMicroTaskQueue@http://localhost:3000/node_modules/zone.js/dist/zone.js:405:25 ZoneTask/this.invoke@http://localhost:3000/node_modules/zone.js/dist/zone.js:336:25 Evaluating http://localhost:3000/app/app.component.js Evaluating http://localhost:3000/app/app.module.js Evaluating http://localhost:3000/app/main.js Error loading http://localhost:3000/app/main.js Stack trace: (SystemJS) parentAnnotations is undefined CustomComponent/<@http://localhost:3000/app/customCompo.js:8:13 DecorateConstructor@http://localhost:3000/node_modules/reflect-metadata/Reflect.js:531:29 decorate@http://localhost:3000/node_modules/reflect-metadata/Reflect.js:115:20 __decorate<@http://localhost:3000/app/app.component.js:4:84 AppComponent<@http://localhost:3000/app/app.component.js:16:20 @http://localhost:3000/app/app.component.js:12:21 @http://localhost:3000/app/app.component.js:1:31 @http://localhost:3000/app/app.component.js:1:2 @http://localhost:3000/app/app.module.js:13:23 @http://localhost:3000/app/app.module.js:1:31 @http://localhost:3000/app/app.module.js:1:2 @http://localhost:3000/app/main.js:3:20 @http://localhost:3000/app/main.js:1:31 @http://localhost:3000/app/main.js:1:2 ZoneDelegate.prototype.invoke@http://localhost:3000/node_modules/zone.js/dist/zone.js:229:17 Zone.prototype.run@http://localhost:3000/node_modules/zone.js/dist/zone.js:113:24 scheduleResolveOrReject/<@http://localhost:3000/node_modules/zone.js/dist/zone.js:509:52 ZoneDelegate.prototype.invokeTask@http://localhost:3000/node_modules/zone.js/dist/zone.js:262:21 Zone.prototype.runTask@http://localhost:3000/node_modules/zone.js/dist/zone.js:151:28 drainMicroTaskQueue@http://localhost:3000/node_modules/zone.js/dist/zone.js:405:25 ZoneTask/this.invoke@http://localhost:3000/node_modules/zone.js/dist/zone.js:336:25 Evaluating http://localhost:3000/app/app.component.js Evaluating http://localhost:3000/app/app.module.js Evaluating http://localhost:3000/app/main.js Error loading http://localhost:3000/app/main.js ),我尝试过这个选项并且工作正常,但不适用于两个或更多类别:

  

处理其他错误时出错:   异常'yii \ base \ ViewNotFoundException',消息'视图文件不存在:[project_route] \ vendor \ yiisoft \ yii2 \ base \ View.php中的[project_route] \ frontend \ views \ site \ error.php':227

http://localhost/frontend/web/c/category1

使用选项2,它可以正常使用两个类别,但不能使用一个。

我看到更好的选择是1,但我不明白为什么不起作用。

答案 2 :(得分:-1)

我使用两个规则来解决它,两个方法调用另一个

'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'rules' => [
            'c/<category:[\w\-]+>'=>'categorias/view-first',
            'c/<category1:[\w\-]+>/<category2:[\w\-]+>'=>'categorias/view-second',
        ]
    ],