Phpunit Laravel 4存储库验证和测试

Phpunit Laravel 4存储库验证和测试,phpunit,laravel,laravel-4,Phpunit,Laravel,Laravel 4,我正在尝试编写一个可测试的Laravel4应用程序。在Taylor Otwells关于Laravel的书中,他写道,我们应该考虑在验证命名空间内创建UpRealValueC类,并将验证器注入到您的存储库中。请提供控制器、存储库和测试中的代码示例。如果用户输入不满意,我是否应该在存储库中抛出验证异常,并在控制器中捕获错误 就个人而言,我更喜欢直接在模型中进行验证。也就是说,对于每个模型,我都有一个getValidator()方法,如下所示: class User extends Eloquent

我正在尝试编写一个可测试的Laravel4应用程序。在Taylor Otwells关于Laravel的书中,他写道,我们应该考虑在验证命名空间内创建UpRealValueC类,并将验证器注入到您的存储库中。请提供控制器、存储库和测试中的代码示例。如果用户输入不满意,我是否应该在存储库中抛出验证异常,并在控制器中捕获错误

就个人而言,我更喜欢直接在模型中进行验证。也就是说,对于每个模型,我都有一个
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,我喜欢这个答案。这是一种委托方式。忽略托基尔。