Overriding Controllers¶
All Sylius bundles are using SyliusResourceBundle as a foundation for database storage.
Extending base Controller¶
If you want to modify the controller or add your custom actions, you can do so by defining a new controller class. By extending resource controller, you also get access to several handy methods. Let’s add to our custom controller a new method to recommend a product:
<?php
// src/Acme/ShopBundle/Controller/ProductController.php
namespace Acme\ShopBundle\Controller;
use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
use Symfony\Component\HttpFoundation\Request;
class ProductController extends ResourceController
{
public function recommendAction(Request $request, $id)
{
$product = $this->findOr404(array('id' => $id)); // Find product with given id or return 404!
$product->incrementRecommendations(); // Add +1!
$this->persistAndFlush($product); // Save product.
return $this->redirect($this->generateUrl('acme_shop_homepage'));
}
}
You also need to configure your controller class in app/config/config.yml.
# app/config/config.yml
sylius_product:
driver: doctrine/orm
classes:
product:
controller: Acme\ShopBundle\Controller\ProductController
That’s it! Now sylius.controller.product:recommendAction is available. You can use it by defining a new route.
# app/config/routing.yml
acme_shop_product_recommend:
path: /products/{id}/recommend
defaults:
_controller: sylius.controller.product:recommendAction
What has happened?
- Parameter
sylius.controller.product.classcontainsAcme\\Bundle\\ShopBundle\\Controller\\ProductController. - Controller service
sylius.controller.productis using your new controller class.