Symfony 4 / Sonata: Quản lý Giao diện Quản trị Đa Máy chủ

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
Sélection_162

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".

Sélection_161-1

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

image-4

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;
    }


}

image-5