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
Il nostro server PostgreSQL
Abbiamo d’un altro lettoé un server PostgreSQL che contiene una tabella « test ».
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
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;
}
}
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.