Howto: связь PHP / Javascript - PullRequest
       33

Howto: связь PHP / Javascript

2 голосов
/ 14 февраля 2009

Когда я разрабатываю свой WebIDE , я продолжаю придумывать вопросы, на которые я не могу ответить сам. Это связано с тем, что проект должен помогать другим создавать то, что они «обычно» создают, но быстрее (то есть максимально автоматизированы). В этом свете мой вопрос: как реализовать бэкэнд PHP?

Вот что я делаю. Мне нравится создавать «функции», которые может вызывать клиентский JavaScript. Обычно я отправляю (через POST и JSON) переменную с именем «action», которая содержит имя «функции», которую я вызываю (а также любые аргументы, которые я хочу отправить). Код PHP выглядит примерно так:

if(issset($_POST['action'])) {
    //function foo(arg1,arg2)
    if($_POST['action'] == 'foo') {
        $arg1 = $_POST['arg1'];
        $arg2 = $_POST['arg2'];
        //do stuff
    }
}

Я все еще могу ссылаться на другие реальные функции, созданные в PHP, но я считаю, что это хороший способ упорядочить все и легко реализовать как в JavaScript, так и в PHP.

Что ты делаешь?

Редактировать 1: Хорошо, основываясь на первых двух ответах на этот вопрос, я не думаю, что я хорошо объясняю себя.

Я спрашиваю, как создать бэкэнд PHP. Идея состоит в том, что ваш AJAX-клиент написан на JavaScript (или, может быть, что-то еще, это не имеет значения ), а затем он вызовет ваш бэкэнд PHP с данными POST или GET. Основываясь на этих данных, ваш бэкэнд будет делать то, что ему нужно (возможно, он просто обновит базу данных и, возможно, даже вернет информацию, опять же: это не имеет значения ).

Вопрос сейчас такой: как вы говорите, что делать? Что вы отправляете через POST / GET и как вы интерпретируете это в своем бэкэнде?

Ответы [ 7 ]

2 голосов
/ 15 марта 2012

Я отправляю все данные на сервер в большом массиве GET.

actionpage.php? Действие = запись и параметры [параметр1] = значение1 & параметры [параметр2] = значение2

Если вы напечатаете _r ($ _ GET), на стороне PHP вы увидите:

array(
    "action" => "create",
    "parameters" => array("parameter1"=>"value1","parameter2"=>"value2")
)

То, что это делает, позволяет вам просматривать ваши параметры. Вы можете сказать в папе

 if($_GET['action'] == 'create'){
      foreach($_GET['parameters'] as $key=>$value){ //something
0 голосов
/ 26 апреля 2012

этот сайт ответит на все ваши вопросы по ajax. Я нашел это действительно полезным. http://ajaxpatterns.org/XMLHttpRequest_Call

0 голосов
/ 27 февраля 2012

Я использую контроллер главной страницы, который обрабатывает мою маршрутизацию. Если вы настроите перезапись мода, у вас могут быть очень чистые конечные точки, где первый сегмент вашего URL ссылается на контроллер (класс), а затем последующие сегменты будут ссылаться на методы внутри, за которыми следуют параметры, передаваемые методу.

http://domain.com/class/method/param1/param2

0 голосов
/ 23 февраля 2012

Вам нужно организовать функции? Это называется «класс».

/// todo: add error processing
$name=$_GET['action'];
$args=json_decode($_GET['args']); /// or just subarray, doesn't matter

/// 'Action' is constant here but in reality you will need more then one class for this
/// because you will want modules in your framework
if(method_exists('Action',$name))
    call_user_func_array(array('Action',$name),$args);
else { /* incorrect parameters processing */ }

/// Ajax-available functions are here
class Action
{
    public static function action1()
    {
        echo 'action1';
    }
    public static function action2()
    {
        echo 'action2';
    }
}
0 голосов
/ 15 февраля 2009

Вопрос сейчас такой: как вы говорите? это что делать? Что вы отправляете через POST / GET и как вы это интерпретируете в твоем бэкэнде?

Выберите свои собственные соглашения. Например, используйте значение «action» в ваших данных JSON, которое сообщает действие, затем добавьте больше параметров. Вы можете шпионить за сообщениями Ajax различных сайтов с расширением Firebug в Firefox, если хотите посмотреть, что делают другие сайты.

Например, данные JSON POST могут быть:

{
    action: "create",
    fields: {
       firstname: "John",
       lastname: "Doe",
       age: 32
    }
}

На что вы можете ответить с идентификатором вновь созданной записи.

Чтобы удалить запись:

{
    action: "delete",
    keys: {
        id: 4654564
    }
}

и т.д.

В обработчике php ajax у вас может быть что-то простое, например, переключатель:

$jsonData = Services_Json::decode($_POST['json']);
switch ($jsonData->action)
{
    case "save":
        if (validate_json_data($jsonData->fields))
        {
            UsersPeer::create($jsonData->fields);
        }
        break;
    case "delete":
        /* etc */
}

// return a json reply with 
$jsonReply = new stdClass;
$jsonReply->status = "ok";
$jsonReply->statusMessage = "Record succesfully created";
echo Services_Json::encode($jsonReply);
exit;

Javascript, скажем, прототип Функция респондента Ajax.Request выведет сообщение об ошибке в специально созданном DIV, если «status» не «ok» и т. Д.

0 голосов
/ 14 февраля 2009

Я обычно пишу функции php как обычные функции.

fn1(arg1, arg2){
 //do stuff here
}
fn2(arg3){
 //do stuff here
}

Я передаю имя функции в переменную с именем action. Затем сделайте это:

foreach($_POST as $key => $value) 
$$key = $value;

Чтобы назначить переменные создания с тем же именем, что и аргументы.

Затем используйте переключатель для вызова соответствующей функции следующим образом:

switch($action){
 case 'fn1':fn1(arg1,arg2);
 break;
 case 'fn2':fn2(arg3);
 break;
}

Это то, что вы ищете?

Редактировать: вы можете использовать PHP SOAP и расширение XML-RPC для разработки веб-сервиса, где, если вы укажете имя функции в запросе SOAP, эта функция будет выполнена автоматически (вы не должны написать коммутатор или если). Я использовал его в Java, но не уверен, как именно он работает в PHP.

0 голосов
/ 14 февраля 2009

Я делаю что-то очень похожее. Что вам нужно, это объект JSON, чтобы передать обратно в JavaScript. Когда вы закончите с вашим PHP, вы можете вызвать json_encode , чтобы передать объект обратно во внешний интерфейс. Оттуда вы можете сделать больше с ним в Javascript или отформатировать его, как вы хотите.

Более подробная информация по аналогичному вопросу здесь: Лучший способ передать массив между PHP и Javascript

Правка: после прочтения вашей правки, я думаю, что вы делаете хорошо. Когда вы отправляете запрос AJAX из Javascript, включайте переменную типа «action» или что угодно. Оттуда вы можете проверить, что это за действие, с помощью оператора case и switch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...