Integrate the Pesto template engine into your Symfony projects to create expressive and modern views.
Start by installing Pesto via Composer.
composer require millancore/pesto
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'
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);
}
}
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',
]);
}
}
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>