9

注意 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',
   ),
),
4

3 回答 3

11

我将逐步解释如何使其正常工作。

第 1 步 - 创建一个 Yii 网络应用

导航到控制台中的 Yii 框架路径并创建一个新的 webapp。就我而言,我在控制台中使用了它:

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

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

第 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 服务被命名为“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',
),

第 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');

第 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']:'',
    ));
  }
}

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 文件,并将其内容设置为:

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

ETC

使用完整的 url 管理能力创建很棒的博客或其他 web 应用程序,玩得开心。

于 2012-09-01T09:55:11.727 回答
3

如果我正确地意识到你,你可以使用这样的东西:

  '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'),
  ),

和控制器:

class BlogController extends Controller
{
    public function actionView($alias)
    {
        echo $alias;
    }
}
于 2012-08-23T08:04:53.747 回答
2

阅读我关于如何使用 Wordpress 处理特定场景(以及其他内容)的文章:http ://www.yiiframework.com/wiki/322/integrating-wordpress-and-yii-still-another-approach-using-yii-作为路由器控制器/

本质上,为了处理这样的默认值(并将其交给不同的系统),最简单的方法是覆盖 Yii 的异常处理系统,捕获 404 错误并将其交给您的博客控制器。

如果您通过将控制器操作设置为错误处理程序将人们发送到您的博客控制器,Yii 会发送一个 404 错误标头(即使您正确处理了错误)。是的,我已经深入研究了很多。不,我不相信有更简单的答案:-)。我很想知道你是否找到更简单的东西......

于 2012-08-23T00:18:40.967 回答