Я пытаюсь решить проблему в ajax, которая возникает с того момента, когда мой клиент попросил меня не использовать какую-либо инфраструктуру для веб-приложений.
Я всегда использовал CodeIgniter, и у меня никогда не было проблем с ajax-запросами, особенно когда мне приходилось вызывать метод, просто выполняю этот вызов:
var postUrl = GlobalVariables.baseUrl + 'application/controllers/user.php/ajax_check_login';
//http://localhost/App_Name/application/controllers/user.php/ajax_check_login <-postUrl content
var postData =
{
'username': $('#username').val(),
'password': $('#password').val()
};
$.post(postUrl, postData, function(response)
{
// do stuff...
});
Как вы можете видеть из кода выше, что я хочу сделать, это вызвать метод в контроллере user.php
чье имя ajax_check_login
,
То, что я сделал до сих пор для достижения желаемого результата, это сделать этот код:
$allowed_functions = array('ajax_check_login');
$ru = $_SERVER['REQUEST_URI']
$func = preg_replace('/.*\//', '', $ru);
if (isset($func) && in_array($func, $allowed_functions)) {
$user = new User();
$user->$func();
}
если вы хотите увидеть полную структуру класса кликните сюда.
Проблема в том, что этот код должен быть размещен внутри каждого контроллера,
и вы должны установить все предлагаемые методы, иногда доступная функция достигает пятидесяти, что приводит к отказу от этого решения …
То, что я хочу знать: как я могу сделать обертку, класс, который позволяет мне вызывать метод контроллера из URL и выполнять его?
До того, как вся эта работа была проделана CodeIgniter. Так что теперь я должен написать свой собственный класс, который позволяет мне легко получать доступ к элементам управления и вызывать методы в разных классах.
Все классы, которые должны ответить на ajax-запрос, находятся в папке application / controllers / …. В папке контроллеров у меня 20 контроллеров.
Вы можете добавить ajax.php:
<?php
preg_match_all('/([^\/.]*)\.php\/([^\/]*)$/', $_SERVER['REQUEST_URI'], $matches);
$class = $matches[1][0];
$func = $matches[2][0];
$allowed_classes = array('user','account','foo');
if (isset($class) && isset($func) && in_array($class, $allowed_classes)) {
require_once "application/controllers/" . $class. ".php";
// here you could do some security checks about the requested function
// if not, then all the public functions will be possible to call
// for example if you don't want to allow any function to be called
// you can add a static function to each class:
// static function getAllowedFunctions() {return array('func1','func2');}
// and use it the same way you had checked it in the question
$obj = new $class();
$obj->$func();
// or if need to pass $_POST:
// call_user_func(array($obj, $func, $_POST));
}
и в сообщении JavaScript, чтобы:
var postUrl = GlobalVariables.baseUrl + 'application/controllers/ajax.php/user.php/ajax_check_login';
Если у вас есть apache, вы можете сделать это даже без добавления ajax.php, добавив его в .htaccess в каталоге контроллера:
RewriteEngine On
RewriteBase /baseUrl.../application/controllers/
RewriteRule ^([^\.]*\.php)/[^/]*$ ajax.php?file=$1&func=$2
Конечно, вам нужен ваш настоящий baseUrl. И измените первые 3 строки в php:
$class = $_GET['class'];
$func = $_GET['func'];
Других решений пока нет …