Laravel-hynmulti-tenancy多租户扩展的使⽤
使⽤相同的Laravel安装来运⾏多个⽹站,同时将租户特定的数据分开以实现完全独⽴的多域设置。没错你没听错,就是这么爽,Saas 项⽬的福⾳,由此可见laravel有多⾹。⽬前这个包还在维护中,使⽤⼈数就已经超过1000了,我花了3-5天研究了⼀下这个东西,是真的⾹。由于是歪果仁开发的,所以⽂档对国内开发者不是特别友好,造成了众多⼩伙伴使⽤不便,这⾥我就给⼤家分享⼀下我的经验。
很多⼈不理解这个包是⼲什么的,所以上去就开始看⽂档,这样很浪费时间。正如⽂章开头说的,使⽤相同的Laravel安装来运⾏多个⽹站,同时将租户特定的数据分开以实现完全独⽴的多域设置。其原理就是配置⽣成的⼦域会同时⽣成相对应的数据库,⽣成的域和数据库由包的内置程序⽣成的UUID来绑定关系,访问域名的时候程序就会访问对应的数据库,从⽽实现多租户之间的数据隔离(传统意义上的分库)。你要说它的⽤处在哪,那就是多⽤于Saas服务,同⼀套代码不需要重新部署服务器环境就可以提供给多个⽤户(这⾥⼤多都是需要建站的客户)使⽤,⽽租户之间的数据是隔离的,也可⽤于b2b开发等。现在你⼤概知道它是⼲什么的吧。
这⾥我以laravel⽣态中的⼀个开源电商cms来讲解具体如何使⽤它。
如何运行php项目2.安装hyn包,composer安装不⽤多说了吧,都懂。
安装之前的环境配置:
Laravel 5.6或5.7。
PHP 7.2或更⾼版本。
MySQL 5.7以上版本,MariaDB 10.2.0以上版本或PostgreSQL 9以上版本。
(可选)Apache 2.4+或Nginx 1.12+。
。
由于这⾥的cms项⽬是laravel5.6的,所以我使⽤的是hyn5.3,这⾥顺带⼀提hyn⽬前更新到5.5版本,但不是特别稳定,官⽅推荐使⽤5.4版。顺带⼀提,国内常⽤的PHP本地开发集成环境⼀般使⽤的是wamp和PHPstudy等,这⾥我建议使⽤后者,PHPstudy⽬前已更新到8.1版,功能强⼤⽅便实⽤,php开发者必备神器!
安装准备:
a.本地数据库准备(这⾥我使⽤的是mysql),由于多租户的数据是分库来处理的,所以需要数据库⽤户有创库权限,利⽤的是mysql 的“GRANT OPTION”特性,在本地mysql中运⾏以下代码:
CREATE DATABASE IF NOT EXISTS bagisto;
CREATE USER IF NOT EXISTS root@localhost IDENTIFIED BY 'yourPASSWORD';
GRANT ALL PRIVILEGES ON *.* TO root@localhost WITH GRANT OPTION;
*注意这⾥的“bagisto”是我本地cms的数据库,下⾯会说明会将其设置为系统数据库,给root⽤户权限。
b.配置系统数据库,在你的项⽬中config/database.php中创建系统数据库连接配置:
'system' => [
'driver' => 'mysql',
'host' => env('TENANCY_HOST', '127.0.0.1'),
'port' => env('TENANCY_PORT', '3306'),
'database' => env('TENANCY_DATABASE', 'bagisto'),
'username' => env('TENANCY_USERNAME', 'root'),
'password' => env('TENANCY_PASSWORD', 'yourPASSWORD'),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
]
*注意建议将配置信息写到.env⽂件中,不需要创建'tenant'数据库配置项,hyn包在连接租户数据库情况下会⾃动创建'tenant'连接
c.在config/tenancy.php配置⾥将website->uuid-limit-length-to-32状态设置为开启
安装:
运⾏composer命令以添加租赁包作为依赖项
composer require "hyn/multi-tenant:5.3.*"
发布配置⽂件和迁移以进⾏租⽤,配置软件包
php artisan vendor:publish --tag=tenancy
选择你要迁移的数据库迁移,主要是⽣成hostname和websites表
php artisan migrate --database=system
⽣成了system连接库的迁移⽂件后,就可将其库内表迁移到新建的⽹站库⾥了,在tenancy.php配置中,将其设置db > tenant-migrations-path为有效的绝对路径,并且默认情况下,所有新租户将运⾏这些迁移。
// ..
"tenant-migrations-path" => database_path('migrations/tenant'),
// ..
如果你还想填充新创建和迁移的租户的数据库,则可以db > tenant-seed-class在tenancy.php 配置⽂
件中启⽤。将此设置更改为完全命名空间的类名,程序包将在运⾏⾃动迁移后⾃动运⾏该迁移。
租赁已将--website_id[=WEBSITE_ID]选项添加到以下每个本机Laravel迁移和种⼦命令中,并相应地为其命名空间。
tenancy:migrate -运⾏数据库迁移
tenancy:migrate:refresh -重置并重新运⾏所有迁移
tenancy:migrate:reset -回滚所有数据库迁移
tenancy:migrate:rollback -回滚上⼀次数据库迁移
tenancy:db:seed -⽤记录为数据库播种
--website_id可选选项接受多个值。尽管是可选的,但如果保留该选项,它将对所有租户运⾏该命令。例如:
php artisan tenancy:migrate --website_id=1 仅迁移租户⽹站1。
php artisan tenancy:migrate --website_id=1 --website_id=2 迁移租户⽹站1和2。
php artisan tenancy:migrate 迁移所有租户⽹站。
该website_id对应了⾃动递增id的⽹站列并不是UUID。
⾄此你的安装算是完成了。
3.创建⽹站和使⽤
⽂档中给出的代码⽰例很清晰,但如果你是像我⼀样为cms部署多⽹站访问,你就会进⼊误区,这段创建新站的代码在那⾥写?!如果你正在开发⼀个新项⽬,那这段建站代码就是你要开发的建站功能,在哪⾥写就不⽤多说了吧!但如果你和我⼀样,是为了节约开发成本,部署⼀个cms的多站访问,那就可以直接php artisan tinker运⾏建站代码。这⾥我就以我的⽅式来讲解。
在调试台中运⾏建站代码之前,你需要知道hyn访问⼦域的原理。我们都知道,如果你在本地部署⼀个项⽬就必须通hostname来访问(这⾥以apache服务举例),这个时候在apache中就会⽣成⼀个vhost⽂件,这个conf⽂件的作⽤就不⽤多说了吧,⽽建站代码中会⽣成⼀个conf⽂件在项⽬中(位置在storage/app/tenancy/webserver/apache2/),这个时候你需要在本地服务的配置⽂件中将这个⽣成的临时conf加载到本地apache服务中,⽽hyn就会依据这个临时conf⽂件去访问这个项⽬(注意此时的临时conf⽂件和创建的⼦域是有绑定关系的,这个在建站代码中逻辑清晰可见)。所以你需要做的有两步:
a.在项⽬config/webserver.php中开启⽣成临时conf⽂件配置apache2->enabled,注意这⾥是⼀⾮常重要的步骤,⽣成的临时⽂件不会⾃动加载到apache服务中,如果你是在本地部署,那只需要重启本地apache服务,如果是在⽣产环境中,就必须修改websrever.php⽂件中重新启动apache服务的命令,否则你每创建⼀个新站就要重启线上环境,修改代码如下:
/**
* Actions to run to work with the Apache2 service.
*/
'actions' => [
/**
* Action that asserts Apache2 is installed.
*/
'exists' => 'F:/phpstudy_pro/Extensions/Apache2.4.39/bin',
/
**
* Action to run to test the apache configuration.
*
* @set to a boolean to force the response of the test command.
* @info true succeeds, false fails
*/
'test-config' => 'httpd -t',
/**
* Action to run to reload the apache service.
*
* @info set to null to disable reloading.
*/
'reload' => 'httpd -k restart'
]
如何修改就不多说,根据你线上apache命令将httpd命令替换即可。
b.在apache的配置⽂件中加载临时vhost⽂件的路径,只需添加以下代码(我本地)
IncludeOptional F:/phpstudy_pro/WWW/bagisto/storage/app/tenancy/webserver/apache2/*.conf
线上环境⾃⾏修改加载路径。
创建并绑定⽹站(这⾥我是php artisan tinker直接运⾏):
use Hyn\Tenancy\Models\Website;
use Hyn\Tenancy\Contracts\Repositories\WebsiteRepository;
use Hyn\Tenancy\Models\Hostname;
use Hyn\Tenancy\Contracts\Repositories\HostnameRepository;
$website = new Website;
app(WebsiteRepository::class)->create($website);
$hostname = new Hostname;
$hostname->fqdn = 'ample';
$hostname = app(HostnameRepository::class)->create($hostname);
app(HostnameRepository::class)->attach($hostname, $website);
这⾥⽣成的UUID是绑定⽹站和数据库关系的标识,长度为32位,如果不想使⽤系统中创建UUID的⽅法,⽂档中也提供了另⼀种⽅法。
新站的访问:
前⽂已经提到,创建新站(也可是⼦域)后就会⽣成这个⽹站对应的数据库,但当前这个数据库是⼀个空库,要实现原项⽬的所有功能就必须将system连接的库中所有表迁移过来,所以下⼀步就是将sys
tem连接库的表迁移到当前库⾥(迁移表不填充数据,为了在访问时区分是否是新站)。⼀般的项⽬都不会将数据库的表直接创建成迁移⽂件放在项⽬中,所以这个时候就需要逆向将表创建成迁移⽂件,再执⾏迁移命令将表迁移到新库中,这⾥顺带给⼤家安利⼀下另⼀个laravel的⼯具(xethron/migrations-generator)。安装依赖和执⾏命令如下:
composer require --dev "xethron/migrations-generator"
下载完成后再app中注册服务
// 省略之前内容
'providers' => [
// 省略之前内容
Way\Generators\GeneratorsServiceProvider::class,
Xethron\MigrationsGenerator\MigrationsGeneratorServiceProvider::class,
],
指定某张表⽣成迁移⽂件
php artisan migrate:generate table1,table2,table3
反向忽略某些表
php artisan migrate:generate --ignore="table3,table4,table5"
*注意这⾥的system连接数据库中,hostname和websites表不需要迁移,所以建议忽略这两张表
4.访问新建站点
a.访问你新建的站点“ample”,如果你本地使⽤的是PHPstudy8.1,可能会出现⽆法解析php⽂件的问题,这是因为⽣成的临时vhost⽂件中没有加载使⽤php的路径,⽽新版PHPstudy8.1中vhost⽂件配置了php的加载路径,这是为了可以选⽤php版本⽽添加的配置项,所以你需要修改临时的vhost⽂件(可建⽴“ample”vhost⽂件,仿照修改)。如果你觉得这样⿇烦还可以去修改⽣成临时vhost⽂件的模板,在vendor/hyn/multi-tenant/assets/generators/webserver/apache/blocks/中。
b.访问成功后测试数据是否是新库数据(或者连接的是否是新库)。
hyn在访问新站点域名时会⾃动⽣成⼀个tenant连接,这个连接对应的数据库即是当前⽹站的数据库,不过在这之前,你需要在所有映射表model⾥⾯use 两个Traits,即Notifiable和UsesTenantConnection,否则访问的任然是system连接库,或者可以使⽤租户路由(这⾥不多做解释,可以查看⽂档)。
⾄此,hyn就算是运⽤成功了。
整理不易,转载请带出处
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论