Estoy trabajando en una aplicación MVC en PHP que no utiliza ningún framework. Estoy usando RedBean para mi ORM, que implementa el patrón de mapeo de datos y funciona bastante similar al doctrine.¿Debo separar totalmente los modelos y ORM en MVC?
Según este question, entiendo que el modelo NO es el objeto ORM. En mi proyecto tengo los siguientes escenarios:
Modelos "complicado" que deben hablar con un montón de tablas en la base de datos:
- Uno de estos modelos puede ser algo como los permisos de RBAC sistema. Un controlador debe poder llamar a algo como
$permission->isAllowed($controller, $action, $resource)
para determinar si el usuario puede realizar la acción solicitada. Además, puede llamar al$permission->getPermissions()
para obtener una lista de los permisos que tiene el usuario.
- Uno de estos modelos puede ser algo como los permisos de RBAC sistema. Un controlador debe poder llamar a algo como
modelos "simple" donde el modelo generalmente se puede representar por 1 tabla en la base de datos:
- Uno de estos modelos serían el modelo
User
. Por ejemplo$user->changeRank()
,$user->addPoints()
y así sucesivamente.
- Uno de estos modelos serían el modelo
El problema que estoy enfrentando ahora es que mirar más documentación para diversos marcos, puedo ver que en los ejemplos, las conversaciones controlador con el ORM directamente. Por ejemplo, he aquí un ejemplo, el controlador de symfony2:
public function createAction()
{
$product = new Product();
$product->setName('A Foo Bar');
$product->setPrice('19.99');
$product->setDescription('Lorem ipsum dolor');
$em = $this->getDoctrine()->getEntityManager();
$em->persist($product);
$em->flush();
return new Response('Created product id '.$product->getId());
}
Si un ORM no es el modelo, ¿por qué se permitió que el controlador de interactuar directamente con él? ¿No debería interactuar con un modelo que se parece a esto?
class ProductModel{
public function newProduct($name, $price, $description){
$product = new Product();
$product->setName('A Foo Bar');
$product->setPrice('19.99');
$product->setDescription('Lorem ipsum dolor');
$em = $this->getDoctrine()->getEntityManager();
$em->persist($product);
$em->flush();
}
}
Finalmente, describí el modelo permissions
anteriormente. ¿Se considera que esto es un modelo en el contexto de MVC? Esta clase se usará en toda la aplicación, ya que la mayoría de las abcisiones deberán verificar los permisos de acceso.
Gran pregunta. –