Tùy chỉnh controller

Thêm Route (định tuyến) mới

@Route./app/Customize/Controller/Bạn có thể thêm định tuyến mới vào trang web của mình bằng cách đặt tệp lớp chú thích bên dưới.

Dưới đây là một ví dụ về bổ sung định tuyến đơn giản nhất.
http://domain/samlpleKhi bạn truy cập “Xin chào trang mẫu!” Định tuyến được thêm vào.

Tập tin điều khiển

./app/Customize/Controll/SamplePageControll.php

<?php

namespace Customize\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;

class SamplePageController
{
    /**
     * @Method("GET")
     * @Route("/sample")
     */
    public function testMethod()
    {
        return new Response('Hello sample page !');
    }
}

Sử dụng tệp mẫu

@TemplateBạn có thể sử dụng tệp mẫu của Twig bằng cách sử dụng.
Mẫu sau sẽ http://domain/samlplehiển thị “Xin chào EC – CUBE!” Khi truy cập.

Tập tin điều khiển

<?php

namespace Customize\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Response;

class SamplePageController
{
    /**
     * @Method("GET")
     * @Route("/sample")
     * @Template("Sample/index.twig")
     */
    public function testMethod()
    {
        return ['name' => 'EC-CUBE'];
    }
}

Tập tin Twig

./app/template/default/Sample/index.twig


<h3>Hello  !</h3>

Mẹo tùy biến

Nhận thông số từ URL

http://domain/samlple/1Bạn có thể nhận tham số có trong URL dưới dạng giá trị của biến như Bạn có thể nhận phần được
bao gồm trong @ Route dưới dạng {id}một biến có cùng tên $id.

    /**
     * @Method("GET")
     * @Route("/sample/{id}")
     */
    public function testMethod($id)
    {
        return new Response('Parameter is '.$id);
    }

Liên kết đến định tuyến đã thêm

Để liên kết đến định tuyến được thêm từ tệp mẫu của trang khác, cần phải đặt tên cho định tuyến.
Bạn namecó thể thêm tên bằng cách thêm tham số vào chú thích @ Tuyến .

    /**
     * @Method("GET")
     * @Route("/sample/{id}", name="sample_page")
     */
    public function testMethod($id)
    {
        return new Response('Parameter is '.$id);
    }

Khi liên kết từ một tệp mẫu của một trang khác, hãy viết nó như sau.
Các thông số cũng có thể được thông qua.


<a href="{{ url("sample_page", { id : 2}) }}">Liên kết đến trang Mẫu</a>

EC-CUBE Ghi đè định tuyến hiện có

EC-CUBE Để ghi đè định tuyến hiện có, xác định định tuyến với cùng đường dẫn và tên.
Trong mẫu bên dưới, trang về “Giới thiệu về trang web này” được ghi đè.

    /**
     * @Method("GET")
     * @Route("/help/about", name="help_about")
     */
    public function testMethod()
    {
        return new Response('Overwrite /help/about page');
    }

Thêm định tuyến của màn hình quản lý

Nếu bạn muốn thêm định tuyến mà chỉ người dùng đã đăng nhập vào màn hình quản trị mới có thể truy cập /%eccube_admin_route%, hãy sử dụng nó cho đường dẫn .

    /**
     * @Method("GET")
     * @Route("/%eccube_admin_route%/sample")
     */
    public function testMethod()
    {
        return new Response('admin page');
    }

Tương tự định tuyến đến UserData /%eccube_user_data_route%chỉ định.

Thực hiện chuyển hướng

redirectToRouteCó thể chuyển hướng bằng cách kế thừa AbstractContoder và sử dụng các hàm.
Trong mẫu bên dưới, chúng tôi đã chuyển hướng đến trang “Giới thiệu về trang web này” nếu có quyền truy cập.

    /**
     * @Method("GET")
     * @Route("/sample")
     */
    public function testMethod()
    {
        return $this->redirectToRoute('help_about');
    }

Cũng forwardToRouteBằng cách sử dụng các chức năng, bạn có thể vượt qua quá trình xử lý với bộ điều khiển khác chứ không phải là chuyển hướng.

Sử dụng dịch vụ trong Bộ điều khiển

AbstractControllerBằng cách kế thừa, bạn có thể sử dụng các phiên bản của các dịch vụ được sử dụng thường xuyên.
Trong mẫu bên dưới, Entity được mua bằng EntityManager.

<?php

namespace Customize\Controller;

use Eccube\Controller\AbstractController;
use Eccube\Entity\Product;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;

class SamplePageController extends AbstractController
{
    /**
     * @Method("GET")
     * @Route("/sample")
     */
    public function testMethod()
    {
        /** @var Product $product */
        $product = $this->entityManager->getRepository('Eccube\Entity\Product')->find(1);

        return new Response('Product is '.$product->getName());
    }
}

Ngoài EntityManger, ./src/Eccube/Controller/AbstractController.phpvui lòng kiểm tra các dịch vụ khả dụng bằng cách kế thừa Tóm tắt .

Sử dụng các dịch vụ không có trong Tóm tắt

Bằng cách sử dụng phép tiêm, bạn cũng có thể sử dụng các phiên bản dịch vụ không tìm thấy trong Tóm tắt.
Trong mẫu bên dưới, tên cửa hàng được lấy từ BaseInfo.

<?php

namespace Customize\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;

class SamplePageController
{
    /** @var \Eccube\Entity\BaseInfo */
    protected $BaseInfo;

    /**
     * SamplePageController constructor.
     * @param \Eccube\Repository\BaseInfoRepository $baseInfoRepository
     */
    public function __construct(\Eccube\Repository\BaseInfoRepository $baseInfoRepository)
    {
        $this->BaseInfo = $baseInfoRepository->get();
    }

    /**
     * @Method("GET")
     * @Route("/sample")
     */
    public function testMethod()
    {
        return new Response('Shop name is '.$this->BaseInfo->getShopName());
    }
}

Tạo một bộ điều khiển không cần hiển thị màn hình

Đảm bảo trả về đối tượng Phản hồi ngay cả khi bộ điều khiển không cần hiển thị màn hình.
(Khi exit()bạn xử lý xong, EC – CUBE sẽ không thể thực hiện hoạt động bình thường)

Cũng có thể chỉ định mã phản hồi và tiêu đề của Phản hồi.

    /**
     * @Method("GET")
     * @Route("/sample")
     */
    public function testMethod()
    {
        return new Response(
          '',
          Response::HTTP_OK,
          array('Content-Type' => 'text/plain; charset=utf-8')
        );
    }
$ curl -D - http://domain/sample
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8

Thông tin tham khảo

EC – CUBE 4.0 sử dụng cơ chế Bộ điều khiển của Symfony.
Tham khảo tài liệu Symfony để biết các phương pháp tùy chỉnh khác.

https://symfony.com/doc/civerse/controll.html

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *