mirror of
https://github.com/archtechx/tenancy.git
synced 2026-02-05 08:14:02 +00:00
wip
This commit is contained in:
parent
740833276d
commit
9029bcd465
10 changed files with 202 additions and 108 deletions
|
|
@ -20,7 +20,7 @@
|
|||
<meta name="generator" content="tighten_jigsaw_doc">
|
||||
@endif
|
||||
|
||||
<title>{{ $page->siteName }}{{ $page->title ? ' | ' . $page->title : '' }}</title>
|
||||
<title>{{ $page->title ? $page->title . ' | ' : '' }}{{ $page->siteName }}</title>
|
||||
|
||||
<link rel="home" href="{{ $page->baseUrl }}">
|
||||
<link rel="icon" href="/favicon.ico">
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ section: content
|
|||
|
||||
# Console Commands {#console-commands}
|
||||
|
||||
The package comes with a couple of artisan commands.
|
||||
The package comes with some artisan commands that will help you during development.
|
||||
|
||||
## Migrate {#migrate}
|
||||
|
||||
|
|
@ -38,7 +38,7 @@ Similarly to [migrate](#migrate), these commands accept a `--tenants` option.
|
|||
|
||||
You can use the tenants:run command to run your own commands for tenants.
|
||||
|
||||
If your command's signature were email:send {user} {--queue} {--subject} {body}, you would run this command like this:
|
||||
If your command's signature were `email:send {--queue} {--subject=} {body}`, you would run this command like this:
|
||||
```
|
||||
php artisan tenants:run email:send --tenants=8075a580-1cb8-11e9-8822-49c5d8f8ff23 --option="queue=1" --option="subject=New Feature" --argument="body=We have launched a new feature. ..."
|
||||
```
|
||||
|
|
@ -50,4 +50,13 @@ php artisan tenants:list
|
|||
Listing all tenants.
|
||||
[Tenant] uuid: dbe0b330-1a6e-11e9-b4c3-354da4b4f339 @ localhost
|
||||
[Tenant] uuid: 49670df0-1a87-11e9-b7ba-cf5353777957 @ dev.localhost
|
||||
```
|
||||
```
|
||||
|
||||
## Selectively clearing tenant cache {#selectively-clearing-tenant-cache}
|
||||
|
||||
You can delete specific tenants' cache by using the `--tags` option on `cache:clear`:
|
||||
```
|
||||
php artisan cache:clear --tags=tenantdbe0b330-1a6e-11e9-b4c3-354da4b4f339
|
||||
```
|
||||
|
||||
The tag is `config('tenancy.cache.tag_base') . $uuid`.
|
||||
22
source/docs/difference-between-this-package-and-others.md
Normal file
22
source/docs/difference-between-this-package-and-others.md
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
---
|
||||
title: Difference Between This Package And Others
|
||||
description: Difference Between This Package And Others | with stancl/tenancy — A Laravel multi-database tenancy package that respects your code.
|
||||
extends: _layouts.documentation
|
||||
section: content
|
||||
---
|
||||
|
||||
# Difference Between This Package And Others
|
||||
|
||||
A frequently asked question is the difference between this package and [tenancy/multi-tenant](https://github.com/tenancy/multi-tenant).
|
||||
|
||||
Packages like tenancy/multi-tenant and tenancy/tenancy give you an API for making your application multi-tenant. They give you a tenant DB connection, traits to apply on your models, a guide on creating your own tenant-aware cache, etc.
|
||||
|
||||
This package makes your application multi-tenant automatically and attempts to make you not have to change (m)any things in your code.
|
||||
|
||||
## Which one should you use?
|
||||
|
||||
Depends on what you prefer.
|
||||
|
||||
If you want full control and make your application multi-tenant yourself, use tenancy/multi-tenant.
|
||||
|
||||
If you want to focus on writing your application instead of tenancy implementations, use stancl/tenancy.
|
||||
|
|
@ -7,11 +7,11 @@ section: content
|
|||
|
||||
# Getting Started {#getting-started}
|
||||
|
||||
todo tenancy end, todo deleting specific cache tags
|
||||
todo filesystem page
|
||||
|
||||
[**stancl/tenancy**](https://github.com/stancl/tenancy) 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.
|
||||
|
||||
> Note: Filesystem is the only thing that can be a little problematic. Be sure to read [that page](TODOfilesystem).
|
||||
> Note: Filesystem is the only thing that can be a little problematic. Be sure to read [that page](filesystem).
|
||||
|
||||
## How does it work? {#how-does-it-work}
|
||||
|
||||
|
|
|
|||
40
source/docs/https-certificates.md
Normal file
40
source/docs/https-certificates.md
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
---
|
||||
title: HTTPS Certificates
|
||||
description: HTTPS Certificates with stancl/tenancy — A Laravel multi-database tenancy package that respects your code..
|
||||
extends: _layouts.documentation
|
||||
section: content
|
||||
---
|
||||
|
||||
# HTTPS certificates
|
||||
|
||||
HTTPS certificates are very easy to deal with if you use the `yourclient1.yourapp.com`, `yourclient2.yourapp.com` model. You can use a wildcard HTTPS certificate.
|
||||
|
||||
If you use the model where second level domains are used, there are multiple ways you can solve this.
|
||||
|
||||
This guide focuses on nginx.
|
||||
|
||||
### 1. Use nginx with the lua module
|
||||
|
||||
Specifically, you're interested in the [`ssl_certificate_by_lua_block`](https://github.com/openresty/lua-nginx-module#ssl_certificate_by_lua_block) directive. Nginx doesn't support using variables such as the hostname in the `ssl_certificate` directive, which is why the lua module is needed.
|
||||
|
||||
This approach lets you use one server block for all tenants.
|
||||
|
||||
### 2. Add a simple server block for each tenant
|
||||
|
||||
You can store most of your config in a file, such as `/etc/nginx/includes/tenant`, and include this file into tenant server blocks.
|
||||
|
||||
```nginx
|
||||
server {
|
||||
include includes/tenant;
|
||||
server_name foo.bar;
|
||||
# ssl_certificate /etc/foo/...;
|
||||
}
|
||||
```
|
||||
|
||||
### Generating certificates
|
||||
|
||||
You can generate a certificate using certbot. If you use the `--nginx` flag, you will need to run certbot as root. If you use the `--webroot` flag, you only need the user that runs it to have write access to the webroot directory (or perhaps webroot/.well-known is enough) and some certbot files (you can specify these using --work-dir, --config-dir and --logs-dir).
|
||||
|
||||
Creating this config dynamically from PHP is not easy, but is probably feasible. Giving `www-data` write access to `/etc/nginx/sites-available/tenants.conf` should work.
|
||||
|
||||
However, you still need to reload nginx configuration to apply the changes to configuration. This is problematic and I'm not sure if there is a simple and secure way to do this from PHP.
|
||||
|
|
@ -7,7 +7,11 @@ section: content
|
|||
|
||||
# Tenancy Initialization {#tenancy-initialization}
|
||||
|
||||
When you, or the `InitializeTenancy` middleware, run `tenancy()->init()`, the `bootstrap()` method is called.
|
||||
Tenancy can be initialized by calling `tenancy()->init()`. The `InitializeTenancy` middleware calls this method automatically.
|
||||
|
||||
You can end a tenancy session using `tenancy()->end()`. This is useful if you need to run multiple tenant sessions or a mixed tenant/non-tenant session in a single request/command.
|
||||
|
||||
The `tenancy()->init()` method calls `bootstrap()`.
|
||||
|
||||
This method switches database connection, Redis connection (if Redis tenancy is enabled), cache and filesystem root paths.
|
||||
|
||||
|
|
@ -49,7 +53,7 @@ public function connect(string $database)
|
|||
|
||||
public function createTenantConnection(string $database_name)
|
||||
{
|
||||
// Create the `tenancy` database connection.
|
||||
// Create the `tenant` database connection.
|
||||
$based_on = config('tenancy.database.based_on') ?: config('database.default');
|
||||
config()->set([
|
||||
'database.connections.tenant' => config('database.connections.' . $based_on),
|
||||
|
|
|
|||
112
source/docs/tenant-manager.md
Normal file
112
source/docs/tenant-manager.md
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
---
|
||||
title: Tenant Manager
|
||||
description: Tenant Manager | stancl/tenancy — A Laravel multi-database tenancy package that respects your code.
|
||||
extends: _layouts.documentation
|
||||
section: content
|
||||
---
|
||||
|
||||
# Tenant Manager {#tenant-manager}
|
||||
|
||||
This page documents a couple of other `TenantManager` methods you may find useful.
|
||||
|
||||
### Finding tenant using UUID
|
||||
|
||||
`find()` is an alias for `getTenantById()`. You may use the second argument to specify the key(s) as a string/array.
|
||||
|
||||
```php
|
||||
>>> tenant()->find('dbe0b330-1a6e-11e9-b4c3-354da4b4f339');
|
||||
=> [
|
||||
"uuid" => "dbe0b330-1a6e-11e9-b4c3-354da4b4f339",
|
||||
"domain" => "localhost",
|
||||
"foo" => "bar",
|
||||
]
|
||||
>>> tenant()->find('dbe0b330-1a6e-11e9-b4c3-354da4b4f339', 'foo');
|
||||
=> [
|
||||
"foo" => "bar",
|
||||
]
|
||||
>>> tenant()->getTenantById('dbe0b330-1a6e-11e9-b4c3-354da4b4f339', ['foo', 'domain']);
|
||||
=> [
|
||||
"foo" => "bar",
|
||||
"domain" => "localhost",
|
||||
]
|
||||
```
|
||||
|
||||
### Getting tenant ID by domain
|
||||
|
||||
```php
|
||||
>>> tenant()->getTenantIdByDomain('localhost');
|
||||
=> "b3ce3f90-1a88-11e9-a6b0-038c6337ae50"
|
||||
>>> tenant()->getIdByDomain('localhost');
|
||||
=> "b3ce3f90-1a88-11e9-a6b0-038c6337ae50"
|
||||
```
|
||||
|
||||
### Finding tenant by domain
|
||||
|
||||
You may use the second argument to specify the key(s) as a string/array.
|
||||
|
||||
```php
|
||||
>>> tenant()->findByDomain('localhost');
|
||||
=> [
|
||||
"uuid" => "b3ce3f90-1a88-11e9-a6b0-038c6337ae50",
|
||||
"domain" => "localhost",
|
||||
]
|
||||
```
|
||||
|
||||
### Accessing the array
|
||||
|
||||
You can access the public array tenant of TenantManager like this:
|
||||
|
||||
```php
|
||||
tenancy()->tenant
|
||||
```
|
||||
|
||||
which is an array. If you want to get the value of a specific key from the array, you can use one of the helpers the key on the tenant array as an argument.
|
||||
|
||||
```php
|
||||
tenant('uuid'); // Does the same thing as tenant()->tenant['uuid']
|
||||
```
|
||||
|
||||
### Getting all tenants
|
||||
|
||||
This method returns a collection of arrays.
|
||||
|
||||
```php
|
||||
>>> tenant()->all();
|
||||
=> Illuminate\Support\Collection {#2980
|
||||
all: [
|
||||
[
|
||||
"uuid" => "32e20780-1a88-11e9-a051-4b6489a7edac",
|
||||
"domain" => "localhost",
|
||||
],
|
||||
[
|
||||
"uuid" => "49670df0-1a87-11e9-b7ba-cf5353777957",
|
||||
"domain" => "dev.localhost",
|
||||
],
|
||||
],
|
||||
}
|
||||
>>> tenant()->all()->pluck('domain');
|
||||
=> Illuminate\Support\Collection {#2983
|
||||
all: [
|
||||
"localhost",
|
||||
"dev.localhost",
|
||||
],
|
||||
}
|
||||
```
|
||||
|
||||
### Deleting a tenant
|
||||
|
||||
```php
|
||||
>>> tenant()->delete('dbe0b330-1a6e-11e9-b4c3-354da4b4f339');
|
||||
=> true
|
||||
>>> tenant()->delete(tenant()->getTenantIdByDomain('dev.localhost'));
|
||||
=> true
|
||||
>>> tenant()->delete(tenant()->findByDomain('localhost')['uuid']);
|
||||
=> true
|
||||
```
|
||||
|
||||
This doesn't delete the tenant's database. If you want to delete it, save the database name prior to deleting the tenant. You can get the database name using `getDatabaseName()`
|
||||
|
||||
```php
|
||||
>>> tenant()->getDatabaseName(tenant()->findByDomain('laravel.localhost'))
|
||||
=> "tenant67412a60-1c01-11e9-a9e9-f799baa56fd9"
|
||||
```
|
||||
Loading…
Add table
Add a link
Reference in a new issue