Creative Commons License
This work is licensed under a
Creative Commons
Attribution-Share Alike 3.0
Unported License.

Master Symfony2 fundamentals

Be trained by SensioLabs experts (2 to 6 day sessions -- French or English).
trainings.sensiolabs.com

Symfony hosting done right

ServerGrove, outstanding support at the right price for your Symfony hosting needs.
servergrove.com

Discover the SensioLabs Support

Access to the SensioLabs Competency Center for an exclusive and tailor-made support on Symfony
sensiolabs.com

Come sovrascrivere parti di un bundle

Come sovrascrivere parti di un bundle

Questa ricetta è un riferimento veloce su come sovrascrivere le varie parti di un bundle di terze parti.

Template

Per informazioni su come sovrascrivere i template, vedere * Sovrascrivere template dei bundle. * Come usare l'ereditarietà per sovrascrivere parti di un bundle

Rotte

Le rotte non sono mai importate automaticamente in Symfony2. Se si vogliono includere rotte da un bundle, occorre importarle manualmente da qualche parte nella propria applicazione (p.e. app/config/routing.yml).

Il modo migliore per "sovrascrivere" le rotte di un bundle è quello di non importarle affatto. Invece di importare le rotte di un bundle di terze parti, meglio copiare il file delle rotte nella propria applicazione, modificarlo e importare quello.

Controllori

Ipotizzando che un bundle di terze parti usi controllori che non siano servizi (che è quasi sempre il caso), si possono facilmente sovrascrivere tramite l'ereditarietà dei bundle. Per maggiori informazioni, vedere Come usare l'ereditarietà per sovrascrivere parti di un bundle.

Servizi & configurazione

Ci sono due opzioni per poter estendere o sovrascrivere un servizio. La prima è impostare il parametro che contiene il nome della classe del servizio, cambiandolo con la propria classe in app/config/config.yml. Ovviamente, questo è possibile solo se il nome della classe è definito come parametro nella configurazione del servizio del bundle che contiene il servizio. Per esempio, per sovrascrivere la classe usata dal servizio translator di Symfony, si può sovrascrivere il parametro translator.class. Potrebbe essere necessaria un po' di ricerca per sapere quale parametro sovrascrivere. Per il traduttore, il parametro è definito e usato nel file Resources/config/translation.xml di FrameworkBundle:

  • YAML
    1
    2
    3
    # app/config/config.yml
    parameters:
        translator.class:      Acme\HelloBundle\Translation\Translator
    
  • XML
    1
    2
    3
    4
    <!-- app/config/config.xml -->
    <parameters>
        <parameter key="translator.class">Acme\HelloBundle\Translation\Translator</parameter>
    </parameters>
    
  • PHP
    1
    2
    // app/config/config.php
    $container->setParameter('translator.class', 'Acme\HelloBundle\Translation\Translator');
    

Come seconda opzione, se la classe non è disponibile come parametro, ci si potrebbe assicurare che la classe sia sempre sovrascritta quando il proprio bundle viene usato oppure usare un passo di compilatore, per modificare qualcosa che non sia solamente il nome della classe:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// src/Acme/FooBundle/DependencyInjection/Compiler/OverrideServiceCompilerPass.php
namespace Acme\DemoBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class OverrideServiceCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $definition = $container->getDefinition('id-del-servizio-originale');
        $definition->setClass('Acme\DemoBundle\YourService');
    }
}

In questo esempio, recuperiamo la definizione del servizio originale e impostiamo il nome della sua classe nella nostra classe.

Si veda Come lavorare con i passi di compilatore nei bundle per informazioni su come usare i passi di compilatore. Se non si vuole solo sovrascrivere la classe, per esempio si vuole aggiungere la chiamata a un metodo, l'unica opzione è il passo di compilatore.

Entità & mappature

In corso...

Form

Per poter sovrascrivere un tipo di form, questo deve essere registrato come servizio (con il tag "form.type"). Lo si può quindi sovrascrivere come qualsiasi altro servizio, come descritto in servizi & configurazione. Ovviamente, funziona solo se il tipo è referenziato tramite alias, piuttosto che istanziato, p.e.:

1
$builder->add('name', 'tipo_personalizzato');

e non:

1
$builder->add('name', new TipoPersonalizzato());

Meta-dati di validazione

In corso...

Traduzioni

In corso...