По нажатию кнопки отправляется 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;
}
}