@Artur937
junior

Как создать маршрут для AJAX запроса на главной странице?

По нажатию кнопки отправляется POST запрос:

function char_db(sub, char){	
	if( (sub == 1) || (sub == 2) || (sub == 3) ) {	
		$.ajax({ 
					type: "POST",
					url: "/char",
					data: sub,
					contentType: "text/plain",
					success:function (text) {
						for(i = 0; i < text.length; i++){
							$('.charter_i').find('ul').append('<li data="'+ text[i]['id'] + '">' + (i+1) + '. ' + text[i]['name'] +'</li>');
						}
						show_charter(char);	
					}
				}).fail(function () {
					console.log('fail');
				});
	} else {
		return;	
	}
}


Создаю маршрут для данного POST запроса в роутах:
' ' => 'main/index',  //для главной страницы
    'char' => 'main/char'   //для AJAX запроса на главной странице


В ответ приходит следующее:
Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'MainController' does not have a method 'actionIndexcmain' in C:\OS\OSPanel\domains\myproject.ru\components\Router.php on line 64

Со схемой MVC знакомлюсь второй день, и не особо понимаю, как решить данную ситуацию. Прикрепляю
также класс Router
class Router
{
    private $routes;

    public function __construct()
    {
        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }

    // return request string

    private function getURI()
    {
        if  (!empty($_SERVER['REQUEST_URI'])) {
            return trim($_SERVER['REQUEST_URI'], '/');
        }
    }

    public function run()
    {
        //Получить строку запросы
        $uri = $this->getURI();

        //Проверить наличие такого запроса в routes.php
        foreach ($this->routes as $uriPattern => $path) {
        
           // Сравниваем $uriPattern и $uri
            if (preg_match("~$uriPattern~", $uri)){

                //Получаем внутренний путь из внешнего согласно правилу
                $internalRoute = preg_replace("~$uriPattern~", $path, $uri);


                //Определить какой контроллер и action обрабатывает запрос и параметры
                
                $segments = explode('/', $internalRoute);

                $controllerName = array_shift($segments).'Controller';
                $controllerName = ucfirst($controllerName);

                $actionName = 'action'.ucfirst(array_shift($segments));

                $parameters = $segments;
          

                //Подключить файл класса контроллера
                $controllerFile = ROOT . '/controllers/' . 
                    $controllerName . '.php';

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


                //Создать объект, взывать метод (т.е. action)
                $controllerObject = new $controllerName;
                $result = call_user_func_array(array($controllerObject, $actionName), $parameters);
                
                if($result != null){
                    break;
                }
            } 
        }
    }
}


Класс MainController:
include_once ROOT.'/models/Main.php';

class MainController
{
    public function actionIndex(){

        require_once (ROOT. '/views/main/main.php');

        return true;

    }

    public function actionChars(){

        echo 'hello';
        return true;
    }
}
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
ПОЧЕМУ НИКТО НЕ ЧИТАЕТ ОШИБКИ????
class 'MainController' does not have a method 'actionIndexcmain' in C:\OS\OSPanel\domains\myproject.ru\components\Router.php on line 64

неужели так сложно прочесть что написано? Нет метода - значит неверно формируется имя экшна. var_dump в руки и ищите косяк, где неверно получаете имя экшна.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 16:03
5000 руб./за проект
25 апр. 2024, в 16:02
40000 руб./за проект
25 апр. 2024, в 15:58
5000 руб./за проект