Yii的高级URL重写(Yii advanced url rewrite)

2019-07-31 03:14发布

注意的是ANYTHING_ELSE所以,我有我的控制器和动作,我想表现为正常响应这样的例子:

// for UserContoller with actionList and actionEdit
user/list
user/edit/25

但是对于那些没有在特定的控制器和我要的是行动回落一切他们归入一个默认的控制器和行动,如:BlogController和的actionView。 这就是ANYTHING_ELSE来。

// ANYTHING_ELSE can be:
this-is-a-test-page
this/is/another/page/with/lots/of/slashes
this-has-extension.html


'urlManager' => array(
  'urlFormat' => 'path',
  'showScriptName' => false,
  'rules' => array(
    '<controller:\w+>/<id:\d+>' => '<controller>/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
    '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
    'ANYTHING_ELSE' => 'blog/view',
   ),
),

Answer 1:

我将一步一步解释如何得到这个工作。

第1步 - 创建Yii的Web应用程序

导航到您的控制台您Yii框架路径和创建新的Web应用程序。 在我来说,我在我的控制台中使用这样的:

cd c:\zeus\yii-1.1.10.r3566\framework
yiic webapp c:\zeus\www\yiiblog

其中c:\宙斯\警予,1.1.10.r3566 \框架是我的Yii PHP框架和C路径:\宙斯\ WWW \ yiiblog是通向我的Yii web应用测试文件夹

扑进2 - 假冒我的域名dev.yiiblog.com

转到C:\ WINDOWS \ SYSTEM32 \ drivers \ etc中,并通过加入这一行编辑您的主机文件:

127.0.0.1 dev.yiiblog.com

第3步 - 修改Apache的httpd.conf文件

<VirtualHost *:80>
    DocumentRoot "c:/zeus/www/yiiblog"
    ServerName dev.yiiblog.com
    ErrorLog "logs/dev.yiiblog.com-error.log"
    CustomLog "logs/dev.yiiblog.com-access.log" common
</VirtualHost>

然后重新启动Apache服务。 我在Windows控制台中使用:

net stop apache
net start apache

在我的Apache 2的服务被命名为“阿帕奇”而不是“APACHE2.2”之类的默认值。

第4步 - 创建一个数据库和配置数据库连接到的Yii

我创建了一个数据库yiitest和用户yiitest。 然后我打开我的Yii的配置文件所在的广告/protected/config/main.php和编辑到MySQL的连接:

'db'=>array(
  'connectionString' => 'mysql:host=localhost;dbname=yiitest',
  'emulatePrepare' => true,
  'username' => 'yiitest',
  'password' => 'password',
  'charset' => 'utf8',
),

第5步 - 下载dburlmanager Yii的扩展

转到Yii的dburlmanager,下载Yii的dburlmanager扩展http://www.yiiframework.com/extension/dburlmanager/并将其解压到你的/保护/扩展文件夹

第6步 - 创建MySQL数据库表,并添加虚拟数据

CREATE TABLE IF NOT EXISTS `articles` (
  `seoURL` varchar(100) NOT NULL
) ENGINE=InnoDB;

INSERT INTO `articles` (`seoURL`) VALUES
('first-post'),
('another-post'),
('post/value'),
('website/page1');

CREATE TABLE IF NOT EXISTS `pages` (
  `seoURL` varchar(100) NOT NULL
) ENGINE=InnoDB;

INSERT INTO `pages` (`seoURL`) VALUES
('page-first-post'),
('page-another-post'),
('page/post/value.html'),
('page-website/page1');

第7步 - 创建自定义的Yii控制器

下创建/保护/控制器命名的文件夹ArticleController.php和PageController.php两个PHP文件:

ArticleController.php内容:

<?php
/**
 * @filename ArticleController.php
 */

class ArticleController extends CController {
  public function actionView() {
    $this->render('view', array(
      'article' => isset($_GET['article'])?$_GET['article']:'',
    ));
  }
}

PageController.php内容:

<?php
/**
 * @filename PageController.php
 */
class PageController extends CController {
  public function actionView() {
    $this->render('view', array(
      'page' => isset($_GET['page'])?$_GET['page']:'',
    ));
  }
}

第8步 - 创建自定义的Yii意见

创建对应于以上路径/protected/views/article/view.php和/protected/views/page/view.php这些控制器视图文件:

文章查看内容:

<h1>Article View Test</h1>
<br />
<?php
    if (isset ($article)) echo "article: $article";
?>

页面视图内容:

<h1>Page View Test</h1>
<br />
<?php
    if (isset ($page)) echo "page: $page";
?>

第9步 - 添加自定义的Yii URL规则

再次打开你的main.php Yii的配置文件,您urlManager设置类似于:

'urlManager'=>array(
  'urlFormat'=>'path',
  'class'=>'ext.DbUrlManager.EDbUrlManager',
  'connectionID'=>'db',
  'rules'=>array(
    '<article:[\w\/.-]+>'=>array(
      'article/view',
      'type'=>'db',
      'fields'=>array(
        'article'=>array(
          'table'=>'articles',
          'field'=>'seoURL'
        ),
      ),
    ),

    '<page:[\w\/.-]+>'=>array(
      'page/view',
      'type'=>'db',
      'fields'=>array(
        'page'=>array(
          'table'=>'pages',
          'field'=>'seoURL'
        ),
      ),
    ),

    '<controller:\w+>/<id:\d+>' => '<controller>/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
    '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
  ),
  'showScriptName'=>false,
),

第10步 - 创建.htaccess文件

您的Web应用程序根目录下创建一个.htaccess文件和ETID其内容:

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php

步骤11 - 测试你的SEO友好的URL

dev.yiiblog.com/first-post
dev.yiiblog.com/page-first-post

等等

玩得开心创建真棒博客或完整的URL管理电源等网络应用。



Answer 2:

If I've realized you correctly, you may use something like this:

  'rules' => array(
    //You should define all the controllers exactly:
    '<controller:user|archive|office>/<action:\w+>' => '<controller>/<action>',
    //Or more complicated rule:
    '<lang:(es|it|en)>/(turismo|visita|travel)/<slug:>' => array('visit/page', 'urlSuffix' => '.html'),

    //After that you can process all remaining urls as you want:
    '<alias:[\w\d\-_\/]+>' => array('blog/view', 'urlSuffix' => '.html'),
  ),

And the controller:

class BlogController extends Controller
{
    public function actionView($alias)
    {
        echo $alias;
    }
}


Answer 3:

阅读我如何处理特定情况的文章(加其他东西)与WordPress: http://www.yiiframework.com/wiki/322/integrating-wordpress-and-yii-still-another-approach-using-yii-作为最路由器控制器/

从本质上说,为了应付这样的一个默认值(和它交给不同的系统),做TR最简单的方法是重写Yii中的异常处理系统,赶上404错误,并交出这些到您的博客控制器。

如果你设置你的控制器动作作为一个错误处理派人到你的博客控制器,Yii中发送一个404错误头(即使你正确地处理错误)。 是的,我已经挖成这个有很多。 不,我不相信有一个简单的答案:-)。 我很想知道,如果你发现简单的东西...



文章来源: Yii advanced url rewrite
标签: yii