Voy a suponer que necesita validación para la persistencia.
No solo View, sino que Model tampoco debe manejar la validación. Durante mis días en TI me di cuenta de que DDD es una de las formas de garantizar que realmente estás haciendo las cosas correctamente, es decir. las clases son realmente responsables de lo que deberían ser.
Al seguir el diseño impulsado por dominio, sus modelos incluyen su lógica de negocios, y eso es todo. Pero no incluyen validación, ¿por qué no?
Supongamos que ya está tan lejos que está utilizando en Data Mapper
lugar de Active Record
persistir en su capa de dominio. Pero aún así, desea que los modelos se validen, por lo que agrega la validación a su Modelo.
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
La lógica de validación garantiza que puede insertar correctamente el modelo en su base de datos MySQL ... Pasan unos meses y decide, quiere almacenar sus Modelos en bases de datos noSQL también, bases de datos, que requieren reglas de validación diferentes a MySQL.
Pero tiene un problema, solo tiene 1 método de validación, pero necesita validar a Model
de 2 maneras diferentes.
Los modelos deben hacer lo que son responsables de hacer , deben cuidar su lógica comercial y hacerlo bien. La validación está vinculada a la persistencia, no a la lógica empresarial, por lo tanto, la validación no pertenece a un modelo .
En Validator
su lugar, debe crear s, que tomará un modelo para validar en su constructor como parámetro, implementar la Validation
interfaz y usar estos Validator
s para validar sus objetos.
interface Validation
{
public function validate();
}
class MySQLConcreteModelValidator implements Validation
{
public function __construct(ConcreteModel $model) { }
public function validate()
{
// you validate your model here
}
}
class RedisConcreteModelValidator implements Validation
{
public function __construct(ConcreteModel $model) { }
public function validate()
{
// you validate your model with different set of rules here
}
}
Si en algún momento en el futuro decide que desea agregar otro método de validación para otra capa de persistencia (porque decidió que Redis y MySQL ya no son el camino a seguir), simplemente creará otro Validator
y usará su IoC
contenedor para obtener la instancia correcta basada en tu config
.