我想知道我的代码中有什么问题我无法保护2输入用户名和密码
在我的控制器中:
class AccountsController extends \BaseController {
...
public function store()
{
$date = new \DateTime;
$input['updated_at']=$date;
$input['created_at']=$date;
$input['username']=Input::get("username", "");
$input['password']=Input::get("password", "");
$input['sex']=Input::get("sex", "");
$input['dob']=Input::get("dob", "");
$input['dob']= date("Y-m-d", strtotime($input['dob']));
$v=Validator::make($input, Account::$register_rules);
$input['password']=Hash::make($input['password']);
if($v->passes()){
DB::table('accounts')->insert($input);
}
//return Redirect::route('text.index');
}
...
}
在我的模特中:
class Account extends \Eloquent {
protected $guarded = array('username', 'password');
public static $register_rules=array(
'username' => 'required|min:4|max:20|unique:accounts',
'password' => 'required|alpha_num|min:6',
'sex' => 'required|in:f,m',
'dob' => 'required|date_format:Y-m-d'
);
}
在我的app / view
中...
{{ Form::open(array('route'=>'account.store')) }}
<table>
<tr>
<td>{{ Form::label('username', 'Username') }}</td>
<td>{{ Form::text('username') }}</td>
</tr>
<tr>
<td>{{ Form::label('password', 'Password') }}</td>
<td>{{ Form::password('password') }}</td>
</tr>
<tr>
<td>{{ Form::label('confirm_password', 'Confirm Password') }}</td>
<td>{{ Form::password('confirm_password', array('id'=>'confirm_password')) }}</td>
</tr>
<tr>
<td>{{ Form::label('sex', 'Sex') }}</td>
<td>
{{ Form::radio('sex', 'f', true) }}{{ Form::label('Female') }}
{{ Form::radio('sex', 'm') }}{{ Form::label('Male') }}
</td>
</tr>
<tr>
<td>{{ Form::label('dob', 'Date of Birth') }}</td>
<td>
{{Form::text('dob', '', array('id' => 'dob'))}}
</td>
</tr>
<tr>
<td></td>
<td>{{ Form::submit('Register', array('id' => 'submit')) }}</td>
</tr>
</table>
{{ Form::close() }}
...
即使我定义了这两个字段,它们仍然保存在数据库中。
答案 0 :(得分:2)
实际上您没有使用Eloquent ORM
,因此以下代码可以保护Eloquent
模型的质量分配,例如使用Model::create(Input::all())
方法,您可以在Account
中创建新的$account = Account::create(Input::all());
数据库如:
Eloquent
在您的情况下,您没有使用insert
模型,而是使用DB::('accounts')->insert($input)
方法Query builder
这是Illuminate\Database\Query\Builder
类的一个功能(它是一个实例Eloquent ORM
)。
因此,如果您使用Eloquent
,则会使用Model::save()
的功能。在这种情况下,create()
的使用不是质量赋值,array
使用质量赋值,因为在创建新模型时,您可以将create
个属性传递给模型构造函数。然后通过质量分配将这些属性分配给模型,array
接受new static($attributes)
个属性,然后使用create
初始化模型,例如,这是public static function create(array $attributes)
{
$model = new static($attributes);
$model->save();
return $model;
}
方法:
$account = new Account(Input::all()); // Mass assignment through constructor
$account->save();
因此,如果您使用以下内容手动启动模型:
Account
这将是一次群发作业。在这种情况下,您需要通过像这样扩展Eloquent
来创建class Account extends Eloquent {
// Protect mass assignment
protected $guarded = array('username', 'password');
//...
}
模型(您已有):
Laravel
您可以在{{1}}网站上详细了解Mass Assignment。
答案 1 :(得分:1)
您没有使用Eloquent ORM。如果您不使用ORM,则不能指望使用任何功能。
DB::table('accounts')->insert($input);
应该是
$account = new Account($input);
$account->save():
// This is mass assigning model attributes
现在您将看到您的受保护属性得到妥善保护。建议您不要将原始输入数据传递到具有保护属性集的模型中,而不将它们定义为可填充或确保您专门清理数据。
所以你的代码会变成类似下面的代码。
$model = new Account();
$model->username = Input::get('username', '');
// etc ...
$validator = Validator::make($model->toArray(), $rules);
if ( ! $validator->fails() )
$model->save();