2012-08-22 117 views
9

要注意的是ANYTHING_ELSE 所以,我有我的控制器和動作,我想響應表現爲正常的像這樣的例子:Yii的高級URL重寫

// 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', 
    ), 
), 
+0

當前的答案似乎相當有用(特別是橡子的),什麼是給你404的網址? –

回答

11

我將一步一步解釋如何讓這個工作。

第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步 - 改變ap ache 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。然後我打開位於ad/protected/config/main中的Yii配置文件。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/並將其解壓到你的/保護/ 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控制器小號

下創建/保護/控制器文件夾兩個PHP文件名爲ArticleController.php和PageController.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 

玩得開心創造出色的博客或其他網絡應用程序,具有完整的網址管理權力。

2

看我如何處理特定情況下(加上其他的東西)與WordPress的文章:http://www.yiiframework.com/wiki/322/integrating-wordpress-and-yii-still-another-approach-using-yii-as-the-router-controller/

從本質上說,爲了處理這樣的一個默認值(和它交給不同的系統),tr最簡單的方法是重寫Yii的異常處理系統,捕獲404錯誤並將其傳遞給您的博客控制器。

如果通過將控制器操作設置爲錯誤處理程序將人員發送到您的博客控制器,Yii會發送404錯誤標題(即使您正確處理錯誤)。是的,我已經深入瞭解這一點。不,我不相信有一個更簡單的答案:-)。我很想知道,如果你發現簡單的東西...

+0

一旦找到了解決這個問題的最佳解決方案,我一定會回來的 –

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; 
    } 
} 
+1

理論上它看起來不錯,實際上我得到了404 –

+2

這不是理論,它有效。所以我希望你引用你輸入的URL作爲URL。我建議你先對最後一個配置的行進行測試,通過評論其他配置(並輸入abra-cadabra作爲url)。 –

+0

也看看這個[類似問題](http://stackoverflow.com/questions/11847451/yii-internationalization-i18n-and-dynamic-url-manager) –