Phoenix.Ajax

Phoenix.Ajax object is a jQuery ajax wrapper, to include it, use:

PhoenixScript::ajax();

The CSRF token will auto injected to this object, just use it as a http client.

Phoenix.Ajax.get('flower/sakura/1')
    .done(function (response, status, jqHXR) {
        // ...
    }).fail(function (jqHXR, status, error) {
        // ...
    }).always(function () {
        // ...
    });

Use other methods:

Phoenix.Ajax.get('flower/sakura/1', data, headers).done(...).fail(...);
Phoenix.Ajax.post('flower/sakura', data, headers).done(...).fail(...);
Phoenix.Ajax.put('flower/sakura/1', data, headers).done(...).fail(...);
Phoenix.Ajax.patch('flower/sakura/1', data, headers).done(...).fail(...);
Phoenix.Ajax.delete('flower/sakura/1', data, headers).done(...).fail(...);
Phoenix.Ajax.head('flower/sakura/1', data, headers).done(...).fail(...);
Phoenix.Ajax.options('flower/sakura/1', data, headers).done(...).fail(...);

Add jQuery ajax options to forth argument:

Phoenix.Ajax.post('flower/sakura', data, headers, {dataType: 'xml'})
    .done(...)
    .fail(...);

Use request():

Phoenix.Ajax.request('POST', 'flower/sakura', data, headers, options)
    .done(...)
    .fail(...);

Override Methods

To override HTTP method with X-HTTP-Method-Override or _method parameter, use .customMethod() chain.

Phoenix.Ajax.customMethod()
    .put('flower/sakura/1')
    .done(...)
    .fail(...);

Set Custom Headers

Phoenix.Ajax.headers.POST['X-Foo'] = 'Bar';

This header will always send with every request.

Integrate JsonApiTrait

Add JsonApiTrait to controller:

class GetController extends AbstractController
{
    use JsonApiTrait;

    // ...

    public function doExecute()
    {
        $this->addMessage('Hello');

        return ['foo' => 'bar'];
    }
}

Now your JSON return will format with this:

{success:true,code:200,message:"Hello",data:{foo:"bar"}}

If you throw exceptions in controller:

class GetController extends AbstractController
{
    use JsonApiTrait;

    // ...

    public function doExecute()
    {
        throw new \RuntimeException('Something error', 403);

        return ['foo' => 'bar'];
    }
}

The return JSON will be:

{"success":false,"code":403,"message":"Something error","data":{"backtrace":...}}

So you can check API status in JS:

Phoenix.Ajax.get('flower/sakura/1')
    .done(function (response, status, jqHXR) {
        if (response.success) {
            console.log(response.data);
        } else {
            throw new Error(response.message);
        }
    });

Use Vue Resource

See Vue Resource

Integrate with Router

See Phoenix.Router

Add CSRF Token

If you want to protect your application in ajax call, you can use this method to add form token.

\Phoenix\Script\CoreScript::csrfToken();

This method will add a meta tag to HTML <nead>

<meta name="csrf-token" content="a7d71a2c21743d8865fdfa61b71b29e8" />

Now you can fetch this token by JS, for example, we can add a param to jQuery ajaxSetup:

jQuery.ajaxSetup({
    headers: {
        'X-Csrf-Token': jQuery('meta[name="csrf-token"]').attr('content')
    }
});

Auto add ajaxSetup

Use this code to auto add ajaxSetup:

JQueryScript::csrfToken();

If you found a typo or error, please help us improve this document.