Yiiブログチュートリアル 6.最後の仕上げ - URLの体裁を整える

作成日:2009/04/06
最終更新日:2009/04/06

今のところこのブログアプリケーションのリンクは美しくありません。 たとえば、記事の表示URLは次のようになっています。

			
/index.php?r=post/show&id=1
			
		

このセクションでは、URLの体裁を整え、SEOに適したものにします。 目的は以下のようなURLを使えるようにすることです。

この目的を実現するために、アプリケーションの設定を以下のように変更します。

			
return array(
    ......
    'components'=>array(
        ......
        'urlManager'=>array(
            'urlFormat'=>'path',
            'rules'=>array(
                'tag/<tag>'=>'post/list',
                'posts'=>'post/list',
                'post/<id:\d+>'=>'post/show',
                'post/update/<id:\d+>'=>'post/update',
            ),
        ),
    ),
);
			
		

上記のコードでは、urlManagerコンポーネントの設定を修正し、 urlFormatプロパティをpathにするとともに、rulesを追加しています。

このルールとは、urlManagerによって利用され、指定されたフォーマットでURLを解析したり作成したりします。 たとえば、上の例での最初のルールは、/index.php/tag/yiiというURLが呼び出された場合、 urlManagerコンポーネントは、post/listというrouteにリクエストを発行し、 GETパラメータのtagに、yiiという値を含めるという意味です。 一方で、post/listというrouteと、tagというパラメータでURL作成する際には、urlManagerは同じルールを利用して、 /index.php/tag/yiiという指定通りのURLを作ります。 このため、urlManagerは双方向のURLマネージャといえます。

urlManagerコンポーネントはさらにURLの体裁を整えることができます。 URLからindex.phpをなくし、拡張子として.htmlをつけるといったことです。 このような機能はアプリケーション設定のurlManagerプロパティを変更することで容易に利用できます。 より詳しくはthe Guideを参照してください。

エラーをログに記録する

実際に運用されるウェブアプリケーションではさまざまなイベントに対して洗練されたログ機能が必要になることがしばしばです。 このブログアプリケーションでは、動作中に起こったエラーを記録します。 たとえば、プログラムのミスやユーザの誤操作によって引き起こされるようなエラーです。 このようなエラーを記録することは、アプリケーションの改善に役立つでしょう。

エラーロギングを有効にするには、アプリケーション設定を以下のように変更します。

			
return array(
    'preload'=>array('log'),
 
    ......
 
    'components'=>array(
        'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CFileLogRoute',
                    'levels'=>'error, warning',
                ),
            ),
        ),
        ......
    ),
);				
			
		

この設定によって、エラーか警告が発生した場合に 詳細情報が記録され、/wwwroot/blog/protected/runtime以下にファイルとして保存されます。

logコンポーネントはより高度な機能も備えています。 ログメッセージを複数のメールアドレス宛に送信したり、 Javascriptコンソールに表示したりといったことも可能です。 より詳しくは、/wwwroot/blog/protected/runtimeを参照してください。

エラー表示を変更する

このブログアプリケーションではエラーを表示するのに、Yiiのデフォルトテンプレートを使っています。 これはブログアプリケーションにそぐわないスタイルと文言なので、テンプレートを変更したいと思います。 そのために、/wwwroot/blog/protected/views/systemの下に、ビューファイルのセットを作ります。

まずはじめにerror.phpという名前のファイルを作ります。 より詳細なエラービューがない場合、これがデフォルトのエラービューになります。 このビューファイルはエラーが発生した場合に表示されるので、新たなエラーを発生させうるような複雑なロジックを含めるべきではありません。 また、エラービューファイルはレイアウトを使わないことに注意してください。 したがってそれぞれのエラービューは完全なページである必要があります。

error401.phpというファイルを作り、401 (unauthenticated) エラーを表示します。 error404.phpというファイルを作り、404 (page not found) エラーを表示します。

エラービューファイルの名前の付け方について詳しくはthe Guideを参照してください。

チューンアップと配置

そろそろブログアプリケーションの開発も終わりに近づいてきました。 アプリケーションを配置する前に、いくつかチューンアップを施します。

ホームページを変更する

記事の一覧をホームページに設定します。 アプリケーション設定を以下のように変更します。

			
return array(
    ......
    'defaultController'=>'post',
    ......
);				
			
		

PostControllerのデフォルトアクションがlistであるため、 アプリケーションにアクセスすると記事一覧を見ることになります。

スキーマのキャッシュを有効にする

ActiveRecordはデータベースのメタデータに基づいて列情報を決めるため、 メタデータの読み込みと解析に時間を要します。 開発段階では大きな問題ではありませんが、アプリケーションが本番環境で動き出すと問題となる可能性があります。 データベーススキーマが変更されないのなら、毎回同じことをするのは時間の無駄です。 したがって、スキーマキャッシュを有効にすることにします。

			
return array(
    ......
    'components'=>array(
        ......
        'cache'=>array(
            'class'=>'CDbCache',
        ),
        'db'=>array(
            'class'=>'system.db.CDbConnection',
            'connectionString'=>'sqlite:/wwwroot/blog/protected/data/blog.db',
            'schemaCachingDuration'=>3600,
        ),
    ),
);			
		

上記のコードでは、まずcacheコンポーネントを追加し、SQLiteをキャッシュストレージとして指定します。 もしAPCなど他のキャッシュ方法が使えるのであれば、それらを使うよう変更することができます。 また、dbコンポーネントのschemaCachingDurationプロパティを3600に設定します。 これによって、データベーススキーマは3600秒の間キャッシュされることになります。

デバッグモードを無効にする

エントリスクリプト/wwwroot/blog/index.phpを修正し、YII_DEBUG定数を削除します。 この定数は詳細なデバッグ情報を表示するようYiiを設定するので、開発段階では便利ですが、 アプリケーションが本番環境で動作している場合には、デバッグ情報を表示するのは良い考えとはいえません。 なぜならアプリケーションの内部構造についての繊細な情報を含んでいるからです。

アプリケーションを配置する

最後の配置プロセスは/wwwroot/blog ディレクトリをターゲットにコピーすることが主な作業です。 以下に必要なステップを示します。

  1. ターゲット環境にYiiをインストールします
  2. /wwwroot/blog ディレクトリ全体をターゲットにコピーします
  3. エントリスクリプトを編集し、$yii変数がYiiのブートストラップファイルを示すようにします
  4. protected/yiic.php ファイルを編集し、$yiic変数が新しいyiic.phpファイルを示すようにします
  5. assetsディレクトリとprotected/runtimeディレクトリのパーミッションをWebサーバプロセスから書き込み可能にします

さらなる機能拡張

これ以上のコードを書くことなく、ブログアプリケーションはすでにthemeableです。 テーマを使うには独自のビューファイルを書いて、テーマを作る必要があります。 たとえば、異なったレイアウトを用いるclassicという名前のテーマを使うには、 /wwwroot/blog/themes/classic/views/layouts/main.php.というレイアウトビューファイルを作る必要があります。 さらに、アプリケーションの設定で、classicテーマを使うよう指定します。

			
return array(
    ......
    'theme'=>'classic',
    ......
);				
			
		

国際化

ブログアプリケーションを国際化して、異なる言語で表示することも可能でしょう。 これは主に二つの側面からなります。

まず、異なった言語のビューファイルを作る必要があります。 たとえば、PostControllerlistページでは、 /wwwroot/blog/protected/views/post/zh_cn/list.phpといったビューファイルを作ります。 アプリケーションが簡体中文(言語コードzh_cn)に設定されると、Yiiは自動的にこのビューファイルを使います。

次に、メッセージの翻訳を作ります。 メッセージの翻訳は/wwwroot/blog/protected/messagesディレクトリ以下に保存する必要があります。 さらに、テキスト表記をYii::t()メソッドによって呼び出す必要があります。

より詳しくはthe Guideを参照してください。

キャッシュを使ってパフォーマンスを改善する

Yiiフレームワークはそれ自体が大変効率的ですが、Yiiで書かれたアプリケーションが必ずしもすべて効率的というわけではありません。 このブログアプリケーションでも何箇所かパフォーマンスを改善できるところがあります。 たとえば、タグクラウドポートレットはボトルネックのひとつです。 なぜなら、複雑はSQLクエリとPHPロジックを実行するからです。

Yiiの洗練されたcaching featureを利用することで、パフォーマンスを改善できます。 Yiiでもっとも便利なコンポーネントのひとつがCOutputCacheです。 このコンポーネントはページの断片をキャッシュするので、リクエストのたびに必要なコードを実行しなくてすみます。 たとえば、/wwwroot/blog/protected/views/layouts/main.phpレイアウトファイルで、タグクラウドポートレットをCOutputCacheで囲むことができます。

			
<?php if($this->beginCache('tagCloud', array('duration'=>3600))) { ?>
 
<?php $this->widget('TagCloud'); ?>
 
<?php $this->endCache(); } ?>				
			
		

上記のコードでは、タグクラウドはリクエストのたびに生成されるのでなく、一度表示されるとキャッシュされます。 キャッシュは3600秒間有効です。

新機能の追加

このブログアプリケーションは基本的な機能しか備えていません。 完璧なブログシステムにするためには、更なる機能が必要です。 たとえば、カレンダーやメール通知、記事のカテゴリ、記事のアーカイブなどです。 これらの実装は読者の皆さんにお任せすることにします。

目次へ戻る