Home Github
Symfony Logo

Using Pesto with Symfony

Integrate the Pesto template engine into your Symfony projects to create expressive and modern views.

Integration Steps

1. Install Pesto

Start by installing Pesto via Composer.

composer require millancore/pesto

2. Register Pesto as a Service

Add the Pesto factory to your config/services.yaml.

services:
    pesto.view:
        class: MillanCore\Pesto\Pesto
        factory: ['MillanCore\Pesto\PestoFactory', 'create']
        arguments:
            - '%kernel.project_dir%/templates'
            - '%kernel.cache_dir%/pesto'

3. Create a Helper Controller Trait

Create a trait at src/Controller/PestoTrait.php to simplify rendering in your controllers.

namespace App\Controller;

use MillanCore\Pesto\Pesto;
use Symfony\Component\HttpFoundation\Response;

trait PestoTrait
{
    private Pesto $pesto;

    #[\Symfony\Contracts\Service\Attribute\Required]
    public function setPesto(Pesto $pesto): void
    {
        $this->pesto = $pesto;
    }

    protected function pestoRender(string $view, array $data = []): Response
    {
        $html = $this->pesto->make($view, $data)->toHtml();

        return new Response($html);
    }
}

4. Render a View in Your Controller

Use the trait in your controller to render Pesto templates.

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

class HomeController extends AbstractController
{
    use PestoTrait;

    #[Route('/', name: 'home')]
    public function index(): Response
    {
        return $this->pestoRender('home.php', [
            'title' => 'Welcome to Symfony with Pesto',
        ]);
    }
}

5. Create a Pesto Template

Create your template at templates/home.php. You can now use Pesto's syntax.

<h1>{{ $title }}</h1>

<ul>
    <li php-foreach="range(1, 5) as $i">
        Item {{ $i }}
    </li>
</ul>