Yii高级url重写

Mar*_*lea 9 yii

注意那个ANYTHING_ELSE所以,我有我的控制器和动作,我想像往常一样响应这样的例子:

// for UserContoller with actionList and actionEdit
user/list
user/edit/25
Run Code Online (Sandbox Code Playgroud)

但对于不属于特定控制器和操作的所有内容,我希望它们属于一个默认控制器和操作,如: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',
   ),
),
Run Code Online (Sandbox Code Playgroud)

Mar*_*lea 11

我将逐步解释如何使其工作.

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

导航到控制台中的Yii框架路径并创建新的Web应用程序.在我的情况下,我在我的控制台中使用它:

cd c:\zeus\yii-1.1.10.r3566\framework
yiic webapp c:\zeus\www\yiiblog
Run Code Online (Sandbox Code Playgroud)

其中c:\ zeus\yii-1.1.10.r3566\framework是我的Yii php框架的路径,c:\ zeus\www\yiiblog是我的Yii webapp测试文件夹的路径

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

转到C:\ Windows\System32\drivers\etc并通过添加以下行来编辑您的hosts文件:

127.0.0.1 dev.yiiblog.com
Run Code Online (Sandbox Code Playgroud)

第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>
Run Code Online (Sandbox Code Playgroud)

并重新启动apache服务.我在我的Windows控制台中使用:

net stop apache
net start apache
Run Code Online (Sandbox Code Playgroud)

我的Apache 2服务被命名为"apache",而不是默认的"apache2.2".

第4步 - 创建数据库并配置数据库连接到Yii

我创建了一个数据库yiitest和一个用户yiitest.然后我打开了位于ad /protected/config/main.php的Yii配置文件并编辑了与MySQL的连接:

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

第5步 - 下载dburlmanager Yii扩展

转到Yii dburlmanager,下载Yii dburlmanager扩展http://www.yiiframework.com/extension/dburlmanager/并将其解压缩到您的/ protected/extensions文件夹

第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');
Run Code Online (Sandbox Code Playgroud)

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

在/ protected/controllers文件夹下创建两个名为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']:'',
    ));
  }
}
Run Code Online (Sandbox Code Playgroud)

PageController.php内容:

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

第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";
?>
Run Code Online (Sandbox Code Playgroud)

网页浏览内容:

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

第9步 - 添加自定义Yii网址规则

再次打开你的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,
),
Run Code Online (Sandbox Code Playgroud)

第10步 - 创建.htaccess文件

在您的Web应用程序根目录下创建一个.htaccess文件,并将其内容整理到:

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
Run Code Online (Sandbox Code Playgroud)

第11步 - 测试您的SEO友好URL

dev.yiiblog.com/first-post
dev.yiiblog.com/page-first-post
Run Code Online (Sandbox Code Playgroud)

等等

通过完整的网址管理功能,创建精彩的博客或其他网络应用程序.