laravel-admin multitenancy
======

在同一套laravel框架中安装多个互相独立的后台。

## Installation

解压之后放到`storage/multitenancy`目录下，然后打开项目根目录下的`composer.json`文件（注意：不是这个扩展包中的composer.json），增加下面的配置：

```json
    "repositories": [
        {
            "type": "path",
            "url": "storage/multitenancy",
            "options": {
              "symlink": false
            }
        }
    ]
```
然后运行`composer require laravel-admin-ext/multitenancy`安装它

如果运行上面命令的过程中出现下面的错误：
```bash
[InvalidArgumentException]
  Could not find package laravel-admin-ext/multitenancy at any version for your minimum-stability (dev). Check the package spelling or your minimum-stability
```
这是由于composer的最小稳定性设置不满足，建议在composer.json里面将`minimum-stability`设置为`dev`，另外`prefer-stable`设置为true, 这样给你的应用安装其它package的时候，还是会倾向于安装稳定版本, 
composer.json的修改如下
```json
{
    ...
    "minimum-stability": "dev",
    "prefer-stable": true,
    ...
}
```


然后运行下面的命令发布配置文件

```bash
php artisan vendor:publish --provider="Encore\Admin\Multitenancy\MultitenancyServiceProvider"
```
运行完成之后会生成新后台的配置文件`config/tenancy.php`, 这个文件和`config/admin.php`有一样的结构

由于新建的后台需要和原后台保持隔离，所以推荐新建一个新的数据库来存放对应表，这里要创建一个新的数据库，并且在`config/database.php`中添加一个名字为`tenancy`的数据库连接

> 当然数据库连接也可以是任何其它的名字，如果使用了其它的连接名，需要在`config/tenancy.php`中修改`database.connection`为相应的值。
> 如果你不想再创建一个新的数据库来安装新的后台，打开`config/tenancy.php`，将`database`下的`connection`设置为空字符串，然后下面的表配置全部重命名掉，避免和第一个后台的这几个表冲突，建议将`admin`前缀替换即可。

第二个后台将会默认安装在`app/Tenancy`目录下，如果你需要安装在其它目录，修改`config/tenancy.php`中的`directory`配置项即可，对应的`route.prefix`、`route.namespace`和`auth.controller`也要修改成对应的值。

把上面生成的配置文件路径写入`config/admin.php`的`extensions`下：

```php
    'extensions' => [
    
        'multitenancy' => [
            'tenancy' => config_path('tenancy.php'),
        ]
        
    ]
```
最后运行下面的命令完成安装：
```bash
php artisan admin:install:tenancy
```

打开`http://localhost:8080/tenancy`访问新建的后台，这个新后台的开发工作就在`app/Tenancy`目录下了，这个后台对应的配置文件是`config/tenancy.php`，根据你的需求修改里面的配置。

## 安装多个后台

如果需要在这个项目中安装更多的后台，复制`config/tenancy.php`文件到config目录下，比如`config/platform.php`，然后参考上面修改里面的数据库连接

因为需要安装在一个新的目录，所以同样要修改`config/platform.php`中的`directory`、`route.prefix`、`route.namespace`和`auth.controller`这几个配置项的值，

然后把配置文件路径写入`config/admin.php`的`extensions`下：

```php
    'extensions' => [
        'multitenancy' => [
            'tenancy' => config_path('tenancy.php'),
            
            // 增加下面一行
            'platform' => config_path('platform.php'),
        ]
    ]
```

最后运行下面的命令安装
```bash
php artisan admin:install:tenancy platform
```
如果你在`config/platform.php`设置的路由前缀是`paltform`, 那么就打开`http://localhost:8080/paltform`访问新建的后台。

## session冲突问题

如果你在同一个浏览器窗口打开两个后台，登入或者登出一个后台会影响到另一个后台，通过下面的方式来解决这个问题

### 区分路径访问

如果多个后台是通过不同的路径访问的，在每个后台的配置文件中（比如`config/admin.php`和`config/tenacy.php`）的route配置的中间件配置数据加上下面

```php
    'route' => [

        'prefix' => 'tenancy',

        'namespace' => 'App\\Tenancy\\Controllers',

        'middleware' => ['web', 'admin', 'multi-session:path,/tenancy'],
    ],
```

在`'multi-session:path,/tenancy'`中，`/tenancy`就是该后台的访问根路径

### 区分域名访问

如果多个后台是通过不同的域名访问的，分别在每个后台的配置文件中加上中间件

```php
    'route' => [

        'prefix' => 'tenancy',

        'namespace' => 'App\\Tenancy\\Controllers',

        'middleware' => ['web', 'admin', 'multi-session:domain,admin.laravel.com'],
    ],
```

在`'multi-session:domain,admin.laravel.com'`中，`admin.laravel.com`就是该后台的访问域名

## 常见问题

### 创建控制器

使用`php artisan admin:make`命令创建的控制器会在原后台目录下，你可以将生成的控制器移动到当前后台的`Controllers`目录下，然后修改一下命名空间即可。

如果你使用`v1.7.0`版本以上的laravel-admin, 可以加上`namespace`选项来指定生成的目录：

```shell
$ php artisan admin:make TestController --model=App\\Models\\User --title=用户管理 --namespace=App\\Tenancy\\Controllers
```

## 版本更新

下载新的版本之后，从安装步骤开始，到`composer require laravel-admin-ext/multitenancy`这一步即可。

## 版权声明

请尊重作者知识产权, 勿传播他人使用。

