@Qixing

Как переопределить значение свойства сущности при помощи сервиса в Symfony2?

Добрый день.
Мне нужно выводить разную конечную цену на продукт в зависимости от условий ( скажем группы пользователя).
Если у меня везде прописано уже в шаблонах. {{ item.price }}
Как мне реализовать сервис, что бы он перехватывал $item->getPrice и возвращал нужное значение.
Ссылки на примеры приветствуются

Накидал пока так
<?php
namespace Bundle\Service;

class Price
{
    public function __construct($ratio , $minCommission) 
    {
        $this->ratio = $ratio;
        $this->minCommission = $minCommission; 
    }

    public function actualPrice($price)
    {
        return $price > 20000 ? $price * $this->ratio : $price + $this->minCommission;
    }
}


crbr.price:
        class: CrbrBundle\Service\Price
        arguments:
            - %price_ratio%
            - %price_minCommission


parameters:
     price_ratio : 1.1
     price_minCommission: 1500
  • Вопрос задан
  • 2637 просмотров
Решения вопроса 2
error500
@error500
PHP-developer
В вашем случае, я считаю, можно поступить иначе - реализовать twig фильтр, и в самом шаблоне уже делать так {{ item.price| actualPrice }} .
Ответ написан
lexxpavlov
@lexxpavlov
Программист, преподаватель
прямо так - никак не сделать. Нужно достаточно сильно изменять работу с сущностью.
1) Можно сделать прокси-класс, имеющий расширенную логику в части некоторых свойств объекта, и передающий остальные свойства без изменений.
2) Можно обрабатывать нужные свойства отдельным вызовом перед передачей объекта в шаблон - передать объект сущности в метод сервиса, и там изменить значения свойств.
3) Можно поставить обработчик событий, который будет перехватывать системные события загрузки сущности и в обработчике изменять объект.
Сущности доктрины - это просто обычный класс. И в идеале не стоит передавать в неё что-то внешнее, привносить лишнюю зависимость (например, не надо передавать текущего пользователя, имеющего роли).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы