erikfig/laravel-tenancy

Laravel 多租户包

dev-master 2019-03-20 19:54 UTC

README

此包允许您通过最小修改创建适用于多个客户的应用程序。

状态:开发

安装

首先安装包

composer require erikfig/laravel-tenancy

然后发布配置文件

php artisan vendor:publish --provider=ErikFig\Laravel\Tenancy\Providers\TenancyServiceProvider

以下文件将被创建

  • config/tenancy.php
  • routes/tenancy.php

最后在数据库中创建表。

php artisan migrate

路由

新的路由文件(routes/tenancy.php)仅对子域名开放路由,默认排除 www

在此文件中放置您项目的路由,这样我们还可以有针对主域名的独立路由(例如网站或市场)。

这是默认路由器

<?php

Route::get('/', function () {
    return 'App Multi-Tenancy home';
});

Route::get('/tenancy', function () {
    return 'App Multi-Tenancy';
});

配置

文件 config/tenancy.php 包含以下参数

route_param: Nome do parâmetro do subdominio na rota, altere somente para evitar incompatibilidades.
subdomains_pattern: Regex da url, exclui o `www` dos subdominios no formato padrão.
domain: O domínio em que vai rodar o projeto (sem www), se o valor for null, vai usar o que estiver em `url` do `config/app.php`.
userModel: Uma string com nome da classe (incluindo namespace) do model de autenticação (caso você tenha alterado o padrão)

助手

如果您需要使用当前子域名,请使用

get_subdomain();

配置认证模型

要配置认证模型(通常是 App\User),请添加 trait ErikFig\Laravel\Tenancy\UserTenancyTrait

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use ErikFig\Laravel\Tenancy\UserTenancyTrait;

class User extends Authenticatable
{
    use Notifiable;
    use UserTenancyTrait;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

}

当您请求数据时,pivot 表已包含权限

\App\User::with('tenancies')->get()

按子域名过滤模型记录

以下 trait 可以自动处理每个子域名的数据注册和列表,只需包含

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use ErikFig\Laravel\Tenancy\TenancyTrait;

class Product extends Model
{
    use TenancyTrait;
}

过滤是通过 scope tenancy 实现的,因此您可以像通常一样处理它。

$all_products = \App\Product::withoutGlobalScope('tenancy)->get();

中间件

中间件仅限制对当前域中允许的用户访问。

要使用它,请将其添加到 app/Http/Kernel.php 中的 $routeMiddleware 变量

'tenancy' => \ErikFig\Laravel\Tenancy\Http\Middleware\TenancyAuthenticate::class,

与认证中间件一起使用

Route::middleware(['auth', 'tenancy'])->post('/tenancy', function () {

您还可以包含将访问路由的用户级别

Route::middleware(['auth', 'tenancy'])->post('/tenancy', function () {
    return 'todos os níveis acessam';
});

Route::middleware(['auth', 'tenancy:owner'])->post('/tenancy', function () {
    return 'somente usuários com role owner acessam';
});

Route::middleware(['auth', 'tenancy:employee'])->post('/tenancy', function () {
    return 'somente usuários com role employee acessam';
});

Route::middleware(['auth', 'tenancy:owner|employee'])->post('/tenancy', function () {
    return 'somente usuários com role owner e employee acessam';
});

管理租户

租户将是“企业”,这样您就可以将多个用户添加到多个租户中。

注册租户

use ErikFig\Laravel\Tenancy\Tenancy;

$owner = \Auth::user();
Tenancy::newTenancy('Nome da empresa', 'subdominio', $owner);

用户将被包含为 role(访问级别)所有者(英文名称),您可以在中间件中按类型过滤用户。

向租户添加用户

use ErikFig\Laravel\Tenancy\Tenancy;

$user = \Auth::user();

$tenancy = Tenancy:where('route', get_subdomain())->first();
$tenancy->attachUser($user, 'editor');

登录用户将收到其已注册/创建的租户列表

dd($user->tenancies);

tenancies 属性是一个 belongsToMany,因此请随意操作,哈哈。

贡献

发送您的 PR!

要查看/建议资源/错误,请使用 问题