@Gristen

Как прикрутить 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();

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

UsersController.php

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 :)
  • Вопрос задан
  • 161 просмотр
Пригласить эксперта
Ответы на вопрос 2
php666
@php666
PHP-макака
$('#register').on('click',function (event)
советую сразу писать на чистом js и избегать jquery, она в нынешних реалиях уже не так сильно нужна, как раньше.

Router::post("/register/auth",\app\controllers\UsersController::class,"signUP");
полный путь к классу в коде - плохой тон, используй use

и как передавать данные между ajaxom и классами пхп .
в чем непонимание?
роут также принимает данные, только вместо отдачи html отдаешь json и на фронте уже пишешь логику на js

упрощенно:
Router::page("/register",'register',\app\controllers\UsersController::class,"index_register");

<code lang="php">
class UsersController extends Controller
{
    public function index_register()
    {
         // что-то делаешь с POST данными 

        $Model = new UsersModel();
        $res = $Model->register($_POST); 
        echo json_encode(['status': (int) $res]);
    }

    
</code>
Ответ написан
@mrStrike
реализовать REST API для работы ajax, а роуты оставить для GET/Post
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы