9

そのANYTHING_ELSEに注意してください。したがって、次のような例に応じて、通常どおりに動作させたいコントローラーとアクションがあります。

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

しかし、特定のコントローラーとアクションに該当しないものはすべて、BlogControllerとactionViewのような1つのデフォルトのコントローラーとアクションに該当するようにします。そこで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 に移動し、次の行を追加して hosts ファイルを編集します。

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」ではなく「apache」と名付けられています。

ステップ 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 という名前の 2 つの 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 管理機能を使用して、素晴らしいブログやその他の 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- as-the-router-controller/

本質的に、そのようなデフォルトを処理する (そしてそれを別のシステムに渡す) には、Yii の例外処理システムをオーバーライドし、404 エラーをキャッチして、ブログ コントローラーに渡すのが最も簡単な方法です。

コントローラー アクションをエラー ハンドラーとして設定してブログ コントローラーに人を送ると、Yii は 404 エラー ヘッダーを送信します (エラーを適切に処理したとしても)。はい、私はこれをたくさん掘り下げました。いいえ、もっと簡単な答えがあるとは思いません:-)。もっと簡単なものがあれば教えていただきたいです...

于 2012-08-23T00:18:40.967 に答える