Parliamo del progetto
PHP symfony Sonata

Symfony 4 / Sonata : gestire un'interfaccia di amministrazione multi-server

Vediamo come gécreare un'interfaccia di’admin che si connette à diversi server.Nel nostro esempio abbiamo monté un server mysql per dédeve che gèsu nostra interfaccia d’admin. Gli utenti, i mégiorni, ecc...

Symfony 4 / Sonata : gestire un'interfaccia di amministrazione multi-server

Vediamo come gécreare un'interfaccia di’admin che si connette à diversi server.
Nel nostro esempio abbiamo monté un server mysql per dédeve che gèsu nostra interfaccia d’admin. Gli utenti, i mégiorni, ecc.
E noi abbiamo monté un server PostgreSQL che contiene una tabella che desideriamo gestire.
Possiamo aggiungere quanti server vogliamo.

Il nostro server Mysql

Abbiamo montato classicamenteé un'istanza symfony sonata par dédeve con una connessione MySQL classica. Possiamo quindi créper la nostra base, lo schéma, e l’utente per démanca della nostra interfaccia di’amministratore.

php bin/console doctrine:database:create
php bin/console doctrine:schema:update --force
php bin/console fos:user:create --super-admin
Sélection_162

Il nostro server PostgreSQL

Abbiamo d’un altro lettoé un server PostgreSQL che contiene una tabella « test ».

Sélection_161-1

Le connessioni

Dall'ultimoères versioni di Symfony le créle credenziali delle connessioni sono géréè nel file .env à la radice del vostro progetto.
Noi andiamo a créer 1 connessioni per ogni server.

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

Procederemo quindi a configurare il nostro parametroétrage dottrina in créhanno una connessione da déserve (mysql) e una connessione aggiuntiva per il nostro server postgreSql.
Attenzione, per éPer evitare le confusioni, si utilizza una nomenclatura con degli underscore « _ » invece dei trattini « – » perché symfony convertirà poi i nostri « – » in « _ » e il mapping non andrà a buon fine.

Noi spécifiamo che tutte le nostre entitàés par dédovranno essere gérésono in src/entity/ServerMysql e che le entitàéqui devono connettersi à Pgsql saranno tutte memorizzateéè nel répercorso /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           



E per véverificare il nostro processoédure si cerca di’amministrare la nostra interfaccia di test

image-4

E forteémento ça non funziona. Perché la nostra entitàé è in magazzinoés nel nostro rérépertoire par débisogna.
La démetti quindi nel nostro rérepertorio « /src/Entità/ServerPgsql »
Dobbiamo solo modificare il servizio e la définitura di l’entitàé, e siamo a posto!

#/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

Adattare l’esempio alla versione installata

Gli esempi Symfony e Sonata rimangono legati alle versioni indicate nell’articolo. Symfony 4.x e Symfony 6.2 non sono più supportati: per un progetto attuale, utilizzate un ramo mantenuto e la documentazione corrispondente esattamente alle vostre dipendenze.

php bin/console about
composer show symfony/framework-bundle sonata-project/admin-bundle

Prima di riprendere il codice, controllate le firme, i servizi, le rotte e i template interessati. Aggiungete poi un test funzionale che copra le autorizzazioni, il codice HTTP e il risultato visibile.

Riferimento : versioni di Symfony supportate.

Condividi questo articolo