@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;
    }
}
  • Вопрос задан
  • 141 просмотр
Решения вопроса 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 в руки и ищите косяк, где неверно получаете имя экшна.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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