Ajax with php mvc

Как прикрутить ajax к php mvc и стоит ли оно того?

Здравствуйте , начал недавно изучать ООП и паттерн MVC и появилось несколько вопросов .
Когда писал прошлый проект использовал функциональный подход + ajax , чтобы передавать данные без перезагрузки страницы , но когда начал знакомиться с ООП и MVC столкнулся с непониманием , нужно ли этот ajax вообще и как передавать данные между ajaxom и классами пхп .

Структура проекта
app
—controllers
—Controller.php
—UsersController.php
—models
—UsersModel.php
—Services
—Router.php
—VIews
—View.php
assets
—js
router
—router.php
vendor
—autoload.php
views
—pages
index.php

У меня есть роутинг , который считывает что я ввел после index/ .
RewriteRule ^(.+)$ index.php?q=$1 [L,QSA]
далее я регистрирую роуты routes.php

Router::page("/home",'home',\app\controllers\homeController::class,"action"); Router::page("/register",'register',\app\controllers\UsersController::class,"index_register"); Router::page("/login",'login',\app\controllers\UsersController::class,"index_login"); Router::page("/",'home',\app\controllers\homeController::class,"action"); Router::post("/register/auth",\app\controllers\UsersController::class,"signUP"); //форма регистрации ведет по этому пути , и как я перехожу запускается уже метод signUP класса UsersController. Router::start();

Последней строкой я запускаю метод который смотрит что у меня в адресной строке , сравнивает с роутами которые я прописал ранее и вызывает соответственный экшен .

namespace app\controllers; use app\Models\Users\UsersModel; class UsersController extends Controller < public function index_register() < $this->view->generate("register.php"); > public function signUP() < $Model = new UsersModel(); $res = $Model->sign($_POST,$_FILES); >

И вот как мне прикрутить тут ajax , я не понимаю как их связать вместе , какой указывать URL , как его подхватить ?
У меня получалось что-то вроде

$('#register').on('click',function (event) < event.preventDefault(); const fd = new FormData(document.getElementById("FormReg")); // let avatar = document.getElementById("avatar") let email = $('#email').val(); let username = $('#username').val(); let password = $('#password').val(); let pass_conf = $('#pass_conf').val(); fd.append('email',email); fd.append('username',username); fd.append('password',password); fd.append('pass_conf',pass_conf); $.ajax (< method: "POST", processData: false, contentType: false, url: "", // куда:( data: fd >) .done(function( msg ) < console.log(msg); >); >)

Буду очень благодарен если объясните нужно ли выключать эту перезагрузку страницы когда я отправляю форму и как передать (куда) передать данные с ajaxa 🙂

Источник

MVC подход и Ajax

Всем привет. Решил создать данную тему, так как много вопросов по MVC и AJAX но толком как и что делать не сказано. Это и не удивительно, так как MVC это не жестко разработанная система, а подход и по этому вариантов реализации может быть много.
Недавно, когда пытался найти ответ на подобную тему, я попал на статью, где автор описывал преимущества MVC и что данный подход прекрасно справляется с динамикой и без AJAX. Но у меня было желание все таки попробовать и реализовать MVC и AJAX в связке. Я не претендую на то что данная статья будет чуть ли не единственной которая раскрывает суть так как есть много Фреймворков где такой подход используется и сделано это довольно не просто для понимания начинающих, по этому данная статья скорей всего заинтересует начинающих программистов которые только недавно начали изучать MVC подход.
И так, сам MVC подход основан на CONTROLLER MODEL VIEWS то есть контроллер обращается к модели, а модель в свою очередь выполняет операции с базой и возвращает результат в виде массива в представление где данный массив парсится и таким образом вырисовывается страница.
Вот примеры CONTROLLER MODEL VIEWS
CONTROLLER

class IndexController implements IController{ public function indexAction(){ $fc = FrontController::getInstance(); $params = $fc->getParams(); $view = new IndexModel(); $view->params = $params; $result = $view->listGo('../views/index.php', $params); $fc->setBody($result); } }
1 2 3 4 5 6 7 8 9 10 11 12 13
class IndexModel{ public function listGo($file,$params = null){ $db = Db_ext::getInstance(); $lib = new lib(); $menu = new mod_menu(); $mainMenu = $menu->get_menu($db); $params['mainMenu'] = $mainMenu; $lib->checkArray($params); ob_start(); include(__DIR__.'/'.$file); return ob_get_clean(); } }

VIEWS вьюшку не буду расписывать, это должно быть понятно.
И тут вам например приспичило как мне прикрутить AJAX.
Большинство разработчиков которые используют AJAX в процедурном PHP знают как работать с AJAX , но в MVC любой с вариантов приведет к тому что у вас повторно от рисуется вся страница в том месте где вы будете выводить результат. И тут возникает куча вопросов у новичков.
Но хотя если подумать, то даже в процедурном подходе, при запросе AJAX делается направление ПОСТ данных на файл который специально был подготовлен для обработки данных. MVC подход не исключение. Для обработки данных AJAX в MVC паттерне, нужно также создать отдельный контроллер AJAX, я назвал его ajaxController.php отдельно создал ajaxModel.php и самое интересное что для данной связки нужно создать вьюшку, но в файле вьюшка можно просто написать одну маленькую строчку просто блок див, а можно ничего не писать, все зависит от вашей реализации.
Ну и получается что когда вы отправляете запрос со страницы которая была от рисована ранее в браузере, первым обработчиком выступает jQuery AJAX я использовал библиотеку jQuery, так как можно использовать уже готовые решения, а не придумывать велосипед.
Вот сам скрипт jQuery который отправляет запрос. Но как писал ранее, все зависит от вашей реализации, в данном примере это самые простые модели.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
function checkUser(){ var valid = true; if($('#login').val().length  2){ $("#error").slideUp(); $('#error').slideDown(function(){ $('#error').html('Поле ( Login ) пусто или не корректно заполнено!'); }); $("#login").focus(); return false; }else if($('#pass').val().length  2){ $("#error").slideUp(); $('#error').slideDown(function(){ $('#error').html('Поле ( Password ) пусто или не корректно заполнено!'); }); $("#Pass").focus(); return false; }else{ $("#error").slideUp(); var myData = "login="+$('#login').val()+"&pass="+$('#pass').val(); jQuery.ajax({ type: "POST", // HTTP метод POST url: "ajax/index", //url-адрес, по которому будет отправлен запрос dataType:"text", // Тип данных, которые пришлет сервер в ответ на запрос ,например, HTML, json data:myData, //данные, которые будут отправлены на сервер (post переменные) success:function(response){ if(response === ''){ $("#error").slideDown(function(){ $("#error").html('Пользователь не найден!'); }); }else if(response != ''){ $("#error").slideDown(function(){ $("#error").html(response); }); } }, error:function (xhr, ajaxOptions, thrownError){ alert(thrownError); //выводим ошибку } }); } }

Если вы заметили то путь по которому будет отправлен запрос уже не пишется как имя_файла.php как в процедурном подходе, а просто прописывается путь контроллер/акшен
( url: «ajax/index», //url-адрес, по которому будет отправлен запрос )
где ajax это ajaxController.php, а index это indexAction в этом же контроллере который запустит модель.
Ну и получается что jQuery отправляет запрос на «ajax/index»
Вот простой пример такого файла.

class ajaxController implements IController{ public function indexAction(){ $fc = FrontController::getInstance(); $params = $fc->getParams(); $view = new ajaxModel(); /*Вызов модели*/ $view->params = $params; $result = $view->ajax('[B]../views/ajax.php[/B]', $params); /*Вьюшка которая у себя имеет только один блок ДИВ*/ $fc->setBody($result); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14
class ajaxModel{ public function ajax($file,$params = null){ $db = Db::getInstance(); $lib = new lib(); /*Проверили пост массив*/ if(isset($_POST)){ $lib->checkUser($_POST['login'], $_POST['pass'], $db);/*Передал данные методу у которого запрос к таблице*/ } $lib->checkArray($params); ob_start(); include(__DIR__.'/'.$file); return ob_get_clean(); } }

А когда запрос выполнится, то он вернет результат который у вас и от рисуется в том файле, а точнее на той странице от куда и был сделан запрос.
Это самый простой вариант MVC AJAX
У одного иностранного разработчика я увидел что подобные запросы он обрабатывает через главный файл index.php так как все что бы мы не делали перенаправляется в MVC подходе на одну точку входа.
Ну в принципе и все. Если будут вопросы пишите.

Источник

Ajax на mvc (php)?

2fe83264ec5d4a66b94897f2bf3ddce7.jpg

Товарищи, здравствуйте! В этом вопросе начинающий, так что не пинайте)
Как можно прикрутить AJAX если использую шаблон MVC на php?
Структура проекта ниже на фото:

в контроллере у меня есть переменная view, которая проверяет get параметр, например, вот так:
localhost/project/?view=profile
Вообще у меня одна точка входа. В index.php имеется такая структура
include $view.»php»;
В этом проекте уже использую ajax, но присылается целая страница и я из нее вырезаю нужный мне кусок, но теперь мне нужен именно «правильный ответ» от сервера, не страница целиком.
Заранее большое спасибо всем!

maNULL

Структура проекта
app\
____Controller\
________Main.php
public\
____js\
________ scripr.js
vendor\
index.php
composer.json
.htaccess
В файле script.js

$('#confirmForm').on('click', function (event) < $.ajax(< url: '/confirm', method: 'post', dataType: 'json', success: function (data) < console.log(data); >>); >);
map('GET|POST', '/confirm', 'Main::index'); if ($match = $router->match()) < $path = explode('::', $match['target']); $controllerName = 'Controller\\' . $path[0]; $controller = new $controllerName; call_user_func_array([$controller, $path[1]], $match['params']); >else < header('Location: /404'); >
saveForm(); json_encode([ 'success' => true, 'message' => 'Форма успешно сохранена' ], JSON_UNESCAPED_UNICODE); > >

А что делать если у меня только один контроллер?
То есть в папке контроллер у меня один файл controller.php
и там в зависимости от view я вызываю конкретные функции, вот пример кода:
itmages.ru/image/view/3206910/0a8b23d0
Большое спасибо за ответ!

maNULL

Александр: Изменил немного ответ, может будет понятнее. А по вашему коду — начинайте вникать, что есть MVC и какой код где должен быть — у вас все в куче

Источник

Читайте также:  Файловый поток си шарп
Оцените статью