Проблемы с получением дочерних данных из класса сущности (через SESSION) - PullRequest
1 голос
/ 09 июля 2020

Я только начал с doctrine / symfony и столкнулся со следующей проблемой:

Фон

У меня 3 объекта:

  1. Конечно
  2. Цены
  3. Скидки

Каждый курс связан с ценой. Цену можно использовать для нескольких курсов. Для каждой цены предусмотрены разные скидки (ожидаемые на дату бронирования).

Что я сделал:

Я добавил функцию в объект курса, чтобы получить текущую цену

class Course {
   // Remark: I will skip the doctine annontation in this example
   
   // properties corresponding to database
   private $name
   private $basicprice
   [...]

   // getters and setters for the properties
   [...]

   // getter to related entities
   public function getPricing() {...}

   // additional functions
   public function getCurrentPrice() {
      dump($this->getPricing());
      dump($this->getPricing()->getName());
      dump($this->getPricing());

      $discounts = $this->getPricing()->getDiscounts(); // <-- BIG ERROR

      // +++ do some magic logic +++
      $currentDiscount = magic();
      $currentPrice    = $this->getBasicPrice() - $currentDiscount; 
     
      return $currentPrice;
   }
}

Что я хочу:

Объект курса хранится в СЕССИИ и теперь должен быть обработан

class BookingController extends AbstractController {
   [...]
   
   public function index() {
      $session = new Session();
      $course  = $session->get('course')
      $price   = $course->getCurrentPrice();
      [...]
   }
}

Проблема

Пока я могу получить ЦЕНУ и СКИДКИ с другими контроллерами, я предполагаю, что проблема в использовании SESSION.

Я не получаю СКИДКИ (ошибка), но проблема в том, что я думаю, что уже на уровне ЦЕНЫ. См. DUMP:

Course.php on line 68:
Proxies\__CG__\App\Entity\Pricing {#948 ▼
  +__isInitialized__: false
  -id: 456
  -name: null
  -createdAt: null
  -updatedAt: null
  -courses: null
  -discounts: null
   …2
}

Course.php on line 69:
null

Course.php on line 70:
Proxies\__CG__\App\Entity\Pricing {#948 ▼
  +__isInitialized__: false
  -id: 456
  -name: null
  -createdAt: null
  -updatedAt: null
  -courses: null
  -discounts: null
   …2
}

Вопросы

  1. Правильно ли размещена эта дополнительная функция в классе курса? Или нужно go в подкласс Course-Class?
  2. Почему я не получаю нужные данные уже на уровне PRICING?

Большое спасибо за ваши идеи !!!

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Кажется, что объект, переданный через SESSION, «мертв», так что отложенная загрузка больше не работает.

Объект сначала нужно «повторно анимировать». После этого Lazy-Loading снова работает:

class BookingController extends AbstractController {
   [...]
   
   public function index() {
      $session   = new Session();
      $course    = $session->get('course')
      $course_id = $course->getId();
      $course    = $this->courseReository->find($course_id);
      $price     = $course->getCurrentPrice();
      [...]
   }
}
0 голосов
/ 09 июля 2020

Это нормально, прайс на эту сущность сброшен как неинициализированный. Он работает с отложенной загрузкой, поэтому, когда вы вызовете какие-либо методы ценообразования, он будет работать правильно.

О ваших вопросах:

  1. Я думаю, что лучше разместить метод для расчет цены с учетом скидок прямо в Ценообразование. Просто потому, что скидки все еще связаны с ценообразованием, а не с курсами;
  2. Как я уже сказал, попробуйте сбросить любой метод get объекта Pricing или даже метод Discount get. Будет работать.
...