tlijian1989

249 经验值

Schema::create('test',function($table){

   $table->increments('id');   

   $table->char('name',8);

   $table->string('email','32'); 

   $table->enum('sex',['1','0']);

   $table->char('password',32); 

   $table->timestamps();  

   $table->softDeletes();

});

执行添加后,没任何问题。但我在测试修改字段的时候发现有报错。

Schema::table('test', function ($table) { 
   $table->string('name', 50)->change();
});

执行后报错

[Doctrine\DBAL\DBALException]  Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.

这就奇怪了,建表的时候没问题,特意看了sex的类型也是enum类型。

当我回滚,从建立表的时候,把sex字段去掉。之后添加和修改字段都没问题。

@JellyBool

protected $fillable = ['name', 'email12', 'password'];

会不会是因为这个原因,没加入 remember_token ,导致laravel 没办法把 token 写进入,所以导致“记住我”这个功能没成功。

@JellyBool
是有内容得,remember_xxxxxx
然后重新走一次:

  1. 执行logout 后,特意看了一下 remember 那个字段的是 null

  2. 返回登陆页,选中“记住我” 后点登陆。

  3. 我执行另一个方法查看,已经登陆了,getRecallerName 有值(和之前的值一样),viaRemember返回依然是 false,数据库的 remember 还是 null。

class TestController extends Controller
{
    public function index(){
        return view('login');
    }

    /**
     * 退出
     *
     * @return mixed
     */
    public function logout()
    {
        return Auth::logout();
    }

    /**
     * 登陆
     *
     * @param Request $request
     */
    public function login(Request $request)
    {

        $remember = ($request->has('remember')) ? true : false;

        $info = [
            'email' => $request->get('email'),
            'password' => $request->get('password')
        ];

        if ( Auth::attempt([
            'email' => $request->get('email'),
            'password' => $request->get('password')
        ],$remember))
        {
            $info['remember'] = $remember;
            print_r($info);
            return ;
        }
    }

    /**
     * 测试
     */
    public function ok(){

        var_dump(\Auth::check());
        echo '<hr/>';
        var_dump(Auth::getRecallerName());
        echo '<hr/>';
        var_dump(Auth::viaRemember());

    }

    public function no(){

       //$a= session('errors');
       //dd($a->first());
    }


}

@JellyBool

我确实是这样写的,当我登陆后;我在其他方法里执行一次Auth::viaRemember(),返回 false。

    public function login(Request $request)
    {

        $remember = ($request->has('remember')) ? true : false;
        if ( Auth::attempt([
            'email' => $request->get('email'),
            'password' => $request->get('password')
        ],$remember))
        {
            return 'ok';
        }
    }

    public function ok(){

        dd(Auth::viaRemember());

    }

手册这样介绍的:

如果你要“记住”用户,可以使用viaRemember方法来判断用户是否使用“记住我”cookie进行认证

if (Auth::viaRemember()) 
{ 
  //
}


我选中“记住我” 登录后,它返回一直是 false,怎么理解? 

dd() 这个方法,是 laravel框架自带的辅助函数,直接用就行.

当我们使用 php artisan make:request 创建验证对象的时候
里面用 rules()方法,但是默认只定义了一组规则.

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => 'required'
        ];
    }

问题: 如何根据不同的方法名,创建多组验证规则?比如"查看","编辑",'插入' 需要有3组不同的规则.

方法 : 首先需要知道当前是什么操作,才能知道该用哪组规则,通过 request对象的$this->segment()方法,来获取 url的信息.比如 http://localhost:8000/submit ,用 $this->segment(1) 值就是 submit.

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $type = $this->segment(1);
        if ($type == 'submit') {
            return [
                'name' => 'required'
            ];
        }elseif($type == 'update'){
            return [
                'id' => 'required'
            ];
        }
    }

如果还有其他更好的方法,还请留言,谢谢!

手册里提到除了用Validator::extend()之外。还可以直接扩展 Validator 类
例子

class CustomValidator extends Illuminate\Validation\Validator {

    public function validateFoo($attribute, $value, $parameters)
    {
        return $value == 'foo';
    }
}

疑问
最后手册说要注册一下,但是这段代码应该写在哪呢?

Validator::resolver(function($translator, $data, $rules, $messages)
{
    return new CustomValidator($translator, $data, $rules, $messages);
});