2016-08-10 02:43:48 3392次浏览 3条回答 0 悬赏 15 金钱

用户提交登录界面,提交用户表格后输出结果非model里面的message匹配内容?

LoginController.php代码如下:

<?php
namespace backend\controllers;

use yii\web\Controller;
use common\models\LoginForm;
use Yii;


class LoginController extends Controller{
    
    public $layout = 'login' ;
    
    public function actionIndex(){
        
        $model = new LoginForm();

            if($model->load(Yii::$app->request->post() && $model->validate())){
                return $this->redirect(['site/index']);
            }else{
            var_dump(Yii::$app->request->isPost);
            echo "<br>";
            var_dump($model->load(Yii::$app->request->post()));    
            echo "To be continued...";
            }
        
        return $this->render('index',['model' => $model]);
    }
  
}

然后是login/index.php的代码:

<?php
use yii\helpers\Html;
use Yii;

//http://www.yiiframework.com/doc-2.0/guide-output-client-scripts.html
$this->registerCssFile('@web/css/bslogin.css');

?>

<div class="container">
<?=Html::beginForm('','post',['class'=>'form-signin'])?>

        <h2 class="form-signin-heading">Please sign in</h2>

        <?=Html::activeInput('text',$model,'username',['id'=>'username','class'=>'form-control','placeholder'=>'用户名','autofocus'=>true])?>
        <?=Html::error($model,'username')?>

        <?=Html::activeInput('password', $model,'password',['id'=>'inputPassword','class'=>'form-control','placeholder'=>'密码'])?>
        <?=Html::error($model,'password')?>
        <div class="checkbox">
          <label>
            <input type="checkbox" value="remember-me"> Remember me
          </label>
        </div>
        <?=Html::submitButton('登入',['class'=>'btn btn-lg btn-primary btn-block'])?>
<?=Html::endForm()?>
</div>

最后的就是LoginForm:

<?php
namespace common\models;

use Yii;
use yii\base\Model;
use common\models\User;

class LoginForm extends Model{
    
    public $username;
    public $password;
    public $rememberMe = true;
    public $verification;
    
    private $user;
    //登录返回用户信息来储存,用于后面的session,cookies等
    
    public function rules(){
        return [
            [['username','password'],'required','message'=>'{attribute}必须要写入...'],
            ['username','validateUser'],
            ];
    }
    
    public function validateUser($attribute,$params){
        $user = User::findOne(['username'=>$this->$attribute]);
        if(!$user){
            $this->addError($this->attribute,'貌似有错误了额...');
        }   
    }   
}

User Model的部分代码:

    public function rules(){
        return [
            [['username','password','email'],'required','message'=>'{attribute}必须要填写哟,少年'],
            ['username','unique','message'=>'你落后了一步,{value}已经被占用'],
            ['email','email','message'=>'非邮箱地址'],
            ['password','string','min'=>6,'tooShort'=>'密码太短了...呵呵',],
            ['status','in','range'=>[0,1]],
            ];
    }

清空用户输入后,提交信息,输出两个错误信息(username & password),然后测试只输入用户名不输入密码,还是同样的错误信息,好像用户名那里[输入=没输入]一样。或者全部输入正确用户名及密码,页面也不进行跳转,这是何故?
截图为输入用户命和密码后的输出(控制器添加了var_dump()):
效果输出图

【疑问】引用User模型的rules不会跟LoginForm的rules冲突吧?

补充于 2016-08-10 10:27

这个是原版的LoginForm

<?php
namespace common\models;

use Yii;
use yii\base\Model;

/**
 * Login form
 */
class LoginForm extends Model
{
    public $username;
    public $password;
    public $rememberMe = true;

    private $_user;


    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            // username and password are both required
            [['username', 'password'], 'required'],
            // rememberMe must be a boolean value
            ['rememberMe', 'boolean'],
            // password is validated by validatePassword()
            ['password', 'validatePassword'],
        ];
    }

    /**
     * Validates the password.
     * This method serves as the inline validation for password.
     *
     * @param string $attribute the attribute currently being validated
     * @param array $params the additional name-value pairs given in the rule
     */
    public function validatePassword($attribute, $params)
    {
        if (!$this->hasErrors()) {
            $user = $this->getUser();
            if (!$user || !$user->validatePassword($this->password)) {
                $this->addError($attribute, 'Incorrect username or password.');
            }
        }
    }

    /**
     * Logs in a user using the provided username and password.
     *
     * @return boolean whether the user is logged in successfully
     */
    public function login()
    {
        if ($this->validate()) {
            return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
        } else {
            return false;
        }
    }

    /**
     * Finds user by [[username]]
     *
     * @return User|null
     */
    protected function getUser()
    {
        if ($this->_user === null) {
            $this->_user = User::findByUsername($this->username);
        }

        return $this->_user;
    }
}

然后是controller的说

    public function actionLogin()
    {
        if (!Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) {
            return $this->goBack();
        } else {
            return $this->render('login', [
                'model' => $model,
            ]);
        }
    }

比较困惑为什么这个可以成功,我的就不行。。

最佳答案

  • 晦涩de咚 发布于 2016-08-10 08:55 举报

    你的控制器

    public function actionIndex(){
            
            $model = new LoginForm();
    
                if($model->load(Yii::$app->request->post() && $model->validate())){
                    return $this->redirect(['site/index']);
                }else{
                var_dump(Yii::$app->request->isPost);
                echo "<br>";
                var_dump($model->load(Yii::$app->request->post()));    
                echo "To be continued...";
                }
            
            return $this->render('index',['model' => $model]);
        }
    

    你的loginForm里面没validate();$model->validate()怎么用他呢?

    还有你的loginForm继承model;那么不应该要指明表吗?,建议你继承user表;

    至于你的疑问:继承user表,只要当前写了与被继承的模型一样的函数,只会覆盖,不会有冲突的。

    4 条回复
    回复于 2016-08-10 10:01 回复

    这...yii\base\Model::validate()在手册里面,validate()是model自带的函数还是我的理解有误...
    在loginForm里面引用了user的表应该可以吧,那个自带的登录LoginForm也是那样子用啊?

    回复于 2016-08-10 10:08 回复

    use 了,并不代表你这个模型继承了

    回复于 2016-08-10 10:29 回复

    我追加了个原版的代码,有点仿着写又加了点其他的,不太知道为嘛我的不成功...

    回复于 2016-08-11 03:14 回复

    已解决。。就是controller的括号位置不对。。愣是没看出来

  • 回答于 2016-08-10 09:38 举报

    输入正确的用户名和密码没有登录是因为你在你的Controller中没有进行登录操作啊~,不知道在你的loginform中有没有实现login方法,可以参考yii中自带的代码

    1 条回复
    回复于 2016-08-10 10:04 回复

    那个目前我还只是测试验证转向,还没有要登录操作的说,这样应该可以吧?我的代码除了login方法之外还有其他什么错误么。。

  • 回答于 2016-08-10 10:20 举报

    LoginForm 的 rules 和 User 的 rules 并没有任何冲突。

    你可以理解为
    LoginForm 的 rules 是用于登录验证,通常包含用户名密码是否为空,用户名密码是否正确。
    User 的 rules 是作用于 注册验证。比如用户名是否为空,长度为何,邮箱是否为空且是否符合格式等等。

    唯一的联系就是LoginForm在进行密码校验时会用到User去执行数据库查询。

    而你现在遇到的问题基本和User没有任何关系。请检查登录Form所对应的Model也就是LoginForm

    1 条回复
    回复于 2016-08-10 10:34 回复

    我参照了原版的LoginForm的代码,对比了下,基本上没有大的不同吧,只是阉割版本的说。原版代码我放到追加提问了,验证规则目前好像也不通过的样子...

您需要登录后才可以回答。登录 | 立即注册
brantyo
助理

brantyo 加拿大

注册时间:2016-04-12
最后登录:2017-04-06
在线时长:2小时30分
  • 粉丝0
  • 金钱105
  • 威望0
  • 积分125

热门问题