Development

Documentation/it_IT/book/1.0/17-Extending-Symfony (diff)

You must first sign up to be able to contribute.

Changes between Version 7 and Version 8 of Documentation/it_IT/book/1.0/17-Extending-Symfony

Show
Ignore:
Author:
Simone.Carletti (IP: 79.12.213.206)
Timestamp:
11/10/07 15:48:41 (10 years ago)
Comment:

Fixed typo

Legend:

Unmodified
Added
Removed
Modified
  • Documentation/it_IT/book/1.0/17-Extending-Symfony

    v7 v8  
    1010----- 
    1111 
    12 Fra tutte le limitazioni di PHP, una delle più fastidiose è che una classe non possa estenderne più di una. Un'altra limitazione è quella di non poter aggiungere metodi ad una classe esistente o fare l'override di quelli esistenti. Per evitare tali inconvenienti e per rendere il framework veramente estendibile, symfony introduce una classe chiamata `sfMixer`. Essa non è in alcun modo correlata a dispositivi per cucinare, piuttosto al concetto di mixin che si trova nella programmazione ad oggetti. Un mixin è un gruppo di metodi o funzioni che possono essere mescolati in una classe per estenderla. 
     12Fra tutte le limitazioni di PHP, una delle più fastidiose è che non è permetto ad una classe di estendere più di una classe alla volta. Un'altra limitazione è quella di non poter aggiungere metodi ad una classe esistente o fare l'override di quelli esistenti. Per evitare tali inconvenienti e per rendere il framework veramente estendibile, symfony introduce una classe chiamata `sfMixer`. Essa non è in alcun modo correlata a dispositivi per cucinare, piuttosto al concetto di mixin che si trova nella programmazione ad oggetti. Un mixin è un gruppo di metodi o funzioni che possono essere mescolati in una classe per estenderla. 
    1313 
    1414### Capire l'ereditarietà multipla 
    100100>Il meccanismo di mixin di symfony è utile in diversi casi. Simulare l'ereditarietà multipla, come nel caso precedente, è solo una delle possibilità. 
    101101> 
    102 >Puoi usare i mixin per alterare un metodo dopo la sua dichiarazione. Ad esempio, nella costruzione di una libreria grafica, probabilmente implementeresti un oggetto `Line` che rappresenta una linea. Esso avrà quattro attributi (le coordinate delle estremità) ed un metodo`draw()` per disegnarla. Una `ColoredLine` dovrebbe avere gli stessi metodi e proprietà, ma con un attributo aggiuntivo, `color`, per specificarne il colore. Inoltre, il metodo `draw()` sarebbe un pò diverso da quello della semplice `Line`, per poter usare il colore. Potresti pacchettizzare le funzionalità di un elemento grafico per gestire il colore in una classe `ColoredElement`. Questo ti permetterebbe di riutilizzare il metodo del colore per altri elementi grafici (`Dot`, `Polygon`, e così via). In questo caso, l'implementazione ideale della classe `ColoredLine` sarebbe un'estensione della classe `Line`, con i metodi di `ColoredElement` mescolati al suo interno. Il metodo finale `draw()` sarebbe un mix tra l'originale di `Line` e quello di `ColoredElement`. 
     102>Puoi usare i mixin per alterare un metodo dopo la sua dichiarazione. Ad esempio, nella costruzione di una libreria grafica, probabilmente implementeresti un oggetto `Line` che rappresenta una linea. Esso avrà quattro attributi (le coordinate delle estremità) ed un metodo `draw()` per disegnarla. Una `ColoredLine` dovrebbe avere gli stessi metodi e proprietà, ma con un attributo aggiuntivo, `color`, per specificarne il colore. Inoltre, il metodo `draw()` sarebbe un pò diverso da quello della semplice `Line`, per poter usare il colore. Potresti pacchettizzare le funzionalità di un elemento grafico per gestire il colore in una classe `ColoredElement`. Questo ti permetterebbe di riutilizzare il metodo del colore per altri elementi grafici (`Dot`, `Polygon`, e così via). In questo caso, l'implementazione ideale della classe `ColoredLine` sarebbe un'estensione della classe `Line`, con i metodi di `ColoredElement` mescolati al suo interno. Il metodo finale `draw()` sarebbe un mix tra l'originale di `Line` e quello di `ColoredElement`. 
    103103> 
    104104>I mixin possono anche essere visti come un modo per aggiungere nuovi metodi ad una classe esistente. Ad esempio, la classe action di symfony, chiamata `sfActions`, è definita nel framework. Uno dei limiti di PHP è che non puoi cambiare la definizione di sfActions dopo la sua dichiarazione. Potresti voler aggiungere un metodo personalizzato a sfActions in una delle tue applicazioni; ad esempio, per redirigere una richiesta ad uno speciale web service. A questo scopo, PHP da solo fallirebbe, ma il meccanismo di mixin fornisce la soluzione perfetta. 
    278278### Estendere con maggiore precisione 
    279279 
    280 L'istruzione `sfMixer::callMixins()` è in effetti uno shortcut ad un qualcosa di un pò più elaborato. Esso cicla automaticamente sulla lista dei mixin registrati e li chiama ad uno ad uno, passando l'oggetto ed i parametri correnti. In breve, una chiamata `sfMixer::callMixins()` si comporta più o meno come nel Listato 17-11. 
     280L'istruzione `sfMixer::callMixins()` è in effetti una scorciatoia ad un qualcosa di un pò più elaborato. Esso cicla automaticamente sulla lista dei mixin registrati e li chiama ad uno ad uno, passando l'oggetto ed i parametri correnti. In breve, una chiamata `sfMixer::callMixins()` si comporta più o meno come nel Listato 17-11. 
    281281 
    282282Listato 17-11 - `callMixin()` cicla sui mixin registrati e li esegue 
    288288    } 
    289289 
    290 Se vuoi passare altri parametri o fare qualcosa di speciale con il valore restituito, puoi scrivere esplicitamente il ciclo foreach invece di usare lo shortcut. Controlla il Listato 17-12 per un esempio di mixin maggiormente integrato in una classe. 
     290Se vuoi passare altri parametri o fare qualcosa di speciale con il valore restituito, puoi scrivere esplicitamente il ciclo foreach invece di usare la scorciatoia. Controlla il Listato 17-12 per un esempio di mixin maggiormente integrato in una classe. 
    291291 
    292292Listato 17-12 - Sostituire `callMixin()` con un loop personalizzato 
    336336--------- 
    337337 
    338 Una factory è la definizione di una classe per certi task. Symfony si basa su factories per le sue funzionalità di core come controller e sessioni. Ad esempio, quando il framework ha bisogno di creare una nuova richiesta, cerca nella definizione di factory il nome della classe da utilizzare a tale scopo. La definizione factory di default per le richieste è `sfWebRequest`, quindi symfony crea un oggetto di questa classe per gestire le richieste. Il grande vantaggio di usare una definizione factory è la facilità con cui si possono alterare le funzionalità di core del framework: cambia semplicemente la definizione di factory, e symfony userà la tua classe di richiesta invece della sua. 
     338Una factory è la definizione di una classe per certi task. Symfony si basa su factories per le sue funzionalità core come controller e sessioni. Ad esempio, quando il framework ha bisogno di creare una nuova richiesta, cerca nella definizione di factory il nome della classe da utilizzare a tale scopo. La definizione factory di default per le richieste è `sfWebRequest`, quindi symfony crea un oggetto di questa classe per gestire le richieste. Il grande vantaggio di usare una definizione factory è la facilità con cui si possono alterare le funzionalità di core del framework: cambia semplicemente la definizione di factory, e symfony userà la tua classe di richiesta invece della sua. 
    339339 
    340340Le definizioni di factory sono memorizzate nel file di configurazione `factories.yml`. Il Listato 17-13 mostra il file di default. Ogni definizione è composta da un nome di una classe caricata automaticamente ed, opzionalmente, un insieme di parametri. Ad esempio, la memorizzazione di sessioni (sotto la chiave `storage:`) usa un parametro `session_name` per nominare il cookie creato sul computer client e permettere sessioni persistenti.