为什么以及何时应该使用命令总线与控制器laravel?

时间:2015-07-16 06:40:56

标签: php laravel laravel-5

laravel 5中包含的新命令总线功能让我感到困惑。 在控制器本身可以实现相同任务时,为什么以及何时应该使用命令?

命令

class PurchasePodcast extends Command implements SelfHandling {

protected $user, $podcast;

   /**
   * Create a new command instance.
   *
   * @return void
   */
   public function __construct(User $user, Podcast $podcast)
   {
       $this->user = $user;
       $this->podcast = $podcast;
   }

  /**
    * Execute the command.
    *
    * @return void
    */
    public function handle()
    {
       // Handle the logic to purchase the podcast...

        event(new PodcastWasPurchased($this->user, $this->podcast));
    }

}

控制器     

use Illuminate\Foundation\Bus\DispatchesCommands;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use PurchasePodcast;

abstract class Controller extends BaseController {

   use DispatchesCommands, ValidatesRequests;

   public function purchasePodcast($podcastId)
   {
      $this->dispatch(
         new PurchasePodcast(Auth::user(), Podcast::findOrFail($podcastId))
      );
  }
}

为什么我要把它变得复杂,而我可以直接在控制器中进行,而不是使用命令。

2 个答案:

答案 0 :(得分:4)

这个想法来自“命令模式”,其中一个对象用于封装信息以执行操作。

使用命令模式可以更轻松地组织要在软件中执行的操作。该命令作为一个对象,可以在多个控制器中重复使用,因此让你干(不要重复自己)。

Command对象也更容易测试,因为它与控制器分离。

当然在编程方面存在权衡。使用命令模式时,您将拥有更多类(和文件)。所以,在需要时使用它。当你发现要执行的复杂动作,并且你的控制器开始变胖时,也许你会想看看这种模式。

答案 1 :(得分:1)

您不必使用命令。这一切都取决于您的项目的大小。如果您可以放弃在控制器中放置东西,那就去做吧。这里没有法律,只有好/坏的做法。对于您正在构建的内容而言,被认为是良好实践并不总是最佳选择。

正如你所说,为什么要让它变得复杂?唐'吨