LoginSignup
2
2

More than 5 years have passed since last update.

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

Posted at

前回は、yiiのインストールからGiiを使ってUserモデルを作るところまで進みました
このユーザを管理するところと、ログインができるアプリケーションまでを作りたいですね

CRUDを作ってみる

CRUDといえば「作る(C)・読む(R)・書き換える(U)・消す(D)」ですね
管理画面を作るとすれば基本的な画面になります
これもソースコードを書くことなくGiiで作れるらしいです

http://52.68.17.10/yiitest/index.php?r=gii/crud

ブラウザでこのURLにアクセスすると
Crud Generatorというページが表示されます

前回、Userクラスが作られましたので
Model ClassにはUserと入力しました
すると、Controller IDには自動でuserと入力されました

previewを押すと、

  • controllers/UserController.php
  • views/user/_form.php
  • views/user/_search.php
  • views/user/_view.php
  • views/user/admin.php
  • views/user/create.php
  • views/user/index.php
  • views/user/update.php
  • views/user/view.php

これだけのファイルを作るよという表示が

前回と同じように書込権限の問題もあるので、
generateを押す前に
controllersとviewsディレクトリを777にしておきましょう

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

# chmod 777 controllers/
# chmod 777 views/

generateを押すと
The controller has been generated successfully. You may try it now.と表示されました

try it nowのところがリンクになっているので押下してみます

すると、http://(IPアドレス)/yiitest/index.php?r=userにリンクされ
ユーザ一覧ページが表示されます
もうすでにページャやソート、検索、閲覧や編集、追加、削除などの機能が備わっています

ちなみに、編集などの操作を行おうとすると、
ログイン画面に飛ばされますが、

username admin
password admin

でログインすればOKのようです

管理画面まわりをカスタマイズしてみる

自動生成されたモデルクラスのファイルUser.phpを少しカスタマイズしてみます
ページに表示されるフォームの名前は
すべてデータベースのカラム名になっているので、
これを日本語に変えてみます

対象のファイルは前回作ったのでどこにあるかはすぐわかります
vimで編集します

# vim /var/www/html/yiitest/protected/models/User.php
        /**
         * @return array customized attribute labels (name=>label)
         */
        public function attributeLabels()
        {
                return array(
                        'id' => 'ID',
                        'username' => 'Username',
                        'password' => 'Password',
                        'email' => 'Email',
                );
        }

attributeLabels()というメソッドで設定されているようです
ここを下記のように日本語にしてみます

        /**
         * @return array customized attribute labels (name=>label)
         */
        public function attributeLabels()
        {
                return array(
                        'id' => 'ユーザ番号',
                        'username' => 'ユーザ名',
                        'password' => 'パスワード',
                        'email' => 'メールアドレス',
                );
        }

そして再度、
http://(IPアドレス)/yiitest/index.php?r=userにアクセスしてみると、
設定した通り、日本語が表示されました!

認証画面をカスタマイズしてみる

実はこの自動生成されたWEBアプリケーションは
adminとdemoというIDとパスワードが同じユーザでログインすることになっています
そんなWEBアプリはよくないので、カスタマイズしてみます

せっかくユーザモデルを作って、管理もできるようになったので
このユーザで認証したいですね

ちなみに、公式リファレンスの「ユーザ認証」を参考にしました

ユーザモデルの修正

とりあえず前提となるDBのユーザテーブルには
パスワードが平文で入ってしまっているので、
一旦tbl_userテーブルは空にしちゃいます
(ここはphpMyAdminなどで直接DBを触っちゃいましょう)

空にした後、http://(IPアドレス)/yiitest/index.php?r=user
No results found.になればOKです

次に新たにユーザを追加する際には
パスワードを平文で入れないように変更したいと思います

Userモデルクラスをvimで編集します

# vim /var/www/html/yiitest/protected/models/User.php
        protected function beforeSave() {
            if(parent::beforeSave()) {
                $this->password = CPasswordHelper::hashPassword($this->password);
                return true;
            } else {
                return false;
            }
        }

上記のように beforeSave()メソッドをオーバライドするようです
CPasswordHelper::hashPassword()で、ハッシュ化されたパスワードを生成するみたいな処理ですね
自動生成されたソースコードにはbeforeSave()メソッドはないので、
追記する形になります

追記を保存したら、ブラウザからユーザを追加してみます
Create Userメニューから適当なユーザを追加します
そうするとDBに新たにレコードが追加され、
パスワードがハッシュ化されていればOKですね

認証処理を変更する

次に、現在のWEBアプリケーションがどのように認証処理をしているか
サラッと見てみます

認証処理をしているのは、
CUserIdentityというクラスを継承したUserIdentityクラスのようです
vimで開いてみます

# vim /var/www/html/yiitest/protected/components/UserIdentity.php 
class UserIdentity extends CUserIdentity
{
        /**
         * Authenticates a user.
         * The example implementation makes sure if the username and password
         * are both 'demo'.
         * In practical applications, this should be changed to authenticate
         * against some persistent user identity storage (e.g. database).
         * @return boolean whether authentication succeeds.
         */
        public function authenticate()
        {
                $users=array(
                        // username => password
                        'demo'=>'demo',
                        'admin'=>'admin',
                );
                if(!isset($users[$this->username]))
                        $this->errorCode=self::ERROR_USERNAME_INVALID;
                else if($users[$this->username]!==$this->password)
                        $this->errorCode=self::ERROR_PASSWORD_INVALID;
                else
                        $this->errorCode=self::ERROR_NONE;
                return !$this->errorCode;
        }
}

短いクラスだったので全部掲載しました
authenticate()メソッドに、admin と demo で認証するみたいな処理がありました

ここをUserモデルが絡む処理に変えてやればいいのですね
こちらのページにサンプルがありました
ひとまずこの通りに実装してみます

class UserIdentity extends CUserIdentity
{
    private $_id;
    public function authenticate()
    {
        $record=User::model()->findByAttributes(array('username'=>$this->username));
        if($record===null)
            $this->errorCode=self::ERROR_USERNAME_INVALID;
        else if(!CPasswordHelper::verifyPassword($this->password,$record->password))
            $this->errorCode=self::ERROR_PASSWORD_INVALID;
        else
        {
            $this->_id=$record->id;
            // $this->setState('title', $record->title); // この行は今回コメントします
            $this->errorCode=self::ERROR_NONE;
        }
        return !$this->errorCode;
    }

    public function getId()
    {
        return $this->_id;
    }
}

この実装後、一度ログアウトしてみて
再度ログイン画面で試験してみます

admin/admin のアカウントではログインできなくなっていればOKです

そして、追加したユーザのユーザ名とパスワードで
ログインができたらOKです!

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2