Laravel контроллер ресурса и модель одинаковы для нескольких баз данных - PullRequest
1 голос
/ 05 апреля 2020

Можно ли как-то использовать один и тот же контроллер и модель для нескольких баз данных?

Например, у меня есть модель Product и ProductController (контроллер ресурсов CRUD с index,show,store,update,destroy). Базы данных, модели и контроллеры идентичны.

Единственный способ изменить соединение - найти модель protected $connection = 'connection_name'; Но тогда мне потребуется продублировать ProductController для каждой модели.

Я думал сделать ProductController как BaseProductController и расширить его для каждой базы данных, но я не могу понять, как установить соединение.

1 Ответ

0 голосов
/ 05 апреля 2020

Вы можете использовать Dependency Injection для своей модели продукта с resolving hook

У поставщика услуг:

use App\Product;

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

Мой пример, очевидно, не работает, потому что я не знаю ваш контекст, но он показывает вам способ мышления.

Другим способом было бы добавить промежуточное программное обеспечение к вашим маршрутам вокруг ProductController, которое устанавливает соединение с БД по умолчанию (используется вашими моделями, когда оно не указано)

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Database\ConnectionResolverInterface 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 к промежуточному ПО маршрута, оно автоматически переключится, и поэтому вы можете использовать тот же контроллер.

...