Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Command pattern in php applications: how to handle controller actions?

I think this is more of a general question (so not php restricted) with regards to ddd and the command pattern.

Let's say I execute a CreatePostCommand from within the create action of my controller, the command will be handled and eventually executed successfully. What's the appropriate way to notify the controller which response to return in case the command did fail or succeed? Given the command handler will fire a domain specific event, I could hook up the controller to the event, but that seems a quite awkward, also not appropriate for every situation (e.g. a post could be created somewhere else and the controller really doesn't know about this :) ).

public function createAction($title, $content)
{
    $this->commandBus->execute(new CreatePostCommand($title, $content);

    $this->render('…'); // what if the command execution failed?
}

Any thoughts on this?

like image 730
iwyg Avatar asked Aug 28 '14 08:08

iwyg


People also ask

How does the command design pattern work?

The Command pattern allows requests to be encapsulated as objects, thereby allowing clients to be parametrized with different requests. The "check" at a diner is an example of a Command pattern. The waiter or waitress takes an order or command from a customer and encapsulates that order by writing it on the check.

What are the important roles in the command pattern?

The command pattern helps us do that. Definition: The command pattern encapsulates a request as an object, thereby letting us parameterize other objects with different requests, queue or log requests, and support undoable operations.

Which design pattern would provide the most effective implementation for handling actions for Java menu items and buttons?

You can use command pattern for solving many design problems e.g. Handling actions for Java menu items and buttons.

What are PHP commands?

What is a Command Bus? The term is mostly used when we combine the Command pattern with a service layer. Its job is to take a Command object (which describes what the user wants to do) and match it to a Handler (which executes it). This can help structure your code neatly.


1 Answers

I think if you are really trying to follow the DDD command pattern then you need to treat the command bus as a fire and forget asynchronous process that may take a long time to complete.

Consider immediately redirecting to a command verifier controller. It's up to the command verifier to actively check the status of the command and see if it worked.

In most cases, the command will have finished successfully and your verifier can then redirect once again to continue normal flow.

If the command fails then the verifier puts up an appropriate error message.

If the command is in progress then you can entire a redirect loop while informing the user that the command is in progress.

Something like:

// Execute the command
$command = new CreatePostCommand($title, $content);
$this->commandBus->execute($command);

return redirect '/command-verifier/' . $command->getId();

// The verification action
public function verifyCommandAction($commandId)

$commandStatus = $this->commandBus->getStatus($commandId);

if ($commandStatus == SUCCESS) redirect to all is well;

if ($commandStatus == FAILED) then oops;

if ($commandStatus == IN_PROGRESS) then maybe pause a bit and redirect again while keeping the user informed.

Clearly there is quite a bit of hand waving going on but I think this is the most general approach especially with php where every request starts from ground zero.

like image 115
Cerad Avatar answered Sep 30 '22 07:09

Cerad