Ecco i comandi per inizializzare un progetto Symfony con un adminépreoccupazionié.
Per far funzionare Symfony 6 dovremo installare php8.0 o php8.1
Per php8.0
sudo apt-get install php8.0-cli libapache2-mod-php8.0 php8.0-common php8.0-opcache php8.0-igbinary php8.0-imagick php8.0-msgpack php8.0-readline php8.0-memcached php8.0-xml php8.0-mbstring php8.0-gd php8.0-mysql php8.0-curl php8.0-intl php8.0-memcache php8.0-memcached memcached libapache2-mod-php8.0 php8.0-zip php8.0-mysql
Per php8.1
sudo apt-get install php8.1-cli libapache2-mod-php8.1 php8.1-common php8.1-opcache php8.1-igbinary php8.1-imagick php8.1-msgpack php8.1-readline php8.1-memcached php8.1-xml php8.1-mbstring php8.1-gd php8.1-mysql php8.1-curl php8.1-intl php8.1-memcache php8.1-memcached memcached libapache2-mod-php8.1 php8.1-zip php8.1-mysql
Poi si installa lo scheletro del progetto.
php8.1 composer.phar create-project symfony/skeleton:"6.0.x-dev" skeleton-sf6
cp composer.phar skeleton-sf6/
cd skeleton-sf6
php8.1 composer.phar require webapp
Su véAssicurati che tutto funzioni bene à questo stadio in lançprima il server web intégré à php.
php8.1 -S localhost:8000 -t public
Che ci dà il’url seguente nel nostro browser : http://localhost:8000/
Si installa poi user-bundle che ci è nénecessario in
l’admin Sonata. Ci installerà tutte le dépendenze nénecessari, incluso Sonata/admin.
Ci si prende cura di fare il downgrade di Syfony/translation che è troppo récento nel nostro scheletro per Sonata
à questo giorno.
php8.1 composer.phar require symfony/translation-contracts:2.5
php8.1 composer.phar require sonata-project/user-bundle:5.x-dev
php8.1 bin/console assets:install
Ci si scontra à un primo problèio :
The child config "resetting" under "sonata_user" must be configured.
Per questo è necessario aggiungere una configurazione per débisogna in /config/packages/sonata_user.yaml
#####/config/packages/sonata_user.yaml
sonata_user:
class:
user: App\Entity\User
resetting:
email:
address: "test@test.com"
sender_name: Backoffice
E fare un console/bin cache:clear
php8.1 bin/console cache:clear
Si installa poi Sonata/admin. Installando doctrine-orm-admin-bundle si installerà automaticamente admin-bundle in éevitando i conflitti.
php8.1 composer.phar require sonata-project/doctrine-orm-admin-bundle
php8.1 bin/console assets:install
Su controllaôil nostro sito dal server web.
php8.1 -S localhost:8000 -t public
Dovremmo avere l’errore seguente :
An exception has been thrown during the rendering of a template ("Asset manifest file "/public/build/manifest.json" does not exist.").
Il faudra installer webpack
yarn add --dev @symfony/webpack-encore
yarn add webpack-notifier --dev
yarn encore dev
Sonata admin è correttamente installatoé. L’autenticazione n’non è ancora configuratoée e ci manca ancora la gestione dei médias e le classificazioni (vedremo le classificazioni in un articolo seguente).
Si installano e configurano le ACL.
php8.1 composer.phar require symfony/acl-bundle
Come configurare sonata_user.yml
#####/config/packages/sonata_user.yaml
sonata_user:
class:
user: App\Entity\User
resetting:
email:
address: "test@test.com"
sender_name: Backoffice
security_acl: true
manager_type: orm # can be orm or mongodb
Su configura security.yaml
#####/config/packages/security.yaml
security:
enable_authenticator_manager: true
password_hashers:
Sonata\UserBundle\Model\UserInterface:
algorithm: auto
providers:
sonata_user_bundle:
id: sonata.user.security.user_provider
access_decision_manager:
strategy: unanimous
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
admin:
lazy: true
pattern: /admin(.*)
provider: sonata_user_bundle
context: user
switch_user: true
form_login:
login_path: sonata_user_admin_security_login
check_path: sonata_user_admin_security_check
default_target_path: sonata_admin_dashboard
logout:
path: sonata_user_admin_security_logout
target: sonata_user_admin_security_login
remember_me:
#secret: "%env(APP_SECRET)%"
secret: "123456"
lifetime: 2629746
path: /admin
access_control:
- { path: ^/admin/login$, role: PUBLIC_ACCESS }
- { path: ^/admin/logout$, role: PUBLIC_ACCESS }
- { path: ^/admin/login_check$, role: PUBLIC_ACCESS }
- { path: ^/admin/request$, role: PUBLIC_ACCESS }
- { path: ^/admin/check-email$, role: PUBLIC_ACCESS }
- { path: ^/admin/reset/.*$, role: PUBLIC_ACCESS }
- { path: ^/admin/, role: ROLE_ADMIN }
role_hierarchy:
ROLE_ADMIN:
- ROLE_USER
- ROLE_SONATA_ADMIN
- ROLE_SONATA_USER_ADMIN_USER_VIEW
ROLE_SUPER_ADMIN:
- ROLE_ADMIN
- ROLE_ALLOWED_TO_SWITCH
Si aggiungono le strade di l’amministratore.
#####/config/route.yaml
sonata_user_admin_security:
resource: '@SonataUserBundle/Resources/config/routing/admin_security.xml'
prefix: /admin
sonata_user_admin_resetting:
resource: '@SonataUserBundle/Resources/config/routing/admin_resetting.xml'
prefix: /admin/resetting
Su créé la nostra entitàé utente.
#/src/Entity/User.php
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Sonata\UserBundle\Entity\BaseUser;
/**
* @ORM\Entity
* @ORM\Table(name="user__user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
protected $id;
}
Si mette à giorno il schéma della nostra base di datiées e si credeée il nostro utente admin.
php8.1 bin/console doctrine:schema:update --force
php8.1 bin/console sonata:user:create admin admin@test.com admin123456
php8.1 bin/console sonata:user:promote --super-admin admin
Riavviamo il nostro server e testiamo l’url : http://localhost:8000/admin/dashboard
php8.1 -S localhost:8000 -t public
Siamo stati reindirizzati correttamenteé vers il mirino di login.
L’l'utente è ben autorizzatoé à entrare in’amministratore.
Ora configuriamo la gestione delle mégiorni.
Su crée 3 entitàés : Galleria, ElementoGalleria e Media
in una struttura di rédirectory à parte per non inquinare la nostra applicazione. Faremo la mêmi scelse per UserBundle e ClassificationBundle.
Metteremo tutto in src/Application/Sonata/MediaBundle/Entity
<?php
declare(strict_types=1);
namespace App\Application\Sonata\MediaBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Sonata\MediaBundle\Entity\BaseGallery;
/**
* @phpstan-extends BaseGallery<GalleryItem>
*
* @ORM\Entity
* @ORM\Table(name="media__gallery")
*/
class Gallery extends BaseGallery
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private ?int $id = null;
public function getId(): ?int
{
return $this->id;
}
}
<?php
declare(strict_types=1);
namespace App\Application\Sonata\MediaBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Sonata\MediaBundle\Entity\BaseGalleryItem;
/**
* @ORM\Entity
* @ORM\Table(name="media__gallery_media")
*/
class GalleryItem extends BaseGalleryItem
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private ?int $id = null;
public function getId(): ?int
{
return $this->id;
}
}
<?php
declare(strict_types=1);
namespace App\Application\Sonata\MediaBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Sonata\MediaBundle\Entity\BaseMedia;
use App\Application\Sonata\ClassificationBundle\Entity\SonataClassificationCategory as SonataClassificationCategory;
/**
* @ORM\Entity
* @ORM\Table(name="media__media")
*/
class Media extends BaseMedia
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private ?int $id = null;
/**
* @var SonataClassificationCategory|null
*/
protected ?object $category = null;
public function getId(): ?int
{
return $this->id;
}
public function getCategory(): ?object
{
return $this->category;
}
public function setCategory(?object $category = null): void
{
$this->category = $category;
}
}
Si aggiunge la configurazione in sonata_media.yaml
sonata_media:
class:
media: App\Application\Sonata\MediaBundle\Entity\Media
gallery: App\Application\Sonata\MediaBundle\Entity\Gallery
gallery_item: App\Application\Sonata\MediaBundle\Entity\GalleryItem
default_context: default
db_driver: doctrine_orm
providers:
file:
allowed_extensions: [jpg, png, jpeg, pdf, ogv, mp4, webm]
allowed_mime_types:
- image/pjpeg
- image/jpeg
- image/png
- image/x-png
- application/pdf
- application/x-pdf
- application/ogg
- video/mp4
- video/webm
contexts:
default:
providers:
- sonata.media.provider.dailymotion
- sonata.media.provider.youtube
- sonata.media.provider.image
- sonata.media.provider.file
- sonata.media.provider.vimeo
formats:
small: { width: 100 , quality: 70}
big: { width: 500 , quality: 70}
cdn:
server:
path: /upload/media
filesystem:
local:
# Directory for uploads should be writable
directory: "%kernel.project_dir%/public/upload/media"
create: false
Aggiungiamo la nostra struttura di sovraccarico di MediaBundle in config/packages/doctrine.yaml
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
# IMPORTANT: You MUST configure your server version,
# either here or in the DATABASE_URL env var (see .env file)
#server_version: '13'
orm:
auto_generate_proxy_classes: true
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
auto_mapping: true
mappings:
App:
is_bundle: false
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: App
App\Application\Sonata\MediaBundle:
is_bundle: false
dir: '%kernel.project_dir%/src/Application/Sonata/MediaBundle/Entity'
prefix: 'App\Application\Sonata\MediaBundle\Entity'
alias: App\Application\Sonata\MediaBundle
filters:
softdeleteable:
class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
Si mette à giorno il schéma del databaseées.
php8.1 bin/console doctrine:schema:update --force
Configuriamo il nostro sonata_admin.yml per débisogna.
sonata_admin:
title: Backoffice
title_logo: /bundles/sonataadmin/images/logo_title.png
show_mosaic_button: false
security:
handler: sonata.admin.security.handler.role
options:
default_admin_route: edit
html5_validate: false
global_search:
admin_route: edit
breadcrumbs:
child_admin_route: edit
dashboard:
groups:
users:
label: Users
icon: <i class="fa fa-users"></i>
on_top: true
items:
- sonata.user.admin.user
media:
label: Media
icon: <i class="fa fa-photo"></i>
on_top: true
items:
- sonata.media.admin.media
E tutto funziona.
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.