mirror of
https://github.com/archtechx/tenancy.git
synced 2026-02-05 11:44:04 +00:00
first implementation
This commit is contained in:
parent
67172a1176
commit
cfaa6463ee
6 changed files with 99 additions and 23 deletions
|
|
@ -3,12 +3,10 @@
|
||||||
namespace Stancl\Tenancy\Commands;
|
namespace Stancl\Tenancy\Commands;
|
||||||
|
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
use Stancl\Tenancy\DatabaseManager;
|
use Illuminate\Support\Facades\Artisan;
|
||||||
|
|
||||||
class Run extends Command
|
class Run extends Command
|
||||||
{
|
{
|
||||||
protected $database;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The console command description.
|
* The console command description.
|
||||||
*
|
*
|
||||||
|
|
@ -21,18 +19,7 @@ class Run extends Command
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
protected $signature = 'tenants:run {command} {--tenants} {args*}';
|
protected $signature = 'tenants:run {commandname} {--tenants=} {args*}';
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new command instance.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct(DatabaseManager $database)
|
|
||||||
{
|
|
||||||
parent::__construct();
|
|
||||||
$this->database = $database;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute the console command.
|
* Execute the console command.
|
||||||
|
|
@ -41,8 +28,8 @@ class Run extends Command
|
||||||
*/
|
*/
|
||||||
public function handle()
|
public function handle()
|
||||||
{
|
{
|
||||||
if (! $this->confirmToProceed()) {
|
if ($tenancy_was_initialized = tenancy()->initialized) {
|
||||||
return;
|
$previous_tenants_domain = tenant('domain');
|
||||||
}
|
}
|
||||||
|
|
||||||
tenant()->all($this->option('tenants'))->each(function ($tenant) {
|
tenant()->all($this->option('tenants'))->each(function ($tenant) {
|
||||||
|
|
@ -50,9 +37,14 @@ class Run extends Command
|
||||||
tenancy()->init($tenant['domain']);
|
tenancy()->init($tenant['domain']);
|
||||||
|
|
||||||
// Run command
|
// Run command
|
||||||
// todo
|
Artisan::call($this->argument('commandname'), [
|
||||||
|
'args' => $this->argument('args') // todo find a better way to pass args
|
||||||
|
]);
|
||||||
|
tenancy()->end();
|
||||||
});
|
});
|
||||||
|
|
||||||
// todo reconnect to previous tenant or end tenancy if it hadn't been started
|
if ($tenancy_was_initialized) {
|
||||||
|
tenancy()->init($previous_tenants_domain);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace Stancl\Tenancy;
|
namespace Stancl\Tenancy;
|
||||||
|
|
||||||
|
use Stancl\Tenancy\Commands\Run;
|
||||||
use Stancl\Tenancy\Commands\Seed;
|
use Stancl\Tenancy\Commands\Seed;
|
||||||
use Illuminate\Cache\CacheManager;
|
use Illuminate\Cache\CacheManager;
|
||||||
use Stancl\Tenancy\Commands\Migrate;
|
use Stancl\Tenancy\Commands\Migrate;
|
||||||
|
|
@ -23,9 +24,10 @@ class TenancyServiceProvider extends ServiceProvider
|
||||||
{
|
{
|
||||||
if ($this->app->runningInConsole()) {
|
if ($this->app->runningInConsole()) {
|
||||||
$this->commands([
|
$this->commands([
|
||||||
|
Run::class,
|
||||||
|
Seed::class,
|
||||||
Migrate::class,
|
Migrate::class,
|
||||||
Rollback::class,
|
Rollback::class,
|
||||||
Seed::class,
|
|
||||||
TenantList::class,
|
TenantList::class,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ class CommandsTest extends TestCase
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @test */
|
/** @test */
|
||||||
public function database_connection_is_switched_to_default_after_migrating_or_seeding_or_rolling_back()
|
public function database_connection_is_switched_to_default()
|
||||||
{
|
{
|
||||||
$originalDBName = DB::connection()->getDatabaseName();
|
$originalDBName = DB::connection()->getDatabaseName();
|
||||||
|
|
||||||
|
|
@ -88,13 +88,28 @@ class CommandsTest extends TestCase
|
||||||
|
|
||||||
Artisan::call('tenants:rollback');
|
Artisan::call('tenants:rollback');
|
||||||
$this->assertSame($originalDBName, DB::connection()->getDatabaseName());
|
$this->assertSame($originalDBName, DB::connection()->getDatabaseName());
|
||||||
|
|
||||||
|
$this->run_commands_works();
|
||||||
|
$this->assertSame($originalDBName, DB::connection()->getDatabaseName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @test */
|
/** @test */
|
||||||
public function database_connection_is_switched_to_default_after_migrating_or_seeding_or_rolling_back_when_tenancy_has_been_initialized()
|
public function database_connection_is_switched_to_default_when_tenancy_has_been_initialized()
|
||||||
{
|
{
|
||||||
tenancy()->init('localhost');
|
tenancy()->init('localhost');
|
||||||
|
|
||||||
$this->database_connection_is_switched_to_default_after_migrating_or_seeding_or_rolling_back();
|
$this->database_connection_is_switched_to_default();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @test */
|
||||||
|
public function run_commands_works()
|
||||||
|
{
|
||||||
|
$uuid = tenant()->create('run.localhost')['uuid'];
|
||||||
|
|
||||||
|
Artisan::call('tenants:migrate', ['--tenants' => $uuid]);
|
||||||
|
|
||||||
|
$this->artisan("tenants:run foo --tenants=$uuid a b")
|
||||||
|
->expectsOutput("User's name is Test command")
|
||||||
|
->expectsOutput('a;b');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
18
tests/Etc/ConsoleKernel.php
Normal file
18
tests/Etc/ConsoleKernel.php
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Stancl\Tenancy\Tests\Etc;
|
||||||
|
|
||||||
|
use Stancl\Tenancy\Tests\Etc\ExampleCommand;
|
||||||
|
use Orchestra\Testbench\Console\Kernel;
|
||||||
|
|
||||||
|
class ConsoleKernel extends Kernel
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The Artisan commands provided by your application.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $commands = [
|
||||||
|
ExampleCommand::class,
|
||||||
|
];
|
||||||
|
}
|
||||||
38
tests/Etc/ExampleCommand.php
Normal file
38
tests/Etc/ExampleCommand.php
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Stancl\Tenancy\Tests\Etc;
|
||||||
|
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
|
||||||
|
class ExampleCommand extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name and signature of the console command.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $signature = 'foo {args*}';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
User::create([
|
||||||
|
'id' => 999,
|
||||||
|
'name' => 'Test command',
|
||||||
|
'email' => 'test@command.com',
|
||||||
|
'password' => bcrypt('password'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->line("User's name is " . User::find(999)->name);
|
||||||
|
$this->line(implode(';', $this->argument('args')));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class User extends \Illuminate\Database\Eloquent\Model
|
||||||
|
{
|
||||||
|
protected $guarded = [];
|
||||||
|
}
|
||||||
|
|
@ -139,6 +139,17 @@ abstract class TestCase extends \Orchestra\Testbench\TestCase
|
||||||
$app->singleton('Illuminate\Contracts\Http\Kernel', Etc\HttpKernel::class);
|
$app->singleton('Illuminate\Contracts\Http\Kernel', Etc\HttpKernel::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolve application Console Kernel implementation.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Foundation\Application $app
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function resolveApplicationConsoleKernel($app)
|
||||||
|
{
|
||||||
|
$app->singleton('Illuminate\Contracts\Console\Kernel', Etc\ConsoleKernel::class);
|
||||||
|
}
|
||||||
|
|
||||||
public function randomString(int $length = 10)
|
public function randomString(int $length = 10)
|
||||||
{
|
{
|
||||||
return substr(str_shuffle(str_repeat($x = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length / strlen($x)))), 1, $length);
|
return substr(str_shuffle(str_repeat($x = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length / strlen($x)))), 1, $length);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue