LINUX.ORG.RU

Ajax PHP - Как лучше возвращать результат?

 , ,


0

3

Был послан запрос. По запросу был вызван метод

public static function method($a,$b,$c)
{
if (empty($a)) throw new Exception('param A is empty',1);
return $b+$c;
}
как его лучше обработать чтобы получить json?

Именно интересует кто какие механизмы для передачи использует. Может какой то класс для ajax запросов стоит использовать?

Пока на ум приходит только что то подобное, которые при большом количестве подобных методов становится проблематичным.

try{

$result = Class::method('something',6,7);

return json_decode(array('error'=>0,'summ'=>$result));

} catch (Exception $e)
{
return json_decode(array('error'=>$e->getCode(),'message'=>$e->getMessage()));
}

★★

Простой обертки обычно хватает...

class JsonData
{
    const ELEM_TYPE_MESSAGE = 'message';
    const ELEM_TYPE_ERROR   = 'error';
    const ELEM_TYPE_DATA    = 'data';
    const ELEMS_QUANTITY    = 'count';
    const ELEMS_VALUES      = 'value';

    private $data;
    private $dataBuffer;


    public function __construct ()
    {
        $this -> dataBuffer = array ();
        $defaults = array (self :: ELEMS_QUANTITY => 0, self :: ELEMS_VALUES => array ());
        $this -> data = array
        (
              self :: ELEM_TYPE_MESSAGE => $defaults
            , self :: ELEM_TYPE_ERROR   => $defaults
            , self :: ELEM_TYPE_DATA    => $defaults
        );
    }

    public function getNumMessages ()
    {
        return $this -> data [self :: ELEM_TYPE_MESSAGE][self :: ELEMS_QUANTITY];
    }

    public function getNumErrors ()
    {
        return $this -> data [self :: ELEM_TYPE_ERROR][self :: ELEMS_QUANTITY];
    }

    public function getNumData ()
    {
        return $this -> data [self :: ELEM_TYPE_DATA][self :: ELEMS_QUANTITY];
    }

    public function addError ()
    {
        foreach (func_get_args () as $arg)
            $this -> _addElem (self :: ELEM_TYPE_ERROR, $arg);
    }

    public function addMessage ($arg)
    {
        foreach (func_get_args () as $arg)
            $this -> _addElem (self :: ELEM_TYPE_MESSAGE, $arg);
    }

    public function addData ()
    {
        switch (func_num_args ())
        {
            case 1:
                $this -> dataBuffer [] = func_get_arg (0);
                break;

            case 2:
                $this -> dataBuffer [func_get_arg (0)] = func_get_arg (1);
                break;

            default:
                throw new \/*...*/\Error\System ('Too many arguments.');
        }

        $this -> data [self :: ELEM_TYPE_DATA][self :: ELEMS_QUANTITY] ++;
    }

    public function __toString ()
    {
        $this -> data [ELEM_TYPE_DATA][self :: ELEMS_VALUES] = $this -> dataBuffer;
        $json = json_encode ($this -> data);
        if ($json === false)
        {
            switch (json_last_error ())
            {
                case JSON_ERROR_NONE:
                    $message = 'JSON_ERROR_NONE';
                    break;
                case JSON_ERROR_DEPTH:
                    $message = 'JSON_ERROR_DEPTH';
                    break;
                case JSON_ERROR_STATE_MISMATCH:
                    $message = 'JSON_ERROR_STATE_MISMATCH';
                    break;
                case JSON_ERROR_CTRL_CHAR:
                    $message = 'JSON_ERROR_CTRL_CHAR';
                    break;
                case JSON_ERROR_SYNTAX:
                    $message = 'JSON_ERROR_SYNTAX';
                    break;
                case JSON_ERROR_UTF8:
                    $message = 'JSON_ERROR_UTF8';
                    break;
                default:
                    $message = 'Unknown JSON_ERROR';
            }

            throw new \/*...*/\Error\System ($message);
        }

        return $json;
    }


    private function _addElem ($elemType, $elemContent)
    {
        $this -> data [$elemType][self :: ELEMS_QUANTITY] ++;
        $this -> data [$elemType][self :: ELEMS_VALUES][] = $elemContent;
    }
}
metrokto ★★
()
Ответ на: комментарий от ex3me

Примерно так:

try
{
    $jd = new JsonData ();
    try
    {
        foreach (new ItemsIterator ($categoryId, $range) as  $item)
            $jd -> addData ($item -> getVars ());
    }
    catch (SomeException $e)
    {
        Log :: add ($e);
        $jd -> addError ($e -> getMessage ());
    }

    echo $jd;
}
catch (\/*...*/\Error\System $e)
{
    echo '{"error":{"count":1,"value":["Не удалось сформировать данные."]}}';
}
if (json.error.count > 0)
    for (var i = 0; i < json.error.count; i ++)
        alert (json.error.value [i]);
else
    var html = Mustache.to_html (template, {items: json.data});
metrokto ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.