tenancy-docs/dist/docs/2.x/getting-started/index.html
2019-09-18 16:33:16 +02:00

422 lines
16 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="description" content="Getting started with stancl/tenancy — A Laravel multi-database tenancy package that respects your code.">
<meta property="og:site_name" content="stancl/tenancy documentation"/>
<meta property="og:title" content="Getting Started | stancl/tenancy documentation"/>
<meta property="og:description" content="Getting started with stancl/tenancy — A Laravel multi-database tenancy package that respects your code."/>
<meta property="og:url" content="https://tenancy.samuelstancl.me/docs/2.x/getting-started"/>
<meta property="og:image" content="/assets/img/logo.png"/>
<meta property="og:type" content="website"/>
<meta name="twitter:image:alt" content="stancl/tenancy documentation">
<meta name="twitter:card" content="summary_large_image">
<title>Getting Started | stancl/tenancy documentation</title>
<link rel="home" href="https://tenancy.samuelstancl.me/docs">
<link rel="icon" href="/favicon.ico">
<!-- Insert analytics code here -->
<link href="https://fonts.googleapis.com/css?family=Nunito+Sans:300,300i,400,400i,700,700i,800,800i" rel="stylesheet">
<link rel="stylesheet" href="/assets/build/css/main.css?id=0e3d47a146ef55ad0760">
</head>
<body class="flex flex-col justify-between min-h-screen bg-grey-lightest text-grey-darkest leading-normal font-sans">
<header class="flex items-center shadow bg-white border-b h-24 mb-8 py-4" role="banner">
<div class="container flex items-center max-w-4xl mx-auto px-4 lg:px-8">
<div class="flex items-center">
<a href="/" title="stancl/tenancy documentation home" class="inline-flex items-center">
<h1 class="text-lg md:text-2xl text-blue-darkest font-semibold hover:text-blue-dark my-0 pr-4">stancl/tenancy documentation</h1>
</a>
</div>
<div class="flex flex-1 justify-end items-center text-right md:pl-10">
</div>
<div class="flex flex-1 justify-end items-center text-right md:pl-10">
<select id="versionSelect">
<option
value="/https://tenancy.samuelstancl.me/docs1.x"
>
1.x
</option>
<option
value="/https://tenancy.samuelstancl.me/docs2.x"
selected
>
2.x (beta)
</option>
</select>
</div>
</div>
<button class="flex justify-center items-center bg-blue border border-blue h-10 mr-4 px-5 rounded-full lg:hidden focus:outline-none"
onclick="navMenu.toggle()"
>
<svg id="js-nav-menu-show" xmlns="http://www.w3.org/2000/svg"
class="fill-current text-white h-9 w-4" viewBox="0 0 32 32"
>
<path d="M4,10h24c1.104,0,2-0.896,2-2s-0.896-2-2-2H4C2.896,6,2,6.896,2,8S2.896,10,4,10z M28,14H4c-1.104,0-2,0.896-2,2 s0.896,2,2,2h24c1.104,0,2-0.896,2-2S29.104,14,28,14z M28,22H4c-1.104,0-2,0.896-2,2s0.896,2,2,2h24c1.104,0,2-0.896,2-2 S29.104,22,28,22z"/>
</svg>
<svg id="js-nav-menu-hide" xmlns="http://www.w3.org/2000/svg"
class="hidden fill-current text-white h-9 w-4" viewBox="0 0 36 30"
>
<polygon points="32.8,4.4 28.6,0.2 18,10.8 7.4,0.2 3.2,4.4 13.8,15 3.2,25.6 7.4,29.8 18,19.2 28.6,29.8 32.8,25.6 22.2,15 "/>
</svg>
</button>
</header>
<main role="main" class="w-full flex-auto">
<section class="container max-w-4xl mx-auto px-6 md:px-8 py-4">
<div class="flex flex-col lg:flex-row">
<nav id="js-nav-menu" class="nav-menu hidden lg:block">
<ul class="list-reset my-0">
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/getting-started"
class="lvl0 active font-semibold text-blue nav-menu__item hover:text-blue"
>
Getting Started
</a>
<ul class="list-reset my-0">
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/installation"
class="lvl1 nav-menu__item hover:text-blue"
>
Installation
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/storage-drivers"
class="lvl1 nav-menu__item hover:text-blue"
>
Storage Drivers
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/difference-between-this-package-and-others"
class="lvl1 nav-menu__item hover:text-blue"
>
This Package vs Others
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/configuration"
class="lvl1 nav-menu__item hover:text-blue"
>
Configuration
</a>
</li>
</ul>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/usage"
class="lvl0 nav-menu__item hover:text-blue"
>
Usage
</a>
<ul class="list-reset my-0">
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/creating-tenants"
class="lvl1 nav-menu__item hover:text-blue"
>
Creating Tenants
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/tenant-routes"
class="lvl1 nav-menu__item hover:text-blue"
>
Tenant Routes
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/tenant-storage"
class="lvl1 nav-menu__item hover:text-blue"
>
Tenant Storage
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/tenant-manager"
class="lvl1 nav-menu__item hover:text-blue"
>
Tenant Manager
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/console-commands"
class="lvl1 nav-menu__item hover:text-blue"
>
Console Commands
</a>
</li>
</ul>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/digging-deeper"
class="lvl0 nav-menu__item hover:text-blue"
>
Digging Deeper
</a>
<ul class="list-reset my-0">
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/middleware-configuration"
class="lvl1 nav-menu__item hover:text-blue"
>
Middleware Configuration
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/custom-database-names"
class="lvl1 nav-menu__item hover:text-blue"
>
Custom Database Names
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/filesystem-tenancy"
class="lvl1 nav-menu__item hover:text-blue"
>
Filesystem Tenancy
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/jobs-queues"
class="lvl1 nav-menu__item hover:text-blue"
>
Jobs &amp; Queues
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/event-system"
class="lvl1 nav-menu__item hover:text-blue"
>
Event System
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/tenancy-initialization"
class="lvl1 nav-menu__item hover:text-blue"
>
Tenancy Initialization
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/application-testing"
class="lvl1 nav-menu__item hover:text-blue"
>
Application Testing
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/writing-storage-drivers"
class="lvl1 nav-menu__item hover:text-blue"
>
Writing Storage Drivers
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/development"
class="lvl1 nav-menu__item hover:text-blue"
>
Development
</a>
</li>
</ul>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/integrations"
class="lvl0 nav-menu__item hover:text-blue"
>
Integrations
</a>
<ul class="list-reset my-0">
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/telescope"
class="lvl1 nav-menu__item hover:text-blue"
>
Telescope
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/horizon"
class="lvl1 nav-menu__item hover:text-blue"
>
Horizon
</a>
</li>
</ul>
</li>
<li class="list-reset pl-4">
<p class="nav-menu__item text-grey-dark">Tips</p>
<ul class="list-reset my-0">
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/https-certificates"
class="lvl1 nav-menu__item hover:text-blue"
>
HTTPS Certificates
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/misc-tips"
class="lvl1 nav-menu__item hover:text-blue"
>
Misc
</a>
</li>
</ul>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/stay-updated"
class="lvl0 nav-menu__item hover:text-blue"
>
Stay Updated
</a>
</li>
<li class="list-reset pl-4">
<a href="https://tenancy.samuelstancl.me/docs/2.x/https://github.com/stancl/tenancy"
class="lvl0 nav-menu__item hover:text-blue"
>
GitHub
</a>
</li>
</ul>
</nav>
<div class="w-full lg:w-3/5 break-words pb-16 lg:pl-4" v-pre>
<h1 id="getting-started">Getting Started</h1>
<p><a href="https://github.com/stancl/tenancy"><strong>stancl/tenancy</strong></a> is a Laravel multi-database tenancy package. It is designed in a way that requires you to make no changes to your codebase. Instead of applying traits on models and replacing every single reference to cache by a reference to a tenant-aware cache, the package lets you write your app without thinking about tenancy. It handles tenancy automatically.</p>
<blockquote>
<p>Note: Filesystem is the only thing that can be a little problematic. Be sure to read <a href="https://tenancy.samuelstancl.me/docs/2.x/filesystem-tenancy">that page</a>.</p>
</blockquote>
<h2 id="how-does-it-work">How does it work?</h2>
<p>A user visits <code>client1.yourapp.com</code>. The package identifies the tenant who this domain belongs to, and automatically does the following:</p>
<ul>
<li>switches database connection</li>
<li>replaces the default cache manager</li>
<li>switches Redis connection</li>
<li>changes filesystem root paths</li>
</ul>
<p>The benefits of this being taken care of by the package are:</p>
<ul>
<li>separation of concerns: you should write your app, not tenancy implementations</li>
<li>reliability: you won't have to fear that you forgot to replace a reference to cache by a tenant-aware cache call. This is something you might worry about if you're implementing tenancy into an existing application.</li>
</ul>
<h2 id="what-is-multi-tenancy">What is multi-tenancy?</h2>
<p>Multi-tenancy is the ability to provide your application to multiple customers (who have their own users and other resources) from a single instance of your application. Think Slack, Shopify, etc.</p>
<p>Multi-tenancy can be single-database and multi-database.</p>
<p><strong>Single-database tenancy</strong> means that your application uses only a single database. The way this is usually implemented is that instead of having the <code>id</code>, <code>title</code>, <code>user_id</code> and <code>body</code> columns in your <code>posts</code> table, you will also have a <code>tenant_id</code> column. This approach works until you need custom databases for your clients. It's also easy to implement, it basically boils down to having your models use a trait which adds a <a href="https://laravel.com/docs/master/eloquent#global-scopes">global scope</a>.</p>
<p><strong>Multi-database tenancy</strong>, the type that this package provides, lets you use a separate database for each tenant. The benefits of this approach are scalability, compliance (some clients need to have the database on their server) and mitigation of risks such as showing the wrong tenant's data to a user. The downside is that this model is harder to implement, which is why this package exists.</p> </div>
</div>
</section>
</main>
<script src="/assets/build/js/main.js?id=559633482baac87a89b5"></script>
<script>
const navMenu = {
toggle() {
const menu = document.getElementById('js-nav-menu');
menu.classList.toggle('hidden');
menu.classList.toggle('lg:block');
document.getElementById('js-nav-menu-hide').classList.toggle('hidden');
document.getElementById('js-nav-menu-show').classList.toggle('hidden');
},
}
</script>
<footer class="bg-white text-center text-sm mt-12 py-4" role="contentinfo">
<ul class="flex flex-col md:flex-row justify-center list-reset">
<li class="md:mr-2">
&copy; <a href="https://github.com/stancl" title="Samuel Štancl">Samuel Štancl</a> 2019.
</li>
<li>
Built with <a href="http://jigsaw.tighten.co" title="Jigsaw by Tighten">Jigsaw</a>
and <a href="https://tailwindcss.com" title="Tailwind CSS, a utility-first CSS framework">Tailwind CSS</a>.
</li>
</ul>
</footer>
<script>
document.getElementById('versionSelect').addEventListener('change', function () {
window.location = document.getElementById('versionSelect').value;
});
</script>
</body>
</html>