smile 22121
smile 22121

Reputation: 295

Slim 3 render method not valid

I want to make simple template rendering in Slim3 but I get an error:

Here is my code : namespace controller;

class Hello
{
    function __construct() {
// Instantiate the app
        $settings = require __DIR__ . '/../../src/settings.php';
        $this->app = new \Slim\App($settings);
    }

    public function index(){
        return $this->app->render('web/pages/hello.phtml');   //LINE20
    }
}

This is the error I get :

Message: Method render is not a valid method

Upvotes: 3

Views: 3786

Answers (2)

scottheckel
scottheckel

Reputation: 9244

I handle this by sticking my renderer in the container. Stick this in your main index.php file.

$container = new \Slim\Container($configuration);
$app = new \Slim\App($container);
$container['renderer'] = new \Slim\Views\PhpRenderer("./web/pages");

Then in your Hello class's file.

class Hello
{
   protected $container;

   public function __construct(\Slim\Container $container) {
       $this->container = $container;
   }

   public function __invoke($request, $response, $args) {
        return $this->container->renderer->render($response, '/hello.php', $args);
   }
}

To clean up this code, make a base handler that has this render logic encapsulated for you.

Upvotes: 0

mzulch
mzulch

Reputation: 1539

The App object doesn't handle any rendering on its own, you'll need a template add-on for that, probably this one based on your template's .phtml extension. Install with composer:

composer require slim/php-view

Then your controller method will do something like this:

$view = new \Slim\Views\PhpRenderer('./web/pages');

return $view->render($response, '/hello.phtml');

You'll eventually want to put the renderer in the dependency injection container instead of creating a new instance in your controller method, but this should get you started.

Upvotes: 2

Related Questions