В PrestaShop 1.8 была внедрена современная архитектура маршрутизации и контроллеров, которая упрощает процесс разработки и улучшает структуру кода. В этом руководстве мы рассмотрим основные концепции и примеры использования современных маршрутов и контроллеров в PrestaShop.
Обзор маршрутизации
Маршрутизация в PrestaShop основана на компоненте Symfony Routing. Это позволяет определять маршруты, которые связывают URL-адреса с контроллерами и их действиями.
Определение маршрутов
Маршруты определяются в файлах YAML или PHP. Основной файл конфигурации маршрутов находится в config/routes.yml. Пример маршрута:
# config/routes.yml
product_list:
path: /products
controller: App\Controller\ProductController::list
methods: [GET]
В этом примере маршрут /products обрабатывается методом list класса ProductController.
Создание контроллеров
Контроллеры в PrestaShop следуют стандартам Symfony и располагаются в директории src/Controller. Контроллеры должны наследоваться от AbstractController.
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class ProductController extends AbstractController
{
/**
* @Route("/products", name="product_list", methods={"GET"})
*/
public function list(): Response
{
// Логика получения списка продуктов
return $this->render('product/list.html.twig', [
'products' => $products,
]);
}
}
В этом примере метод list обрабатывает маршрут /products и возвращает шаблон product/list.html.twig с данными продуктов.
Работа с аннотациями
Вместо определения маршрутов в файлах YAML, вы можете использовать аннотации прямо в контроллерах. Это упрощает процесс создания маршрутов и улучшает читаемость кода.
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class OrderController extends AbstractController
{
/**
* @Route("/orders", name="order_list", methods={"GET"})
*/
public function list(): Response
{
// Логика получения списка заказов
return $this->render('order/list.html.twig', [
'orders' => $orders,
]);
}
}
Использование аннотаций позволяет легко добавлять новые маршруты и быстро вносить изменения в существующие.
Внедрение зависимостей в контроллеры
Для повышения гибкости и модульности кода в контроллерах используется внедрение зависимостей. Это позволяет легко тестировать и заменять компоненты.
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Service\ProductService;
class ProductController extends AbstractController
{
private $productService;
public function __construct(ProductService $productService)
{
$this->productService = $productService;
}
/**
* @Route("/products", name="product_list", methods={"GET"})
*/
public function list(): Response
{
$products = $this->productService->getAllProducts();
return $this->render('product/list.html.twig', [
'products' => $products,
]);
}
}
В этом примере сервис ProductService внедряется в контроллер через конструктор, что упрощает управление зависимостями.
Шаблоны и представления
Шаблоны в PrestaShop основаны на Twig, мощном и гибком шаблонизаторе. Шаблоны располагаются в директории templates и могут быть легко расширяемыми и настраиваемыми.
{# templates/product/list.html.twig #}
{% extends 'base.html.twig' %}
{% block title %}Список продуктов{% endblock %}
{% block body %}
Список продуктов
{% for product in products %}
- {{ product.name }} - {{ product.price }}
{% endfor %}
{% endblock %}
Этот пример шаблона отображает список продуктов, используя данные, переданные из контроллера.
Настройка маршрутов и контроллеров для модулей
Для создания маршрутов и контроллеров в модулях PrestaShop следует придерживаться тех же принципов, что и для основного приложения. Маршруты можно определять в файлах конфигурации модуля или с помощью аннотаций.
// config/routes/module_routes.yml
module_product_list:
path: /module/products
controller: App\Module\Controller\ProductController::list
methods: [GET]
namespace App\Module\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class ProductController extends AbstractController
{
/**
* @Route("/module/products", name="module_product_list", methods={"GET"})
*/
public function list(): Response
{
// Логика получения списка продуктов модуля
return $this->render('module/product/list.html.twig', [
'products' => $products,
]);
}
}
Заключение
Современная архитектура маршрутизации и контроллеров в PrestaShop 1.8 значительно упрощает процесс разработки и улучшает структуру кода. Использование аннотаций, внедрение зависимостей и работа с шаблонами на основе Twig позволяют создавать гибкие и масштабируемые решения. Следование этим принципам и рекомендациям поможет вам эффективно разрабатывать и поддерживать модули и страницы для вашего интернет-магазина на PrestaShop.

