Auto deploy from Github Actions

This commit is contained in:
tobyzerner 2021-07-22 03:07:36 +00:00
commit 077f75f398
49 changed files with 1028 additions and 0 deletions

20
404.html Normal file
View File

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/6.60d915b0.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/2.45932810.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><div class="theme-default-content"><h1>404</h1> <blockquote>Looks like we've got some broken links.</blockquote> <a href="/json-api-server/" class="router-link-active">
Take me home.
</a></div></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/6.60d915b0.js" defer></script>
</body>
</html>

47
adapters.html Normal file
View File

@ -0,0 +1,47 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Adapters | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/7.62c9b4c8.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" aria-current="page" class="active sidebar-link">Adapters</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="adapters"><a href="#adapters" class="header-anchor">#</a> Adapters</h1> <p>Adapters connect your API schema to your application's data persistence layer.</p> <p>You'll need to supply an adapter for each <a href="https://jsonapi.org/format/#document-resource-object-identification" target="_blank" rel="noopener noreferrer">resource type<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> you define. You can define resource types using the <code>resource</code> method. For example:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token keyword">use</span> <span class="token package">Tobyz<span class="token punctuation">\</span>JsonApiServer<span class="token punctuation">\</span>Schema<span class="token punctuation">\</span>Type</span><span class="token punctuation">;</span>
<span class="token variable">$api</span><span class="token operator">-&gt;</span><span class="token function">resource</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">,</span> <span class="token variable">$adapter</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token class-name type-declaration">Type</span> <span class="token variable">$type</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// define your schema</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h3 id="eloquent-adapter"><a href="#eloquent-adapter" class="header-anchor">#</a> Eloquent Adapter</h3> <p>An <code>EloquentAdapter</code> is provided out of the box to hook your resources up with Laravel <a href="https://laravel.com/docs/8.x/eloquent" target="_blank" rel="noopener noreferrer">Eloquent<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> models. Instantiate it with the model class that corresponds to your resource.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Models<span class="token punctuation">\</span>User</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Tobyz<span class="token punctuation">\</span>JsonApiServer<span class="token punctuation">\</span>Adapter<span class="token punctuation">\</span>EloquentAdapter</span><span class="token punctuation">;</span>
<span class="token variable">$adapter</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">EloquentAdapter</span><span class="token punctuation">(</span><span class="token class-name static-context">User</span><span class="token operator">::</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>When using the Eloquent Adapter, the <code>$model</code> passed around in the schema will be an instance of the given model, and the <code>$query</code> will be a <code>Illuminate\Database\Eloquent\Builder</code> instance querying the model's table:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">scope</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token class-name type-declaration">Builder</span> <span class="token variable">$query</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token class-name type-declaration">User</span> <span class="token variable">$user</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h3 id="custom-adapters"><a href="#custom-adapters" class="header-anchor">#</a> Custom Adapters</h3> <p>For other ORMs or data persistence layers, you can <a href="https://github.com/tobyzerner/json-api-server/blob/master/src/Adapter/AdapterInterface.php" target="_blank" rel="noopener noreferrer">implement your own adapter<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>.</p></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/adapters.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/requests.html" class="prev">
Handling Requests
</a></span> <span class="next"><a href="/json-api-server/scopes.html">
Scopes
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/7.62c9b4c8.js" defer></script>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#aaa" fill="none"><path d="M11.29 11.71l-4-4"/><circle cx="5" cy="5" r="4"/></g></svg>

After

Width:  |  Height:  |  Size: 216 B

1
assets/js/10.f39ec3a0.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/11.724dd987.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/12.9934b242.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/13.01e72a34.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/14.0a2e817f.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{195:function(t,a,s){"use strict";s.r(a);var e=s(6),n=Object(e.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),s("p",[t._v("To install, simply require the package via Composer.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("composer")]),t._v(" require tobyz/json-api-server\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]);

1
assets/js/15.88e8e5d1.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/16.c308b4df.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/17.8ed4f1c9.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/18.3550a25e.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/19.65cfb425.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/2.45932810.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/20.b9e8a752.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/21.80416eea.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{203:function(t,s,e){"use strict";e.r(s);var a=e(6),n=Object(a.a)({},(function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"scopes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scopes"}},[t._v("#")]),t._v(" Scopes")]),t._v(" "),e("p",[t._v("Restrict the visibility of resources, and make other query modifications, using the "),e("code",[t._v("scope")]),t._v(" method.")]),t._v(" "),e("p",[t._v("This "),e("code",[t._v("scope")]),t._v(" method allows you to modify the query builder object provided by the adapter. This is the perfect opportunity to apply conditions to the query to restrict which resources are visible in the API.")]),t._v(" "),e("p",[t._v("For example, to make it so the authenticated user can only see their own posts:")]),t._v(" "),e("div",{staticClass:"language-php extra-class"},[e("pre",{pre:!0,attrs:{class:"language-php"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token package"}},[t._v("Tobyz"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("JsonApiServer"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("Context")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$type")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("scope")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$query")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name type-declaration"}},[t._v("Context")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$context")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$query")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("where")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string single-quoted-string"}},[t._v("'user_id'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$context")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAttribute")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string single-quoted-string"}},[t._v("'userId'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("A resource type's scope is global it will also be applied when that resource is being "),e("a",{attrs:{href:"relationships"}},[t._v("included")]),t._v(" as a relationship.")]),t._v(" "),e("p",[t._v("You can define multiple scopes per resource type, and they will be applied in order.")])])}),[],!1,null,null,null);s.default=n.exports}}]);

1
assets/js/22.c8abdf2c.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{204:function(t,s,a){"use strict";a.r(s);var e=a(6),n=Object(e.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"showing-resources"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#showing-resources"}},[t._v("#")]),t._v(" Showing Resources")]),t._v(" "),a("p",[t._v("For each resource type, a "),a("code",[t._v("GET /{type}/{id}")]),t._v(" endpoint is exposed to show an individual resource.")]),t._v(" "),a("h2",{attrs:{id:"events"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#events"}},[t._v("#")]),t._v(" Events")]),t._v(" "),a("h3",{attrs:{id:"onshow"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#onshow"}},[t._v("#")]),t._v(" "),a("code",[t._v("onShow")])]),t._v(" "),a("p",[t._v("Run after models and relationships have been retrieved, but before they are serialized into a JSON:API document.")]),t._v(" "),a("div",{staticClass:"language-php extra-class"},[a("pre",{pre:!0,attrs:{class:"language-php"}},[a("code",[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("onShow")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$model")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name type-declaration"}},[t._v("Context")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$context")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// do something")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]);

1
assets/js/23.298bad12.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/24.f0bf2e90.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/25.5bf262d7.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/26.1472df94.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/3.54f7104d.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{164:function(t,e,n){},183:function(t,e,n){"use strict";n(164)},209:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:(t,{props:e,slots:n})=>t("span",{class:["badge",e.type],style:{verticalAlign:e.vertical}},e.text||n().default)},p=(n(183),n(6)),l=Object(p.a)(i,void 0,void 0,!1,null,"15b7b770",null);e.default=l.exports}}]);

1
assets/js/4.a1fa2109.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{163:function(t,e,a){},182:function(t,e,a){"use strict";a(163)},187:function(t,e,a){"use strict";a.r(e);var s={name:"CodeBlock",props:{title:{type:String,required:!0},active:{type:Boolean,default:!1}},mounted(){this.$parent&&this.$parent.loadTabs&&this.$parent.loadTabs()}},i=(a(182),a(6)),n=Object(i.a)(s,(function(){var t=this.$createElement;return(this._self._c||t)("div",{staticClass:"theme-code-block",class:{"theme-code-block__active":this.active}},[this._t("default")],2)}),[],!1,null,"759a7d02",null);e.default=n.exports}}]);

1
assets/js/5.42433e02.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{165:function(e,t,a){},184:function(e,t,a){"use strict";a(165)},188:function(e,t,a){"use strict";a.r(t);var o={name:"CodeGroup",data:()=>({codeTabs:[],activeCodeTabIndex:-1}),watch:{activeCodeTabIndex(e){this.activateCodeTab(e)}},mounted(){this.loadTabs()},methods:{changeCodeTab(e){this.activeCodeTabIndex=e},loadTabs(){this.codeTabs=(this.$slots.default||[]).filter(e=>Boolean(e.componentOptions)).map((e,t)=>(""===e.componentOptions.propsData.active&&(this.activeCodeTabIndex=t),{title:e.componentOptions.propsData.title,elm:e.elm})),-1===this.activeCodeTabIndex&&this.codeTabs.length>0&&(this.activeCodeTabIndex=0),this.activateCodeTab(0)},activateCodeTab(e){this.codeTabs.forEach(e=>{e.elm&&e.elm.classList.remove("theme-code-block__active")}),this.codeTabs[e].elm&&this.codeTabs[e].elm.classList.add("theme-code-block__active")}}},s=(a(184),a(6)),c=Object(s.a)(o,(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ClientOnly",[a("div",{staticClass:"theme-code-group"},[a("div",{staticClass:"theme-code-group__nav"},[a("ul",{staticClass:"theme-code-group__ul"},e._l(e.codeTabs,(function(t,o){return a("li",{key:t.title,staticClass:"theme-code-group__li"},[a("button",{staticClass:"theme-code-group__nav-tab",class:{"theme-code-group__nav-tab-active":o===e.activeCodeTabIndex},on:{click:function(t){return e.changeCodeTab(o)}}},[e._v("\n "+e._s(t.title)+"\n ")])])})),0)]),e._v(" "),e._t("default"),e._v(" "),e.codeTabs.length<1?a("pre",{staticClass:"pre-blank"},[e._v("// Make sure to add code blocks to your code group")]):e._e()],2)])}),[],!1,null,"deefee04",null);t.default=c.exports}}]);

1
assets/js/6.60d915b0.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{186:function(t,e,s){"use strict";s.r(e);const o=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."];var n={methods:{getMsg:()=>o[Math.floor(Math.random()*o.length)]}},h=s(6),i=Object(h.a)(n,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"theme-container"},[e("div",{staticClass:"theme-default-content"},[e("h1",[this._v("404")]),this._v(" "),e("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),e("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=i.exports}}]);

1
assets/js/7.62c9b4c8.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/8.2eaea85f.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/9.e517d767.js Normal file

File diff suppressed because one or more lines are too long

14
assets/js/app.67f738be.js Normal file

File diff suppressed because one or more lines are too long

43
attributes.html Normal file
View File

@ -0,0 +1,43 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Attributes | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/8.2eaea85f.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" aria-current="page" class="active sidebar-link">Attributes</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/attributes.html#getters" class="sidebar-link">Getters</a></li></ul></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="attributes"><a href="#attributes" class="header-anchor">#</a> Attributes</h1> <p>Define an <a href="https://jsonapi.org/format/#document-resource-object-attributes" target="_blank" rel="noopener noreferrer">attribute field<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> on your resource using the <code>attribute</code> method.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'firstName'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>By default, the attribute will read and write to the property on your model with the same name. (The Eloquent adapter will <code>snake_case</code> it automatically for you.) If you'd like it to correspond to a different property, use the <code>property</code> method:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'firstName'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">property</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'fname'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="getters"><a href="#getters" class="header-anchor">#</a> Getters</h2> <p>Use the <code>get</code> method to define custom retrieval logic for your attribute, instead of just reading the value straight from the model property.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token keyword">use</span> <span class="token package">Tobyz<span class="token punctuation">\</span>JsonApiServer<span class="token punctuation">\</span>Context</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'firstName'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token function">ucfirst</span><span class="token punctuation">(</span><span class="token variable">$model</span><span class="token operator">-&gt;</span><span class="token property">first_name</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>If you're using Eloquent, you could also define attribute <a href="https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting" target="_blank" rel="noopener noreferrer">casts<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> or <a href="https://laravel.com/docs/8.x/eloquent-mutators#defining-an-accessor" target="_blank" rel="noopener noreferrer">accessors<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> on your model to achieve a similar thing. However, the Request instance will not be available in this context.</p></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/attributes.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/scopes.html" class="prev">
Scopes
</a></span> <span class="next"><a href="/json-api-server/relationships.html">
Relationships
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/8.2eaea85f.js" defer></script>
</body>
</html>

48
create.html Normal file
View File

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Creating Resources | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/9.e517d767.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" aria-current="page" class="active sidebar-link">Creating Resources</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/create.html#customizing-the-model" class="sidebar-link">Customizing the Model</a></li><li class="sidebar-sub-header"><a href="/json-api-server/create.html#events" class="sidebar-link">Events</a></li></ul></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="creating-resources"><a href="#creating-resources" class="header-anchor">#</a> Creating Resources</h1> <p>You can allow resources to be <a href="https://jsonapi.org/format/#crud-creating" target="_blank" rel="noopener noreferrer">created<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> using the <code>creatable</code> and <code>notCreatable</code> methods on the schema builder.</p> <p>Optionally pass a closure that returns a boolean value.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">creatable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">creatable</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$context</span><span class="token operator">-&gt;</span><span class="token function">getRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user'</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">isAdmin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="customizing-the-model"><a href="#customizing-the-model" class="header-anchor">#</a> Customizing the Model</h2> <p>When creating a resource, an empty model is supplied by the adapter. You may wish to override this and provide a custom model in special circumstances. You can do so using the <code>newModel</code> method:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">newModel</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">CustomModel</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="events"><a href="#events" class="header-anchor">#</a> Events</h2> <h3 id="oncreating"><a href="#oncreating" class="header-anchor">#</a> <code>onCreating</code></h3> <p>Run before the model is saved.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">onCreating</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h3 id="oncreated"><a href="#oncreated" class="header-anchor">#</a> <code>onCreated</code></h3> <p>Run after the model is saved.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">onCreated</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$context</span><span class="token operator">-&gt;</span><span class="token function">meta</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'foo'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'bar'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/create.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/show.html" class="prev">
Showing Resources
</a></span> <span class="next"><a href="/json-api-server/update.html">
Updating Resources
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/9.e517d767.js" defer></script>
</body>
</html>

45
delete.html Normal file
View File

@ -0,0 +1,45 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Deleting Resources | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/10.f39ec3a0.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" aria-current="page" class="active sidebar-link">Deleting Resources</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/delete.html#events" class="sidebar-link">Events</a></li></ul></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="deleting-resources"><a href="#deleting-resources" class="header-anchor">#</a> Deleting Resources</h1> <p>You can allow resources to be <a href="https://jsonapi.org/format/#crud-deleting" target="_blank" rel="noopener noreferrer">deleted<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> using the <code>deletable</code> and <code>notDeletable</code> methods on the schema builder.</p> <p>Optionally pass a closure that returns a boolean value.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">deletable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">deletable</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$context</span><span class="token operator">-&gt;</span><span class="token function">getRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user'</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">isAdmin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="events"><a href="#events" class="header-anchor">#</a> Events</h2> <h3 id="ondeleting"><a href="#ondeleting" class="header-anchor">#</a> <code>onDeleting</code></h3> <p>Run before the model is deleted.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">onDeleting</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h3 id="ondeleted"><a href="#ondeleted" class="header-anchor">#</a> <code>onDeleted</code></h3> <p>Run after the model is deleted.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">onDeleted</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/delete.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/update.html" class="prev">
Updating Resources
</a></span> <span class="next"><a href="/json-api-server/errors.html">
Error Handling
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/10.f39ec3a0.js" defer></script>
</body>
</html>

59
errors.html Normal file
View File

@ -0,0 +1,59 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Error Handling | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/11.724dd987.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" aria-current="page" class="active sidebar-link">Error Handling</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/errors.html#error-providers" class="sidebar-link">Error Providers</a></li></ul></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="error-handling"><a href="#error-handling" class="header-anchor">#</a> Error Handling</h1> <p>The <code>JsonApi</code> class can produce <a href="https://jsonapi.org/format/#errors" target="_blank" rel="noopener noreferrer">JSON:API error responses<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> from exceptions.</p> <p>This is achieved by passing the caught exception into the <code>error</code> method.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$api</span><span class="token operator">-&gt;</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$api</span><span class="token operator">-&gt;</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token variable">$e</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="error-providers"><a href="#error-providers" class="header-anchor">#</a> Error Providers</h2> <p>Exceptions can implement the <code>ErrorProviderInterface</code> to determine what status code will be used in the response, and any JSON:API error objects to be rendered in the document.</p> <p>The interface defines two methods:</p> <ul><li><code>getJsonApiStatus</code> which must return a string.</li> <li><code>getJsonApiErrors</code> which must return an array of JSON-serializable content, such as <a href="https://github.com/json-api-php/json-api" target="_blank" rel="noopener noreferrer">json-api-php<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> error objects</li></ul> <div class="language-php extra-class"><pre class="language-php"><code><span class="token keyword">use</span> <span class="token package">JsonApiPhp<span class="token punctuation">\</span>JsonApi<span class="token punctuation">\</span>Error</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Tobyz<span class="token punctuation">\</span>JsonApiServer<span class="token punctuation">\</span>ErrorProviderInterface</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">ImATeapotException</span> <span class="token keyword">implements</span> <span class="token class-name">ErrorProviderInterface</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">getJsonApiErrors</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">array</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">[</span>
<span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name class-name-fully-qualified">Error<span class="token punctuation">\</span>Title</span><span class="token punctuation">(</span><span class="token string double-quoted-string">&quot;I'm a teapot&quot;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token keyword">new</span> <span class="token class-name class-name-fully-qualified">Error<span class="token punctuation">\</span>Status</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token function">getJsonApiStatus</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">)</span>
<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">getJsonApiStatus</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">string</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string single-quoted-string">'418'</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>Exceptions that do not implement this interface will result in a generic <code>500 Internal Server Error</code> response.</p></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/errors.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/delete.html" class="prev">
Deleting Resources
</a></span> <span class="next"><a href="/json-api-server/laravel.html">
Laravel Helpers
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/11.724dd987.js" defer></script>
</body>
</html>

50
filtering.html Normal file
View File

@ -0,0 +1,50 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Filtering | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/12.9934b242.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" aria-current="page" class="active sidebar-link">Filtering</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/filtering.html#custom-filters" class="sidebar-link">Custom Filters</a></li></ul></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="filtering"><a href="#filtering" class="header-anchor">#</a> Filtering</h1> <p>You can define a field as <code>filterable</code> to allow the resource listing to be <a href="https://jsonapi.org/recommendations/#filtering" target="_blank" rel="noopener noreferrer">filtered<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> by the field's value.</p> <p>This works for both attributes and relationships:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'firstName'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">filterable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// GET /users?filter[firstName]=Toby</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasMany</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'groups'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">filterable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// GET /users?filter[groups]=1,2,3</span>
</code></pre></div><p>The <code>&gt;</code>, <code>&gt;=</code>, <code>&lt;</code>, <code>&lt;=</code>, and <code>..</code> operators on attribute filter values are automatically parsed and applied, supporting queries like:</p> <div class="language- extra-class"><pre class="language-text"><code>GET /users?filter[postCount]=&gt;=10
GET /users?filter[postCount]=5..15
</code></pre></div><h2 id="custom-filters"><a href="#custom-filters" class="header-anchor">#</a> Custom Filters</h2> <p>To define filters with custom logic, or ones that do not correspond to an attribute, use the <code>filter</code> method:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">filter</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'minPosts'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$query</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$query</span><span class="token operator">-&gt;</span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'postCount'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'&gt;='</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>Just like <a href="/json-api-server/visibility.html">fields</a>, filters can be made conditionally <code>visible</code> or <code>hidden</code>:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">filter</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">,</span> <span class="token variable">$callback</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">visible</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$context</span><span class="token operator">-&gt;</span><span class="token function">getRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'isAdmin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/filtering.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/writing.html" class="prev">
Field Writability
</a></span> <span class="next"><a href="/json-api-server/sorting.html">
Sorting
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/12.9934b242.js" defer></script>
</body>
</html>

81
index.html Normal file

File diff suppressed because one or more lines are too long

35
install.html Normal file
View File

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Installation | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/14.0a2e817f.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" aria-current="page" class="active sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="installation"><a href="#installation" class="header-anchor">#</a> Installation</h1> <p>To install, simply require the package via Composer.</p> <div class="language-bash extra-class"><pre class="language-bash"><code><span class="token function">composer</span> require tobyz/json-api-server
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/install.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/" class="prev router-link-active">
Introduction
</a></span> <span class="next"><a href="/json-api-server/requests.html">
Handling Requests
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/14.0a2e817f.js" defer></script>
</body>
</html>

36
laravel.html Normal file
View File

@ -0,0 +1,36 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Laravel Helpers | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/15.88e8e5d1.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" aria-current="page" class="active sidebar-link">Laravel Helpers</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/laravel.html#validation" class="sidebar-link">Validation</a></li><li class="sidebar-sub-header"><a href="/json-api-server/laravel.html#authentication" class="sidebar-link">Authentication</a></li></ul></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="laravel-helpers"><a href="#laravel-helpers" class="header-anchor">#</a> Laravel Helpers</h1> <h2 id="validation"><a href="#validation" class="header-anchor">#</a> Validation</h2> <h3 id="rules"><a href="#rules" class="header-anchor">#</a> <code>rules</code></h3> <p>Use Laravel's <a href="https://laravel.com/docs/8.x/validation" target="_blank" rel="noopener noreferrer">Validation component<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> as a <a href="/json-api-server/writing.html#validation">field validator</a>.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token keyword">use</span> <span class="token package">Tobyz<span class="token punctuation">\</span>JsonApiServer<span class="token punctuation">\</span>Laravel</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">validate</span><span class="token punctuation">(</span>Laravel\<span class="token function">rules</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'required|min:3|max:20'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>Pass a string or array of validation rules to be applied to the value. You can also pass an array of custom messages and custom attribute names as the second and third arguments.</p> <h2 id="authentication"><a href="#authentication" class="header-anchor">#</a> Authentication</h2> <h3 id="authenticated"><a href="#authenticated" class="header-anchor">#</a> <code>authenticated</code></h3> <p>A shortcut to call <code>Auth::check()</code>.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">creatable</span><span class="token punctuation">(</span>Laravel\<span class="token function">authenticated</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h3 id="can"><a href="#can" class="header-anchor">#</a> <code>can</code></h3> <p>Use Laravel's <a href="https://laravel.com/docs/8.x/authorization" target="_blank" rel="noopener noreferrer">Gate component<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> to check if the given ability is allowed. If this is used in the context of a model (eg. <code>updatable</code>, <code>deletable</code>, or on a field), then the model will be passed to the gate check as well.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">updatable</span><span class="token punctuation">(</span>Laravel\<span class="token function">can</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'update-post'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/laravel.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/errors.html" class="prev">
Error Handling
</a></span> <!----></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/15.88e8e5d1.js" defer></script>
</body>
</html>

45
list.html Normal file
View File

@ -0,0 +1,45 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Listing Resources | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/16.c308b4df.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" aria-current="page" class="active sidebar-link">Listing Resources</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/list.html#events" class="sidebar-link">Events</a></li></ul></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="listing-resources"><a href="#listing-resources" class="header-anchor">#</a> Listing Resources</h1> <p>For each resource type, a <code>GET /{type}</code> endpoint is exposed to list resources.</p> <p>If you want to restrict the ability to list a resource type, use the <code>listable</code> and <code>notListable</code> methods. You can optionally pass a closure that returns a boolean value.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">notListable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">listable</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$context</span><span class="token operator">-&gt;</span><span class="token function">getRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user'</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">isAdmin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="events"><a href="#events" class="header-anchor">#</a> Events</h2> <h3 id="onlisting"><a href="#onlisting" class="header-anchor">#</a> <code>onListing</code></h3> <p>Run before <a href="/json-api-server/scopes.html">scopes</a> are applied to the <code>$query</code> and results are retrieved.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">onListing</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$query</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h3 id="onlisted"><a href="#onlisted" class="header-anchor">#</a> <code>onListed</code></h3> <p>Run after models and relationships have been retrieved, but before they are serialized into a JSON:API document.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">onListed</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$models</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/list.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/meta.html" class="prev">
Meta Information
</a></span> <span class="next"><a href="/json-api-server/show.html">
Showing Resources
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/16.c308b4df.js" defer></script>
</body>
</html>

40
meta.html Normal file
View File

@ -0,0 +1,40 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Meta Information | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/17.8ed4f1c9.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" aria-current="page" class="active sidebar-link">Meta Information</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/meta.html#document-meta" class="sidebar-link">Document Meta</a></li><li class="sidebar-sub-header"><a href="/json-api-server/meta.html#resource-meta" class="sidebar-link">Resource Meta</a></li><li class="sidebar-sub-header"><a href="/json-api-server/meta.html#relationship-meta" class="sidebar-link">Relationship Meta</a></li></ul></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="meta-information"><a href="#meta-information" class="header-anchor">#</a> Meta Information</h1> <p>You can add meta information at various levels of the document using the <code>meta</code> method.</p> <h2 id="document-meta"><a href="#document-meta" class="header-anchor">#</a> Document Meta</h2> <p>To add meta information at the top-level of a document, you can call the <code>meta</code> method on the <code>Context</code> instance which is available inside any of your schema's callbacks.</p> <p>For example, to add meta information to a resource listing, you might call this inside of an <code>onListed</code> listener:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">onListed</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$models</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$context</span><span class="token operator">-&gt;</span><span class="token function">meta</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'foo'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'bar'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="resource-meta"><a href="#resource-meta" class="header-anchor">#</a> Resource Meta</h2> <p>To add meta information at the resource-level, call <code>meta</code> on the schema builder.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">meta</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'updatedAt'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$model</span><span class="token operator">-&gt;</span><span class="token property">updated_at</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="relationship-meta"><a href="#relationship-meta" class="header-anchor">#</a> Relationship Meta</h2> <p>Meta information can also be <a href="/json-api-server/relationships.html#meta-information">added to relationships</a>.</p></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/meta.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/pagination.html" class="prev">
Pagination
</a></span> <span class="next"><a href="/json-api-server/list.html">
Listing Resources
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/17.8ed4f1c9.js" defer></script>
</body>
</html>

40
pagination.html Normal file
View File

@ -0,0 +1,40 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Pagination | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/18.3550a25e.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" aria-current="page" class="active sidebar-link">Pagination</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/pagination.html#countability" class="sidebar-link">Countability</a></li></ul></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="pagination"><a href="#pagination" class="header-anchor">#</a> Pagination</h1> <p>By default, resource listings are automatically <a href="https://jsonapi.org/format/#fetching-pagination" target="_blank" rel="noopener noreferrer">paginated<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> with 20 records per page.</p> <p>You can change this amount using the <code>paginate</code> method on the schema builder, or you can remove it by calling the <code>dontPaginate</code> method.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">paginate</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// default to listing 50 resources per page</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">dontPaginate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// default to listing all resources</span>
</code></pre></div><p>Consumers may request a different limit using the <code>page[limit]</code> query parameter. By default the maximum possible limit is capped at 50; you can change this cap using the <code>limit</code> method, or you can remove it by calling the <code>noLimit</code> method:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">limit</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// set the maximum limit for resources per page to 100</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">noLimit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// remove the maximum limit for resources per page</span>
</code></pre></div><h2 id="countability"><a href="#countability" class="header-anchor">#</a> Countability</h2> <p>By default, a query will be performed to count the total number of resources in a collection. This will be used to populate a <code>total</code> attribute in the document's <code>meta</code> object, as well as the <code>last</code> pagination link.</p> <p>For some types of resources, or when a query is resource-intensive (especially when certain filters or sorting is applied), it may be undesirable to have this happen. So it can be toggled using the <code>countable</code> and <code>uncountable</code> methods:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">countable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">uncountable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/pagination.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/sorting.html" class="prev">
Sorting
</a></span> <span class="next"><a href="/json-api-server/meta.html">
Meta Information
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/18.3550a25e.js" defer></script>
</body>
</html>

63
relationships.html Normal file
View File

@ -0,0 +1,63 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Relationships | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/19.65cfb425.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" aria-current="page" class="active sidebar-link">Relationships</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/relationships.html#resource-linkage" class="sidebar-link">Resource Linkage</a></li><li class="sidebar-sub-header"><a href="/json-api-server/relationships.html#relationship-inclusion" class="sidebar-link">Relationship Inclusion</a></li><li class="sidebar-sub-header"><a href="/json-api-server/relationships.html#polymorphic-relationships" class="sidebar-link">Polymorphic Relationships</a></li><li class="sidebar-sub-header"><a href="/json-api-server/relationships.html#meta-information" class="sidebar-link">Meta Information</a></li></ul></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="relationships"><a href="#relationships" class="header-anchor">#</a> Relationships</h1> <p>Define <a href="https://jsonapi.org/format/#document-resource-object-relationships" target="_blank" rel="noopener noreferrer">relationship fields<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> on your resource using the <code>hasOne</code> and <code>hasMany</code> methods.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasOne</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasMany</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'comments'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>By default, the resource type that the relationship corresponds to will be the pluralized form of the relationship name. In the example above, the <code>user</code> relationship would correspond to the <code>users</code> resource type, while <code>comments</code> would correspond to <code>comments</code>. If you'd like to use a different resource type, call the <code>type</code> method:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasOne</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'author'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'people'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>By default, the relationship will read and write to the relation on your model with the same name. If you'd like it to correspond to a different relation, use the <code>property</code> method:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasOne</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'author'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">property</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="resource-linkage"><a href="#resource-linkage" class="header-anchor">#</a> Resource Linkage</h2> <p>By default, to-one relationships will have <a href="https://jsonapi.org/format/#document-resource-object-linkage" target="_blank" rel="noopener noreferrer">resource linkage<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>, but to-many relationships will not. You can toggle this by calling the <code>withLinkage</code> or <code>withoutLinkage</code> methods.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasMany</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">withLinkage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="custom-block danger"><p class="custom-block-title">WARNING</p> <p>Be careful when enabling linkage on to-many relationships as pagination is not supported.</p></div> <h2 id="relationship-inclusion"><a href="#relationship-inclusion" class="header-anchor">#</a> Relationship Inclusion</h2> <p>To make a relationship available for <a href="https://jsonapi.org/format/#fetching-includes" target="_blank" rel="noopener noreferrer">inclusion<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> via the <code>include</code> query parameter, call the <code>includable</code> method.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasOne</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">includable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="custom-block danger"><p class="custom-block-title">WARNING</p> <p>Be careful when making to-many relationships includable as pagination is not supported.</p></div> <p>Relationships included via the <code>include</code> query parameter are automatically <a href="https://laravel.com/docs/8.x/eloquent-relationships#eager-loading" target="_blank" rel="noopener noreferrer">eager-loaded<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> by the adapter, and any type <a href="scopes">scopes</a> are applied automatically. You can also apply additional scopes at the relationship level using the <code>scope</code> method:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token keyword">use</span> <span class="token package">Tobyz<span class="token punctuation">\</span>JsonApiServer<span class="token punctuation">\</span>Context</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasOne</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">includable</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">scope</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$query</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$query</span><span class="token operator">-&gt;</span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'is_listed'</span><span class="token punctuation">,</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>To prevent a relationship from being eager-loaded, use the <code>dontLoad</code> method:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasOne</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">includable</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">dontLoad</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="polymorphic-relationships"><a href="#polymorphic-relationships" class="header-anchor">#</a> Polymorphic Relationships</h2> <p>Define a polymorphic relationship using the <code>polymorphic</code> method. Optionally you may provide an array of allowed resource types:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasOne</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'commentable'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">polymorphic</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasMany</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'taggable'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">polymorphic</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'photos'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'videos'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="custom-block warning"><p class="custom-block-title">WARNING</p> <p>Note that nested includes cannot be requested on polymorphic relationships.</p></div> <h2 id="meta-information"><a href="#meta-information" class="header-anchor">#</a> Meta Information</h2> <p>You can add meta information to a relationship using the <code>meta</code> method:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasOne</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">meta</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'updatedAt'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token variable">$user</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$user</span><span class="token operator">-&gt;</span><span class="token property">updated_at</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/relationships.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/attributes.html" class="prev">
Attributes
</a></span> <span class="next"><a href="/json-api-server/visibility.html">
Field Visibility
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/19.65cfb425.js" defer></script>
</body>
</html>

46
requests.html Normal file
View File

@ -0,0 +1,46 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Handling Requests | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/20.b9e8a752.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" aria-current="page" class="active sidebar-link">Handling Requests</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/requests.html#authentication" class="sidebar-link">Authentication</a></li></ul></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="handling-requests"><a href="#handling-requests" class="header-anchor">#</a> Handling Requests</h1> <p>The <code>JsonApi</code> class is a <a href="https://www.php-fig.org/psr/psr-15/" target="_blank" rel="noopener noreferrer">PSR-15 request handler<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>.</p> <p>Instantiate it with your <strong>API's base path</strong>, then pass in a PSR-7 request and you'll get back a PSR-7 response. You should catch any exceptions and pass them back into the <code>error</code> method to generate a JSON:API error document.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token keyword">use</span> <span class="token package">Tobyz<span class="token punctuation">\</span>JsonApiServer<span class="token punctuation">\</span>JsonApi</span><span class="token punctuation">;</span>
<span class="token variable">$api</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">JsonApi</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/api'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/** @var Psr\Http\Message\ServerRequestInterface $request */</span>
<span class="token comment">/** @var Psr\Http\Message\ResponseInterface $response */</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$api</span><span class="token operator">-&gt;</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$api</span><span class="token operator">-&gt;</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token variable">$e</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>In Laravel, you'll need to <a href="https://laravel.com/docs/8.x/requests#psr7-requests" target="_blank" rel="noopener noreferrer">convert the Laravel request into a PSR-7 request<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> before you can pass it into <code>JsonApi</code>. You can then return the response directly from the route or controller the framework will automatically convert it back into a Laravel response and display it.</p></div> <h2 id="authentication"><a href="#authentication" class="header-anchor">#</a> Authentication</h2> <p>You (or your framework) are responsible for performing authentication.</p> <p>Often you will need to access information about the authenticated user inside of your schema for example, when <a href="scopes">scoping</a> which resources a visible within the API. An effective way to pass on this information is by setting an attribute on your Request object before passing it into the request handler.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$request</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-&gt;</span><span class="token function">withAttribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user'</span><span class="token punctuation">,</span> <span class="token variable">$user</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/requests.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/install.html" class="prev">
Installation
</a></span> <span class="next"><a href="/json-api-server/adapters.html">
Adapters
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/20.b9e8a752.js" defer></script>
</body>
</html>

39
scopes.html Normal file
View File

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Scopes | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/21.80416eea.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" aria-current="page" class="active sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="scopes"><a href="#scopes" class="header-anchor">#</a> Scopes</h1> <p>Restrict the visibility of resources, and make other query modifications, using the <code>scope</code> method.</p> <p>This <code>scope</code> method allows you to modify the query builder object provided by the adapter. This is the perfect opportunity to apply conditions to the query to restrict which resources are visible in the API.</p> <p>For example, to make it so the authenticated user can only see their own posts:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token keyword">use</span> <span class="token package">Tobyz<span class="token punctuation">\</span>JsonApiServer<span class="token punctuation">\</span>Context</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">scope</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$query</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$query</span><span class="token operator">-&gt;</span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user_id'</span><span class="token punctuation">,</span> <span class="token variable">$context</span><span class="token operator">-&gt;</span><span class="token function">getRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'userId'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>A resource type's scope is global it will also be applied when that resource is being <a href="relationships">included</a> as a relationship.</p> <p>You can define multiple scopes per resource type, and they will be applied in order.</p></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/scopes.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/adapters.html" class="prev">
Adapters
</a></span> <span class="next"><a href="/json-api-server/attributes.html">
Attributes
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/21.80416eea.js" defer></script>
</body>
</html>

37
show.html Normal file
View File

@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Showing Resources | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/22.c8abdf2c.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" aria-current="page" class="active sidebar-link">Showing Resources</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/show.html#events" class="sidebar-link">Events</a></li></ul></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="showing-resources"><a href="#showing-resources" class="header-anchor">#</a> Showing Resources</h1> <p>For each resource type, a <code>GET /{type}/{id}</code> endpoint is exposed to show an individual resource.</p> <h2 id="events"><a href="#events" class="header-anchor">#</a> Events</h2> <h3 id="onshow"><a href="#onshow" class="header-anchor">#</a> <code>onShow</code></h3> <p>Run after models and relationships have been retrieved, but before they are serialized into a JSON:API document.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">onShow</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/show.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/list.html" class="prev">
Listing Resources
</a></span> <span class="next"><a href="/json-api-server/create.html">
Creating Resources
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/22.c8abdf2c.js" defer></script>
</body>
</html>

45
sorting.html Normal file
View File

@ -0,0 +1,45 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Sorting | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/23.298bad12.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" aria-current="page" class="active sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="sorting"><a href="#sorting" class="header-anchor">#</a> Sorting</h1> <p>You can define an attribute as <code>sortable</code> to allow the resource listing to be <a href="https://jsonapi.org/format/#fetching-sorting" target="_blank" rel="noopener noreferrer">sorted<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> by the attribute's value.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'firstName'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">sortable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'lastName'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">sortable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// GET /users?sort=lastName,firstName</span>
</code></pre></div><p>You can set a default sort string to be used when the consumer has not supplied one using the <code>defaultSort</code> method on the schema builder:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">defaultSort</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'-updatedAt,-createdAt'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>To define sort fields with custom logic, or ones that do not correspond to an attribute, use the <code>sort</code> method:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">sort</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'relevance'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$query</span><span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$direction</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$query</span><span class="token operator">-&gt;</span><span class="token function">orderBy</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'relevance'</span><span class="token punctuation">,</span> <span class="token variable">$direction</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/sorting.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/filtering.html" class="prev">
Filtering
</a></span> <span class="next"><a href="/json-api-server/pagination.html">
Pagination
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/23.298bad12.js" defer></script>
</body>
</html>

45
update.html Normal file
View File

@ -0,0 +1,45 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Updating Resources | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/24.f0bf2e90.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" aria-current="page" class="active sidebar-link">Updating Resources</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/update.html#events" class="sidebar-link">Events</a></li></ul></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="updating-resources"><a href="#updating-resources" class="header-anchor">#</a> Updating Resources</h1> <p>You can allow resources to be <a href="https://jsonapi.org/format/#crud-updating" target="_blank" rel="noopener noreferrer">updated<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> using the <code>updatable</code> and <code>notUpdatable</code> methods on the schema builder.</p> <p>Optionally pass a closure that returns a boolean value.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">updatable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">updatable</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$context</span><span class="token operator">-&gt;</span><span class="token function">getRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user'</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">isAdmin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="events"><a href="#events" class="header-anchor">#</a> Events</h2> <h3 id="onupdating"><a href="#onupdating" class="header-anchor">#</a> <code>onUpdating</code></h3> <p>Run before the model is saved.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">onUpdating</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h3 id="onupdated"><a href="#onupdated" class="header-anchor">#</a> <code>onUpdated</code></h3> <p>Run after the model is saved.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">onUpdated</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/update.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/create.html" class="prev">
Creating Resources
</a></span> <span class="next"><a href="/json-api-server/delete.html">
Deleting Resources
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/24.f0bf2e90.js" defer></script>
</body>
</html>

41
visibility.html Normal file
View File

@ -0,0 +1,41 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Field Visibility | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/25.5bf262d7.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" aria-current="page" class="active sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="field-visibility"><a href="#field-visibility" class="header-anchor">#</a> Field Visibility</h1> <p>Restrict the visibility of a field using the <code>visible</code> and <code>hidden</code> methods.</p> <p>You can optionally supply a closure to these methods which will receive the model instance, and should return a boolean value.</p> <p>For example, the following schema will make an email attribute that only appears when the authenticated user is viewing their own profile:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">visible</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$model</span><span class="token operator">-&gt;</span><span class="token property">id</span> <span class="token operator">===</span> <span class="token variable">$context</span><span class="token operator">-&gt;</span><span class="token function">getRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'userId'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>Hiding a field completely is useful when you want it the field to be available for <a href="/json-api-server/writing.html">writing</a> but not reading for example, a password field.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'password'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">hidden</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">writable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/visibility.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/relationships.html" class="prev">
Relationships
</a></span> <span class="next"><a href="/json-api-server/writing.html">
Field Writability
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/25.5bf262d7.js" defer></script>
</body>
</html>

82
writing.html Normal file
View File

@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Field Writability | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/26.1472df94.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/20.b9e8a752.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" class="sidebar-link">Handling Requests</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" aria-current="page" class="active sidebar-link">Field Writability</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/writing.html#writable-once" class="sidebar-link">Writable Once</a></li><li class="sidebar-sub-header"><a href="/json-api-server/writing.html#default-values" class="sidebar-link">Default Values</a></li><li class="sidebar-sub-header"><a href="/json-api-server/writing.html#validation" class="sidebar-link">Validation</a></li><li class="sidebar-sub-header"><a href="/json-api-server/writing.html#transformers" class="sidebar-link">Transformers</a></li><li class="sidebar-sub-header"><a href="/json-api-server/writing.html#setters" class="sidebar-link">Setters</a></li><li class="sidebar-sub-header"><a href="/json-api-server/writing.html#savers" class="sidebar-link">Savers</a></li><li class="sidebar-sub-header"><a href="/json-api-server/writing.html#events" class="sidebar-link">Events</a></li></ul></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="field-writability"><a href="#field-writability" class="header-anchor">#</a> Field Writability</h1> <p>By default, fields are read-only. You can allow a field to be written to in <code>PATCH</code> and <code>POST</code> requests using the <code>writable</code> and <code>readonly</code> methods.</p> <p>You can optionally supply a closure to these methods which will receive the model instance, and should return a boolean value.</p> <p>For example, the following schema will make an email attribute that is only writable by the self:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">writable</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$model</span><span class="token operator">-&gt;</span><span class="token property">id</span> <span class="token operator">===</span> <span class="token variable">$context</span><span class="token operator">-&gt;</span><span class="token function">getRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'userId'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="writable-once"><a href="#writable-once" class="header-anchor">#</a> Writable Once</h2> <p>You may want a field to only be writable when creating a new resource, but not when an existing resource is being updated. This can be achieved by calling the <code>once</code> method:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasOne</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'author'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">writable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">once</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="default-values"><a href="#default-values" class="header-anchor">#</a> Default Values</h2> <p>You can provide a default value to be used when creating a new resource if there is no value provided by the consumer. Pass a value or a closure to the <code>default</code> method:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'joinedAt'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token keyword">default</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">DateTime</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'ipAddress'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token keyword">default</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$context</span><span class="token operator">-&gt;</span><span class="token function">getRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getServerParams</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'REMOTE_ADDR'</span><span class="token punctuation">]</span> <span class="token operator">??</span> <span class="token constant">null</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>If you're using Eloquent, you could also define <a href="https://laravel.com/docs/8.x/eloquent#default-attribute-values" target="_blank" rel="noopener noreferrer">default attribute values<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> to achieve a similar thing. However, the Request instance will not be available in this context.</p></div> <h2 id="validation"><a href="#validation" class="header-anchor">#</a> Validation</h2> <p>You can ensure that data provided for a field is valid before the resource is saved. Provide a closure to the <code>validate</code> method, and call the first argument if validation fails:</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">validate</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token keyword type-hint">callable</span> <span class="token variable">$fail</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token function">filter_var</span><span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token constant">FILTER_VALIDATE_EMAIL</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$fail</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Invalid email'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>You can easily use Laravel's <a href="https://laravel.com/docs/8.x/validation" target="_blank" rel="noopener noreferrer">Validation<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> component for field validation with the <a href="/json-api-server/laravel.html#validation"><code>rules</code> helper function</a>.</p></div> <p>This works for relationships, too. The related models will be retrieved via your adapter and passed into your validation function.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">hasMany</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'groups'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">validate</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token keyword type-hint">callable</span> <span class="token variable">$fail</span><span class="token punctuation">,</span> <span class="token keyword type-hint">array</span> <span class="token variable">$groups</span><span class="token punctuation">,</span> <span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$groups</span> <span class="token keyword">as</span> <span class="token variable">$group</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$group</span><span class="token operator">-&gt;</span><span class="token property">id</span> <span class="token operator">===</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$fail</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'You cannot assign this group'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="transformers"><a href="#transformers" class="header-anchor">#</a> Transformers</h2> <p>Use the <code>transform</code> method on an attribute to mutate any incoming value before it is saved to the model.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'firstName'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">transform</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token function">ucfirst</span><span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>If you're using Eloquent, you could also define attribute <a href="https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting" target="_blank" rel="noopener noreferrer">casts<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> or <a href="https://laravel.com/docs/8.x/eloquent-mutators#defining-a-mutator" target="_blank" rel="noopener noreferrer">mutators<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> on your model to achieve a similar thing.</p></div> <h2 id="setters"><a href="#setters" class="header-anchor">#</a> Setters</h2> <p>Use the <code>set</code> method to define custom mutation logic for your field, instead of just setting the value straight on the model property.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'firstName'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$model</span><span class="token operator">-&gt;</span><span class="token property">first_name</span> <span class="token operator">=</span> <span class="token function">ucfirst</span><span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$model</span><span class="token operator">-&gt;</span><span class="token property">first_name</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'Toby'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$model</span><span class="token operator">-&gt;</span><span class="token property">last_name</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'Zerner'</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="savers"><a href="#savers" class="header-anchor">#</a> Savers</h2> <p>If your field corresponds to some other form of data storage rather than a simple property on your model, you can use the <code>save</code> method to provide a closure that will be run <em>after</em> your model has been successfully saved. If specified, the adapter will NOT be used to set the field on the model.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'locale'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">save</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$model</span><span class="token operator">-&gt;</span><span class="token function">preferences</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'key'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'locale'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'value'</span> <span class="token operator">=&gt;</span> <span class="token variable">$value</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="events"><a href="#events" class="header-anchor">#</a> Events</h2> <h3 id="onsaved"><a href="#onsaved" class="header-anchor">#</a> <code>onSaved</code></h3> <p>Run after a field has been successfully saved.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$type</span><span class="token operator">-&gt;</span><span class="token function">attribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">onSaved</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Context</span> <span class="token variable">$context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">event</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">EmailWasChanged</span><span class="token punctuation">(</span><span class="token variable">$model</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/writing.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/visibility.html" class="prev">
Field Visibility
</a></span> <span class="next"><a href="/json-api-server/filtering.html">
Filtering
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/26.1472df94.js" defer></script>
</body>
</html>