Chúng ta sẽ xem cách quản lý giao diện quản trị kết nối với nhiều máy chủ.
Trong ví dụ của chúng ta, chúng ta đã thiết lập một máy chủ MySQL mặc định quản lý giao diện quản trị của chúng ta. Người dùng, phương tiện truyền thông, v.v.
Và chúng ta đã thiết lập một máy chủ PostgreSQL chứa một bảng mà chúng ta muốn quản lý.
Chúng ta có thể thêm bao nhiêu máy chủ tùy ý.
Máy chủ MySQL của chúng ta
Chúng ta đã thiết lập truyền thống một phiên bản Sonata Symfony mặc định với kết nối MySQL cổ điển. Vì vậy, chúng ta có thể tạo cơ sở dữ liệu, sơ đồ và người dùng mặc định của giao diện quản trị của mình.
php bin/console doctrine:database:create
php bin/console doctrine:schema:update --force
php bin/console fos:user:create --super-admin

Máy chủ PostgreSQL của chúng ta
Ngược lại, chúng ta có một máy chủ PostgreSQL chứa bảng "test".

Các Kết Nối
Trong các phiên bản gần đây của Symfony, thông tin xác thực cho các kết nối được quản lý trong tệp .env ở gốc dự án của bạn.
Chúng ta sẽ tạo 1 kết nối cho mỗi máy chủ.
DATABASE_URL_PGSQL=pgsql://tbourdin:123456@127.0.0.1:5432/test?
DATABASE_URL_MYSQL=mysql://root:toor@127.0.0.1:3306/symfony-sonata-skeleton?serverVersion=5.7
Sau đó, chúng ta sẽ cấu hình cài đặt Doctrine của mình bằng cách tạo một kết nối mặc định (MySQL) và một kết nối bổ sung cho máy chủ PostgreSQL của chúng ta.
Để tránh nhầm lẫn, chúng ta sử dụng dấu gạch dưới "_" thay vì gạch nối "–" vì Symfony sẽ chuyển đổi "–" của chúng ta thành "_" và việc ánh xạ sẽ không được thực hiện chính xác.
Chúng ta chỉ định rằng tất cả các thực thể mặc định của chúng ta sẽ được quản lý trong src/entity/ServerMysql và các thực thể cần kết nối với Pgsql sẽ được lưu trữ trong thư mục /src/Entity/ServerPgsql
doctrine:
dbal:
default_connection: db_mysql_local
types:
json: Sonata\Doctrine\Types\JsonType
connections:
db_mysql_local:
url: '%env(resolve:DATABASE_URL_MYSQL)%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
db_pgsql_local:
url: '%env(resolve:DATABASE_URL_PGSQL)%'
driver: 'pdo_pgsql'
server_version: '9.6.11'
charset: utf8
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
# IMPORTANT: You MUST configure your server version,
# either here or in the DATABASE_URL env var (see .env file)
#server_version: '5.7'
orm:
auto_generate_proxy_classes: true
default_entity_manager: App
entity_managers:
#default code, the sonata admin, that use the default connexion (no need to define it here)
App:
connection: db_mysql_local
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
mappings:
ApplicationSonataMediaBundle: ~
SonataMediaBundle: ~
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/ServerMysql'
prefix: 'App\Entity\ServerMysql'
alias: App
#our pgSql entities that use our pgsql connexion
app-pgsql:
connection: db_pgsql_local
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: false
mappings:
AppPgsql:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/ServerPgsql'
prefix: 'App\Entity\ServerPgsql\'
alias: AppPgsql
Và để kiểm tra quy trình của chúng ta, chúng ta thử quản lý giao diện kiểm tra của mình

Và tất nhiên, nó không hoạt động. Bởi vì thực thể của chúng ta được lưu trữ trong thư mục mặc định của chúng ta.
Vì vậy, chúng ta di chuyển nó đến thư mục của chúng ta "/src/Entity/ServerPgsql"
Chúng ta chỉ cần chỉnh sửa dịch vụ và định nghĩa thực thể, và chúng ta đã xong!
#/config/services.yaml
admin.table1:
class: App\Admin\Table1Admin
arguments: [~, App\Entity\ServerPgsql\Table1, App\Controller\Table1AdminController]
tags:
- { name: sonata.admin, manager_type: orm, group: admin, label: Table1 }
public: true
<?php
namespace App\Entity\ServerPgsql;
use Doctrine\ORM\Mapping as ORM;
/**
* Table1
*
* @ORM\Table(name="table1")
* @ORM\Entity
*/
class Table1
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="SEQUENCE")
* @ORM\SequenceGenerator(sequenceName="table1_id_seq", allocationSize=1, initialValue=1)
*/
private $id;
/**
* @var string|null
*
* @ORM\Column(name="var1", type="string", length=250, nullable=true)
*/
private $var1;
/**
* @var json|null
*
* @ORM\Column(name="var2", type="json", nullable=true)
*/
private $var2;
public function getId(): ?int
{
return $this->id;
}
public function getVar1(): ?string
{
return $this->var1;
}
public function setVar1(?string $var1): self
{
$this->var1 = $var1;
return $this;
}
public function getVar2(): ?array
{
return $this->var2;
}
public function setVar2(?array $var2): self
{
$this->var2 = $var2;
return $this;
}
}
