The DoYouHaoBaby PHP Framework中文开发文档手册
Copyright(c) DoYouHaoBaby.NET All Rights Reserved.
Copyright(c) DoYouHaoBaby.NET All Rights Reserved.
[ 用户登录 ]
这里,我们将会为大家讲解一下,如何登录系统。首先,给大家介绍的是,我们这里使用简单的COOKIE验证当前是
否处于登录状态。我这里使用的user_login这个COOKIE值来验证,这个cookie值存在,表示已经登录,否则表示还
未登录。
我们要登录,第一步是判断是否处于登录状态,处于登录状态我们就不需要重复登录了。我们在公用控制器
InitController.class.php中将当前的登录信息获取出来。
代码如下:
- public function init__(){
- parent::init__();
- $arrUserData = $this->getCookieData( 'user_login' );
- if( empty( $arrUserData['user_id'] ) )
- $GLOBALS['___login___'] = false;
- else
- $GLOBALS['___login___'] = $arrUserData;
- unset( $arrUserData );
- // 公用赋值
- $this->assign_();
- }
说明:init__是框架控制器的一个初始化方法,只要这个方法存在,那么这个方法就会被执行。这样可以用于初始
化一些公用数据的需要,比如说这里的登录信息等等。
代码的意思也很清楚,就是将登录信息保存全局变量中,这样我们后面就可以调用到。全局变量的好处就是,在网
站的任何地方都可以方便取出登录数据。
登录界面
在UserController中写下如下的代码:
- /**
- * 登录
- */
- public function login(){
- // 判断是否已经登录
- if( $GLOBALS['___login___']!==false )
- $this->E( G::L( '你已经登录过了。' ) );
- $this->display();
- }
说明:首先判断是否已经登录过了,登录过了就不需要重复登录,如果没有登录就会加载登录界面。
这里,根据框架惯性,这里会加载 user_login.html模板文件。
然后,我们在模板文件中加入user_login.html,记得要删除一遍TplFileIndex.inc.php(模板文件缓存)。
- <include file="public_header">
- <div id="content_wrapper">
- <div id="content">
- <form name="form_user" id="form_user" action="{:G::U('user/check_login')}" method="post">
- <fieldset>
- <p>
- <label for="user_name">用户名</label>
- <input type="text" name="user_name" id="user_name" />
- </p>
- <p>
- <label for="user_password">密码</label>
- <input type="password" name="user_password" id="user_password" />
- </p>
- <p>
- <input type="submit" name="Submit" value="登录" />
- </p>
- </fieldset>
- </form>
- <p>你可以返回首页,<a href="{:G::U( 'index/index' )}">返回首页</a> </p>
- </div>
- <include file="public_sidebar">
- <include file="public_footer">
然后访问 http://localhost/wedoit/index.php/user/login,你会看到如下的界面:

接着,我们添加登录的逻辑处理代码,位于UserController.class.php中check_login方法:
- /**
- * 登录验证
- */
- public function check_login(){
- // 取得登录用户信息
- $sUserName = Safe::getGpc( 'user_name','P' );
- $sPassword = Safe::getGpc( 'user_password','P' );
- // 账号不能为空
- if( empty( $sUserName ) ) {
- $this->E( G::L( '帐号或者E-mail不能为空!' ) );
- }
- elseif ( empty( $sPassword ) ){
- $this->E( G::L( '密码不能为空!' ) );
- }
- // 检测是E-mail登录验证,还是帐号
- // 启动日常验证检测程序
- Check::RUN();
- if( Check::C( $sUserName,'email' ) ){
- $bEmail = true;
- unset( $_POST['user_name'] );
- }
- else{
- $bEmail = false;
- }
- // 登录验证
- // 这里还有一个参数为是否自动更新登录信息,默认开启
- // Rbac行为插件中的checkLogin( $sUsername, $sPassword,$bEmail=false, $bUpdateLogin = true )
- $oUser = UserModel::M()->checkLogin( $sUserName,$sPassword,$bEmail );
- // 尝试获取行为插件验证错误消息,没有错误,表示验证通过
- if( UserModel::M()->isBehaviorError() ){
- $this->E ( UserModel::M()->getBehaviorErrorMessage() );
- }
- else{
- // 开始模型中的错误,如果没有那么路过
- if( $oUser->isError( ) ){
- $this->E( $oUser->getErrorMessage() );
- }
- $this->setCookieData( 'user_login',$oUser->toArray(),86400 );
- $this->assign( '__JumpUrl__',G::U( 'index/index' ) );
- $this->assign( '__WaitSecond__',3 );
- // 刚开始我们无法获取数据,因为刚开始验证完毕后,程序尚未从数据库获取用户登录
- 信息
- // 这里可以使用$arrUserData = $oUser->userData() 获取数据
- // 同样也可以使用$arrUserData = UserModel->userData()
- // 还可以直接使用全局变量, $arrUserData = $GLOBALS[ $this->getCookieData[ G::C(
- 'RBAC_DATA_PREFIX' ).'authkey' ] ];
- $this->S( G::L( 'Hello %s,你成功登录!','app',null,$sUserName ) );
- }
- }
这里,我们使用了框架的RBAC行为扩展插件,这里我们直接使用框架提供的登录验证方法来验证数据。
- UserModel::M()->checkLogin( $sUserName,$sPassword,$bEmail );
我们使用如下代码来捕获模式扩展中可能遇到的错误:
- UserModel::M()->getBehaviorErrorMessage();
如果,登录成功后,我们就发送cookie,表示登录成功了。
- $this->setCookieData( 'user_login',$oUser->toArray(),86400 );
好了,逻辑代码就结束了。
首先,我们注册一个xiaoniuge,密码为123456来测试一下登录效果。
输入用户名和密码,然后点击“登录”,你会看到如下的效果。
如图2:
我们在首页,填上如下的代码:
- <div class="content_section divider">
- <h2>欢迎你来到我们的演示庭</h2>
- <p>我们我们将会带领大家开发一个简单的wedoit 在线任务管理器程序。 </p>
- {if $GLOBALS['___login___']===false}<p>你可以在这里注册一个用户,<a href="{:G::U(
- 'user/register' )}">注册</a> | <a href="{:G::U( 'user/login' )}">登录</a></p>
- {d*else}登录用户 | <a href="{:G::U( 'index/change_password?id='.$GLOBALS
- ['___login___']['user_id'] )}">{$GLOBALS['___login___']['user_name']}</a> <a href="{:G::U(
- 'user/logout' )}">注销</a> | <a href="{:G::U( 'index/add' )}">添加任务</a> {/if}
- </div>
然后,你就会看到如下的效果:
如图3:
好了,登录验证我们已经制作完毕,continue to end !
