Phpunit Laravel 4存储库验证和测试
我正在尝试编写一个可测试的Laravel4应用程序。在Taylor Otwells关于Laravel的书中,他写道,我们应该考虑在验证命名空间内创建UpRealValueC类,并将验证器注入到您的存储库中。请提供控制器、存储库和测试中的代码示例。如果用户输入不满意,我是否应该在存储库中抛出验证异常,并在控制器中捕获错误 就个人而言,我更喜欢直接在模型中进行验证。也就是说,对于每个模型,我都有一个Phpunit Laravel 4存储库验证和测试,phpunit,laravel,laravel-4,Phpunit,Laravel,Laravel 4,我正在尝试编写一个可测试的Laravel4应用程序。在Taylor Otwells关于Laravel的书中,他写道,我们应该考虑在验证命名空间内创建UpRealValueC类,并将验证器注入到您的存储库中。请提供控制器、存储库和测试中的代码示例。如果用户输入不满意,我是否应该在存储库中抛出验证异常,并在控制器中捕获错误 就个人而言,我更喜欢直接在模型中进行验证。也就是说,对于每个模型,我都有一个getValidator()方法,如下所示: class User extends Eloquent
getValidator()
方法,如下所示:
class User extends Eloquent
{
public function getValidator()
{
$params = array(
'username' => $this->username,
'password' => $this->password,
);
$rules = array(
'username' => ['required', 'unique:users'],
'password' => ['required', 'min:6'],
);
return Validator::make($params, $rules);
}
}
然后,在我的控制器、命令或测试中,我只需调用该方法来拥有一个验证器实例,然后调用我需要的方法,可以是passes()
或fails()
下面说明了我如何在控制器中实际使用它
class UserController extends BaseController
{
public function processCreateUser()
{
// Retrieve user input.
$user = new User(Input::all());
// Validate input.
$validator = $user->getValidator();
if ($validator->passes())
{
// Hash the password.
$user->password = Hash::make($user->password);
// Save the new user.
$user->save();
return Redirect::to('users')
->with('success', 'User created!');
}
return Redirect::route('users.create')
->withInput()
->with('error', 'Cannot create user, please double check the form.')
->withErrors($validator);
}
}
就个人而言,我更喜欢直接在模型中进行验证。也就是说,对于每个模型,我都有一个
getValidator()
方法,如下所示:
class User extends Eloquent
{
public function getValidator()
{
$params = array(
'username' => $this->username,
'password' => $this->password,
);
$rules = array(
'username' => ['required', 'unique:users'],
'password' => ['required', 'min:6'],
);
return Validator::make($params, $rules);
}
}
然后,在我的控制器、命令或测试中,我只需调用该方法来拥有一个验证器实例,然后调用我需要的方法,可以是passes()
或fails()
下面说明了我如何在控制器中实际使用它
class UserController extends BaseController
{
public function processCreateUser()
{
// Retrieve user input.
$user = new User(Input::all());
// Validate input.
$validator = $user->getValidator();
if ($validator->passes())
{
// Hash the password.
$user->password = Hash::make($user->password);
// Save the new user.
$user->save();
return Redirect::to('users')
->with('success', 'User created!');
}
return Redirect::route('users.create')
->withInput()
->with('error', 'Cannot create user, please double check the form.')
->withErrors($validator);
}
}
我最近编写了类似的代码,这是laracasts()推荐的(它引用了Taylor Otwell的书)。请注意,您不必遵循所使用的应用程序结构
<?php namespace ACME\Services\Validation;
use Validator as V;
abstract class Validator {
protected $errormessages;
protected $rules;
public function validate($input, $rules)
{
$validator = V::make($input, $rules);
$this->rules = $rules;
if ($validator->fails()) {
$this->errormessages = $validator->messages();
return false;
}
return true;
}
public function getErrorMessages()
{
return $this->errormessages;
}
public function getValidationRules()
{
return $this->rules;
}
}
我最近编写了类似的代码,这是laracasts()推荐的(它引用了Taylor Otwell的书)。请注意,您不必遵循所使用的应用程序结构
<?php namespace ACME\Services\Validation;
use Validator as V;
abstract class Validator {
protected $errormessages;
protected $rules;
public function validate($input, $rules)
{
$validator = V::make($input, $rules);
$this->rules = $rules;
if ($validator->fails()) {
$this->errormessages = $validator->messages();
return false;
}
return true;
}
public function getErrorMessages()
{
return $this->errormessages;
}
public function getValidationRules()
{
return $this->rules;
}
}
注意,结尾提供的是与Laravel 3相关的,而不是与Laravel 4相关的。注意,结尾提供的是与Laravel 3相关的,而不是与Laravel 4相关的。这个答案根本没有涉及原始问题要求的任何内容@JasonMortonNZ,我同意你的看法。但是OP提供的最后一个链接谈到了直接在模型中实现验证,而不是使用存储库。因此,我很抱歉,这个基于我个人经验的答案可能会引起OP的兴趣。这个答案根本没有涉及到最初的问题所要求的任何东西@JasonMortonNZ,我同意你的看法。但是OP提供的最后一个链接谈到了直接在模型中实现验证,而不是使用存储库。因此,我认为OP可能会对基于我个人经验的答案感兴趣。管理员应该调用存储库,而不是相反。Repository封装了数据存储中持久化的一组对象以及在这些对象上执行的操作,提供了持久化层更面向对象的视图。请参见存储库不调用控制器,它只是将其结果通知侦听器,而侦听器恰好就是控制器。马特·韦恩(Matt Wynne)在高谭Ruby大会上展示了这一点,杰弗里·韦(Jeffrey Way)在他的“控制器清理”屏幕上做了一个类似于拉威尔的翻译。如果马特·韦恩只是遵循“应该”做的事情,他就不会固守被动控制器的想法。参考资料:-@VerronKnowles,我喜欢这个答案。这是一种委托方式。忽略Torkil。控制器应该调用存储库,而不是相反。Repository封装了数据存储中持久化的一组对象以及在这些对象上执行的操作,提供了持久化层更面向对象的视图。请参见存储库不调用控制器,它只是将其结果通知侦听器,而侦听器恰好就是控制器。马特·韦恩(Matt Wynne)在高谭Ruby大会上展示了这一点,杰弗里·韦(Jeffrey Way)在他的“控制器清理”屏幕上做了一个类似于拉威尔的翻译。如果马特·韦恩只是遵循“应该”做的事情,他就不会固守被动控制器的想法。参考资料:-@VerronKnowles,我喜欢这个答案。这是一种委托方式。忽略托基尔。