Методы действий против открытых методов в фреймворках PHP - PullRequest
2 голосов
/ 18 апреля 2010

Существует множество PHP-фреймворков, которые многие из вас знают, и меня интересуют ваши мысли по этому поводу: Zend Framework имеет так называемые контроллеры действий, которые должны содержать хотя бы один метод действия, метод, имя которого заканчивается «Действие». Например:

public function indexAction() {}

Важно слово «Действие», без которого вы не можете получить доступ к методу напрямую через URI. Однако в некоторых других средах, таких как Kohana, у вас есть публичные и частные методы, где публичные методы доступны, а частные - нет. Итак, мой вопрос: как вы думаете, какой подход лучше? С точки зрения безопасности я бы проголосовал за подход Зенда, но мне интересно знать, что думают другие.

Ответы [ 5 ]

1 голос
/ 19 апреля 2010

Это связано не столько с безопасностью, сколько с дизайном 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, так это то, что он делает методы действия четко отличимыми от других методов в контроллере.

1 голос
/ 19 апреля 2010

Основываясь на предпочтениях, я хорошо разбираюсь в подходе Zend Framework.Он имеет правильную инкапсуляцию контроллера.Да, вы должны добавить слово action и создать скрипт представления (необязательно), чтобы вы могли получить к нему доступ через URL.Тем не менее, вы можете использовать частные, защищенные и публичные функции в контроллере для дополнительной логики.

1 голос
/ 18 апреля 2010

Это действительно предпочтение. Использование некоторого соглашения об именах является более универсальным (и это фактически то, что сейчас делает Kohana 3), поскольку оно допускает публичные методы, которые не являются действиями, что может быть полезно.

Конечно, идеальным решением является использование некоторых метаданных кода, таких как .NET-атрибуты или аннотаций Java , но, к сожалению, эта функция не существует в PHP.

0 голосов
/ 18 апреля 2010

Я бы сказал, это зависит от личных предпочтений. здесь есть много вариантов, например, версия codeigniter состоит в том, что любое имя метода, начинающееся с _, является приватным, а все остальное является методом контроллера.

говоря лично, я бы сказал, что все, что использует встроенные языковые элементы управления (например, public function против private function), будет наиболее интуитивно понятным.

edit: как говорит Фрэнк, метод MOST SECURE будет использовать как можно больше функций (например, private, а также имя метода).

0 голосов
/ 18 апреля 2010

У Zend это есть, потому что в PHP 4 у вас не было private / public, поэтому им приходилось полагаться на соглашения об именах. На самом деле более безопасно иметь общедоступное / частное и соглашение об именах.

...