Yii

Yii Brog Tutorial ログオン機能とMVCの関係はどうなんだろう?

スキャフォールディングで出力されたログイン処理の入り口は、site コントローラの login (site/login)アクションにあるのでソースを眺めて見る。Definitive Guide を見たおかげで、ようやく何をしているか推測できるようになってきた。

このログイン処理へは、サイト表示上部の Login の他、コントローラで定義された accessRules で、アクションが「admin」に指定されているとリダイレクトされる。これは、フレームワーク動作の中心となるアプリケーションコンポーネントの中の CWebUser が持つパラメータ 「loginUrl」によって、デフォルトが「/site/login」に定められているからのようだ。

コアアプリケーションコンポーネントのプロパティは、config/main.php の中で初期設定できる。Core Application Components をみると、「user: CWebUser」とあるので、config/main.php の componets 指定で、

return array(
	'components'=>array(
		'user'=>array(
			'loginUrl'=>'controller/action',
		),

を設定すれば、ログイン処理は site/login 以外のアクションに変更できそうだ。

ログイン表示のビューは views/site/lgoin.php に置かれているので、タイトルなど日本語に変更する。入力フィールドのタイトルは、モデル(model/LoginForm.php)に定義された attributeLabels() メソッドからアトリビュート名(モデル内のテーブルカラム名など定義)をキーとした配列で渡されるので、次のようにオーバーライドした。

public function attributeLabels() {
	return array(
		'username'=>'ログイン名',
		'password'=>'パスワード',
		'rememberMe'=>'次回ログインを省略',
	);
}

さて、認証処理をする components/UserIdentity.php の authenticate() メソッドへは、

SiteController.php の actionLogin() 内 $model->validate() により
model/LoginForm.php の rules 定義で authenticate() が実行され
authenticate() 内 $identity->authenticate() により
components/UserIdentity.php の authenticate() が実行される

順番で進む。チュートリアルでは UserIdentity.php の authenticate() で、入力データとDB上のユーザテーブルを照合し認証結果を戻す。

ここで、今後のサイト作りでログインした人の名前を表示したいので、次のような仕掛けを作ってみる。

セッションデータに名前を登録し、ログイン時にその名前をナビゲーションに表示するようにする。

user テーブルに dispname カラムを追加し、それを読み込んで表示するようにする。

先ずはUserIdentity クラスに $_dispname プロパティを追加し、getDispname()で読み取れるように準備する。次にLoginForm.php の authenticate()で、ユーザ認証でエラーがなかった際、Yii:app()->user->login() を実行してセッションに登録しているようなので、その下に

Yii::app()->user->setState(‘dispname’, $identity->dispname);

UserIdentity.php の authenticate()でユーザー認証が正常に行なわれた場合、下のように

$this->setState('dispname', $model->dispname);

として名前を登録する。

ナビゲーションの表示は、レイアウトビュー views/layouts/main.php で行なわれている。

Yii::app()->user->name

Yii::app()->user->getState(‘dispname’)

に変更して、名前を表示するようになった。

最後に、ログイン画面のエラー表示を変更してみる。Yii のエラー表示は、入力項目別に行なう方法とページの一か所にまとめて表示する方法を用意している。両方同時表示も可能。エラーメッセージを日本語表示したい場合は、Yii デフォルトコントローラ/アクションの変更を参照して下さい。

エラーが発生した場合 LoginForm.php の authenticate()内で、addError() を利用して CHtml ヘルパーで属性とエラーメッセージを表示している。スキャフォールドで作成された認証エラーは、ご丁寧にログイン名とパスワードのどちらで発生したものか知らせてくれるので、これを止めて、一か所のエラー表示でログインデータの誤りを表示するようにしたい。

そこでエラーを case 処理せず、そして属性を指定しないで登録してみた。

switch($identity->errorCode) {
	case UserIdentity::ERROR_NONE:
	 :
	default:
		$this->addError('', 'ログイン名、パスワードが誤りです。');
		break;
}

これで、views/site/login.php にある CHtml::errorSummary()で、登録したエラーが表示されるようになった。各項目別にエラーを表示したい場合は、CHtml::error()を利用すればよい。

(yii-1.1.0.r1700)