使用 Hyn/多租户在 Laravel 项目中设置测试

Posted

技术标签:

【中文标题】使用 Hyn/多租户在 Laravel 项目中设置测试【英文标题】:Setting up testing in Laravel project using Hyn/multi-tenant 【发布时间】:2020-11-22 03:30:49 【问题描述】:

我正在使用Hyn/multi-tenant 5.6 包来支持多租户应用程序。 我的应用程序运行良好,我可以创建租户并且它们运行正常。

问题来自于测试。我想为我的测试目的设置一个现有租户。但不知何故,应用程序无法在测试期间创建正确的路由。 在 CreateApplication.php 中,我设置了用于测试的租户。其中有website_id = 1

trait CreatesApplication

    /**
     * Creates the application.
     *
     * @return \Illuminate\Foundation\Application
     */
    public function createApplication()
    
        $app = require __DIR__.'/../bootstrap/app.php';

        $app->make(Kernel::class)->bootstrap();

        return $app;
    

    public function setUp() : void

        parent::setUp();

        $hostname = Hostname::find(1);
        $website = Website::findOrFail($hostname->website_id);
        $tenancy = app(Environment::class);
        $tenancy->hostname($hostname);

        Artisan::call('optimize:clear');
        Artisan::call('tenancy:migrate:fresh', ['--website_id' => 1]);
        Artisan::call('tenancy:db:seed',['--class' => 'TenantSeeder','--website_id' => 1]);

    


我通过谷歌搜索发现了一些类似的问题,但他们的解决方案都不适合我: https://github.com/tenancy/multi-tenant/issues/584

我所有的路线都在我的tenants.php 文件中并且正在运行。 我正在使用最新版本的 PHPUNIT。

我得到的错误是:

Symfony\Component\Routing\Exception\RouteNotFoundException : Route [new_anmeldung_single] not defined.

【问题讨论】:

【参考方案1】:

在我写这个问题时,我尝试了更多选项,添加和删除了一些代码(我上周至少做了 10 小时),令我惊讶的是我找到了解决方案。

我只是忘了做:

$tenancy->tenant($website); // switches the tenant and reconfigures the app (new RouteProvider(app()))->boot();//reloads the routes

因此,如果您想为测试设置现有租户,则需要将以下代码添加到您的 setUp() 方法中。如果您想创建一个新租户,可以按照问题中发布的问题中的示例进行操作。

public function setUp() : void

        parent::setUp();


        $hostname = Hostname::find(1);
        $website = Website::findOrFail($hostname->website_id);
        $tenancy = app(Environment::class);
        $tenancy->hostname($hostname);
        $tenancy->tenant($website); // switches the tenant and reconfigures the app

        (new RouteProvider(app()))->boot();

        Artisan::call('tenancy:migrate:fresh', ['--website_id' => 1]);
        Artisan::call('tenancy:db:seed',['--class' => 'TenantSeeder','--website_id' => 1]);

    

遗憾的是这部分没有记录,所以我希望有类似问题的人能找到这篇文章。

【讨论】:

以上是关于使用 Hyn/多租户在 Laravel 项目中设置测试的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Firestore 中多租户的命名空间

需要在 Laravel 4 的同一张表中设置一对多关系

如何在 laravel 项目中设置 X-Frame-Options?

在 Windows 中设置 Laravel 本地服务器

如何在 Laravel 中设置全局变量?

如何使用 Eloquent 在 Laravel 中设置 AUTO_INCREMENT?