1
0
Fork 0
mirror of https://github.com/archtechx/tenancy.git synced 2025-12-12 15:34:03 +00:00

Add tenancy()->central() helper (#526)

* Add tenancy()->central() helper

* Apply fixes from StyleCI

* Add docblock

* Fix return typehint

Co-authored-by: stancl <stancl@users.noreply.github.com>
This commit is contained in:
Samuel Štancl 2020-11-13 08:15:24 +01:00 committed by GitHub
parent dd1b7fc86d
commit 8f34a733d8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 79 additions and 0 deletions

View file

@ -8,6 +8,13 @@ use Stancl\Tenancy\Contracts\Tenant;
trait TenantRun
{
/**
* Run a callback in this tenant's context.
* Atomic, safely reverts to previous context.
*
* @param callable $callback
* @return mixed
*/
public function run(callable $callback)
{
/** @var Tenant $this */

View file

@ -103,6 +103,30 @@ class Tenancy
return $this->model()->where($this->model()->getTenantKeyName(), $id)->first();
}
/**
* Run a callback in the central context.
* Atomic, safely reverts to previous context.
*
* @param callable $callback
* @return mixed
*/
public function central(callable $callback)
{
$previousTenant = $this->tenant;
$this->end();
// This callback will usually not accept arguments, but the previous
// Tenant is the only value that can be useful here, so we pass that.
$result = $callback($previousTenant);
if ($previousTenant) {
$this->initialize($previousTenant);
}
return $result;
}
/**
* Run a callback for multiple tenants.
* More performant than running $tenant->run() one by one.

View file

@ -71,6 +71,54 @@ class AutomaticModeTest extends TestCase
$this->assertSame('foobar', app('tenancy_initialized_for_tenant'));
}
/** @test */
public function central_helper_runs_callbacks_in_the_central_state()
{
tenancy()->initialize($tenant = Tenant::create());
tenancy()->central(function () {
$this->assertSame(null, tenant());
});
$this->assertSame($tenant, tenant());
}
/** @test */
public function central_helper_returns_the_value_from_the_callback()
{
tenancy()->initialize(Tenant::create());
$this->assertSame('foo', tenancy()->central(function () {
return 'foo';
}));
}
/** @test */
public function central_helper_reverts_back_to_tenant_context()
{
tenancy()->initialize($tenant = Tenant::create());
tenancy()->central(function () {
//
});
$this->assertSame($tenant, tenant());
}
/** @test */
public function central_helper_doesnt_change_tenancy_state_when_called_in_central_context()
{
$this->assertFalse(tenancy()->initialized);
$this->assertNull(tenant());
tenancy()->central(function () {
//
});
$this->assertFalse(tenancy()->initialized);
$this->assertNull(tenant());
}
}
class MyBootstrapper implements TenancyBootstrapper