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.