Реализация AJAX в MVC php

AJAX в PHP MVC

Реализация AJAX в MVC php

Добрый день! Недавно столкнулся с задачей реализовать AJAX на MVC. Думаю это является тривиальной задачей и во всех фреймворках реализована. Но вот в интернете я не нашёл того, что мне было нужно и пришлось делать самому. Данная задача у меня появилась в учебных и производственных целях. Мой руководитель поручил сделать простое web-приложение для отработки возражений клиентов во время телефонного разговора. Приложение нужно было сделать как можно быстрее. Оно должно было быть производительным и работать без перезагрузок. Так как я пока не овладел никакими фреймворками для создания SPA, то решено было сделать на MVC с использованием AJAX и Jquery, тем более что мне это очень интересно.

Принцип работы моего роутера

Роутер подключает файл с роутами и получает путь, введённый в адресной строке. Далее он проходит по роутам и сопоставляет его с адресом. Если он находит совпадение, то подключает соответствующий класс и вызывает метод, и передаёт параметры.

Пример:

Роут: ‘view-ajax.php’=>’ajax/MakeAjax’

Если мой роутер получит путь view-ajax.php, то подключит класс (php) AjaxController (ajax) и использует его метод actionMakeAjax (MakeAjax)

Jquery обращения к AJAX

Пример:

$.post( "view-ajax.php", {'action': 'AddNotes', 'TEL': tel, 'TEXT': text}, function( data ) {
$( ".notes" ).html( data );
});

Метод Jquery $.post посылает запрос по адресу view-ajax.php и сообщает ему объект: {‘action’: ‘AddNotes’, ‘TEL’: tel, ‘TEXT’: text}, где AddNotes это метод, который я вызываю в классе. Это очень похоже на то, как это реализовано в wordpress, можете ознакомиться с wordpress ajax в моей статье.

Код класса AjaxController

class AjaxController
{
    public function actionMakeAjax(){
        $actionName = $_POST['action'];
        $params = $_POST;
        unset($params['action']);

        $actionFile = ROOT . '/models/ajax/makeAjax.php';

        $actionFile = str_replace('/', '\\', $actionFile);

        if (file_exists($actionFile)){
            include_once($actionFile);
        }

        $action = 'make'.$actionName;

        $controllerObject = new makeAjax();

        $result = call_user_func_array(array($controllerObject, $action), $params);

        return true;
    }
}

AjaxController содержит единственный метод actionMakeAjax. В нём я получаю название action’а и  остальные переданные параметры. Далее я подключаю модель(класс) makeAjax.php, в которой содержатся все функции, которые могут быть в вызваны по AJAX.

Второй шаг: я определяю название action’а (метода класса makeAjax) $action = ‘make’.$actionName; и создаю экземпляр объекта $controllerObject = new makeAjax();

Далее я вызываю метод класса и передаю ему параметры строкой. $result = call_user_func_array(array($controllerObject, $action), $params);

Данная запись позволяет передавать параметры как переменные, а не хранить их в $_POST. Однако вам потребуется знать очерёдность пришедших переменных, чтобы верно их именовать.

Обращаю внимание на строку $actionFile = str_replace(‘/’, ‘\\’, $actionFile); Данная строка требуется только для разработки на компьютерах windows и её требуется убрать перед заливкой на сервер.

Модель makeAjax()

Класс makeAjax() содержит методы класса по определённому правилу именования приставка всегда make и далее название action’а который вы передаёте в $.post Jquery

Пример:

Для ‘action’: ‘AddNotes’ метод класса makeAjax() будет назван makeAddNotes()

Это пример для ‘action’: ‘GetPost ‘

public function makeGetPost($id){
        $id = intval($id);

        if($id){


            $db =Db::getConnection();

            $result = $db->query('SELECT `detail_text` from `data-text` WHERE id=' . $id);
            $result->setFetchMode(PDO::FETCH_ASSOC);
            $result->execute();
            $res = $result->fetch();
            //$newsItem = $result->fetch();
            //var_dump($newsItem);

            $res = $res['detail_text'];

            echo $res;

            return true;


        }

    }

Этот метод печатает детальный текст записи по её id. У вас может быть любая другая функция, которая вам нужна. Главное, что вы сможете расширять вашу модель и без проблем пользоваться AJAX в MVC.

Если что-то непонятно задайте вопрос в комментариях!