Разработка надежного PHP-обработчика обратной передачи - PullRequest
1 голос
/ 27 мая 2009

Я разрабатываю CMS на основе php и в настоящее время переписываю ее в состояние, пригодное для использования клиентами. (Моя первая версия была только для внутреннего использования; и немного грязный беспорядок: P)

В моей первой версии у меня была функция HandlePostBack (), которая проверяла наличие значительного числа переменных $ _POST - кнопки отправки из каждой возможной формы. Если он был установлен, то соответствующая команда будет выполнена.

Мне интересно, есть ли лучший способ? Я мог бы перейти на коммутатор и найти одну переменную $ _POST, включенную в каждую форму, а затем выполнить команду. Было бы неплохо минимум кода, поэтому я могу быстро и легко расширить систему.

Ответы [ 4 ]

2 голосов
/ 27 мая 2009

Мне кажется, ваша система форм могла бы немного переработать. Почему бы не представить каждую форму как класс и сделать функцию HandlePostBack методом? Затем вы можете обнаружить отправленную форму и обработать ее.

class ProfileForm extends Form {
    private $form_items = array(
        new FormItem('name', 'datatype', 'other_parameters'),
        new FormItem('another_name', 'datatype', 'other_parameters'),
        ...
    );

    public function render() {
        ...
    }

    public function handlePostData() {
        ...
    }
}

Если вы используете стандартный формат для идентификаторов кнопок отправки (например, <form_name>_submit, вы можете сделать что-то подобное при отправке:

foreach ($_POST as $key => $value) {
    if (substr($key, strlen($key) - 7) == '_submit') {
        $className = ucfirst(substr($key, 0, strlen($key) - 7)) . 'Form';
        $form = new $className();
        $form->handlePostBack();
    }
}
1 голос
/ 27 мая 2009

Я бы попытался сделать это по-другому. Зачем вам нужен центральный пункт для всех ваших сообщений? Это действительно плохая практика.

Не пытайтесь улучшить его, попробуйте переосмыслить саму идею наличия центральной точки и избавиться от нее.

0 голосов
/ 28 мая 2009

Один из способов сделать это - направить ваши запросы в классы, а если $_SERVER['REQUEST_METHOD'] == 'POST', то вызвать метод post () для этого класса. Это будет означать, что действие в вашей форме будет отображаться непосредственно в некоторый класс, имеющий метод post.

// routed from URL: /users
class Users implements Resource
{
    public function post() 
    {
        // do your post here
    }

    public function get()
    {
        // do it for GET requests too
    }
}

Хотя это, по сути, то же самое, что вы делали раньше, оно может позволить вам немного лучше организовать свой код, поскольку вы можете обрабатывать запросы в общем виде:

$resource = $resourceFactory->getResource($url);
$method = strtolower($_SERVER['REQUEST_METHOD']);
$response = $resource->$method(); // eg: $resource->post();
$response->respond();

Взгляните на структуру углубления , которая продвигает эту идею далеко.

0 голосов
/ 27 мая 2009

В подобных случаях я обычно использую скрытый ввод 'form_action', поэтому я могу использовать разные кнопки отправки для предоставления различных действий (например, «добавить», «редактировать», «удалить» и т. Д.)

<input type="submit" onclick="assignAction(this.form, 'myItem_delete');"...>

Затем на стороне сервера я могу разделить действие на "_" и использовать 1-ю часть в качестве идентификатора класса формы (т. Е. Для простого переключения или отражения ...), а вторая часть говорит, какой метод класса формы должен обрабатывать данные обратной передачи. В общем коде это так

$handler = explode('_', $_POST['form_action']);
$className = $handler[0]; // not secure, but simple enough for example
if (class_exists($className))
{
   $form = new $className();
   $method = $handler[1]; // again too simple
   if (method_exists($form, $method))
   {
      $form->$method($_POST, $other_params...);
   }
}

Конечно, пример слишком прост. Но это обычная идея, как и у меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...