Edited at

初めてPHPのフレームワーク(Yii)を使ってみる その2

More than 5 years have passed since last update.

手探り状態ですが、なんとかここまで進みました。ここから、実際にコードを触ったりしていきます

今回は、ユーザテーブルにアクセスして、ログイン(ユーザ認証)するところまでを作ってみます



UserモデルとUserProfileモデルの作成

元々作られているUserクラスを削除して、新たにデータベースに合わせたUserクラスを作成する

htdocs/ec_site/protected/models/User.phpを削除

次にブラウザからhttp://www.example.com/ec_site/index.php?r=giiにアクセス

(パスワードは「その1」で最後に設定したGiiのパスワード)

Model Generatorリンクをクリックして、Model Generatorページへ

Table Nameフィールドにec_user(ユーザテーブル名)、Table Prefixフィールドにec_と入力し、Previewボタンを押す

下に作成されるコード一覧(models/User.php)が表示されるので、Generateボタンを押すと、htdocs/ec_site/protected/models/User.phpが生成される

同様にして、UserProfileモデルも作成する


日本語化

loginForm.phpとlogin.phpははじめに生成されるものをほとんどそのまま使える。

ただし、usernameにあたる部分をメールアドレスにしたので、わかりやすいようにusernameをmailaddrに変える。また、ブラウザでの表示を日本語に変える。


LoginForm.phpの編集

htdocs/ec_site/protected/models/LoginForm.phpの中のusernameをmailaddrに置換し、英語表示を日本語に変える。


htdocs/ec_site/protected/models/LoginForm.php.php

<?php

...
public $mailaddr;
public $password;
public $rememberMe;

private $_identity;
...
public function attributeLabels()
{
// 日本語のラベルに書き換える
return array(
'mailaddr' => 'メールアドレス',
'password' => 'パスワード',
'rememberMe' => 'ログイン状態を保存する',
);
}

/**
* Authenticates the password.
* This is the 'authenticate' validator as declared in rules().
*/

public function authenticate($attribute,$params)
{
if(!$this->hasErrors())
{
$this->_identity=new UserIdentity($this->mailaddr,$this->password);
if(!$this->_identity->authenticate())
$this->addError('password','メールアドレスかパスワードが正しくありません');
}
}
...



login.phpを編集

login.phpの中のusernameをmailaddrに置換し、英語表示を日本語に変える


htdocs/ec_site/protected/views/site/login.php

...

<h1>ログイン</h1>

<p>メールアドレスとパスワードを入力してください:</p>

<div class="form">
...
<p class="note"><span class="required">*</span>は必須事項です</p>

<div class="row">
<?php echo $form->labelEx($model,'mailaddr'); ?>
<?php echo $form->textField($model,'mailaddr'); ?>
<?php echo $form->error($model,'mailaddr'); ?>
</div>
...
<div class="row buttons">
<?php echo CHtml::submitButton('ログイン'); ?>
</div>

<?php $this->endWidget(); ?>
</div><!-- form -->



認証部分を作る


UserIdentuty.phpを編集

htdocs/ec_site/protected/components/UserIdentity.phpを編集


htdocs/ec_site/protected/components/UseeIdentity.php

<?php

/**
* UserIdentity represents the data needed to identity a user.
* It contains the authentication method that checks if the provided
* data can identity the user.
*/

class UserIdentity extends CUserIdentity
{
private $_id;

public function authenticate()
{
$username=$this->username;
$user=User::model()->find('mailaddr=?',array($username));
if($user===null)
$this->errorCode=self::ERROR_USERNAME_INVALID;
else if(!$user->validatePassword($this->password))
$this->errorCode=self::ERROR_PASSWORD_INVALID;
else
{
$this->_id=$user->id;
$this->username=$user->mailaddr;
$this->errorCode=self::ERROR_NONE;
}
return $this->errorCode==self::ERROR_NONE;
}

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


##CUserIdentity.phpを編集

usernameをmailaddrに替えたために、継承元ファイルも変えなければならなくなった。yii/framework/web/auth/CUserIdentity.phpの中のusernameをmailaddrに置換する


パスワードのチェックをするメソッドを追加する

パスワードのバリデーションチェック、ハッシュと検証をするメソッドをhtdocs/ec_site/protected/models/User.phpに追加する。ついでにラベルを日本語化しておく


htdocs/ec_site/protected/models/User.php

...

public function attributeLabels()
{
return array(
'id' => 'ID',
'mailaddr' => 'メールアドレス',
'password' => 'パスワード',
'auth' => 'Auth',
);
}
...
public function validatePassword($password)
{
return CPasswordHelper::verifyPassword($password,$this->password);
}

public function hashPassword($password)
{
return CPasswordHelper::hashPassword($password);
}
...



テスト

MySQLAdminでec_userに適当なデータを1行ぶん作り(パスワードはハッシュがかかっているので、/htdocs/ec_site/protected/date/schema.mysql.sqlのINSERT文からdemoまたはadminをハッシュした文字列をコピーするといい)、サイトの「Login」タブからログインしてみる


どうでしょうか。うまくいきましたか?

次はデータの更新作業をしてみます。