Возвратите ответ json для запроса Ajax в базовом PHP MVC - PullRequest
2 голосов
/ 10 января 2012

Я планирую создать легкий простой MVC на PHP для простых проектов.

Я пытаюсь понять простой способ показа шаблона View или возврата ответа JSON, если это AJAX-запрос.

Ниже приведен фрагмент, который я только что придумал, это всегипотетически, так что ни один из методов на самом деле еще не существует, я просто ожидаю, что они будут работать.

Если посмотреть на приведенный ниже код и прочитать комментарии к нему, то будет ли это выглядеть так, как вы, вероятно, вернетеAJAX-запрос вместо шаблона представления в базовом MVC?

/**
 * Example Controller
 */
class Test_Controller extends Core_Controller {


    function SomeAction($userId)
    {
        //GET ID from URI
        $this->request->get($userId['id']);

        // load a Model 'some' = Model Name
        $this->profile_model = $this->loadModel('some');

        // Get the Dataset from the Model
        $profileData = $this->profile_model->getProfile($userId);

        // Check if this is an AJAX request true/false
        if($this->request->isAjax()){
            //is AJAX is true then we return json instead of loading a View template
            return $this->response->json($profileData);
        }else{
            // load view file
            $this->view->load('userProfile', $profileData);
        }
    }

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Ваш метод кажется довольно интуитивным и, вероятно, очень похож на то, как я бы это делал, но за исключением того, что я не отвечал бы JSON на каждый запрос AJAX.Я отвечу только JSON, если:

  • JSON запрашивается в URI (например, /users/1/json или /users/1.json) или
  • JSON запрашивается через Accepts HTMLheader

Это позволяет вам быть более гибким / ориентированным на будущее.Если в какой-то момент в будущем вы решите, что хотите обработать некоторые данные для запроса AJAX в формате XML, а не в формате JSON, все, что вам нужно сделать, это указать его для этого одного запроса (например, /users/1.xml).Если вы ранее обслуживали JSON для каждого AJAX-запроса, вам пришлось бы изменить все AJAX-запросы, чтобы явно запрашивать JSON, чтобы удовлетворить этот один XML-запрос, и это не очень удобно для разработчиков.: -)

2 голосов
/ 10 января 2012

Я предпочитаю этот способ в вашем методе:

public function executeSomeAction($request)
{
    if ($request->isXmlHttpRequest())
    {
         $this->actAsJsonResponse(); // here you set headers and other things
         /**
          * $code - 0, if all's fine, other on error
          * $message - verbal message that describe the error, or success
          * $extra - any data to send.
          */
         return $this->prepareJsonResponse($code, $message, $extra);
    }
}

В результате в моей структуре у меня есть что-то вроде:

public function executeSave(\Lighty\Request\Request $request)
{
    $this->actAsJsonResponse();
    $p      = \Lighty\Model\ParticipantSqlAdapter::getInstance()->findById($this->getUser()->getIdParticipant());
    $data   = $request->get('profile', \Lighty\Request\Request::POST, array());
    if (count($data))
    {
        $form = new \Form\Profile(array(
            'default'   => array_merge($p->getAccount()->getArray(), $p->getArray(), $data),
        ));
        if ($form->save($p))
        {
            if (isset($data['tags']))
            {
                $tags = explode(',', $data['tags']);
                array_trim($tags);
                $tags = array_unique($tags);
                $data['tags'] = implode(', ', $tags);
                unset($tags);
            }

            $this->prepareMetaResponse(0, 'Your profile saved successfully', array('updated' => $data));
        }
        else
        {
            $this->prepareMetaResponse(1, 'Passed data is invalid', array('error' => $form->getErrors()));
        }
    }
    else
    {
        $this->prepareMetaResponse(2, 'Not enough data passed');
    }
}

Тогда вы упростите обработку запроса на стороне клиента:1007 *

if (response.code == 0) {
    // do whatever you need to, on success
} else {
    alert(response.code + ' ' + response.message);
}

Надеюсь, это поможет.

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