miércoles, 19 de septiembre de 2012

Ingeniería inversa - Symfony2

Algunos proyectos web obligan a utilizar una base de datos existente y que no se puede modificar. En estos casos no es necesario crear las entidades con las herramientas explicadas en las secciones anteriores. Lo mejor es crear las entidades directamente a partir de la base de datos mediante las herramientas de ingeniería inversa que incluye Symfony2.

En primer lugar, configura la información de acceso a la base de datos mediante el archivo app/ config/parameters.ini (o, si lo prefieres, en el archivo app/config/config.yml). Después, eje- cuta el siguiente comando para transformar la estructura completa de tablas de la base de datos en las clases PHP de las entidades:

$ php app/console doctrine:mapping:import OfertaBundle annotation
Importing mapping information from "default" entity manager
> writing .../OfertaBundle/Entity/Ciudad.php
> writing .../OfertaBundle/Entity/Oferta.php
> writing .../OfertaBundle/Entity/Tienda.php
// ...

El primer argumento del comando es el nombre del bundle en el que se guardan todos los archivos generados automáticamente. El segundo argumento indica el formato utilizado para definir la in- formación de cada entidad. El valor annotation indicado anteriormente hace que la información se defina mediante anotaciones. Por esa razón el comando anterior genera una clase PHP por ca- da tabla de la base de datos e incluye todas las anotaciones necesarias para reflejar la estructura de tablas y el tipo de columnas.

Si el formato indicado es yml o xml, no se generan las clases PHP sino los archivos de configura- ción YAML o XML que se guardan en el directorio Resources/config/doctrine del bundle.

Para completar las entidades, añade los getters y setters con el siguiente comando:

$ php app/console doctrine:generate:entities OfertaBundle

Como todas las entidades de la aplicación se han creado en el bundle OfertaBundle, seguramente el último paso consistirá en colocar el archivo de cada entidad en su bundle correspondiente. No olvides modificar el valor del namespace en todas las clases que muevas de sitio.

Generar las entidades mediante ingeniería inversa es un proceso sencillo y que funciona muy bien, ya que Doctrine2 tiene en cuenta la información de las tablas, columnas, índices, claves primarias y externas. No obstante, el manual de Doctrine2 asegura que cuando el esquema de la base de datos es muy complejo, solamente se puede obtener entre el 70 y el 80% de la información. Con- ceptos como la herencia de entidades, las asociaciones inversas, los eventos y otra información avanzada tendrás que configurarla manualmente.

Y para el CRUD:

php app/console doctrine:generate:crud

Fuente: Desarrollo web ágil con Symfony2 - Javier Eguiluz

miércoles, 5 de septiembre de 2012

Error 403 - Symfony2 - Centos Linux

Error:
403 Forbidden
You don't have permission to access /app_dev.php/aereo/ on this server.
Apache/2.2.15 (CentOS) 
Server at tije.test.local Port 80

Solución:
find /var/www/html -type d -exec chmod -R 775 {} \;
find /var/www/html -type f -exec chmod -R 664 {} \;

Nota: generalmente esto se da en ambiente de producción, por cuestiones de actualización de vendors, no es aconsejable hacerlo en ambiente de testing y/o desarrollo.

Failed to write cache and log file - Linux - Symfony2

Es un problema que sucede cuando no tenemos seteados los permisos correspondientes a la carpeta cache de app.

Error:

Whoops, looks like something went wrong. 1/1 RuntimeException:
Failed to write cache file "/var/www/html/tijedev/app/cache/dev/classes.php".

Solución:

Posicionarse sobre la carpeta app del proyecto y lanzar.

chmod 755 -R cache

Nota:

También puede suceder con los logs, por lo tanto se debe lanzar:

chmod -R 777 logs

La instalación de php sobre Centos no trae las librerias que soportan SOAP:

yum install php-soap

martes, 4 de septiembre de 2012

Cómo minimizar los js y css con YUI Compressor - Symfony2

1) Descargar el JAR de YUI Compressor y guárdalo en:

app/Resources/java/yuicompressor.jar

2) Se debe configurar dos filtros Assetic en tu aplicación, uno para minimizar los JavaScript con el compresor YUI y otro para minimizar hojas de estilo:

#app/config/config.yml
assetic:
 filters:
  yui_css:
   jar: "%kernel.root_dir%/Resources/java/yuicompressor.jar"
  yui_js:
   jar: "%kernel.root_dir%/Resources/java/yuicompressor.jar"

3) Uso

{% javascripts ’@AcmeFooBundle/Resources/public/js/*’ filter=’yui_js’ %}
{% endjavascripts %}
{% stylesheets ’@AcmeFooBundle/Resources/public/css/*’ filter=’yui_css’ %}
{% endstylesheets %}

Migración Proyecto Symfony2 Windows a Linux - Problemas

Error: Class 'DOMDocument' not found
Solución: yum install php-xml

Error: Whoops, looks like something went wrong.
Solución: date.timezone = America/Buenos_Aires

Multihost - Centos

Editar el archivo

gedit /etc/httpd/conf/httpd.conf

1) Descomentar

NameVirtualHost *:80

2) Crear virtual hosts


# Virtual host general.
<VirtualHost *:80>
 DocumentRoot "/var/www/html"
 <Directory "/var/www/html">
  allow from all
  Options +Indexes
 </Directory>
</VirtualHost>

#Desarrollo
<VirtualHost *:80>
 DocumentRoot "/var/www/html/tijedev/web"
 #DirectoryIndex app.php
 ServerName tije.dev.local
 <Directory "/var/www/html/tijedev/web">
  AllowOverride All
  Allow from All
 </Directory>
</VirtualHost>

#Testing
<VirtualHost *:80>
 DocumentRoot "/var/www/html/tijetest/web"
 #DirectoryIndex app.php
 ServerName tije.test.local
 <Directory "/var/www/html/tijetest/web">
  AllowOverride All
  Allow from All
 </Directory>
</VirtualHost>

Abrir el archivo /etc/hosts y agregar los NameVirtual:

127.0.0.1 tije.dev.local
127.0.0.1 tije.test.local

FileZilla - Centos

Instalación de Filezilla sobre Centos:

1. wget http://nchc.dl.sourceforge.net/project/filezilla/FileZilla_Client/3.5.3/FileZilla_3.5.3_i586-linux-gnu.tar.bz2

2. tar -jxvf FileZilla_3.5.3_i586-linux-gnu.tar.bz2

3. cd FileZilla3/bin

4. ./filezilla

Luego mover la carpeta Filezilla3 a /opt

Permisos - Centos

Este comando se aplica a archivos y carpetas, se puede usar -R para dar permisos recursivamente. El comando es:

chmod [opciones] XXX nomCarpeta/nomFichero

Donde:

[opciones]
-R permiso recursivo, se asigna el mismo permiso a carpetas y archivos hijos

XXX
0 = Ningún permiso (Lectura = 0 + Escritura = 0 + Ejecución = 0)
1 = Permiso de Ejecución (Lectura = 0 + Escritura = 0 + Ejecución = 1)
2 = Permiso de Escritura (Lectura = 0 + Escritura = 2 + Ejecución = 0)
3 = Permiso de Escritura y Ejecución (Lectura = 0, Escritura = 2, Ejecución = 1)
4 = Permiso de Lectura (Lectura = 4 + Escritura = 0 + Ejecución = 0)
5 = Permiso de Lectura y Ejecución (Lectura = 4 + Escritura = 0 + Ejecución = 1)
6 = Permiso de Lectura y Escritura (Lectura = 4 + Escritura = 2 + Ejecución = 0)
7 = Permiso de Lectura, Escritura y Ejecución (Lectura = 4 + Escritura = 2 + Ejecución = 1)

¿Entonces, que es, por ejemplo, chmod 644? 

Son los Permisos que tiene asignados cada Identidad, sobre un archivo o carpeta, según su Relación Numérica.

Siempre siguiendo este orden:

Propietario = 6 (Puede Leer y Escribir)
Grupo = 4 (solo puede Leer)
Otros = 4 (solo puede Leer)

Nota: Evidentemente el comando chmod contiene muchas más opciones y formas de asignar permisos, puedes consultarlas consultando el manual del comando, para ello abre un terminal y teclea: