2013-02-17 8 views
0

Мне было интересно, есть ли какие-либо хорошие методы для вызова метода из php-класса с Javascript, путем Ajax.Вызов функции класса php в javascript (ajax)

Это мой текущий «стиль» для его выполнения.

(метод в классе только здесь, например)

PHP сторона:

<?php 

if(isset($_POST['action']) && $_POST['action'] != null) 
{ 
    extract($_POST); 

    if($action) 
    { 
     $ajaxCommand = new EleveUpdate(); 

     if(method_exists($ajaxCommand, $action)) 
     { 
      $reponse = call_user_func(array($ajaxCommand, $action),$_POST); 
      echo $reponse; 
      exit(0); 
     } 
     else 
     { 
      throw new Exception("Cette méthode n'existe pas"); 
     } 
    } 
} 
else 
{ 
    echo 'Cette action n\'est pas autorisée'; 
    return false; 
} 

class EleveUpdate 
{ 

    public function __construct() 
    { 

    } 

    public function testfunct($data) 
    { 
     echo $data['eleve']; 
    } 
} 

Javascript сторона:

$(document).ready(function() { 
    $.ajax({ 
     url: 'eleveupdate.php', 
     type: 'POST', 
     data: { 
      action: "testfunct", 
      eleve: 1 
     }, 
     beforeSend: function() 
     { 
      loading(true); 
     }, 
     error: function() 
     { 
      console.log('error'); 
     }, 
     success: function(data) 
     { 
      loading(false); 
      console.log(data); 
     } 
    }); 
}); 

Проблема, что Исеть $ _POST всегда в моем классе, я уверен, что это неправильный способ сделать это, я здесь, чтобы найти помощь в этом.

Спасибо заранее

Simon

+0

Как вы думаете, что должно произойти, и что происходит вместо этого? Кроме того, попробуйте переместить декларацию класса сверху. – gd1

+0

Идея состоит в том, чтобы иметь более «элегантный» способ сделать это. Этот метод работает отлично, но я не знаю, хочу ли я использовать его так. Все возвращается, как я хочу, но я хочу найти способ «хорошей практики» :) – Simon

+0

Единственная проблема, которую я вижу, это то, что кто-то может вызвать произвольный метод вашего класса извне. Если ваш класс содержит только «безопасные» методы, с этим нет никаких проблем. Более того, мне не нравится использование extract() для переменных $ _POST. – gd1

ответ

0

Проблема заключается в том, что это не так легко назвать сферой применения namings на основе строки запроса. Вы можете использовать что-то LAMBDA или анонимные функции. Таким образом, вы можете сохранить массив строк с прикрепленным к ним LAMBDA. Как это:

<?php 
class EleveUpdate { 
    private $funcs = array(); 

    function __construct($which_function) { 
     $funcs['testfunct'] = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);'); 

     $funcs[$which_function]; 
    } 
} 
?> 

Смотреть подробнее здесь: http://www.php.net/manual/en/function.create-function.php

Вы, вероятно, не будет даже нужно Классом больше с этим методом, но только с указанием.