2010-01-25 13 views
6

Esta es una pregunta rápida relacionada con Symfony, pero podría ser una pregunta general de MVC.¿Debe validar en el modelo? (Pregunta basada en Symfony, pero relacionada con MVC general)

Tengo una clase en mi modelo, por ejemplo, WebUser. Esta clase tiene una propiedad de email_address. Este valor debe ser único para cada WebUser.

Ahora, lo he hecho para que todos mis formularios de Symfony validen que el email_address es único para el WebUser, sin embargo, me pregunto si debería agregar esta validación al modelo también.

Pero esto también me hizo pensar, ¿debería realmente validar cada método set() en el modelo? Parece una decisión lo suficientemente sabia como para asegurarse de que no haya datos erróneos en la base de datos, sin embargo, la mayoría de los datos (si no todos) deben pasar por los controladores, que también se validan. ¿Entonces para mí parece que estoy ejecutando la misma validación dos veces y parece inútil?

¿Qué piensas de esto? Todavía me inclino por la validación en el modelo ya que tiene más sentido ya que dicta la lógica comercial.

Si debe validar en el modelo, ¿cómo arroja un error set() apropiado en Symfony que maneja correctamente el marco de formulario?

Gracias.

Respuesta

6

No estoy de acuerdo con "La validación debe ser parte de la lógica del dominio, no de la lógica del front-end".

La validación es una parte funcional compleja de su aplicación y debe tener en cuenta el contexto. es decir. debe saber si el usuario ha iniciado sesión, qué tipo de credenciales tiene, el estado de la solicitud/formulario, etc. Los modelos en su lugar deben ser independientes del contexto (para trabajar en cualquier entorno, no solo con la solicitud HTTP, sino también con cli, etc.), por lo que desconocen el usuario, el estado y la solicitud http. Este es un requisito importante para la capacidad de prueba de sus clases modelo.

Por la razón de suceso, la validación funcional debe pertenecer al formulario que conoce el estado de la aplicación (es decir, la sesión). Symfony ayuda mucho con las clases sfValidator * que pertenecen al componente de formulario. Esa es la razón por la cual los formularios se prueban con la prueba funcional .

La validación de datos debe estar en el modelo en su lugar (es decir, verificar si el valor es un número entero o una cadena, verificar si es nulo y así sucesivamente). Esto se logra fácilmente con las reglas de validación de Doctrine in-schema.

+0

+1 para distinguir entre validación funcional y validación de datos. Aunque, creo que la mayoría de las respuestas (incluida la mía) solo se referían a la validación de datos. Sin embargo, no estoy seguro de que me referiría a lo que describiste como 'validación'. Usualmente solo lo mencionas como controlador o lógica de aplicación. Pero eso es solo semántica. –

+0

¿Qué sucede si no estás usando Doctrine? No usamos una base de datos, estamos usando una API (eventualmente usan una base de datos) –

0

No puedo ayudar con la parte symfony, pero la mayoría de MVC-Frameworks hacen la validación en el modelo, ya que este es el único lugar dentro de un entorno MVC donde la validación debería ser.
Esto se aplica a la validación de los atributos del modelo, por supuesto.

+0

Mira, yo también pensé esto, y tiene sentido. Sin embargo, he estado leyendo y Symfony ve las cosas de forma un poco diferente. Sugieren que es posible que la validación no se aplique a algunos usuarios, por ejemplo, administradores, por lo que la validación debe estar en los controladores de los formularios especificados. Y aplicar esa idea a Symfony y cómo está configurado/funciona parece tener sentido. Oh, bueno, podría tener que ir por esa ruta. –

3

No puedo hablar específicamente a Symfony, pero sé que evité a propósito la validación de formularios de Zend Framework y validar en mis modelos (Zend Framework no proporciona su propio componente de modelo, por lo que no tiene una opinión real importar).

No hay nada de malo con la validación en el formulario, pero creo que también debería estar validando en el modelo. La validación en el formulario puede ser útil para una verificación de entrada rápida y fácil, especialmente si la lógica de procesamiento es compleja: no perderá tiempo trabajando con datos obviamente malos.

razones creo que la validación del modelo es mejor:

  • Existe la posibilidad de un modelo alterará los datos después de su paso por la forma y antes de entrar en la base de datos
  • validación debe ser parte de la lógica de dominio , no lógica de front-end (me doy cuenta de que Symfony parece estar en desacuerdo).
  • El estado de validación viaja con el objeto modelo, en lugar del objeto de formulario.

Si no está totalmente vendido validando solo en el modelo, una combinación de los dos suena como una buena solución.

EDITAR: Al final del día, podría ser más lógico ir con su marco en esto. Si Symfony parece más obstinado hacia la validación en el controlador, y no proporciona una ruta fácil para la validación en el modelo, simplemente vaya con lo que quiere que haga (o la dirección en la que se apoya la comunidad de Symfony). Luchar contra su marco nunca es divertido.

0

Creo que deberías usuario MVC herramienta Validador Ket Insted de utilizar otros se basan en ModelState su easyer y comprobable y su basado en formcollected no al modelo que le dan forma de ejecución libre

Saludos Marwan Hafez

Cuestiones relacionadas