+1 đến @morphatic câu trả lời, nó chính xác trên hầu hết các nội dung.
Di chuyển
Đối với cơ sở dữ liệu chính của bạn, bạn sẽ có thể sử dụng database/migration
mặc định và sử dụng php artisan make:migration
và php artisan migrate
.
Tuy nhiên, Tenanti sẽ sử dụng đường dẫn di chuyển được đặt trong cấu hình "trình điều khiển". ví dụ:
'path' => database_path('tenanti/user'),
Trong trường hợp này, quá trình di chuyển sẽ được tạo / di chuyển từ database/tenanti/user
(bạn có thể chọn thư mục khác và nó sẽ sử dụng thư mục đó). Khi bạn thiết lập điều này, bạn có thể tạo tệp di chuyển mới cho đối tượng thuê người dùng thông qua php artisan tenanti:make user create_blogs_table
(làm ví dụ) và chạy quá trình di chuyển qua php artisan tenanti:migrate user
(xem sự giống nhau giữa lệnh di chuyển Laravel và Tenanti?).
Trình điều khiển
Trình điều khiển chỉ là nhóm của một đối tượng thuê, bạn có thể nhóm nó theo người dùng, công ty hoặc nhóm, v.v. Và có khả năng bạn có thể yêu cầu nhiều hơn một loại nhóm cho mỗi dự án, nếu không, hầu hết thời gian bạn chỉ sử dụng duy nhất " nhóm "hoặc" trình điều khiển ".
Xác thực hoặc truy cập DB
Trước hết, bạn cần xem xét cách bạn định phân biệt từng đối tượng thuê. Hầu hết thời gian tôi sẽ thấy mọi người có xu hướng chọn tên miền phụ. Vì vậy, trong trường hợp này, bạn cần kiểm tra xem miền phụ thuộc về bất kỳ người dùng nào (bằng cách truy vấn cơ sở dữ liệu chính) bằng cách sử dụng phần mềm trung gian và sau đó kết nối với cơ sở dữ liệu của người dùng đó.
Tenanti không quản lý phần đó của quy trình vì mọi người có phong cách khác nhau về khía cạnh đó, nhưng chúng tôi cung cấp mã để kết nối động với đối tượng thuê cơ sở dữ liệu của bạn từ cấu hình cơ sở dữ liệu cơ sở.
Giả sử bạn có cấu hình sau:
<?php
return [
'fetch' => PDO::FETCH_CLASS,
'default' => 'primary',
'connections' => [
'primary' => [
//
],
'tenants' => [
'driver' => 'mysql',
'host' => 'dbhost', // for user with id=1
'username' => 'dbusername', // for user with id=1
'password' => 'dbpassword', // for user with id=1
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
],
],
'migrations' => 'migrations',
'redis' => [ ... ],
];
Bạn có thể làm theo bước có sẵn trong https://github.com/orchestral/ tenanti # multi-database-connection-setup và thêm mã sau.
<?php namespace App\Providers;
use Orchestra\Support\Facades\Tenanti;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Tenanti::setupMultiDatabase('tenants', function (User $entity, array $template) {
$template['database'] = "tenant_{$entity->getKey()}";
return $template;
});
}
}
Điều này sẽ đảm bảo rằng bạn đang sử dụng tenant_1
cơ sở dữ liệu cho người dùng =1, tenant_2
cơ sở dữ liệu cho user =2, v.v.
Đây là nơi bạn cần thêm logic vào phần mềm trung gian của mình.
$user = App\User::whereSubdomain($request->route()->parameter('tenant'))->first();
Tenanti::driver('user')->asDefaultDatabase($user, 'tenants_{id}');