Ver índice de contenidos del libro

23.5. Las factorías

A lo largo del tutorial de Jobeet hemos hablado de los objetos internos de Symfony como sfUser, sfRequest, sfResponse, sfI18N, sfRouting, etc. El framework Symfony crea, configura y gestiona automáticamente todos estos objetos. Además, estos objetos siempre son accesibles a través del objeto sfContext, y como muchos otros elementos del framework, se pueden configurar a través de un archivo de configuración llamado factories.yml. Este archivo también permite establecer diferentes opciones para cada entorno.

Cuando sfContext inicializa las factorías, lee el contenido del archivo factories.yml para determinar el nombre de las clases (class) y los parámetros (param) que se pasan al constructor:

response:
  class: sfWebResponse
  param:
    send_http_headers: false

El código anterior hace que cuando Symfony cree la factoría de los objetos de la respuesta, instancie un objeto de la clase sfWebResponse y pase send_http_headers como argumento al constructor.

Como puedes personalizar las factorías, es posible emplear tus propias clases para los objetos internos de Symfony en vez de los objetos por defecto. También puedes modificar el comportamiento de las clases por defecto variando los parámetros que se les pasan.

A continuación vamos a ver algunas de las configuraciones propias más interesantes.

Symfony utiliza una cookie para gestionar las sesiones de usuario. Por defecto, esta cookie se llama symfony, pero se puede modificar en el archivo factories.yml. Dentro de la sección all, añade lo siguiente para cambiar el nombre de la cookie por jobeet:

# apps/frontend/config/factories.yml
storage:
  class: sfSessionStorage
  param:
    session_name: jobeet

23.5.2. Cómo se guardan las sesiones

La clase por defecto encargada de guardar las sesiones se llama sfSessionStorage. Esta clase hace uso del sistema de archivos para guardar toda la información de las sesiones. Si dispones de varios servidores web, quizás te interese centralizar el almacenamiento de las sesiones en una base de datos:

# apps/frontend/config/factories.yml
storage:
  class: sfPDOSessionStorage
  param:
    session_name: jobeet
    db_table:     session
    database:     propel
    db_id_col:    id
    db_data_col:  data
    db_time_col:  time

23.5.3. El tiempo de expiración de las sesiones

El tiempo de expiración por defecto de las sesiones de usuario es de 1800 segundos. Si quieres modificarlo, hazlo en la sección user:

# apps/frontend/config/factories.yml
user:
  class: myUser
  param:
    timeout: 1800

23.5.4. Mensajes de log

El entorno prod no genera por defecto ningún mensaje de log, ya que la clase utilizada por su logger es sfNoLogger:

# apps/frontend/config/factories.yml
prod:
  logger:
    class:   sfNoLogger
    param:
      level:   err
      loggers: ~

Si quieres que se guarden los mensajes de log en algún archivo, puedes cambiar el nombre de la clase de su logger por sfFileLogger:

# apps/frontend/config/factories.yml
logger:
  class: sfFileLogger
  param:
    level: error
    file:  %SF_LOG_DIR%/%SF_APP%_%SF_ENVIRONMENT%.log

Nota En el archivo de configuración factories.yml, las cadenas de texto con el formato %XXX% se reemplazan por su valor correspondiente del objeto sfConfig. Por tanto, utilizar %SF_APP% en un archivo de configuración es equivalente a utilizar sfConfig::get('sf_app') en el código PHP. Esta notación también se puede utilizar en el archivo app.yml. Su principal utilidad es que permite hacer referencia a la ruta de un directorio sin tener que escribir la ruta completa en el archivo de configuración (simplemente debes indicar SF_ROOT_DIR, SF_WEB_DIR, etc.)