Laravel 4 - 在未返回被调用方法时从存储库重定向

时间:2015-04-30 07:47:30

标签: php model-view-controller laravel-4 controller

我在Laravel 4项目中使用了一个存储库模式,但遇到了一些我认为我做错了的事情。

我在保存新用户之前正在进行用户验证。

我的控制器中有一个方法:

public function addNewUser() {
    $validation = $this->userCreator->validateUser($input);

    if ( $validation['success'] === false )
    {
        return Redirect::back()
            ->withErrors($validation['errors'])
            ->withInput($input);
    }

    return $this->userCreator->saveUser($input);
}

然后validateUser方法是:

public function validate($input) {
    $rules = array(
        'first_name' => 'required',
        'last_name' => 'required',
        'email_address' => 'unique:users'
    );

    $messages = [
    ];

    $validation = Validator::make($input, $rules, $messages);

    if ($validation->fails())
    {
        $failed = $validation->messages();
        $response = ['success' => false, 'errors' => $failed];
        return $response;
    }

    $response = ['success' => true];
    return $response;
}

这可能没关系,但我不喜欢在我的控制器中执行if语句?我宁愿能够在我的验证课中处理它。

但是为了能够从验证类重定向,我需要在控制器中返回该方法。

如果我想要调用5个方法怎么办?我不能全部归还它们?

我希望能够简单地按顺序调用方法,然后在各自的类中处理我需要的内容以及是否有任何错误重定向或处理它们。但如果一切正常,只需忽略它并转到下一个功能。

所以例子:

public function addNewUser()
{
  $this->userCreator->validateUser($input);
  $this->userCreator->formatInput($input);
  $this->userCreator->sendEmails($input);
  return $this->userCreator->saveUser($input);
}

如果在控制器中执行if语句并不像我想的那么糟糕,那么我可以继续,但这似乎不正确?

1 个答案:

答案 0 :(得分:0)

对于存储库模式,您可以使用: -

像这样设置你的基础模型

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model{

   protected static $rules=null;
   protected $errors=null;


   public function validateForCreation($data)
   {
       $validation=\Validator::make($data,static::$rules);
       if($validation->fails())
       {
           $this->errors=$validation->messages();
           return false;
       }
       return true;
   }

   /**
    * @return errors
    */
   public function getErrors() { return $this->errors; }
}

现在在您的存储库中,添加这些方法

protected $model;

protected $errors=null;

public function model(){ return $this->model; }

public function getErrors(){ return $this->errors; }

public function create($inputs)
{
    if(!$this->model->validateForCreation($inputs))
    {
        $this->errors=$this->model->getErrors();
        return false;
    }
    $new=$this->model->create($inputs);

    return $new;
}

,控制器看起来像这样......

public function postCreate(Request $request)
{
    $inputs=$request->all();

    if($new=$this->repo->create($inputs))
    {
        return redirect()->back()
            ->with('flash_message','Created Successfully');
    }
    return redirect()->back()->withInput()->withErrors($this->repo->getErrors())
        ->with('flash_message','Whoops! there is some problem with your input.');
}