почему php spl_autoload_register и ajax не работают вместе?

Это мой файл index.php:

function Loader($class)
{
    $base=$_SERVER["DOCUMENT_ROOT"];

    if (file_exists($base.'/app/'.$class.'.php')) {
    include($base.'/app/'.$class.'.php');
    return true;
    }
  return false;
}

spl_autoload_register('Loader');
?>
<html>
<head>
</head>
<body>
<div id="container">
    </div>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/main.js"></script>
</body>
</html>

В моем файле main.js я делаю вызов AJAX:

  $.ajax({
        type: 'POST',
        url: 'controllers/UserController.php',
        dataType: "json",
        data: {
            model: model,
            method: method
        },

        success: function(result) {

            if (typeof(template) != 'undefined'){

                $.get('http://localhost/heliox/templates/'+template, function(data)     {

                    $(target).empty();

                    $(target).html(_.template(data,{data:result}));

                });
            } 
        }
    });

В файле UserController.php у меня есть:

Class UserController extends BaseController
{

    public function test()
    {
    echo "test";
    }
}

$UserController = new UserController;

Когда я помещаю свою функцию «Loader» в файл UserController, она работает нормально, и класс BaseController загружается, но когда функция находится внутри моего файла index.php и я делаю вызов AJAX, я получаю:

Неустранимая ошибка: класс BaseController не найден в D:\xampp\htdocs\heliox\controllers\UserController.php в строке 13.


person Kriss    schedule 11.06.2013    source источник
comment
Потому что UserControler.php ничего не знает о index.php и определенном там автозагрузчике.   -  person dev-null-dweller    schedule 11.06.2013
comment
так это другой сеанс, не так ли?   -  person Kriss    schedule 11.06.2013
comment
Это другая отправная точка. В php вы должны включать файлы для доступа к определенным в них функциям.   -  person dev-null-dweller    schedule 11.06.2013
comment
Хорошо, я думаю, я понял - большое спасибо.   -  person Kriss    schedule 11.06.2013


Ответы (2)


С помощью ajax-вызова вы напрямую обращаетесь к controllers/UserController.php. В этом файле у вас есть только объявление класса, которое расширяет другой класс. в этот момент интерпретатор PHP ничего не знает о index.php и зарегистрированной в нем функции автозагрузки, поэтому он не сможет разобрать файл, так как он ничего не знает ни о BaseController, ни о том, где его искать.

То, что вам нужно, называется начальной загрузкой — поместите весь код, необходимый для запуска вашего приложения (например, регистрацию автозагрузчиков, включая библиотеки, загрузку файлов конфигурации и т. д.) в один файл, который будет включен в каждый файл, доступ к которому осуществляется напрямую.

person dev-null-dweller    schedule 11.06.2013
comment
Должен ли файл начальной загрузки находиться в корневом каталоге проекта для правильной работы? - person knot22; 17.03.2017

Измените его на:

$.ajax({
        type: 'POST',
        url: 'http://localhost/user/your_parameters',
person Please_Dont_Bully_Me_SO_Lords    schedule 08.11.2013