Это связано не столько с безопасностью, сколько с дизайном ZF. Как вы сказали, методы недоступны при вызове через URL, но это происходит исключительно из-за того, как Zend Framework обрабатывает запросы.
Цитирование справочного руководства :
Рабочий процесс Zend_Controller
относительно прост. Zend_Controller_Front
получает запрос, который, в свою очередь, вызывает Zend_Controller_Router_Rewrite
, чтобы определить, какой контроллер (и действие в этом контроллере) отправлять.
Zend_Controller_Router_Rewrite
декомпозирует URI, чтобы задать имена контроллеров и действий в запросе. Zend_Controller_Front
затем входит в цикл отправки. Он вызывает Zend_Controller_Dispatcher_Standard
, передавая ему запрос, для отправки контроллеру и действия, указанного в запросе (или используя значения по умолчанию).
Имена методов форматируются в Zend_Controller_Dispatcher_Abstract
:
/**
* Formats a string into an action name. This is used to take a raw
* action name, such as one that would be stored inside a Zend_Controller_Request_Abstract
* object, and reformat into a proper method name that would be found
* inside a class extending Zend_Controller_Action.
*
* @param string $unformatted
* @return string
*/
public function formatActionName($unformatted)
{
$formatted = $this->_formatName($unformatted, true);
return strtolower(substr($formatted, 0, 1)) . substr($formatted, 1) . 'Action';
}
Суффикс действия жестко закодирован, поэтому диспетчер всегда будет искать метод действия, несмотря ни на что. Поэтому, когда вы запрашиваете /user/show/
, вы звоните UserController::showAction()
из-за того, как обрабатывается запрос. Это не функция безопасности или замена видимости. Сделайте showAction()
защищенным, и у вас больше не будет доступа к нему через URL. И технически, вы могли бы очень сильно вызвать неактивные методы из URI, если вы не запускаете их через обычную настройку. Вы можете создать свой собственный Dispatcher и легко изменить способ форматирования имен действий в ZF.
Что хорошо в Action Suffix, так это то, что он делает методы действия четко отличимыми от других методов в контроллере.