mirror of
https://github.com/strapi/strapi.git
synced 2025-08-19 06:08:50 +00:00
111 lines
23 KiB
HTML
111 lines
23 KiB
HTML
![]() |
<!DOCTYPE html>
|
||
|
<html lang="en-US">
|
||
|
<head>
|
||
|
<meta charset="utf-8">
|
||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
|
<title>Hooks | Strapi Docs</title>
|
||
|
<meta name="description" content="API creation made simple, secure and fast.">
|
||
|
|
||
|
|
||
|
<link rel="preload" href="/documentation/assets/css/styles.a8210063.css" as="style"><link rel="preload" href="/documentation/assets/js/app.a8210063.js" as="script"><link rel="preload" href="/documentation/assets/js/30.5d2829b8.js" as="script"><link rel="prefetch" href="/documentation/assets/js/28.9b077c15.js"><link rel="prefetch" href="/documentation/assets/css/1.styles.77d89b12.css"><link rel="prefetch" href="/documentation/assets/js/1.77d89b12.js"><link rel="prefetch" href="/documentation/assets/css/2.styles.08038ddb.css"><link rel="prefetch" href="/documentation/assets/js/2.08038ddb.js"><link rel="prefetch" href="/documentation/assets/js/3.4d92d5e3.js"><link rel="prefetch" href="/documentation/assets/js/4.385ae6a0.js"><link rel="prefetch" href="/documentation/assets/js/5.edd21cb3.js"><link rel="prefetch" href="/documentation/assets/js/6.fd6e4b24.js"><link rel="prefetch" href="/documentation/assets/js/7.e1f45fa9.js"><link rel="prefetch" href="/documentation/assets/js/8.dc78e1c2.js"><link rel="prefetch" href="/documentation/assets/js/9.fd6a21e6.js"><link rel="prefetch" href="/documentation/assets/js/10.f9e7d997.js"><link rel="prefetch" href="/documentation/assets/js/11.bfb9de0f.js"><link rel="prefetch" href="/documentation/assets/js/12.124227d1.js"><link rel="prefetch" href="/documentation/assets/js/13.d8092700.js"><link rel="prefetch" href="/documentation/assets/js/14.7cfd4cb8.js"><link rel="prefetch" href="/documentation/assets/js/15.55a20f7c.js"><link rel="prefetch" href="/documentation/assets/js/16.5c84c402.js"><link rel="prefetch" href="/documentation/assets/js/17.1c93d494.js"><link rel="prefetch" href="/documentation/assets/js/18.e1f1758f.js"><link rel="prefetch" href="/documentation/assets/js/19.8d1b00cd.js"><link rel="prefetch" href="/documentation/assets/js/20.856d7bdd.js"><link rel="prefetch" href="/documentation/assets/js/21.6f851286.js"><link rel="prefetch" href="/documentation/assets/js/22.7ddb4e1d.js"><link rel="prefetch" href="/documentation/assets/js/23.15e5a0c3.js"><link rel="prefetch" href="/documentation/assets/js/24.6fdf34d0.js"><link rel="prefetch" href="/documentation/assets/js/25.21c9a549.js"><link rel="prefetch" href="/documentation/assets/js/26.6608295c.js"><link rel="prefetch" href="/documentation/assets/js/27.2c9596ea.js"><link rel="prefetch" href="/documentation/assets/js/29.8ea8ecc1.js"><link rel="prefetch" href="/documentation/assets/js/31.fad00a3a.js"><link rel="prefetch" href="/documentation/assets/js/32.a6900221.js"><link rel="prefetch" href="/documentation/assets/js/33.bbfb3084.js"><link rel="prefetch" href="/documentation/assets/js/34.0eb2f8aa.js"><link rel="prefetch" href="/documentation/assets/js/35.76c29241.js"><link rel="prefetch" href="/documentation/assets/js/36.dfcc07a1.js"><link rel="prefetch" href="/documentation/assets/js/37.173a8112.js"><link rel="prefetch" href="/documentation/assets/js/38.b86fac79.js"><link rel="prefetch" href="/documentation/assets/js/39.a7d50afe.js"><link rel="prefetch" href="/documentation/assets/js/40.0415492d.js"><link rel="prefetch" href="/documentation/assets/js/41.5ef681df.js"><link rel="prefetch" href="/documentation/assets/js/42.fdd80522.js"><link rel="prefetch" href="/documentation/assets/js/43.03b496f2.js"><link rel="prefetch" href="/documentation/assets/js/44.3f55a367.js"><link rel="prefetch" href="/documentation/assets/js/45.6746c3dc.js"><link rel="prefetch" href="/documentation/assets/js/46.ff6bc353.js"><link rel="prefetch" href="/documentation/assets/js/47.53b7147a.js"><link rel="prefetch" href="/documentation/assets/js/48.31a883aa.js"><link rel="prefetch" href="/documentation/assets/js/49.18bd1a60.js"><link rel="prefetch" href="/documentation/assets/js/50.9b6079cd.js"><link rel="prefetch" href="/documentation/assets/js/51.b67aee1b.js"><link rel="prefetch" href="/documentation/assets/js/52.62bc63b6.js"><link rel="prefetch" href="/documentation/assets/js/53.2c567c55.js"><link rel="prefetch" href="/documentation/assets/js/54.6cc10d25.js"><link rel="prefetch" href="/documentation/assets/js/55.7faca13f.js"><link rel="prefetch" href="/docum
|
||
|
<link rel="stylesheet" href="/documentation/assets/css/styles.a8210063.css"><link rel="stylesheet" href="/documentation/assets/css/1.styles.77d89b12.css"><link rel="stylesheet" href="/documentation/assets/css/2.styles.08038ddb.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="/documentation/" class="home-link router-link-active"><!----> <span class="site-name">
|
||
|
Strapi Docs
|
||
|
</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"> <a href="https://github.com/strapi/strapi" target="_blank" rel="noopener noreferrer" class="repo-link">
|
||
|
GitHub
|
||
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" 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></a></nav></div></header> <div class="sidebar-mask"></div> <div class="sidebar"><nav class="nav-links"> <a href="https://github.com/strapi/strapi" target="_blank" rel="noopener noreferrer" class="repo-link">
|
||
|
GitHub
|
||
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" 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></a></nav> <div><select class="version-selector"><option value="/3.x.x/" selected="selected">Version 3.x.x</option><option value="/1.x.x/">Version 1.x.x</option></select></div> <ul class="sidebar-links"><li><div class="sidebar-group first"><p class="sidebar-heading"><span>UsefulLinks</span> <!----></p> <ul class="sidebar-group-items"><li><a href="/documentation/3.x.x/" class="sidebar-link">Introduction</a></li><li><a href="https://strapi.io" class="sidebar-link">Strapi Website</a></li><li><a href="https://github.com/strapi/strapi" class="sidebar-link">GitHub Repository</a></li><li><a href="https://github.com/strapi/strapi/blob/master/CONTRIBUTING.md" class="sidebar-link">Contribution Guide</a></li></ul></div></li><li><div class="sidebar-group"><p class="sidebar-heading"><span>Getting started</span> <!----></p> <ul class="sidebar-group-items"><li><a href="/documentation/3.x.x/getting-started/installation.html" class="sidebar-link">Installation</a></li><li><a href="/documentation/3.x.x/getting-started/quick-start.html" class="sidebar-link">Quick start</a></li></ul></div></li><li><div class="sidebar-group"><p class="sidebar-heading"><span>Globals</span> <!----></p> <ul class="sidebar-group-items"><li><a href="/documentation/3.x.x/api-reference/reference.html" class="sidebar-link">API Reference</a></li><li><a href="/documentation/3.x.x/cli/CLI.html" class="sidebar-link">Command Line Interface (CLI)</a></li><li><a href="/documentation/3.x.x/concepts/concepts.html" class="sidebar-link">Concepts</a></li><li><a href="/documentation/3.x.x/configurations/configurations.html" class="sidebar-link">Configurations</a></li></ul></div></li><li><div class="sidebar-group"><p class="sidebar-heading"><span>Guides</span> <!----></p> <ul class="sidebar-group-items"><li><a href="/documentation/3.x.x/guides/authentication.html" class="sidebar-link">Authentication</a></li><li><a href="/documentation/3.x.x/guides/controllers.html" class="sidebar-link">Controllers</a></li><li><a href="/documentation/3.x.x/guides/deployment.html" class="sidebar-link">Deployment</a></li><li><a href="/documentation/3.x.x/guides/email.html" class="sidebar-link">Email</a></li><li><a href="/documentation/3.x.x/guides/filters.html" class="sidebar-link">Filters</a></li><li><a href="/documentation/3.x.x/guides/graphql.html" class="sidebar-link">GraphQL</a></li><li><a href="/documentation/3.x.x/guides/i18n.html" class="sidebar-link">Internationalization</a></li><li><a href="/documentation/3.x.x/guides/models.html" class="sidebar-link">Models</a></li><li><a href="/documentation/3.x.x/guides/policies.html" class="sidebar-link">Policies</a></li><li><a href="/documentation/3.x.x/guides/public-assets.html" class="sidebar-link">Public Assets</a></li><li><a href="/documentation/3.x.x/guides/requests.html" class="sidebar-link">Request</a></li></ul></div></li><li><div class="sidebar-group"><p class="sidebar-heading open"><span>Advanced</span> <!----></p> <ul class="sidebar-group-items"><li><a href="/documentation/3.x.x/advanced/customize-admin.html" class="sidebar-link">Admin panel</a></li><li><a href="/documentation/3.x.x/advanced/hooks.html" class="active sidebar-link">Hooks</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/documentation/3.x.x/advanced/hooks.html#structure" class="sidebar-link">Structure</a></li><li class="sidebar-sub-header"><a href="/documentation/3.x.x/advanced/hooks.html#dependencies" class="sidebar-link">Dependencies</a></li><li class="sidebar-sub-header"><a href="/documentation/3.x.x/advanced/hooks.html#custom-hooks" class="sidebar-link">Custom hooks</a></li></ul></li><li><a href="/documentation
|
||
|
<span class="token keyword">const</span> path <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'path'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
|
|
||
|
module<span class="token punctuation">.</span><span class="token function-variable function">exports</span> <span class="token operator">=</span> strapi <span class="token operator">=></span> <span class="token punctuation">{</span>
|
||
|
<span class="token keyword">const</span> hook <span class="token operator">=</span> <span class="token punctuation">{</span>
|
||
|
|
||
|
<span class="token comment">/**
|
||
|
* Default options
|
||
|
*/</span>
|
||
|
|
||
|
defaults<span class="token punctuation">:</span> <span class="token punctuation">{</span>
|
||
|
documentation<span class="token punctuation">:</span> <span class="token punctuation">{</span>
|
||
|
path<span class="token punctuation">:</span> <span class="token string">'/public/documentation'</span>
|
||
|
<span class="token punctuation">}</span>
|
||
|
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
||
|
|
||
|
<span class="token comment">/**
|
||
|
* Initialize the hook
|
||
|
*/</span>
|
||
|
|
||
|
initialize<span class="token punctuation">:</span> cb <span class="token operator">=></span> <span class="token punctuation">{</span>
|
||
|
<span class="token keyword">try</span> <span class="token punctuation">{</span>
|
||
|
<span class="token comment">// Check if documentation folder exist.</span>
|
||
|
fs<span class="token punctuation">.</span><span class="token function">accessSync</span><span class="token punctuation">(</span>path<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span>process<span class="token punctuation">.</span><span class="token function">cwd</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>defaults<span class="token punctuation">.</span>documentation<span class="token punctuation">.</span>path<span class="token punctuation">)</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">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
|
||
|
<span class="token comment">// Otherwise, create the folder.</span>
|
||
|
fs<span class="token punctuation">.</span><span class="token function">mkdirSync</span><span class="token punctuation">(</span>path<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span>process<span class="token punctuation">.</span><span class="token function">cwd</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>defaults<span class="token punctuation">.</span>documentation<span class="token punctuation">.</span>path<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
|
<span class="token punctuation">}</span>
|
||
|
|
||
|
<span class="token comment">// This function doesn't really exist,</span>
|
||
|
<span class="token comment">// it's just an example to tell you that you</span>
|
||
|
<span class="token comment">// run your business logic and when it's done</span>
|
||
|
<span class="token comment">// you just need to call the callback `cb`</span>
|
||
|
<span class="token function">generateDocumentation</span><span class="token punctuation">(</span>path<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span>process<span class="token punctuation">.</span><span class="token function">cwd</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>defaults<span class="token punctuation">.</span>documentation<span class="token punctuation">.</span>path<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span>
|
||
|
<span class="token keyword">if</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span>
|
||
|
<span class="token comment">// Error: it will display the error to the user</span>
|
||
|
<span class="token comment">// and the hook won't be loaded.</span>
|
||
|
<span class="token keyword">return</span> <span class="token function">cb</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
|
<span class="token punctuation">}</span>
|
||
|
|
||
|
<span class="token comment">// Success.</span>
|
||
|
<span class="token function">cb</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 punctuation">}</span><span class="token punctuation">;</span>
|
||
|
|
||
|
<span class="token keyword">return</span> hook<span class="token punctuation">;</span>
|
||
|
<span class="token punctuation">}</span><span class="token punctuation">;</span>
|
||
|
</code></pre></div><ul><li><code>defaults</code> (object): Contains the defaults configurations. This object is merged to <code>strapi.config.hook.settings.**</code>.</li> <li><code>initialize</code> (function): Called during the server boot. The callback <code>cb</code> needs to be called. Otherwise, the hook won't be loaded.</li></ul> <p>Every folder that follows this name pattern <code>strapi-*</code> in your <code>./node_modules</code> folder will be loaded as a hook. The hooks are accessible through the <code>strapi.hook</code> variable.</p> <h2 id="structure"><a href="#structure" aria-hidden="true" class="header-anchor">#</a> Structure</h2> <p>A hook needs to follow the structure below:</p> <div class="language- extra-class"><pre class="language-text"><code>/hook
|
||
|
└─── lib
|
||
|
- index.js
|
||
|
- LICENSE.md
|
||
|
- package.json
|
||
|
- README.md
|
||
|
</code></pre></div><p>The <code>index.js</code> is the entry point to your hook. It should look like the example above.</p> <h2 id="dependencies"><a href="#dependencies" aria-hidden="true" class="header-anchor">#</a> Dependencies</h2> <p>It happens that a hook has a dependency to another one. For example, the <code>strapi-hook-bookshelf</code> has a dependency to <code>strapi-hook-knex</code>. Without it, the <code>strapi-hook-bookshelf</code> can't work correctly. It also means that the <code>strapi-hook-knex</code> hook has to be loaded before.</p> <p>To handle this case, you need to update the <code>package.json</code> at the root of your hook.</p> <div class="language-json extra-class"><pre class="language-json"><code><span class="token punctuation">{</span>
|
||
|
<span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"strapi-hook-bookshelf"</span><span class="token punctuation">,</span>
|
||
|
<span class="token property">"version"</span><span class="token operator">:</span> <span class="token string">"x.x.x"</span><span class="token punctuation">,</span>
|
||
|
<span class="token property">"description"</span><span class="token operator">:</span> <span class="token string">"Bookshelf hook for the Strapi framework"</span><span class="token punctuation">,</span>
|
||
|
<span class="token property">"dependencies"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
|
||
|
...
|
||
|
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
||
|
<span class="token property">"strapi"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
|
||
|
<span class="token property">"dependencies"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
|
||
|
<span class="token string">"strapi-hook-knex"</span>
|
||
|
<span class="token punctuation">]</span>
|
||
|
<span class="token punctuation">}</span>
|
||
|
<span class="token punctuation">}</span>
|
||
|
</code></pre></div><h2 id="custom-hooks"><a href="#custom-hooks" aria-hidden="true" class="header-anchor">#</a> Custom hooks</h2> <p>The framework allows to load hooks from the project directly without having to install them from npm. It's great way to take advantage of the features of the hooks system for code that doesn't need to be shared between apps. To achieve this, you have to create a <code>./hooks</code> folder at the root of your project and put the hooks into it.</p> <div class="language- extra-class"><pre class="language-text"><code>/project
|
||
|
└─── admin
|
||
|
└─── api
|
||
|
└─── config
|
||
|
└─── hooks
|
||
|
│ └─── strapi-documentation
|
||
|
│ - index.js
|
||
|
│ └─── strapi-server-side-rendering
|
||
|
│ - index.js
|
||
|
└─── plugins
|
||
|
└─── public
|
||
|
- favicon.ico
|
||
|
- package.json
|
||
|
- server.js
|
||
|
</code></pre></div></div> <div class="page-edit"><div class="edit-link"><a href="https://github.com/strapi/strapi/edit/master/docs/3.x.x/advanced/hooks.md" target="_blank" rel="noopener noreferrer">Improve this page</a> <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" 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></div> <!----></div> <div class="page-nav"><p class="inner"><span class="prev">
|
||
|
← <a href="/documentation/3.x.x/advanced/customize-admin.html" class="prev">
|
||
|
Admin panel
|
||
|
</a></span> <span class="next"><a href="/documentation/3.x.x/advanced/logging.html">
|
||
|
Logging
|
||
|
</a> →
|
||
|
</span></p></div> </div></div></div>
|
||
|
<script src="/documentation/assets/js/30.5d2829b8.js" defer></script><script src="/documentation/assets/js/app.a8210063.js" defer></script>
|
||
|
</body>
|
||
|
</html>
|