-
Notifications
You must be signed in to change notification settings - Fork 91
Do we really need notFoundAction? #204
Description
The question is simple: do we really need notFoundAction?
I don't think so...
My problems:
- It's not triggering a dispatch error, while all other and similar (!) errors do. If we can't locate the controller, we trigger a dispatch error, if we can't locate the action inside that controller, we do not trigger any error. What is the reason for handling similar errors in different ways? If we don't have notFoundController, then why have we notFoundAction?
- Because it doesn't trigger any error, it's hard to bypass it. If a custom error and exception handling is needed, we can do it easily by attaching custom listeners to the dispatch.error event, but this doesn't work for notFoundAction becasue the missing event. We cannot use the dispatch event neither: with priority 1 or lower it's too late, notFoundAction already returned a ViewModel with 404 status code, with priority 2 or higher it's too early, we don't have the controller yet.
What should be done?
- We should remove the notFoundAction and modify onDispatch (https://github.com/zendframework/zend-mvc/blob/master/src/Controller/AbstractActionController.php#L60).
- We should check the existance of the method in the DispatchListener (https://github.com/zendframework/zend-mvc/blob/master/src/DispatchListener.php#L77). If the method doesn't exists, we should trigger a dispatch error and set the name of the error to the following:
const ERROR_CONTROLLER_METHOD_NOT_FOUND = 'error-controller-method-not-found';
(I think it would be better than the old ERROR_CONTROLLER_CANNOT_DISPATCH, which means nothing for me, it's too general.)
After that we could do small simplifications in RouteNotFoundReason, and remove weird lines (!!!) similar to this one: https://github.com/zendframework/zend-mvc/blob/master/src/View/Http/RouteNotFoundStrategy.php#L231
By the way, that line and this switch case (https://github.com/zendframework/zend-mvc/blob/master/src/View/Http/RouteNotFoundStrategy.php#L135) perfectly shows how illogical the error handling in it's current form is. There are errors (retrieved via getError from MvcEvent) and there is ERROR_CONTROLLER_CANNOT_DISPATCH.
(The impossibility of retrieving the error type ERROR_CONTROLLER_CANNOT_DISPATCH from the MvcEvent via the getError method can cause further problems too. Let's say we would like to log them...)
Opinions?