yiiフレームワークを使ってみる(1)

#yiiフレームワークとは
ざっと言うと、PHPのフレームワークで、
読み方は「イーフレームワーク」です

何やらjQueryとかが最初からパッケージされていて?
MVCベースで、オブジェクト指向な人に嬉しい設計になっているとかいないとか?
ただすいません、自分の知識はここまでです(苦笑
自分は偉そうに「yiiフレームワークとは何か・・」など語れないので
あとは [たなかひさてるさんのslideshare](http://www.slideshare.net/tanakahisateru/yii-6505530) あたりを参考にしてください

現時点では日本語の関連書籍もないとのことなので、
自分も今からチュートリアルなどを触りながら勉強して
学んだこと感じたことをここに備忘録代わりに書き記していきます

#yiiをダウンロードしてくる
平行して勉強しているAWSのEC2をWEBサーバとして
ここにyiiを入れていこうと思います
ですので、[AWSのEC2に基本的なLAMP環境を作ってみる(2)](http://qiita.com/nakau1/items/a24571b374ad266c3f5e) で作った環境をベースにしていきます

まずは、macのターミナルからSSH接続です
こちらのEC2はLAMP環境が揃ってる前提です

```
ssh -i ~/.ssh/(任意の名前).pem ec2-user@(EC2インスタンスのPublicIP)
```

で、ルートになっておきます

```
$ sudo -i
```

次にyiiを入れるのですが、
アーカイブファイルを落として解凍する方法と
Composerを使う方法があるようです
(公式リファレンスより)

Composerはまた違う機会に勉強しようかと思うので、
今回は前者の方で・・・

また、今回のyiiフレームワークは、1.1を選択してます
執筆時点でyii2という選択肢もあったのですが、
yiiのノリをまずは掴むため、情報がまだネットに多い1.1を使うことにしました

まずは、webのルートになる場所へ

```
# cd /var/www/html/
```

で、アーカイブを落としました

```
# wget https://github.com/yiisoft/yii/releases/download/1.1.16/yii-1.1.16.bca042.tar.gz

# ls 
yii-1.1.16.bca042.tar.gz
```

`ls`で確認。落ちてきました
次に解凍です

```
# tar zxvf yii-1.1.16.bca042.tar.gz

# ls 
yii-1.1.16.bca042  yii-1.1.16.bca042.tar.gz
```

`ls`で確認。解凍できました
次にこのディレクトリ名だと扱いにくいので、名前を変えます

```
# mv yii-1.1.16.bca042 yii

# ls 
yii  yii-1.1.16.bca042.tar.gz
```

`ls`で確認。yiiディレクトリができました
次にアーカイブはもう不要なので消します

```
# rm -f yii-1.1.16.bca042.tar.gz

# ls
yii
```

これで、`/var/www/html/yii`だけになりました

#yiiの必須要件をチェックしてみる
yiiが動く環境なのかどうかを、ブラウザで簡単に確認が出来るようです

```
http://(IPアドレス)/yii/requirements/
```

※ IPアドレスの部分はDNSがあれば、それで・・ということで

このURLにアクセスすると、一覧として出してくれます
全部緑であればOKなのですが、Warningはいくつか出るのではないかと・・・

ただ、Failedが出てなければ、あとで直せるということで
自分はこのまま進みます

#yiiのアプリケーションを作ってみる
公式リファレンス[初めての Yii アプリケーションの作成](http://www.yiiframework.com/doc/guide/1.1/ja/quickstart.first-app)を参考に
yiiのアプリケーションを作ってみました

yiiには、「yiic」というジェネレータツールがあるとのことなので、それを使ってみます
(読み方は「イーク」?)

では、yiicを叩きます
アプリケーションのディレクトリ名はとりあえず`yiitest`にします

```
# php yii/framework/yiic webapp yiitest

Create a Web application under '/var/www/html/yiitest'? (yes|no) [no]:
```

上のコマンドは、先ほど作られたyiiの中の`framework/yiic`というツールに対して命令をしています

すると、「じゃあ指定の場所にWEBアプリを作るよ?」って聞いてくるので、`yes`と答えました

するとガガガっとファイルが作られていき

```
Your application has been created successfully under /var/www/html/yiitest.
```

と、メッセージが出されます
OKのようです


ブラウザで確認してみます

```
http://(IPアドレス)/yiitest/
```

`My Web Application`というページが表示されました
これでOKですね!

#データベース設定と簡単なアプリケーション
LAMPなWEBアプリケーションなので、MySQLと連携させます
phpMyAdminなどで、`yiitest`というテーブルとそれに対する全権持ちのユーザを作っておきました(そのあたりの作業は割愛)

次に、このデータベースに`tbl_user`というテーブルを作りました
このテーブル定義は、yiicの時に自動的に`/protected/data/schema.mysql.sql`というファイルが作られていて、その中身に書いてあるSQLから作りました

ちなみに中身はこんな感じです

```
CREATE TABLE tbl_user (
    id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(128) NOT NULL,
    password VARCHAR(128) NOT NULL,
    email VARCHAR(128) NOT NULL
);

INSERT INTO tbl_user (username, password, email) VALUES ('test1', 'pass1', 'test1@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test2', 'pass2', 'test2@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test3', 'pass3', 'test3@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test4', 'pass4', 'test4@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test5', 'pass5', 'test5@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test6', 'pass6', 'test6@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test7', 'pass7', 'test7@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test8', 'pass8', 'test8@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test9', 'pass9', 'test9@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test10', 'pass10', 'test10@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test11', 'pass11', 'test11@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test12', 'pass12', 'test12@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test13', 'pass13', 'test13@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test14', 'pass14', 'test14@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test15', 'pass15', 'test15@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test16', 'pass16', 'test16@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test17', 'pass17', 'test17@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test18', 'pass18', 'test18@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test19', 'pass19', 'test19@example.com');
INSERT INTO tbl_user (username, password, email) VALUES ('test20', 'pass20', 'test20@example.com');
```

では、早速データベース設定をしてみます
vimで規定の「アプリケーション初期構成ファイル」を編集するようです

```
# vim protected/config/main.php
```
```
                'db'=>array(
                        'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
                ),
                // uncomment the following to use a MySQL database
                /*
                'db'=>array(
                        'connectionString' => 'mysql:host=localhost;dbname=testdrive',
                        'emulatePrepare' => true,
                        'username' => 'root',
                        'password' => '',
                        'charset' => 'utf8',
                ),
                */
```

`db`という項目がありました
どうやら、sqliteがデフォルトで設定されているようです
これをMySQLを使うように設定変更するみたいです

`uncomment the following to use a MySQL database`
「MySQLデータベースを使うにはコメントを外してね」と書いてありますからね
逆にsqliteの方は使わないのでコメントしておきました

```
'connectionString' => 'mysql:host=<ホスト>;dbname=<データベース名>',
```
```
'username' => '<ユーザー名>',
'password' => '<パスワード>',
```

基本的には、上記を設定する感じですね
追加でタイムゾーンを直したりするらしいですが、
それはまた後ほどやります

今回は`yiitest`というデータベースなので、dbnameとusernameは`yiitest`にしました
ホストはサーバ内のMySQLなのでとりあえず`localhost`で


#Giiでソースコードを作ってみる
「Gii」とは、公式リファレンスによると「強力なウェブベースのコードジェネレータ」とのことらしいです

まずは事前準備をしなければならないようです
vimで「アプリケーション初期構成ファイル」を編集します

```
# cd /var/www/html/yiitest

# vim protected/config/main.php
```
```
        'modules'=>array(
                // uncomment the following to enable the Gii tool
                /*
                'gii'=>array(
                        'class'=>'system.gii.GiiModule',
                        'password'=>'Enter Your Password Here',
                        // If removed, Gii defaults to localhost only. Edit carefully to taste.
                        'ipFilters'=>array('127.0.0.1','::1'),
                ),
                */
        ),
```

`modules`という項目に`gii`がありました
`uncomment the following to enable the Gii tool`
「Giiを有効にするにはコメント外してね」とあるので、外します

`Enter Your Password Here`
「パスワードを入れてね」とパスワードが必要ぽいので適当なものを入れておきました

`ipFilters`の項目でIPのフィルタがかけられるようです
後ほどのジェネレータページにアクセスできるIPを制限しているようなので、
一旦この配列に`'*'`という文字列を足しました(後で消す前提で)

```
'ipFilters'=>array('127.0.0.1','::1','*'), // こんな感じで書き換え
```

ブラウザで次のURLにアクセスしてみます

```
http://(IPアドレス)/yiitest/?r=gii
```

すると、`Please enter your password`と何やらパスワードを聞かれます
ここには先ほど「アプリケーション初期構成ファイル」で設定したパスワードを入れました

すると`Welcome to Yii Code Generator!`というページが表示されました!

+ Controller Generator
+ Crud Generator
+ Form Generator
+ Model Generator
+ Module Generator

というメニューがあるので、まずはモデルから作ってみます
`Model Generator`を選択します

`Model Generator`ページにはフォームがたくさんありますが、
自分が編集したのはまず`Table Prefix`です
今回テーブル名のプレフィクスは`tbl_`なので、それを入力しました

次に`Table Name`を入力しました
テーブルは`tbl_user`なので、それを入力しますが、
入力すると`Model Class`が自動で「User」と入力されました

下のpreviewボタンを押すと、`models/User.php`というリンクが表示されました
クリックしてみると、PHPソースコードがふわっと表示されました!

```
<?php

/**
 * This is the model class for table "tbl_user".
 *
 * The followings are the available columns in table 'tbl_user':
 * @property integer $id
 * @property string $username
 * @property string $password
 * @property string $email
 */
class User extends CActiveRecord
{
    /**
     * Returns the static model of the specified AR class.
     * @param string $className active record class name.
     * @return User the static model class
     */
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

(以下略...)
```

`@property`のコメントを見ると、
先ほどデータベースに作ったテーブル定義がちゃんと反映されてるようです
これが生成されるようですね!

では早速、generateボタンと行きたいところですが、
これを押すとエラーになります

Giiが `/var/www/html/yiitest/protected/models/`に
`User.php`を作ろうとするのですが、
書込権限がないのでファイルを作れないためです

なので、以下を実行します

```
# cd /var/www/html/yiitest/protected/ 

# chmod 777 models/
```

あらためて、先述のgenerateボタンを押すと
エラーにはならず、`The code has been generated successfully.`と表示されました

本当かどうか確かめます

```
# cd models/

# ls -la
合計 20
drwxrwxrwx  2 root   root   4096  4月  5 23:51 .
drwxr-xr-x 14 root   root   4096  4月  5 23:35 ..
-rw-r--r--  1 root   root    969  4月  5 23:35 ContactForm.php
-rw-r--r--  1 root   root   1779  4月  5 23:35 LoginForm.php
-rw-rw-rw-  1 apache apache 2278  4月  5 23:51 User.php
[root@ip-172-30-1-229 models]# 
```

User.phpが作られてますね!
OKです