Projecte Symfony correctament desplegat

Per configurar correctament un projecte Symfony a la Diputació de Barcelona cal seguir el estàndard de Symfony i tenir en compte que tindrem dos entorns amb configuracions diferents però un codi únic.

1. Versió

Treballarem amb versions LTS (Long Term Suport), actualment Symfony 2.8 LTS amb suport fins al Novembre del 2018.

La propera versió LTS serà Symfony 3.4 planificada per a mitjans del 2017.

Per la vida i la naturalesa dels nostres projectes no treballem amb les versions curtes entre LTS i LTS que tenen un suport per bugs de 9 mesos, com Symfony 3.0, 3.1, etc.

2. Carpetes del projecte

A l’arrel ha d’haver-hi les següents carpetes (Symfony 2.7 LTS o 2.8 LTS):

  • \app          (configuració, cache, logs, ...)
  • \src           (bundles amb el codi font del nostre projecte)
  • \vendor     (codi font de Symfony i les seves dependències)
  • \web         (fitxers i documents públics: JS, CSS, Imatges, ...)

Important no barrejar carpetes o estructures de Symfony 3! Recordem que estem treballant amb les versió LTS i seguim amb Symfony 2.8 LTS.

3. Accés

S'accedirà al projecte a través d'un domini o subdomini que apuntarà directament a la carpeta /web

4. Configuració

Tota la configuració del projecte ha d’anar a: app/config amb fitxers de configuració YML. Aquí tindràs dos tipus de fitxers, les configuracions que son vàlides per a qualsevol entorn i les configuracions específiques de cada entorn. Per exemple:

  • Configuració general comuna per tots entorns: config.yml, routing.ylm, security.yml, etc.
  • Configuracions específiques per a cada entorn: config_prod.yml, config_dev.yml, etc.

Per tant, la configuració relativa a la connexió de la base de dades estarà a: config_prod.yml i a config_dev.yml.

El mateix passa si es fan servir serveis web o similars, caldrà especificar la url del servei web en un fitxer d’entorn, perquè la URL del servei web de desenvolupament serà diferent que la url del servei web de producció.

És una mala pràctica utilitzar configurar paràmetres de configuració a dins del /src

5. Memòria cau

Tota la cache en fitxers físics sempre estarà a: app/cache/{entorn}, i si es defineixen una caché personalitzada li hauran de posar un nom, per exemple “custom_cache” i guardar-ho en una carpeta allí dins per evitar col·lisions: app/cache/{entorn}/custom_cache

6. Entorns

Les característiques de com s’executa cada entorn es defineixen a:

  • /web/app.php            (producció)
  • /web/app_dev.php     (desenvolupament)

Producció s’executa amb les configuracions de producció i amb el log només activat per a errors.

Desenvolupament s’executa amb les configuracions de desenvolupament, el log en mode verbose i la barra de symfony activada.

Exemple d'un app.php típic de producció:

<?php
use Symfony\Component\HttpFoundation\Request;
/** @var \Composer\Autoload\ClassLoader $loader */
$loader = require __DIR__.'/../app/autoload.php';
$kernel = new AppKernel('prod', false);

$kernel = new AppCache($kernel);
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

7. Control d'execpcions

A l'entorn de producció cal definir, almenys, una pàgina d'error404 i d'error500, mai mostrarem el log de depuració de Symfony quan salta una excepció.

El lloc habitual per definir aquest tipus de pàgines és a:

  • app\Resources\TwigBundle\views\Exception\error404.html.twig
  • app\Resources\TwigBundle\views\Exception\error500.html.twig

8. Definició de l'entorn

És important que hi hagi un únic codi i sigui igual a Desenvolupament i a Producció.

La única diferència entre els dos entorns ha de ser el fitxer: \web\.htaccess on especifiquem si s’ha d’arrancar symfony en “mode producció” (app.php) o en “mode desenvolupament” (app_dev.php), i que definirem de la següent manera:

.htaccess tipus de desenvolupament (redirigim tot el trafic al controlador app_dev.php):

DirectoryIndex app_dev.php
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^app_dev\.php(/(.*)|$) %{CONTEXT_PREFIX}/$2 [R=301,L]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^(.*)$ app_dev.php [QSA,L]
    RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]
    RewriteRule .? %{ENV:BASE}app_dev.php [L]
</IfModule>

.htaccess tipus de producció (redirigim tot el tràfic al controlador app.php i bloquegem el app_dev.php):

DirectoryIndex app.php
<Files app_dev.php>
    Order Deny,Allow
    Deny from all
</Files>
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^app\.php(/(.*)|$) %{CONTEXT_PREFIX}/$2 [R=301,L]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^(.*)$ app.php [QSA,L]
    RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]
    RewriteRule .? %{ENV:BASE}app.php [L]
</IfModule>
2
Categories:
Symfony, Plataforma PHP
1
Grups de treball:
Plataforma PHP