在 Spatie 的最新项目中,我们已经开始使用称为动作 (Action) 的概念。它使我们的控制器和模型保持苗条。这是一个简单的实践。我将在这篇文章中解释。
来自控制器和模型中的逻辑
考虑你又一个用 Laravel 开发的博客,您想在上面发布帖子。帖子发布后,应用会将它的标题和链接关联到推特。
执行该操作的控制器可能如下所示:
class PostsController
{
public function create()
{
// ...
}
public function store()
{
// ...
}
public function edit()
{
// ...
}
public function update()
{
// ...
}
public function delete()
{
// ...
}
public function publish(Post $post, TwitterApi $twitterApi)
{
$post->markAsPublished();
$twitterApi->tweet($post->title . PHP_EOL . $post->url);
flash()->success('Your post has been published!');
return back();
}
}
对我而言,非 CRUD 行为存在控制器中显得有点脏乱。让我们遵循 Adam’s advice 的建议,将 publish 方法放到它自己的控制器中。
class PublishPostController
{
public function __invoke(Post $post, TwitterApi $twitter)
{
$post->markAsPublished();
$twitter->tweet($post->title . PHP_EOL . $post->url);
flash()->success('Your post has been published!');
return back();
}
}
这已经比刚才好一点了,但是我们可以做的更好。加入你想要创建一个发布博文的命名。目前而言是不可能的,因为相关逻辑放置于控制器中。
为了相关逻辑可以从命令行(或应用的任何地方)调用,该逻辑不应该在控制器中。理想状态下,控制器唯一要做的就是处理 HTTP 层