Как структурировать службу PHP, которая отвечает на запросы Ajax - PullRequest
0 голосов
/ 02 декабря 2010

Я изо всех сил пытаюсь разработать серверный сценарий, который отвечает на запросы от приложения Ajax.

В своем текущем состоянии приложение разделено на отдельные страницы (например, заказы, товары, финансы и т. Д.). Только при переключении между этими страницами реальная веб-страница перезагружается. У каждой страницы есть свой «оператор», который требуется в корень operator.php, на который направлены все запросы Ajax.

В каждом операторе содержится этот шаблон:

foreach ($actions as $action) {
    switch ($action) {
    case 'get-items':
        [...]
        break;
    case 'get-item':
        [...]
        break;
    case 'update-item':
        [...]
        break;
    [...]
    }
}

$actions предоставляются по запросу, например, operator.php?page=items&action=get-item&id=123.

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

Я обнаружил, что часто буду использовать этот шаблон, когда хочу использовать внутреннюю логику действия в PHP:

$items = json_decode(file_get_contents('http://[...]/operator.php?action=get-items'));

(Излишне говорить, что этот дизайн создает много дополнительных накладных расходов.)

Так что вместо этого у меня теперь есть класс Operator, который расширяется каждой страницей. Я могу, например, создать ItemOperator и напрямую вызывать нужное мне действие без какой-либо кодировки, декодирования или лишних HTTP-запросов:

$items = $itemsOperator->getItems();

Я изменил скрипт, который отвечает на запросы Ajax, для использования класса Operator, например:

foreach ($actions as $action) {
    switch ($action) {
    case 'get-items':
        $json['items'] = $operator->getItems();
        break;
    [...]
    }
}

if (count($json)) {
    echo json_encode($json);
}

Этот подход работает достаточно хорошо, но у меня никогда не было формального обучения веб-разработке, и я подозреваю, что существуют устоявшиеся, лучше абстрагированные шаблоны (которые я безумно не могу найти в Google). Этот вопрос вдохновил меня на многочисленные недостатки моего подхода к домашнему пиву:

  1. Концепция класса «Оператор», который содержит «действия», слишком расплывчата и всеобъемлюща. Как мне отделить логику?
  2. Где подход становится особенно запутанным, когда мне нужно, например, искать базу данных товаров на странице финансов. Включаю ли я также ItemOperator вместе с FinancesOperator? (Я сейчас дублирую логику.)
  3. Есть ли лучший способ связать скрипт запроса Ajax с объектами Operator (при условии, что я не должен полностью сбрасывать понятие операторов)? Например, в настоящее время мне нужно написать скрипт для каждой страницы, который отображает переменную URL «action» на соответствующий метод объекта оператора.

Очень жаль, если этот вопрос слишком открытый. Вокруг меня нет разработчиков, от которых можно было бы обмениваться идеями (и, как я уже сказал, у меня не было реальных тренировок), поэтому очень важно услышать совет сообщества SO. При разработке сценария, подобного этому, количество возможностей / подходов / стратегий может быть огромным. И после того, как вы потратили пару дней на один конкретный подход, может быть очень трудно повернуть назад.

Большое спасибо за ваше внимание (и читая это далеко).

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

Похоже, вам было бы полезно прочитать о шаблоне архитектуры Model-View-Controller (http://en.wikipedia.org/wiki/Model-View-Controller).

Где вы выполняли такие запросы:

$items = json_decode(file_get_contents('http://[...]/operator.php?action=get-items'));

... вы должны инкапсулировать логику в классы обслуживания. Поэтому, когда вы хотите сделать что-то вроде «поиска в базе данных товаров на странице финансов», вы можете просто полагаться на сервисы, которые инкапсулируют логику для этого.

Еще немного прочтения об основных принципах объектно-ориентированного программирования, а также краткий обзор шаблонов проектирования. Я бы рекомендовал проверить Head First Design Patterns для простого понимания этих концепций.

0 голосов
/ 02 декабря 2010

Не полный ответ, но я бы разделил operator.php на два файла. Один называется operator.php, а другой operator_ajax.php. operator.php делает то, что вы делаете сейчас, но вместо того, чтобы повторить это, просто помещает переменную, чтобы ее можно было включить. operator_ajax.php включает operator.php и отображает значение. operator.php затем может быть включен из любого другого файла (вместо HTTP-запроса).

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