Vamos a ver como configurar un proyecto symfony estableciendo como ORM Doctine.
Lo primero que vamos a hacer es un directorio en nuestro directorio de usuario de linux con el nombre del proyecto; vamos a llamar a nuestro proyecto mosacio. Yo suelo poner todos los proyectos que desarrollo con symfony bajo un directorio llamado sfproyects, por lo tanto
1
2
3
4
5
| $ cd
$ mkdir sfprojects
$ cd sfprojects
$ mkdir mosaico
$ cd mosaico |
Bueno, estamo en el directorio que contendrá todos los ficheros y directorio de nuestro proyecto symfony. Ahora vamos a crear dos directorio, en el directorio vendor estará symfony que descargaremos y configuraremos después. Estando en el directorio de trabajo (mosaico), lanzamos el siguiente comando para crear los directorios comentados
Nos movemos al reciente directorio creado:
Ahora debemos descargar symfony, vamos a trabajar con la versión 1.2, por lo tanto vamos a la página y lo descargamos guardando el archivo symfony-1.2.8.tgz en el recien creado directorio vendor. Vamos a descomprimir y cambiamo el directorio descomprimido al nombre de symfony, borrando el fichero descargado después
1
2
3
| $ tar zxpf symfony-1.2.8.tgz
$ mv symfony-1.2.8 symfony
$ rm symfony-1.2.8.tgz |
Vamos a comprobar la configuración, llamaremos a un archivo php que se va a encargar de decirnos que fallos contiene nuestro sistema para el desarrollo normal con symfony. Nos movemos al directorio mosaico y llamamos a un archivo que se encargará de hacer esa comprobación.
1
2
| $ cd ../..
$ php lib/vendor/symfony/data/bin/check_configuration.php |
Otra forma es coger ese fichero, el check_configuration.php y ponerlo en tu servidor web y llamarlo.
Deberiamos obtener algo así
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| ********************************
* *
* symfony requirements check *
* *
********************************
php.ini used by PHP: /etc/php5/cli/php.ini
** WARNING **
* The PHP CLI can use a different php.ini file
* than the one used with your web server.
* If this is the case, please launch this
* utility from your web server.
** WARNING **
** Mandatory requirements **
OK PHP version is at least 5.2.4
OK php.ini has zend.ze1_compatibility_mode set to off
** Optional checks **
OK PDO is installed
OK PDO has some drivers installed: mysql
OK PHP-XML module is installed
OK XSL module is installed
OK The token_get_all() function is available
OK The mb_strlen() function is available
OK The iconv() function is available
OK The utf8_decode() is available
OK A PHP accelerator is installed
OK php.ini has short_open_tag set to off
OK php.ini has magic_quotes_gpc set to off
OK php.ini has register_globals set to off
OK php.ini has session.auto_start set to off
OK PHP version is not 5.2.9 |
Algunas cosas que quizás te salgan como warning serán php.ini has short_open_tag, php.ini has magic_quotes_gpc, esto se soluciona buscando esas palabras en el fichero de configuración php.ini y poniendo su valor a Off.
Un proyecto de symfony se divide en aplicaciones y estas en módulos. Las aplicaciones más importantes para un proyecto suelen ser el frontend, esto es, lo que será público para cuando se accede a nuestra aplicación y otra aplicación, el backend, zona restringida al público y desde donde controlaremos nuestra página web. Vamos a crear nuestro frontend; antes crearemos el proyecto:
1
| $ php lib/vendor/symfony/data/bin/symfony generate:project mosaico |
No, eso no ha sido matrix, simplemente la creación de directorios y ficheros de un proyecto symfony. Vamos ahora a crear la aplicación:
1
| $ php lib/vendor/symfony/data/bin/symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret frontend |
si haceis un ls vereis algunas carpetas como apps, cache, config, data, doc, lib, log, plugins, test, web, dentro de la carpeta apps contiene la aplicación recién creada frontend. Además de las carpetas que ha creado ha puesto un enlace simbólico al comando symfony, por lo tanto de aquí en adelante nos olvidamos de php lib/vendor/symfony/data/bin/symfony y como estamos en un sistema tipo Unix podemos simplemente llamar al comando symfony como ./symfony en vez de php symfony si lo haceis vereis todos los comandos que podemos lanzar.
Vamos a cambiar un fichero de configuración del proyecto, para eso editamos el fichero que está en la carpeta config/ y el fihcero se llama ProjectConfiguration.class.php
1
| $ gedit config/ProjectConfiguration.class.php |
Cambiamos esta línea:
1
| require_once '/home/jfrank/sfprojects/mosaico/lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php'; |
por esta otra:
1
| require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php'; |
¿Qué conseguimos con esto?, pues simplemente quitarle la rigidez al buscar el archivo sfCoreAutoload.php predefinido con la ruta absoluta y decirle que lo busque desde donde esté el archivo ProjectConfiguration.class.php. Ahora podrás llevarte la carpeta del proyecto a cualquier ubicación y el proyecto seguirá funcionando perfectamente.
El proyecto y la aplicación están ok, vamos a meterle mano a doctrine. Cuando se crea el proyecto se utiliza un ORM que se está utilizando desde que nació symfony, Propel, por lo tanto hay cosas de propel desperdigadas por los directorios que nos vamos a encargar de borrar y modificar para que sea Doctrine el ORM que vamos a utilizar.
Vamos a entrar de nuevo al fichero de configuración ProjectConfiguration.class.php y vamos a hacer algunas modificaciones
1
| $ gedit config/ProjectConfiguration.class.php |
El fihcero ProjectConfiguration.class.php
1
2
3
4
5
6
7
8
9
10
11
| <?php
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
sfCoreAutoload::register();
class ProjectConfiguration extends sfProjectConfiguration
{
public function setup()
{
// for compatibility / remove and enable only the plugins you want
$this->enableAllPluginsExcept(array('sfDoctrinePlugin', 'sfCompat10Plugin'));
}
} |
nos tiene que quedar así:
1
2
3
4
5
6
7
8
9
10
11
| <?php
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
sfCoreAutoload::register();
class ProjectConfiguration extends sfProjectConfiguration
{
public function setup()
{
// for compatibility / remove and enable only the plugins you want
$this->enableAllPluginsExcept(array('sfPropelPlugin', 'sfCompat10Plugin'));
}
} |
Con esto lo que indicamos es que en vez de cargar el plugin de Propel cargue el de Doctrine.
Después de este cambio vamos a borrar la cache:
Tras instalar cualquier plugin o habilitarlo debemos tenemos que llamar a la siguiente función:
1
| $ ./symfony plugin:publish-assets |
Vamos a borrar ficheros que hubiera de Propel:
1
2
3
| $ rm web/sfPropelPlugin
$ rm config/propel.ini
$ rm config/schema.yml |
Y creamos un directorio para Doctrine:
1
| $ mkdir config/doctrine |
Vale, el proyecto symfony para que utilice doctrine como ORM está listo, vamos a configurar apache para que pueda ver el proyecto. Para esto nos puede venir bien algo que no se comenta mucho en la documentación, pero es un fichero que nos ayudaría a crear el directorio virtual de apache, tenemos un fichero llamado vhost.sample dentro de config, este es el fichero:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # Be sure to only have this line once in your configuration
NameVirtualHost 127.0.0.1:80
# This is the configuration for mosaico
Listen 127.0.0.1:80
<VirtualHost 127.0.0.1:80>
ServerName mosaico.localhost
DocumentRoot "/home/jfrank/sfprojects/mosaico/web"
DirectoryIndex index.php
<Directory "/home/jfrank/sfprojects/mosaico/web">
AllowOverride All
Allow from All
</Directory>
Alias /sf "/home/jfrank/sfprojects/mosaico/lib/vendor/symfony/data/web/sf"
<Directory "/home/jfrank/sfprojects/mosaico/lib/vendor/symfony/data/web/sf">
AllowOverride All
Allow from All
</Directory>
</VirtualHost> |
Como nuestra intención es que se pueda acceder por medio de http://mosaico.localhost y no utilizar puertos vamos a borrar las 4 primeras lineas y lo vamos a añadir a httpd.conf
Vamos a editar el httpd.conf de apache para insertarlo allí.
Editamos httpd.conf:
1
| $ sudo gedit /etc/apache2/httpd.conf |
y añadimos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # This is the configuration for mosaico
<VirtualHost 127.0.0.1:80>
ServerName mosaico.localhost
DocumentRoot "/home/jfrank/sfprojects/mosaico/web"
DirectoryIndex index.php
<Directory "/home/jfrank/sfprojects/mosaico/web">
AllowOverride All
Allow from All
</Directory>
Alias /sf "/home/jfrank/sfprojects/mosaico/lib/vendor/symfony/data/web/sf"
<Directory "/home/jfrank/sfprojects/mosaico/lib/vendor/symfony/data/web/sf">
AllowOverride All
Allow from All
</Directory>
</VirtualHost> |
También tendremos que añadir el nuevo host, para ello editamos hosts
1
| $ sudo gedit /etc/hosts |
y añadimos 127.0.0.1 mosaico.localhost
Reiniciamos apache
1
| $ sudo /etc/init.d/apache restart |
Si teneis varios proyectos puestos por directorio virtual, al reiniciar os puede decir algo como VirtualHost overlaps, esto es porque se utiliza siempre el 127.0.0.1, no pasa nada, seguirá funcionando igual, para solucionarlo puedes cambiar la ip de cada proyecto, por ejemplo para el primero 127.0.0.1, para el segundo 127.0.0.2 y asi sucesivamente.
Accedemos a nuestra aplicación: http://mosaico.localhost

Proyecto configurado
Este sería el proyecto en producción, lo que vería el público, pero podemos acceder al proyecto en entorno de desarrollo donde podremos acceder a un montón de variables que nos ayudarán en el proceso de desarrollo, para acceder al entorno de desarrollo, entonces tendremos que ir a
http://mosaico.localhost/frontend_dev.php, en la parte superior derecha podemos ver una barra con todos los datos que se manejan.

Proyecto en entorno de desarrollo
Hasta aquí, veremos en futuros post como crear nuestra base de datos, configurarla en el proyecto, cargar la base de datos por medio de un fichero de texto (fixtures) y como cambiar esa pantalla que es la que da por defecto symfony por nuestra aplicación en sí