A mi parecer la opción más limpia es la 2, aunque te recomendaría usar un DataMapper
¿Que es un Data Mapper?
Precisamente es una capa entre el controlador y tu capa de persistencia, a la que le alimentas objetos y te regresa objetos, es la opción más limpia a mi parecer y así no expones código de tu capa de persistencia al controlador y esta, esta totalmente contenida.
Lo ideal en este caso es que crees un objeto en tu controlador (no importa el input ya sea un request, etc.) Y pases este objeto a tu capa, que se encarga de llamar a la persistencia y salvar el objeto (esto hace que puedas implementar cualquier ORM de una forma más sencilla).
Un ejemplo:
Código PHP:
Ver originalpublic function fooAction()
{
$aPostData = $this->getRequest()->getPost();
$Producto = new Model_Producto();
$Producto->setTitle($aPostData['title'])
->setDescription($aPostData['description']);
$ProductoMapper = new Application_Model_Mapper_Productos();
$ProductoMapper->saveProducto($Producto);
}
Mapper:
Código PHP:
Ver originalpublic function saveProducto(Model_Producto $Producto)
{
$DbTable = new Application_Model_DbTable_Producto();
'title' => $Producto->getTitle(),
'description' => $Producto->getDescription()
);
$DbTable->insert($aData);
}
Puede parecer más código (y lo es) pero depende mucho como abstraigas, igual puedes crear un Base_Model, Factory, etc. La idea es abstraer el paso de datos entre tu controller y tu capa ORM.
Saludos.