Yiiによる本サイトの作り方メモ

nginx設定

基本設定

server {
    set $host_path "/var/www/radio-age.com/root";
    listen	80;
    server_name  radio-age.com;
    root   $host_path;
    include /etc/nginx/conf.d/hosts/yii-common.inc;
    location / {
        try_files $uri /$yii_bootstrap?$args;
    }
}

yii-common.inc

上記基本設定のinclude /etc/nginx/conf.d/hosts/yii-common.inc;の内容

    set $yii_bootstrap "index.php";
    charset utf-8;
    location ~ ^/(protected|framework|nbproject|themes/\w+/views) {
        deny  all;
    }

    location ~ \.php {
        fastcgi_split_path_info  ^(.+\.php)(.*)$;
        #let yii catch the calls to unexising PHP files
        set $fsn /$yii_bootstrap;
        if (-f $document_root$fastcgi_script_name){
            set $fsn $fastcgi_script_name;
        }
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index   index.php;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
    }

yiiアプリケーション初期化

(rootで行うとする)

cd yiiルート/framework

./yiic webapp /var/www/radio-age.com/root

chown -R nginxのuser:group /var/www/radio-age.com/root

/etc/init.d/nginx restart

ブラウザで見れば

no title


環境の変更

configでのYAML設定ファイル作成

Yiiのconfig/main.phpの各種設定をYAMLファイルで制御する。=>YIIをつかう:その2 を参照。

以下configに関しては配列ではなくてYAML記法で表現する。

ルーティングの変更

  • configのcomponentsにurlManagerを登録(コメントアウトすればいい)
  • showScriptNameをFALSE=index.phpを消す
  • rulesでルーティングを設定。

rules例

  'gii': 'gii'
  'gii/<controller:\w+>': 'gii/<controller>'
  'gii/<controller:\w+>/<action:\w+>': 'gii/<controller>/<action>'
   略
  '': 'site/index'
  '.+': 'site/index'

この例では、/gii以下のリクエスト以外は、すべてデフォルトコントローラー(SiteController.php)のactionIndexメソッドで処理することになる。

MVC

基本モデル

各ページはファイルに記述。DBは用いない(*1)。

したがってURLのリクエストは、OSのディレクトリ/パスと対応する。

webroot/protected/models/Filemodel.phpにCModelを継承した

class Filemodel extends CModel

を作成。

ドキュメントルート+URLパスでファイルを読み込むメソッドを作る。

ファイルの付帯情報ファイル

ファイル(htmlや画像)にはタイトルなどの補足情報が必要なので、これは別途テキストファイルを作成する。

test.htmlに対して、同じディレクトリ内にtest.html.info

test.html.infoには#記号を冒頭に持つ三行の情報を記載。

#(タイトル名)

#グループメニューを表示させるか

#パン屑メニューを表示させるか

見栄え寄りの話になるので後ろの2行についての説明は省略。ざっくり言えば下記画像のようなリンク生成に関わるフラグである。

no title


またグループメニュー/パン屑メニューそれ自体については些末な話なので後述。

このinfoファイルは拡張する場合がある(たとえばキャッシュのon/offフラグを付け加えるとか、そのページは移動したのでリダイレクトフラグを加えるとか)。

extension CFILEのインストール

ファイル操作を簡便にするためにエクステンションをインストール。

webroot/protected/extension/file

config(YAML)のcompotenents部に、

file:
 class: 'application.extensions.file.CFile'

ただ思ったほどの効果がないので、Yii標準のファイルヘルパーでいいかもしれない。

コントローラーの記述

上のルーティングで書いたようにほぼすべてのURLリクエストはSiteController.phpのactionIndexメソッドで処理する。

actionIndex前のアクションとしてbeforeActionを定義してリクエストされたURLパスに基づきfilemodelオブジェクトを生成する。


      public function beforeAction()
      {
        $url = Yii::app()->request->url;
        $add = '';
        if(preg_match('#([^\?]*)(\?.*)#',$url,$match))
        {
        $path = $match[1];
        $add = $match[2];
        }
        else
          $path = $url;
        if(!preg_match("#\.#",$path) && !preg_match("#\/$#",$path))
            $this->redirect($path.'/'.$add);
        $this->filemodel = new Filemodel;
        $this->filemodel->setPath($path);
        return TRUE;
      }

上記setPathメソッドは、ドキュメントルート+URLパスを整形して、リクエストに対応するファイルが存在するかどうかをチェックした上で、trueFullPath変数にファイルフルパスを格納している。

以下、コントローラー側では$this->filemodelを用いて処理しビューにデータを渡す。




*1: 特殊な用途では用いるかもしれない。

this file --> last modified:2012-05-25 11:02:27