}', name: 'app_product')] public function __invoke(int $productId): Response { if($this->cache->getItem('product'.$productId)->isHit()) { return $this->render('product.html.twig', ['product' => ['id' => $productId]]); } $product = Product::with([ 'price' => fn($query) => $query->orderBy('created_at', 'desc'), 'stock' => fn($query) => $query->orderBy('created_at', 'desc'), ])->find($productId); if (null === $product) { throw $this->createNotFoundException('Product not found'); } $priceList = $product->price()->pluck('price'); $stockList = $product->stock()->pluck('stock'); $priceDates = $product->price()->pluck('created_at')->map(fn($date) => $date->format('Y-m-d'))->toArray(); $stockDates = $product->stock()->pluck('created_at')->map(fn($date) => $date->format('Y-m-d'))->toArray(); return $this->render('product.html.twig', [ 'product' => $product, 'price_list' => $this->prepareChartData($priceDates, $priceList), 'stock_list' => $this->prepareChartData($stockDates, $stockList), 'price_dates' => implode("','", $priceDates), ]); } private function prepareChartData($set1, $set2): string { $data = []; foreach ($set1 as $key => $value) { $data[] = ['x' => $value, 'y' => $set2[$key]]; } $stringData = json_encode($data); return str_replace(['"x"', '"y"'], ['x', 'y'], $stringData); } }