Model
View
Controller
架构告诉我,所有业务逻辑都应位于Model
内,而数据流应由{{1}处理}。
知道了这一点,当我在Controller
内处理我的逻辑时,我需要让Model
知道他是否应该重定向到另一个网址,重定向回来,是什么样的在重定向期间传递的消息或变量等
这样做的最佳方式是什么?
我可以考虑一些方法,例如在Controller
上抛出异常并在Model
上捕获它们或从Controller
返回一个数组并在Model
上对其进行处理但是,它们似乎都不是很好。最简单的方法是调用Controller
内的Redirect->to()
(或back()
),然后返回Model
的{{1}}返回,但它似乎打破了建筑的规则分离。
是否有"权利"这样做的方式?每种方式的优点和缺点是什么?
答案 0 :(得分:2)
修改强>
以下答案是旧的。 Laravel现在包含了一系列处理常见问题的不同方法。
例如,使用Laravel的FormRequest's作为在控制器方法上轻松验证数据的方法,使用Jobs来处理用于创建/更新模型的业务逻辑。
旧帖子:
这是一个常见问题,而“MVC'模式很适合Web应用程序的基本起点,我觉得大多数开发人员总是需要另一个中间服务来进行验证,数据处理以及开发过程中出现的其他问题。
无偏见地回答您的问题:没有正确方式。
为了回答您的个人偏见,我觉得大多数开发人员会使用存储库或服务模式来处理控制器和控制器之间的中间数据处理模型,也有单独的验证类。
在我看来,存储库更适合框架和数据无关的设计(由于它们的接口驱动实现),而服务更适合处理业务逻辑/规则。控制器更适用于处理响应和将输入数据传递到存储库或服务。
每种模式的路径都是相同的:
Request -> Controller (Validation) -> Service -> Model -> Database
Request -> Controller (Validation) -> RepositoryInterface -> Model -> Database
验证在括号内,因为输入未经从验证器传递到服务/存储库,输入发送到验证器,提供“确定”,以及让控制器知道将数据发送到要处理的服务/存储库是可以的。
我只使用服务,当我绝对正面我不会改变框架或数据源。否则我会使用存储库。存储库只需要设置一些工作,因为您需要使Laravel通过其IoC解析到存储库类的接口。
服务示例:
服务:
namespace App\Services;
use App\Models\Post;
class PostService
{
/**
* @var Post
*/
protected $model;
/**
* Constructor.
*
* @param Post $post
*/
public function __construct(Post $post)
{
$this->model = $post;
}
/**
* Creates a new post.
*
* @param array $input
*/
public function create(array $input)
{
// Perform business rules on data
$post = $this->model->create($input);
if($post) return $post;
return false;
}
}
控制器:
namespace App\Http\Controllers;
use App\Services\PostService;
use App\Validators\PostValidaor;
class PostController extends Controller
{
/**
* @var PostService
*/
protected $postService;
/**
* @var PostValidator
*/
protected $postValidator;
/**
* Constructor.
*
* @param PostService $postService
* @param PostValidator $postValidator
*/
public function __construct(PostService $postService, PostValidator $post Validator)
{
$this->postService = $postService;
$this->postValidator = $postValidator;
}
/**
* Processes creating a new post.
*/
public function store()
{
$input = Input::all();
if($this->postValidator->passes($input)) {
// Validation passed, lets send off the data to the service
$post = $this->postService->create($input);
if($post) {
return 'A post was successfully created!';
} else {
return 'Uh oh, looks like there was an issue creating a post.';
}
} else {
// Validation failed, return the errors
return $this->postValidator->errors();
}
}
}
现在使用这种模式,您可以很好地分离所有流程,并清楚地表明每个流程的作用。
对于存储库示例,Google&#La; Laravel Repository Pattern'。有很多关于此的文章。
答案 1 :(得分:1)
实际上 - 在Laravel 5中不是最好的方法。业务逻辑应该不在模型中。模型唯一应该做的就是从数据库中检索和存储数据。
最好使用CommandBus或ServiceProviders来处理应用程序逻辑和业务规则。网上有很多关于这些的文章,但我个人更喜欢laracasts.com作为最好的学习资源。