Implement a caching mechanism
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
namespace Krzysiej\RyobiCrawler\Controller;
|
||||
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
|
||||
use Twig\Environment;
|
||||
use Illuminate\Database\Capsule\Manager as Capsule;
|
||||
|
||||
@@ -10,7 +11,7 @@ class BaseController extends AbstractController
|
||||
{
|
||||
protected Environment $twig;
|
||||
|
||||
public function __construct()
|
||||
public function __construct(protected FilesystemAdapter $cache)
|
||||
{
|
||||
$capsule = new Capsule;
|
||||
$capsule->addConnection(['driver' => 'sqlite', 'database' => __DIR__ . '/../../database.sqlite']);
|
||||
|
||||
@@ -11,6 +11,10 @@ final class CategoryController extends BaseController
|
||||
#[Route('/category/{category}', name: 'app_category')]
|
||||
public function __invoke(string $category): Response
|
||||
{
|
||||
if($this->cache->getItem('list_category_'.$category)->isHit()) {
|
||||
return $this->render('productList.html.twig', ['listType' => 'category_'.$category]);
|
||||
}
|
||||
|
||||
$products = Product::with('price')
|
||||
->selectRaw('products.*')
|
||||
->distinct('products.id')
|
||||
@@ -19,6 +23,7 @@ final class CategoryController extends BaseController
|
||||
->orderByDesc('starred')
|
||||
->orderByDesc('created_by')
|
||||
->get();
|
||||
return $this->render('productList.html.twig', ['products' => $products]);
|
||||
|
||||
return $this->render('productList.html.twig', ['products' => $products, 'listType' => 'category_'.$category]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,12 +13,15 @@ final class DiscontinuedController extends BaseController
|
||||
#[Route('/discontinued', name: 'app_discontinued')]
|
||||
public function __invoke(): Response
|
||||
{
|
||||
if($this->cache->getItem('list_discontinued')->isHit()) {
|
||||
return $this->render('productList.html.twig', ['listType' => 'discontinued']);
|
||||
}
|
||||
|
||||
$products = Product::where('updated_at', '<', now()->format('Y-m-d'))
|
||||
->orderByDesc('starred')
|
||||
->orderByDesc('created_by')
|
||||
->with(['currentPrice'])
|
||||
->get();
|
||||
return $this->render('productList.html.twig', ['products' => $products]);
|
||||
return $this->render('productList.html.twig', ['products' => $products, 'listType' => 'discontinued']);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,10 +11,14 @@ final class IndexController extends BaseController
|
||||
#[Route('/', name: 'app_home')]
|
||||
public function __invoke(): Response
|
||||
{
|
||||
if($this->cache->getItem('list_all')->isHit()) {
|
||||
return $this->render('productList.html.twig', ['listType' => 'all']);
|
||||
}
|
||||
$products = Product::with(['currentStock', 'price'])
|
||||
->orderByDesc('starred')
|
||||
->orderByDesc('created_by')
|
||||
->get();
|
||||
return $this->render('productList.html.twig', ['products' => $products]);
|
||||
|
||||
return $this->render('productList.html.twig', ['products' => $products, 'listType' => 'all']);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,11 +14,15 @@ final class NewController extends BaseController
|
||||
#[Route('/new', name: 'app_new')]
|
||||
public function __invoke(): Response
|
||||
{
|
||||
if($this->cache->getItem('list_new')->isHit()) {
|
||||
return $this->render('productList.html.twig', ['listType' => 'new']);
|
||||
}
|
||||
|
||||
$products = Product::where('created_at', '>', now()->modify('-30 days')->format('Y-m-d'))
|
||||
->orderByDesc('starred')
|
||||
->orderByDesc('created_by')
|
||||
->with(['currentPrice'])
|
||||
->get();
|
||||
return $this->render('productList.html.twig', ['products' => $products]);
|
||||
return $this->render('productList.html.twig', ['products' => $products, 'listType' => 'new']);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace Krzysiej\RyobiCrawler\Controller;
|
||||
|
||||
use Krzysiej\RyobiCrawler\Models\Product;
|
||||
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\Attribute\Route;
|
||||
use Twig\Error\LoaderError;
|
||||
@@ -19,6 +20,10 @@ final class ProductController extends BaseController
|
||||
#[Route('/product/{productId<\d+>}', 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'),
|
||||
|
||||
@@ -12,11 +12,15 @@ final class PromosController extends BaseController
|
||||
#[Route('/promos', name: 'app_promos')]
|
||||
public function __invoke(): Response
|
||||
{
|
||||
if($this->cache->getItem('list_promos')->isHit()) {
|
||||
return $this->render('productList.html.twig', ['listType' => 'promos']);
|
||||
}
|
||||
|
||||
$products = Product::whereHas('currentPrice', fn(Builder $query) => $query->whereColumn('price', '<', 'productStandardPrice'))
|
||||
->orderByDesc('starred')
|
||||
->orderByDesc('created_by')
|
||||
->with(['currentPrice'])
|
||||
->get();
|
||||
return $this->render('productList.html.twig', ['products' => $products]);
|
||||
return $this->render('productList.html.twig', ['products' => $products, 'listType' => 'promos']);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user