$_POST can work but it only tells you some kind of data was submitted.

isset($_POST['some_input']) tells you whether it was present in the request.

$_POST['some_input'] will raise warnings if it was not present.

Ideally you would test that all form inputs you're expecting are present. Typically one just looks for a submit button or a particular required bit of information. The REQUEST_METHOD is another option but has the same problem as checking $_POST.

And if your wish to run a process and send them to a Congradulations page upon success, you can place redirects after your proccesses to other pages, or meerly back to this page with a case built for success.

I hate it but I've fallen into the habit of including a hidden "action" form field with many of my forms, then looking for it similar to the last example. Though I rarely handle multiple actions in one Controller--I create a Controller for each instead.

So "action" is just there to tell PHP that, "Yes, this form was submitted". You can then check from there that the expected form values exist, validate them, etc.

It also supports a consistent practice.

Sometimes you might submit a form via Javascript and not have a submit button, but can still have a hidden field. Sometimes you'll trigger an AJAX post and you can just include an "action" parameter. Then you might have more actions than GET, POST, etc. can represent, so relying on something YOU control is more flexible. (Yeah, Jacques, I went there again...)

So accepting the "action" parameter in PHP maximizes flexibility, IMO.