tengo un mecanismo de precios algo complejo en mi aplicación- Éstos son algunos de mis reglas de negocio para establecer la etapa (entidades están en negrita ):Symfony2/Doctrine, teniendo que poner la lógica de negocio en mi controlador? Y duplicar el controlador?
- Un Producto pueden tener únicas puntos de precio para un Cliente, Sitio web, o Grupo de clientes.
- Un Producto veces puede tener una o más opciones que pueden tener sus propios puntos de precio o reglas de precios.
- A El producto tiene una Unique Addition seleccionada por el usuario, que es esencialmente un precio y un número entero.
En este momento, tengo una EntityRepository para puntos de precio para determinar esencialmente el punto de precio correcto para el producto base. Lo mismo ocurre con el Unique Addition y el Opciones.
PricePointRepository
public function getThePrice($Product, $qty, $Website, $Customer = null)
{
//all logic to get product price for this given instance goes here. Good.
}
Controlador (simplificado)
public function indexAction()
{
$Product = $em->dostuffwithpostdata;
$qty = POST['qty']; //inb4insecure trolls
$Website = $em->dostuff();
$Customer = (if user is logged in, return their object with $em, otherwise null as it is a guest or public person); // No business logic here, just understanding the request.
$price = $em->getRepository(PricePointRepository)->getThePrice($Product,$qty,Website,$Customer);
$Options[] = $em->dostuffwithPOSTdata;
$optionsPrice = 0;
//Below is some logic directly related to pricing the product.
foreach($Options as $option) {
if($option->hasRule()) {
$optionsPrice += $ruleprice; //after some other stuff of course)
} else {
$optionsPrice += $em->getRepository(OptionPricePoints)->getPrice($option->getID(),$qty);
}
}
$uniqueAdditionPrice = $em->stuff;
$finalprice = $price + $optionsPrice + $uniqueAdditionPrice; //This is logic related to how I price this type of product!
$unitprice = $finalprice/$qty;
//twig stuff to render and show $finalprice, $unitprice, $uniqueAdditionPrice
}
Eso es sólo para la página del producto. Qué sucede cuando llego al carro, guardo el pedido, etc., cuando esta lógica necesita ser reutilizada. Como puede ver, utilizo Doctrine para extraer datos en función de mi lógica empresarial en las clases de repositorio.
Agradezco gustosamente las respuestas de urdoingitwrong, porque realmente creo que esto está mal. ¿Cómo hago para arreglar esto? Algo hermoso sería un servicio que en esencia es la siguiente:
$pricer = getPricerService->Pricer($Entities,$postdata,$etc);
$unitPrice = $pricer->getUnitPrice();
$totalPrice = $pricer->getTotalPrice();
$optionsPrice = $pricer->getOptionsPrice();
Pero no tengo ni idea de cómo hacer para hacer que el interior de Symfony/Doctrina, especialmente la forma en Doctrina y repositorios se accede en los controladores.
Fantástico, ¡gracias! Entre su respuesta y la de Kuba tengo una idea de cómo lograr esta parte de la aplicación. – Nick
¿Qué sucede si quiere combinar dos llamadas de servicio en la misma transacción? – GorillaApe