mirror of
https://github.com/archtechx/tenancy.git
synced 2025-12-12 13:54:03 +00:00
parent
cc74e9f3ca
commit
a1270189da
3 changed files with 94 additions and 0 deletions
|
|
@ -5,6 +5,7 @@ declare(strict_types=1);
|
||||||
namespace Stancl\Tenancy;
|
namespace Stancl\Tenancy;
|
||||||
|
|
||||||
use ArrayAccess;
|
use ArrayAccess;
|
||||||
|
use Closure;
|
||||||
use Illuminate\Foundation\Application;
|
use Illuminate\Foundation\Application;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
use Illuminate\Support\Traits\ForwardsCalls;
|
use Illuminate\Support\Traits\ForwardsCalls;
|
||||||
|
|
@ -362,6 +363,27 @@ class Tenant implements ArrayAccess
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a closure inside the tenant's environment.
|
||||||
|
*
|
||||||
|
* @param Closure $closure
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function run(Closure $closure)
|
||||||
|
{
|
||||||
|
$originalTenant = $this->manager->getTenant();
|
||||||
|
|
||||||
|
$this->manager->initializeTenancy($this);
|
||||||
|
$result = $closure($this);
|
||||||
|
$this->manager->endTenancy($this);
|
||||||
|
|
||||||
|
if ($originalTenant) {
|
||||||
|
$this->manager->initializeTenancy($originalTenant);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
public function __get($key)
|
public function __get($key)
|
||||||
{
|
{
|
||||||
return $this->get($key);
|
return $this->get($key);
|
||||||
|
|
|
||||||
|
|
@ -206,6 +206,10 @@ class TenantManager
|
||||||
*/
|
*/
|
||||||
public function initializeTenancy(Tenant $tenant): self
|
public function initializeTenancy(Tenant $tenant): self
|
||||||
{
|
{
|
||||||
|
if ($this->initialized) {
|
||||||
|
$this->endTenancy();
|
||||||
|
}
|
||||||
|
|
||||||
$this->setTenant($tenant);
|
$this->setTenant($tenant);
|
||||||
$this->bootstrapTenancy($tenant);
|
$this->bootstrapTenancy($tenant);
|
||||||
$this->initialized = true;
|
$this->initialized = true;
|
||||||
|
|
|
||||||
|
|
@ -105,4 +105,72 @@ class TenantClassTest extends TestCase
|
||||||
|
|
||||||
$this->assertSame(['foo' => 'bar'], $data);
|
$this->assertSame(['foo' => 'bar'], $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @test */
|
||||||
|
public function run_method_works()
|
||||||
|
{
|
||||||
|
$this->assertSame(null, tenancy()->getTenant());
|
||||||
|
|
||||||
|
$users_table_empty = function () {
|
||||||
|
return count(\DB::table('users')->get()) === 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
$tenant = Tenant::new()->save();
|
||||||
|
\Artisan::call('tenants:migrate', [
|
||||||
|
'--tenants' => [$tenant->id],
|
||||||
|
]);
|
||||||
|
tenancy()->initialize($tenant);
|
||||||
|
$this->assertTrue($users_table_empty());
|
||||||
|
tenancy()->end();
|
||||||
|
|
||||||
|
$foo = $tenant->run(function () {
|
||||||
|
\DB::table('users')->insert([
|
||||||
|
'name' => 'foo',
|
||||||
|
'email' => 'foo@bar.xy',
|
||||||
|
'password' => bcrypt('secret'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return 'foo';
|
||||||
|
});
|
||||||
|
|
||||||
|
// test return value
|
||||||
|
$this->assertSame('foo', $foo);
|
||||||
|
|
||||||
|
// test that tenancy was ended
|
||||||
|
$this->assertSame(false, tenancy()->initialized);
|
||||||
|
$this->assertSame(null, tenancy()->getTenant());
|
||||||
|
|
||||||
|
// test closure
|
||||||
|
tenancy()->initialize($tenant);
|
||||||
|
$this->assertFalse($users_table_empty());
|
||||||
|
|
||||||
|
// test returning to original tenant
|
||||||
|
$tenant2 = Tenant::new()->save();
|
||||||
|
\Artisan::call('tenants:migrate', [
|
||||||
|
'--tenants' => [$tenant2->id],
|
||||||
|
]);
|
||||||
|
|
||||||
|
tenancy()->initialize($tenant2);
|
||||||
|
$this->assertSame($tenant2, tenancy()->getTenant());
|
||||||
|
$this->assertTrue($users_table_empty());
|
||||||
|
|
||||||
|
$tenant->run(function () {
|
||||||
|
\DB::table('users')->insert([
|
||||||
|
'name' => 'bar',
|
||||||
|
'email' => 'bar@bar.xy',
|
||||||
|
'password' => bcrypt('secret'),
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->assertSame($tenant2, tenancy()->getTenant());
|
||||||
|
|
||||||
|
$this->assertSame(2, $tenant->run(function () {
|
||||||
|
return \DB::table('users')->count();
|
||||||
|
}));
|
||||||
|
|
||||||
|
// test that the tenant variable can be accessed
|
||||||
|
$this->assertSame($tenant->id, $tenant->run(function ($tenant) {
|
||||||
|
return $tenant->id;
|
||||||
|
}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue