# Need Help Integrating Twig View and Slim 4 using containers

**URL:** <https://discourse.slimframework.com/t/need-help-integrating-twig-view-and-slim-4-using-containers/5155>\
**Category:** Questions\
**Created:** [February 19, 2022, 3:24pm UTC](https://discourse.slimframework.com/t/need-help-integrating-twig-view-and-slim-4-using-containers/5155 "2022-02-19T15:24:36Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![bostonmacosx](https://avatars.discourse-cdn.com/v4/letter/b/e36b37/32.png) [@bostonmacosx](https://discourse.slimframework.com/u/bostonmacosx)\
**Post date:** [February 19, 2022, 3:24pm UTC](https://discourse.slimframework.com/t/need-help-integrating-twig-view-and-slim-4-using-containers/5155/1 "2022-02-19T15:24:36Z")

</div>

So I’m using a skeleton I found online…

The “boostrap.php” looks like

```auto

use DI\ContainerBuilder;
use Slim\App;

require_once __DIR__. '/../vendor/autoload.php';

$containerBuilder = new ContainerBuilder();

// Add DI container definitions
$containerBuilder->addDefinitions( __DIR__. '/container.php');

// Create DI container instance
$container = $containerBuilder->build();

// Create Slim App instance
$app = $container->get(App::class);

// Register routes
(require __DIR__. '/routes.php')($app);

// Register middleware
(require __DIR__. '/middleware.php')($app);

return $app;

```

In the container I’m adding TWIG I think correctly…

```auto
return [
    'settings' => function () {
        return require __DIR__. '/settings.php';
    },

    App::class => function (ContainerInterface $container) {
        AppFactory::setContainer($container);

        return AppFactory::create();
    },

    ErrorMiddleware::class => function (ContainerInterface $container) {
        $app = $container->get(App::class);
        $settings = $container->get('settings')['error'];

        return new ErrorMiddleware(
            $app->getCallableResolver(),
            $app->getResponseFactory(),
            (bool)$settings['display_error_details'],
            (bool)$settings['log_errors'],
            (bool)$settings['log_error_details']
        );
    },

    Twig:class => function (ContainerInterface $container){
        return new Twig( __DIR__.'/../views',[
            'cache' => __DIR__. '/../cache',
            'auto_reload' => true
        ]);
    },
     TwigMiddleware::class => function (ContainerInterface $container){
        return TwigMiddleware::createFromContainer($container->get(App::class));
    },

 etc etc etc

```

So I’m thinking this is correct however I also need to setup the middleware for the Twig and also be able to use it in the Classes/Controller/Routes…

_ **In my Middleware** _

```auto
<?php

use Selective\BasePath\BasePathMiddleware;
use Slim\App;
use Slim\Middleware\ErrorMiddleware;
use Slim\Views\TwigMiddleware;
use Slim\Views\Twig;
 

return function (App $app) {
    // Parse json, form data and xml
    $app->addBodyParsingMiddleware();
    $app->add(TwigMiddleware::class));

    // Add the Slim built-in routing middleware
    $app->addRoutingMiddleware();

    $app->add(BasePathMiddleware::class);

    // Handle exceptions
    $app->add(ErrorMiddleware::class);
};

```

The Current error is

```auto
Message: The specified container key does not exist: view
File: /home/webuser/testsite/genapp/vendor/slim/twig-view/src/TwigMiddleware.php

```

So I’m not sure how to set the key I guess of for Twig instance/class.

I’m new to this format of DI so I’m unsure how to add the middleware and then use it throughout the app…

Thanks

---

<div class="post-metadata">

**Author:** ![tj\_gumis](https://avatars.discourse-cdn.com/v4/letter/t/c89c15/32.png) [@tj\_gumis](https://discourse.slimframework.com/u/tj_gumis)\
**Post date:** [February 19, 2022, 6:02pm UTC](https://discourse.slimframework.com/t/need-help-integrating-twig-view-and-slim-4-using-containers/5155/2 "2022-02-19T18:02:11Z")

</div>

Are you sure your container’s definitions contain an entry:

```php
return [
    ...
    'view' => function () {
        ...
    },
    ...
];

```

or maybe you just confused `view` with `Twig::class` key within your middleware call from the container?

---

<div class="post-metadata">

**Author:** ![odan](https://avatars.discourse-cdn.com/v4/letter/o/9de053/32.png) [@odan](https://discourse.slimframework.com/u/odan)\
**Post date:** [February 20, 2022, 8:42am UTC](https://discourse.slimframework.com/t/need-help-integrating-twig-view-and-slim-4-using-containers/5155/3 "2022-02-20T08:42:25Z")

</div>

The TwigMiddleware uses the key “twig” as default. To make it work, change the DI container definition as follows:

```php
use Slim\Views\Twig;
use Slim\Views\TwigMiddleware;
// ...

TwigMiddleware::class => function (ContainerInterface $container) {
    return TwigMiddleware::createFromContainer(
        $container->get(App::class),
        Twig::class
    );
},

```

---

<div class="post-metadata">

**Author:** ![bostonmacosx](https://avatars.discourse-cdn.com/v4/letter/b/e36b37/32.png) [@bostonmacosx](https://discourse.slimframework.com/u/bostonmacosx)\
**Post date:** [February 23, 2022, 10:18pm UTC](https://discourse.slimframework.com/t/need-help-integrating-twig-view-and-slim-4-using-containers/5155/4 "2022-02-23T22:18:41Z")

</div>

My final solution which appeared to work is in the bootstrap

> ‘view’ =\> function (ContainerInterface $container){  
> return Twig::create( **DIR**.‘/…/views’,[  
> ‘cache’ =\> **DIR**. ‘/…/cache’,  
> ‘auto\_reload’ =\> true  
> ]);  
> },  
> TwigMiddleware::class =\> function (ContainerInterface $container){  
> return TwigMiddleware::createFromContainer($container-\>get(App::class));  
> }

and  
in middleware.php

> ```
> $app->add(TwigMiddleware::class);
> 
> ```
