Home Github
CakePHP Logo

Using Pesto with CakePHP

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

Integration Steps

1. Install Pesto

Start by installing Pesto via Composer.

composer require millancore/pesto

2. Create a Pesto View Class

Create a custom View class at src/View/PestoView.php that extends CakePHP's View.

namespace App\View;

use Cake\View\View;
use MillanCore\Pesto\PestoFactory;

class PestoView extends View
{
    protected $pesto;

    public function initialize(): void
    {
        parent::initialize();
        $this->pesto = PestoFactory::create(
            ROOT . '/templates',
            ROOT . '/tmp/cache/pesto'
        );
    }

    protected function _render(string $templateFile, array $data = []): string
    {
        $relative = str_replace(ROOT . '/templates/', '', $templateFile);

        return $this->pesto->make($relative, array_merge(
            $this->viewVars,
            $data
        ))->toHtml();
    }
}

3. Set PestoView in Your Controller

In your controller, set the view class to use PestoView.

namespace App\Controller;

class ArticlesController extends AppController
{
    public function initialize(): void
    {
        parent::initialize();
        $this->viewBuilder()->setClassName('Pesto');
    }
}

4. Render a View in Your Controller

Use the standard CakePHP set() method to pass data to your Pesto templates.

namespace App\Controller;

class ArticlesController extends AppController
{
    public function index()
    {
        $articles = $this->Articles->find('all')->toArray();
        $this->set(compact('articles'));
    }
}

5. Create a Pesto Template

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

<h1>Articles</h1>

<ul>
    <li php-foreach="$articles as $article">
        {{ $article->title }}
    </li>
</ul>