2018-07-18 10:13:28 +00:00
<!DOCTYPE HTML>
< html lang = "" >
< head >
< meta charset = "UTF-8" >
< meta content = "text/html; charset=utf-8" http-equiv = "Content-Type" >
2018-08-25 12:49:36 +00:00
< title > Controllers (WIP) · GitBook< / title >
2018-07-18 10:13:28 +00:00
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" / >
< meta name = "description" content = "" >
< meta name = "generator" content = "GitBook 3.2.3" >
< link rel = "stylesheet" href = "../gitbook/style.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-highlight/website.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-search/search.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-fontsettings/website.css" >
< meta name = "HandheldFriendly" content = "true" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1, user-scalable=no" >
< meta name = "apple-mobile-web-app-capable" content = "yes" >
< meta name = "apple-mobile-web-app-status-bar-style" content = "black" >
< link rel = "apple-touch-icon-precomposed" sizes = "152x152" href = "../gitbook/images/apple-touch-icon-precomposed-152.png" >
< link rel = "shortcut icon" href = "../gitbook/images/favicon.ico" type = "image/x-icon" >
< link rel = "next" href = "../performance.html" / >
< link rel = "prev" href = "browser.html" / >
< / head >
< body >
< div class = "book" >
< div class = "book-summary" >
< div id = "book-search-input" role = "search" >
< input type = "text" placeholder = "Type to search" / >
< / div >
< nav role = "navigation" >
< ul class = "summary" >
< li class = "chapter " data-level = "1.1" data-path = "../" >
< a href = "../" >
Introduction
< / a >
< / li >
< li class = "chapter " data-level = "1.2" data-path = "../basics/" >
< a href = "../basics/" >
Basics
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.2.1" data-path = "../basics/route_syntax.html" >
< a href = "../basics/route_syntax.html" >
Route Syntax
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2" data-path = "../basics/router.html" >
< a href = "../basics/router.html" >
Router
< / a >
< / li >
< li class = "chapter " data-level = "1.2.3" data-path = "../basics/path_based_routing.html" >
< a href = "../basics/path_based_routing.html" >
Path-based Routing
< / a >
< / li >
< li class = "chapter " data-level = "1.2.4" data-path = "../basics/name_based_routing.html" >
< a href = "../basics/name_based_routing.html" >
Name-based Routing
< / a >
< / li >
< li class = "chapter " data-level = "1.2.5" data-path = "../basics/route_data.html" >
< a href = "../basics/route_data.html" >
Route Data
< / a >
< / li >
< li class = "chapter " data-level = "1.2.6" data-path = "../basics/route_data_validation.html" >
< a href = "../basics/route_data_validation.html" >
Route Data Validation
< / a >
< / li >
< li class = "chapter " data-level = "1.2.7" data-path = "../basics/route_conflicts.html" >
< a href = "../basics/route_conflicts.html" >
Route Conflicts
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.3" data-path = "../coercion/" >
< a href = "../coercion/" >
Coercion
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.3.1" data-path = "../coercion/coercion.html" >
< a href = "../coercion/coercion.html" >
Coercion Explained
< / a >
< / li >
< li class = "chapter " data-level = "1.3.2" data-path = "../coercion/schema_coercion.html" >
< a href = "../coercion/schema_coercion.html" >
Plumatic Schema
< / a >
< / li >
< li class = "chapter " data-level = "1.3.3" data-path = "../coercion/clojure_spec_coercion.html" >
< a href = "../coercion/clojure_spec_coercion.html" >
Clojure.spec
< / a >
< / li >
< li class = "chapter " data-level = "1.3.4" data-path = "../coercion/data_spec_coercion.html" >
< a href = "../coercion/data_spec_coercion.html" >
Data-specs
< / a >
< / li >
< / ul >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4" data-path = "../ring/" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../ring/" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Ring
2018-07-18 10:13:28 +00:00
< / a >
< ul class = "articles" >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4.1" data-path = "../ring/ring.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../ring/ring.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Ring-router
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4.2" data-path = "../ring/reverse_routing.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../ring/reverse_routing.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Reverse-routing
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4.3" data-path = "../ring/default_handler.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../ring/default_handler.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Default handler
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4.4" data-path = "../ring/static.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../ring/static.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Static Resources
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4.5" data-path = "../ring/dynamic_extensions.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../ring/dynamic_extensions.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Dynamic Extensions
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4.6" data-path = "../ring/data_driven_middleware.html" >
< a href = "../ring/data_driven_middleware.html" >
Data-driven Middleware
< / a >
2018-07-18 10:13:28 +00:00
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4.7" data-path = "../ring/transforming_middleware_chain.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../ring/transforming_middleware_chain.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Transforming Middleware Chain
2018-07-18 10:13:28 +00:00
< / a >
2018-08-25 12:49:36 +00:00
< / li >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4.8" data-path = "../ring/middleware_registry.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../ring/middleware_registry.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Middleware Registry
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4.9" data-path = "../ring/default_middleware.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../ring/default_middleware.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Default Middleware
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4.10" data-path = "../ring/coercion.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../ring/coercion.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Pluggable Coercion
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4.11" data-path = "../ring/route_data_validation.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../ring/route_data_validation.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Route Data Validation
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4.12" data-path = "../ring/compiling_middleware.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../ring/compiling_middleware.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Compiling Middleware
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.4.13" data-path = "../ring/swagger.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../ring/swagger.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Swagger Support
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< / ul >
2018-08-22 18:52:18 +00:00
2018-08-25 12:49:36 +00:00
< / li >
< li class = "chapter " data-level = "1.5" data-path = "../advanced/" >
< a href = "../advanced/" >
2018-08-22 18:52:18 +00:00
2018-08-25 12:49:36 +00:00
Advanced
2018-08-22 18:52:18 +00:00
< / a >
2018-08-25 12:49:36 +00:00
< ul class = "articles" >
2018-08-22 18:52:18 +00:00
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.5.1" data-path = "../advanced/configuring_routers.html" >
2018-07-28 09:08:17 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../advanced/configuring_routers.html" >
2018-07-28 09:08:17 +00:00
2018-08-25 12:49:36 +00:00
Configuring Routers
2018-07-28 09:08:17 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.5.2" data-path = "../advanced/composing_routers.html" >
2018-08-03 07:10:16 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../advanced/composing_routers.html" >
2018-08-03 07:10:16 +00:00
2018-08-25 12:49:36 +00:00
Composing Routers
2018-08-03 07:10:16 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.5.3" data-path = "../advanced/different_routers.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../advanced/different_routers.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Different Routers
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.5.4" data-path = "../advanced/route_validation.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../advanced/route_validation.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Route Validation
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.5.5" data-path = "../advanced/dev_workflow.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< a href = "../advanced/dev_workflow.html" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Dev Workflow
2018-07-18 10:13:28 +00:00
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< / ul >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
< / li >
< li class = "chapter " data-level = "1.6" data-path = "../patterns/" >
< a href = "../patterns/" >
2018-07-18 10:13:28 +00:00
2018-08-25 12:49:36 +00:00
Patterns
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.6.1" data-path = "../patterns/shared_routes.html" >
< a href = "../patterns/shared_routes.html" >
Shared Routes
2018-07-18 10:13:28 +00:00
< / a >
< / li >
< / ul >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.7" data-path = "./" >
2018-07-18 10:13:28 +00:00
< a href = "./" >
Frontend
< / a >
< ul class = "articles" >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.7.1" data-path = "basics.html" >
2018-07-18 10:13:28 +00:00
< a href = "basics.html" >
Basics
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.7.2" data-path = "browser.html" >
2018-07-18 10:13:28 +00:00
< a href = "browser.html" >
Browser integration
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter active" data-level = "1.7.3" data-path = "controllers.html" >
2018-07-18 10:13:28 +00:00
< a href = "controllers.html" >
2018-08-25 12:49:36 +00:00
Controllers (WIP)
2018-07-18 10:13:28 +00:00
< / a >
< / li >
< / ul >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.8" data-path = "../performance.html" >
2018-07-18 10:13:28 +00:00
< a href = "../performance.html" >
Performance
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.9" data-path = "../interceptors.html" >
2018-07-18 10:13:28 +00:00
< a href = "../interceptors.html" >
Interceptors (WIP)
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.10" data-path = "../development.html" >
2018-07-18 10:13:28 +00:00
< a href = "../development.html" >
Development Instructions
< / a >
< / li >
2018-08-25 12:49:36 +00:00
< li class = "chapter " data-level = "1.11" data-path = "../faq.html" >
2018-07-18 10:13:28 +00:00
< a href = "../faq.html" >
FAQ
< / a >
< / li >
< li class = "divider" > < / li >
< li >
< a href = "https://www.gitbook.com" target = "blank" class = "gitbook-link" >
Published with GitBook
< / a >
< / li >
< / ul >
< / nav >
< / div >
< div class = "book-body" >
< div class = "body-inner" >
< div class = "book-header" role = "navigation" >
<!-- Title -->
< h1 >
< i class = "fa fa-circle-o-notch fa-spin" > < / i >
2018-08-25 12:49:36 +00:00
< a href = ".." > Controllers (WIP)< / a >
2018-07-18 10:13:28 +00:00
< / h1 >
< / div >
< div class = "page-wrapper" tabindex = "-1" role = "main" >
< div class = "page-inner" >
< div id = "book-search-results" >
< div class = "search-noresults" >
< section class = "normal markdown-section" >
2018-08-25 12:49:36 +00:00
< h1 id = "controllers-wip" > Controllers (WIP)< / h1 >
2018-08-22 18:59:44 +00:00
< ul >
< li > < a href = "https://github.com/metosin/reitit/tree/master/examples/frontend-controllers" target = "_blank" > https://github.com/metosin/reitit/tree/master/examples/frontend-controllers< / a > < / li >
< / ul >
2018-08-23 07:42:11 +00:00
< p > Controllers run code when a route is entered and left. This can be useful to:< / p >
< ul >
< li > Load resources< / li >
< li > Update application state< / li >
< / ul >
< h2 id = "authentication" > Authentication< / h2 >
< p > Controllers can be used to load resources from a server. If and when your
API requires authentication you will need to implement logic to prevent controllers
trying to do requests if user isn' t authenticated yet.< / p >
< h3 id = "run-controllers-and-check-authentication" > Run controllers and check authentication< / h3 >
< p > If you have both unauthenticated and authenticated resources, you can
run the controllers always and then check the authentication status
on controller code, or on the code called from controllers (e.g. re-frame event
handler).< / p >
< h3 id = "disable-controllers-until-user-is-authenticated" > Disable controllers until user is authenticated< / h3 >
< p > If all your resources require authentication an easy way to prevent bad
requests is to enable controllers only after authentication is done.
To do this you can check authentication status and call < code > apply-controllers< / code >
only after authentication is done (also remember to manually call < code > apply-controllers< / code >
with current < code > match< / code > when authentication is done). Or if no navigation is possible
before authentication is done, you can start the router only after
authentication is done.< / p >
< h2 id = "alternatives" > Alternatives< / h2 >
< p > Similar solution could be used to describe required resources as data (maybe
2018-08-23 07:43:53 +00:00
even GraphQL query) per route, and then have code automatically load
2018-08-23 07:42:11 +00:00
missing resources.< / p >
2018-07-18 10:13:28 +00:00
< / section >
< / div >
< div class = "search-results" >
< div class = "has-results" >
< h1 class = "search-results-title" > < span class = 'search-results-count' > < / span > results matching "< span class = 'search-query' > < / span > "< / h1 >
< ul class = "search-results-list" > < / ul >
< / div >
< div class = "no-results" >
< h1 class = "search-results-title" > No results matching "< span class = 'search-query' > < / span > "< / h1 >
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< a href = "browser.html" class = "navigation navigation-prev " aria-label = "Previous page: Browser integration" >
< i class = "fa fa-angle-left" > < / i >
< / a >
< a href = "../performance.html" class = "navigation navigation-next " aria-label = "Next page: Performance" >
< i class = "fa fa-angle-right" > < / i >
< / a >
< / div >
< script >
var gitbook = gitbook || [];
gitbook.push(function() {
2018-08-31 08:18:39 +00:00
gitbook.page.hasChanged({"page":{"title":"Controllers (WIP)","level":"1.7.3","depth":2,"next":{"title":"Performance","level":"1.8","depth":1,"path":"performance.md","ref":"performance.md","articles":[]},"previous":{"title":"Browser integration","level":"1.7.2","depth":2,"path":"frontend/browser.md","ref":"frontend/browser.md","articles":[]},"dir":"ltr"},"config":{"plugins":["editlink","github","highlight"],"root":"doc","styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"editlink":{"label":"Edit This Page","multilingual":false,"base":"https://github.com/metosin/reitit/tree/master/doc"},"github":{"url":"https://github.com/metosin/reitit"},"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"gitbook":"*"},"file":{"path":"frontend/controllers.md","mtime":"2018-08-31T08:17:50.396Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2018-08-31T08:18:32.313Z"},"basePath":"..","book":{"language":""}});
2018-07-18 10:13:28 +00:00
});
< / script >
< / div >
< script src = "../gitbook/gitbook.js" > < / script >
< script src = "../gitbook/theme.js" > < / script >
< script src = "../gitbook/gitbook-plugin-editlink/plugin.js" > < / script >
< script src = "../gitbook/gitbook-plugin-github/plugin.js" > < / script >
< script src = "../gitbook/gitbook-plugin-search/search-engine.js" > < / script >
< script src = "../gitbook/gitbook-plugin-search/search.js" > < / script >
< script src = "../gitbook/gitbook-plugin-lunr/lunr.min.js" > < / script >
< script src = "../gitbook/gitbook-plugin-lunr/search-lunr.js" > < / script >
< script src = "../gitbook/gitbook-plugin-sharing/buttons.js" > < / script >
< script src = "../gitbook/gitbook-plugin-fontsettings/fontsettings.js" > < / script >
< / body >
< / html >