Laravel资源控制器,并为多个数据库建立相同的模型



有什么方法可以为多个数据库使用相同的控制器和模型吗?

例如,我有一个Product模型和ProductController(带有index,show,store,update,destroy的CRUD资源控制器(。数据库、模型和控制器是相同的。

我发现改变连接的唯一方法是在型号protected $connection = 'connection_name';中但是我需要为每个模型复制ProductController。

我想把ProductController作为BaseProductController,并将其扩展到每个数据库,但我不知道如何设置连接。

您可以在带有resolving挂钩的产品模型上使用依赖注入

在服务提供商中:

use AppProduct;
$this->app->resolving(Product::class, function ($product, $app) {
$request = $app['request'];
if ($request->isConnection1()) {
$product->setConnection('connection1');
}
elseif ($request->isConnection2()) {
$product->setConnection('connection2');
}
});

我的例子显然不起作用,因为我不知道你的背景,但它向你展示了思考的方式。

另一种方法是在ProductController周围的路由中添加一个中间件,该中间件设置DB默认连接(当未指定时由您的模型使用(

<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateDatabaseConnectionResolverInterface as DatabaseManager;
class SwitchConnection
{
protected $dbManager;
public function __construct(DatabaseManager $dbManager)
{
$this->dbManager = $dbManager;
}
public function handle($request, Closure $next, string $connection)
{
$this->dbManager->setDefaultConnection($connection);
return $next($request);
}
}

顺便说一句,如果您将该中间件别名为switch.connection,并将switch.connection:connection1添加到路由的中间件中,它将自动切换,因此您可以使用相同的控制器。