redirectToRoute Symfony5 上的上一页

redirectToRoute Previous page on Symfony5

我的网站上有购物车功能。
我在两个不同的页面(cart.html.twig 和 home.html.twig)上显示购物车,我可以在这两个页面上修改购物车。
当我想用按钮增加一个产品+1时,我被重定向到一个单一的路线。
如果用户增加主页上的产品我希望他被重定向到主页,并且如果他增加购物车页面上的产品我希望他被重定向到购物车页面,我想怎么做,我有点迷路了。
有重定向到上一页的方法吗?

有代码:

class CartService {

protected $session;
protected $productRepository;

public function __construct(SessionInterface $session, ProductRepository $productRepository){
    $this->session = $session;
    $this->productRepository = $productRepository;
}

public function add(int $id){
    $cart = $this->session->get('cart', []);

    if(isset($cart[$id])){
        $cart[$id]++;
    } else {
        $cart[$id] = 1;
    }

    $this->session->set('cart', $cart);
}

public function remove(int $id) {
    $cart = $this->session->get('cart', []);

    if(isset($cart[$id])){
        if($cart[$id] > 1){
            $cart[$id]--;
        } else {
            unset($cart[$id]);
        }
    }

    $this->session->set('cart', $cart);
}

public function delete(int $id){
    $cart = $this->session->get('cart', []);

    if(isset($cart[$id])){
        unset($cart[$id]);
    }

    $this->session->set('cart', $cart);
}

public function getFullCart() : array{
    $cart = $this->session->get('cart', []);
    
    $cartWithData = [];

    foreach($cart as $id => $quantity){
        $cartWithData[] = [
            'product' => $this->productRepository->find($id),
            'quantity' => $quantity
        ];
    }

    return $cartWithData;
}

public function getTotal(): float{
    $total = 0;

    foreach($this->getFullCart() as $item){
        $total += $item['product']->getPrice() * $item['quantity'];
    }

    return $total;
}

}

购物车页面的控制者:

class CartController extends AbstractController{

/**
 * @Route ("/cart", name = "cart")
 */
public function cart(CartService $cartservice){

    return $this->render(
        'users/cart.html.twig',
        [
            'items' => $cartservice->getFullCart(),
            'total' => $cartservice->getTotal()
        ]
    );
}

/**
 * @Route ("/cart/add/{id}", name = "add_cart")
 */
public function add($id, CartService $cartservice, Request $request){
    $cartservice->add($id);

    return $this->redirectToRoute('homepage');
}


/**
 * @Route ("/cart/remove/{id}", name="remove_cart")
 */
public function remove($id, CartService $cartservice){
    $cartservice->remove($id);

    return $this->redirectToRoute('homepage');
}


/**
 * @Route ("/cart/delete/{id}", name="delete_cart")
 */
public function delete($id, CartService $cartservice){
    $cartservice->delete($id);

    return $this->redirectToRoute('homepage');
}

}

而且我在主页上也显示了一部分购物车,我显示了卡的价格/名称/数量,我主页的控制器“HomeController.php”:

/**
 * @Route("/", name="homepage")
*/
public function home(ProductRepository $productRepository, CategoryRepository $categoryRepository, CartService $cartService) : Response{
    $productRepository = $this->getDoctrine()->getRepository(Product::class);
    $products = $productRepository->findAll();
    $categories = $categoryRepository->findAll();
    return $this->render(
        'users/home.html.twig',
        [
            'products' => $products,
            'categories' => $categories,
            'total' => $cartService->getTotal(),
            'items' => $cartService->getFullCart()
        ]
    );
}

我在 CartController.php

中添加的函数中尝试了这个
    /**
 * @Route ("/cart/add/{id}", name = "add_cart")
 */
public function add($id, CartService $cartservice, Request $request){
    $cartservice->add($id);

    $uri = $request->attributes->get("_route");
    return $this->redirectToRoute($uri);
}

但它不起作用,它对我说“缺少一些强制性参数(“id”)来为路由“add_cart”生成 URL。”和产品增量 x30。我认为路线 cart/add/{id}.

上的函数循环

在你的控制器中

 /**
 * @Route ("/cart/add/{id}/{origin}", name = "add_cart")
   */
  public function add($id, $origin, CartService $cartservice, Request 
      $request){
     $cartservice->add($id);

     return $this->redirectToRoute($origin);

    }   

在你的 twig 主页

<a href="{{ path('add_cart', 
 {'id':product.id,'origin':app.request.attributes.get('_route')})}}" >

  add +
 </a>

对您想要的其他页面执行相同的操作

你可以使用

获取树枝中的当前路径

app.request.attributes.get('_route')

然后你把它交给你的控制器

最后您可以使用 if 条件重定向

更新:

我只需要像这样获取 referer :

    /**
 * @Route ("/cart/add/{id}", name = "add_cart")
 */
public function add($id, CartService $cartservice, Request $request){
    $cartservice->add($id);

    $route = $request->headers->get('referer');

    return $this->redirect($route);
}

我被重定向到上一页