Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Integrate Twig with CodeIgniter 4

I used Twig with Symfony and I really loved it. I now have a CodeIgniter project and I want to integrate Twig with it.

I installed the latest versions of CodeIgniter and Twig via Composer and and followed this tutorial but I believe the code in the tutorial is for CI v3.

Could anyone who has integrated Twig with CI v4 help me with the proper code please.

UPDATE

solution below!

like image 342
Jolan Avatar asked Sep 06 '25 04:09

Jolan


1 Answers

Try this I hope it will help you

Install Composer and run the following command to get the latest version:

composer require "twig/twig:*"

Then after installation add this line of code to the Services.php file in the config folder, that is, app => Config => Services.php, just like the code below

    ....

    public static function twig($viewDir = null, $getShared = true)
    {
        if ($getShared) {
            return static::getSharedInstance('twig', $viewDir);
        }

        $appPaths = new \Config\Paths();
        $appViewPaths = $viewDir ?? $appPaths->viewDirectory;

        $loader = new \Twig\Loader\FilesystemLoader($appViewPaths);

        return new \Twig\Environment($loader, [
            'cache' => WRITEPATH.'/cache/twig',
        ]);
    }
    ....

**Then in your controller call the services method you just created, just like this

namespace App\Controllers;

use CodeIgniter\Controller;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use Config\Services; // Add the services namespace 

class BaseController extends Controller
{
    protected $helpers = [];
    protected $twig;

    // protected $helper = [];
    public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
    {
        parent::initController($request, $response, $logger);

        $this->twig = Services::twig(); // call the twig service you just created

    }
}

So with this now you can call the view files in other controllers extends to parent controller BaseController e.g


namespace App\Controllers;


class Home extends BaseController
{
    public function index ()
    {
        // To load a template from a Twig environment, call the load() method which returns a \Twig\TemplateWrapper instance:

       $template = $this->twig->load('index.html');

       // To render the template with some variables, call the render() method:

       return $template->render(['the' => 'variables', 'go' => 'here']);

       // The display() method is a shortcut to output the rendered template.
       // OR You can also load and render the template in one fell swoop:

       return $this->twig->render('index.html', ['the' => 'variables', 'go' => 'here']);

       // If a template defines blocks, they can be rendered individually via the renderBlock() call:

       return $template->renderBlock('block_name', ['the' => 'variables', 'go' => 'here']);

       // Note any of them above will work
    }
}

If you still want to use view() with twig like codeigniter 4 default view function you can modify the Common.php file in app directory by adding this block of code below.


if (!function_exists('view'))
{
    function view($tpl, $data = []) {

        $twig = \Config\Services::twig(); // call the twig service you just created

        return $twig->render($tpl, $data);
    }
}

Then in controller call it like this


return view('index', ['name' => 'Chibueze Agwu'])

Then in view file index.twig

<!DOCTYPE html>
<html>
  <head>
    <title>My Webpage</title>
  </head>
  <body>
    <h1>My Webpage</h1>
    {{ name }}
  </body>
</html>

This will output

My Webpage
Chibueze Agwu

I haven't test this code but I hope it will work. If not call my attentions. In order to obey the the rule of DRY (DO NOT REPEAT YOURSELF), you can go ahead to improve the code I will do that later

like image 76
Chibueze Agwu Avatar answered Sep 08 '25 00:09

Chibueze Agwu