Symfony2: PropertyPath – PropertyAccess Component

Tenía pendiente este artículo sobre la clase PropertyPath al igual que hicimos con ArrayCollection (1 y 2) y lo publicamos ahora ya que la semana pasada se separó del componente Form dando lugar a un nuevo componente llamado PropertyAccess, por lo que ya no hará falta usar todo el componente de formularios para su uso (justo la semana pasada también se separó las colecciones en Doctrine). Esta librería permite acceder a las propiedades de un objeto o array dinámicamente tanto para lectura como para escritura.

PropertyPath

Admite como argumento en el constructor un string indicando la ruta a la propiedad que vamos a acceder, además permite indicar una ruta con varios niveles (esto lo veremos mejor en los ejemplos del final):

Disponemos del método getValue que recibe como parámetro un objeto o un array:

Esto intentaría acceder en el objeto al método getName, isName o hasName y si ninguno de estos métodos existe intentaría mirar directamente en la propiedad como si fuera pública. Si el parámetro es un array hay que indicar la ruta con corchetes.

La clase también tiene el método setValue que recibe como parámetros un objeto o un array y el valor que queremos asignar:

PropertyPath se usa dentro del componente de formularios para acceder (lectura y escritura) a los campos del objeto o array que lleva asociado el formulario.

En mi caso utilicé PropertyPath a la hora de crearme un Type, ImageFileType le llamé, que  lo usaba para en vez del tipo file cuando el fichero era una imagen. Le añadí la opción image_property_path donde le indicaba la ruta del método que devuelve la ruta del fichero (webPathPhoto por ejemplo) para poder mostrar la imagen a la hora de editar al lado del propio campo file. El uso era así:

Esto lo veremos cuando hagamos un artículo en el que veamos cómo crearse un custom Type.

Ejemplo

Vamos primero a configurar el entorno como ya vimos, el composer.json que usaremos será el siguiente:

Y 3 modelos, Person:

City:

Country:

Y finalmente un fichero playgroundPropertyPath.php donde cargamos las fixtures y haremos las pruebas:

Método getValue, debajo de cada llamada está la que hace internamente y el resultado:

Método setValue:

Se puede ver el código en GitHub.