Table of Contents
Questions & Feedback
Found a typo or an error?
Want to improve this document? Edit it.
Need support or have a technical question?
Post to the user mailing-list.
Master Symfony2 fundamentals
Symfony hosting done right
Discover the SensioLabs Support
Come padroneggiare e creare nuovi ambienti
Come padroneggiare e creare nuovi ambienti¶
Ogni applicazione è la combinazione di codice e di un insieme di configurazioni
che determinano come il codice dovrà lavorare. La configurazione può definire
la base dati da utilizzare, cosa dovrà essere messo in cache e cosa non, o quanto
esaustivi dovranno essere i log. In Symfony2, l'idea di ambiente è quella di
eseguire il codice, utilizzando differenti configurazioni. Per esempio,
l'ambiente dev dovrebbe usare una configurazione che renda lo sviluppo
semplice e ricco di informazioni, mentre l'ambiente prod dovrebbe usare un
insieme di configurazioni che ottimizzino la velocità.
Ambienti differenti, differenti file di configurazione¶
Una tipica applicazione Symfony2 inizia con tre ambienti: dev, prod
e test. Come si è già detto, ogni "ambiente " rappresenta un modo in cui
eseguire l'intero codice con differenti configurazioni. Non dovrebbe destare
sorpresa il fatto che ogni ambiente carichi i suoi propri file di configurazione.
Se si utilizza il formato di configurazione YAML, verranno utilizzati
i seguenti file:
- per l'ambiente
dev:app/config/config_dev.yml- per l'ambiente
prod:app/config/config_prod.yml- per l'ambiente
test:app/config/config_test.yml
Il funzionamento si basa su di un semplice comportamento predefinito all'interno
della classe AppKernel:
1 2 3 4 5 6 7 8 9 10 11 12 13 | // app/AppKernel.php
// ...
class AppKernel extends Kernel
{
// ...
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
}
}
|
Come si può vedere, quando Symfony2 viene caricato, utilizza l'ambiente per determinare quale file di configurazione caricare. Questo permette di avere ambienti differenti in modo elegante, efficace e trasparente.
Ovviamente, in realtà, ogni ambiente differisce solo per alcuni aspetti dagli altri.
Generalmente, gli ambienti condividono gran parte della loro configurazione.
Aprendo il file di configurazione di dev, si può vedere come questo venga
ottenuto facilmente e in modo trasparente:
- YAML
1 2 3
imports: - { resource: config.yml } # ...
- XML
1 2 3 4
<imports> <import resource="config.xml" /> </imports> <!-- ... -->
- PHP
1 2
$loader->import('config.php'); // ...
Per condividere una configurazione comune, i file di configurazione di ogni ambiente
importano, per iniziare, un file di configurazione comune (config.yml).
Il resto del file potrà deviare dalla configurazione predefinita, sovrascrivendo
i singoli parametri. Ad esempio, nell'ambiente dev, la barra delle applicazioni
viene attivata modificando, nel file di configurazione di dev, il relativo
parametro predefinito:
- YAML
1 2 3 4 5 6 7
# app/config/config_dev.yml imports: - { resource: config.yml } web_profiler: toolbar: true # ...
- XML
<!-- app/config/config_dev.xml --> <imports> <import resource="config.xml" /> </imports> <webprofiler:config toolbar="true" ... /> - PHP
1 2 3 4 5 6 7 8
// app/config/config_dev.php $loader->import('config.php'); $container->loadFromExtension('web_profiler', array( 'toolbar' => true, // ... ));
Eseguire un'applicazione in ambienti differenti¶
Per eseguire l'applicazione in ogni ambiente, sarà necessario caricarla
utilizzando il front controller app.php (per l'ambiente prod) o
utilizzando il front controller app_dev.php (per l'ambiente dev):
1 2 | http://localhost/app.php -> ambiente *prod*
http://localhost/app_dev.php -> ambiente *dev*
|
Note
Le precedenti URL presuppongono che il server web sia configurato in modo da
usare la cartella web/ dell'applicazione, come radice. Per approfondire, si legga
Installare Symfony2.
Guardando il contenuto di questi file, si vede come l'ambiente utilizzato da entrambi, sia definito in modo esplicito:
1 2 3 4 5 6 7 8 9 | <?php
require_once __DIR__.'/../app/bootstrap_cache.php';
require_once __DIR__.'/../app/AppCache.php';
use Symfony\Component\HttpFoundation\Request;
$kernel = new AppCache(new AppKernel('prod', false));
$kernel->handle(Request::createFromGlobals())->send();
|
Si può vedere come la chiave prod specifica che l'ambiente di esecuzione
sarà l'ambiente prod. Un'applicazione Symfony2 può essere esguita in qualsiasi
ambiente utilizzando lo stesso codice, cambiando la sola stringa relativa all'ambiente.
Note
L'ambiente test è utilizzato quando si scrivono i test funzionali e
non è perciò accessibile direttamente dal browser tramite un front controller.
In altre parole, diversamente dagli altri ambienti, non c'è alcun file,
per il front controller, del tipo app_test.php.
Creare un nuovo ambiente¶
Un'applicazione Symfony2 viene generata con tre ambienti preconfigurati per gestire la maggior parte dei casi. Ovviamente, visto che un ambiente non è nient'altro che una stringa che corrisponde a un insieme di configurazioni, creare un nuovo ambiente è abbastanza semplice.
Supponiamo, per esempio, di voler misurare le prestazioni dell'applicazione
prima del suo invio in produzione. Un modo è quello di usare una configurazione
simile a quella del rilascio ma che utilizzasse il web_profiler di Symfony2.
Queso permetterebbe a Symfony2 di registrare le informazioni dell'applicazione mentre se ne misura le prestazioni.
Il modo migliore per ottenere tutto ciò è tramite un ambiente che si chiami, per esempio,
benchmark. Si parte creando un nuovo file di configurazione:
- YAML
1 2 3 4 5 6
# app/config/config_benchmark.yml imports: - { resource: config_prod.yml } framework: profiler: { only_exceptions: false }
- XML
1 2 3 4 5 6 7 8
<!-- app/config/config_benchmark.xml --> <imports> <import resource="config_prod.xml" /> </imports> <framework:config> <framework:profiler only-exceptions="false" /> </framework:config>
- PHP
1 2 3 4 5 6
// app/config/config_benchmark.php $loader->import('config_prod.php') $container->loadFromExtension('framework', array( 'profiler' => array('only-exceptions' => false), ));
Con queste poche e semplici modifiche, l'applicazione supporta un nuovo
ambiente chiamato benchmark.
Questa nuova configurazione importa la configurazione dell'ambiente prod
e la modifica. Così si garantice che l'ambiente sia identico a quello
prod eccetto per le modifiche espressamente inserite in configurazione.
Siccome sarà necessario che l'ambiente sia accessibile tramite browser, sarà
necessario creare un apposito front controller. Basterà copiare il file web/app.php
nel file web/app_benchmark.php e modificare l'ambiente in modo che punti a benchmark:
1 2 3 4 5 6 7 8 9 | <?php
require_once __DIR__.'/../app/bootstrap.php';
require_once __DIR__.'/../app/AppKernel.php';
use Symfony\Component\HttpFoundation\Request;
$kernel = new AppKernel('benchmark', false);
$kernel->handle(Request::createFromGlobals())->send();
|
Il nuovo ambiente sarà accessibile tramite:
1 | http://localhost/app_benchmark.php
|
Note
Alcuni ambienti, come il dev, non dovrebbero mai essere accessibile su di
un server pubblico di produzione. Questo perché alcuni ambienti, per facilitarne
il debug, potrebbero fornire troppe informazioni relative all'infrastruttura
sottostante l'applicazione. Per essere sicuri che questi ambienti non siano
accessibili, il front controller è solitamente protetto dall'accesso da parte di
indirizzi IP esterni tramite il seguente codice, posto in cima al controllore:
1 2 3 if (!in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1'))) { die('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.'); }
Gli ambienti e la cartella della cache¶
Symfony2 sfrutta la cache in diversi modi: la configurazione dell'applicazione, la configurazione delle rotte, i template di Twig vengono tutti immagazzinati in oggetti PHP e salvati su file nella cartella della cache.
Normalmente questi file sono conservati principalmente nella cartella app/cache.
Comunque ogni ambiente usa il suo proprio insieme di file della cache:
1 2 | app/cache/dev - cartella per la cache dell'ambiente *dev*
app/cache/prod - cartella per la cache dell'ambiente *prod*
|
Alcune volte, durante il debug, può essere utile poter controllare i file
salvati in cache, per capire come le cose stiano funzionando. In questi casi
bisogna ricordarsi di guardare nella cartella dell'ambiente che si sta utilizzando
(solitamente, in fase di sviluppo e debug, il dev). Sebbene possa variare,
il contenuto della cartella app/cache/dev includerà i seguenti file:
appDevDebugProjectContainer.php- il "contenitore di servizi" salvato in cache che rappresenta la configurazione dell'applicazione;appdevUrlGenerator.php- la classe PHP generata a partire dalla configurazione delle rotte e usata nella generazione degli URL;appdevUrlMatcher.php- la classe PHP utilizzata per ricercare le rotte: qui è possibile vedere le espressioni regolari utilizzate per associare gli URL in ingresso con le rotte disponibili;twig/- questa cartella contiene la cache dei template di Twig.
Note
Si possono cambiare facilmente posizione e nome della cartella. Per maggiori informazioni, si legga la ricetta Modificare la struttura della cartelle predefinita.
Approfondimenti¶
Si legga la ricetta Configurare parametri esterni nel contenitore dei servizi.





is a trademark of Fabien Potencier. All rights reserved.