Thắc mắc về command bus trong command design pattern

bắt nguồn từ bài viết http://blog.luuhoangnam.com/laravel/laravel-the-right-way.html
tác giả có nói đến command design pattern nhưng mô hình tối giản đi giống như thế này

<?php
    interface Command
    {
    	function execute();
    }
    
    class User
    {
    	public function register()
    	{
    		echo('Hello world!!!');
    	}
    }
    
    class UserRegisterCommand implements Command
    {
    	protected $user;
    
    	public function __construct(User $user)
    	{
    		$this->user = $user;
    	}
    
    	public function execute()
    	{
    		$this->user->register();
    	}
    }
    
    class Handle
    {
    	protected $command;
    
    	public function __construct(Command $command)
    	{
    		$this->command = $command;
    	}
    
    	public function handle()
    	{
    		$this->command->execute();
    	}
    }
    
    $u = new User();
    $command = new UserRegisterCommand($u);
    $handle = new Handle($command);
    $handle->handle();

vậy tại sao dùng nó, làm thế nào để thêm nó vào đoạn code trên, thanks!

Mình thấy blog của tác giả nói cũng rõ ràng chi tiết đó chứ “Tóm lại, bạn sẽ làm như vậy để tăng tính resuable và maintanable của code”.

Ở đoạn code trên, bạn chỉ cần duy nhất phương thức handle để chạy những command khác nhau thay vì handle_2(), handle_3(), … blah blah. Ở trên có UserRegisterCommand là 1 câu lệnh, giờ bạn muốn thêm 1 câu lệnh nữa thì có thể làm như sau.

class UserDeleteCommand implements Command
    {
    	protected $user;

    	public function __construct(User $user)
    	{
    		$this->user = $user;
    	}

    	public function execute()
    	{
    		$this->user->delete();
    	}
}

Sau đó để dùng câu lệnh delete chỉ cần gán this->command bằng UserDeleteCommand. Khi cần đăng kí user lại gán this->command bằng UserRegisterCommand. Tương tự với những câu lệnh khác.

Các câu lệnh tách riêng ra từng khối như thế thì khi cần sửa bạn chỉ cần vào xem từng class riêng rẽ, rất tiện cho việc quản lý.

Bạn thử giải quyết bài toán mà không dùng command xem :), sẽ rõ vấn đề hơn.

1 Like

cái đó mình biết nhưng mình không biết cái command bus nó nằm ở chỗ nào vì tác giả chỉ nhắc qua mà không dùng nó trong controller, chính vì thế mình mới thắc mắc đó cái handle đó liệu có phải là command bus hay không thôi, vì mình một số tài liệu họ mình thấy 2 class riêng rẽ là Handle và Command bus đó

Mình không rõ cái đó, bạn xem thử ở đây xem sao :D.

1 Like

cảm ơn bạn! Mình có tìm rồi nhưng lí thuyết dài hơi khó hiểu và các đoạn code cũng thế, mình không thể hiểu rõ cái thần của nó ở chỗ nào thế nên mới lên đây hỏi.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?