今のところこのブログアプリケーションのリンクは美しくありません。 たとえば、記事の表示URLは次のようになっています。
/index.php?r=post/show&id=1
このセクションでは、URLの体裁を整え、SEOに適したものにします。 目的は以下のようなURLを使えるようにすることです。
/index.php/tag/yii:yiiというタグを持つ記事一覧ページへのリンク/index.php/posts:最新の記事一覧へのリンク/index.php/post/1:IDが1の記事を表示するページへのリンク/index.php/post/update/1IDが1の記事を更新するページへのリンクこの目的を実現するために、アプリケーションの設定を以下のように変更します。
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 ディレクトリをターゲットにコピーすることが主な作業です。
以下に必要なステップを示します。
/wwwroot/blog ディレクトリ全体をターゲットにコピーします$yii変数がYiiのブートストラップファイルを示すようにしますprotected/yiic.php ファイルを編集し、$yiic変数が新しいyiic.phpファイルを示すようにしますassetsディレクトリとprotected/runtimeディレクトリのパーミッションをWebサーバプロセスから書き込み可能にします
これ以上のコードを書くことなく、ブログアプリケーションはすでにthemeableです。
テーマを使うには独自のビューファイルを書いて、テーマを作る必要があります。
たとえば、異なったレイアウトを用いるclassicという名前のテーマを使うには、
/wwwroot/blog/themes/classic/views/layouts/main.php.というレイアウトビューファイルを作る必要があります。
さらに、アプリケーションの設定で、classicテーマを使うよう指定します。
return array(
......
'theme'=>'classic',
......
);
ブログアプリケーションを国際化して、異なる言語で表示することも可能でしょう。 これは主に二つの側面からなります。
まず、異なった言語のビューファイルを作る必要があります。
たとえば、PostControllerのlistページでは、
/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秒間有効です。
このブログアプリケーションは基本的な機能しか備えていません。 完璧なブログシステムにするためには、更なる機能が必要です。 たとえば、カレンダーやメール通知、記事のカテゴリ、記事のアーカイブなどです。 これらの実装は読者の皆さんにお任せすることにします。