PHPクラスの制御とロード(「自動ロード」)などに使用する一般的なクラスローダーを作成しました。簡素化されたコードの一部:
PHP ファイル:
namespace Ajax;
require_once '../Loader.php';
class Loader extends \Loader{
static public function getAjaxResponse($Post){
if (!\Checker::isClassName($Post['className']) || !\Checker::isMethodName($Post['method']) ){
return '';
}
Loader::loadClass($Post['className']);
$class = '\\'.$Post['className'];
$handler = array($class, $Post['method']);
if (is_callable($handler) ){
$oClass = new $class(true);
return $oClass->$Post['method']($Post['params']);
}
}
}
new Loader;
echo Loader::getAjaxResponse($_POST);
JS ファイル:
var requestData = {
className : 'Menu',
method : 'assignItemToMenu',
params : { IdItem: $('input[name="IdItem"]').val(), IdParent:$('select[name="IdParent"]').val() }
};
if ($('#itemsSortOrder').children().length == 0){
$.extend(requestData.params, {addButtons : true} );
}
$.post('../classRepository/Ajax/Loader.php?open=' + $_GET['open'], requestData)
.success(function(data){
document.write(data);
window.alert(data);
})
.error(function(){
window.alert('Retrieving data failed.');
});
いつ機能しますか?AJAX リクエストでパラメータを 1 つだけ送信すると、JS コードには次のものが含まれます。
var requestData = {
className : 'Vocabulary',
method : 'getReport',
params : $('#report').val()
};
うまくいかないときは?複数のパラメーターを送信する必要がある場合。call_user_func_array() を使用しようとしましたが、オブジェクト内の $this-> では機能しません。メソッドは静的でなければなりません。リフレクションを使用しようとしましたが、成功しませんでした。
私は地獄の方法を知っています、これを行う方法: eval(); しかし、これは eval よりも悪い :)) 、コードは次のようになります。
$params = array();
foreach ($_POST['params'] as $param){
if (is_string($param) ){
$params[] = '"'.$param.'"';
}
else{
$params[] = $param;
}
}
$params = implode(',',$params);
$oClass = new $class;
eval ('$oClass->$_POST["method"]('.$params.')');
誰かあなたのことを知っていますか、それを解決する方法はありますか?