How can I render a twig template in a custom controller in Silex?

2.9k Views Asked by At

I'm playing with Silex microframework to build a very simple app. The Silex documentation briefly illustrates how to keep your code organised using controller as class and I've also found this useful article talking about the same practice: https://igor.io/2012/11/09/scaling-silex.html but still can't solve my problem

The issue:

in my app.php I'm using

$app->get('/{artist}', 'MyNamespace\\MyController::getAlbum');

This is working. MyController is a class correctly loaded through composer using psr-4. At the moment the return method of getAlbum($artist) is return $player; What I'd like to do instead, is returning a twig view from getAlbum, something like:

return $app['twig']->render('player.twig', $player);

To do so, what I've tried to do in my custom class/controller is:

use Silex\Application;
use Symfony\Component\HttpFoundation\Request;
[...]
        public function getAlbum(Request $request, Application $app, $artist)

but this is generating the following error when I try to access the routed pages:

ReflectionException in ControllerResolver.php line 43:
Class MyNamespace\Request does not exist

Whic made me think that there's a namespace conflict between myNamespace and the Silex namespaces?!

What am I doing wrong? Is this the right way to make $app visible in my custom controller in order to use return $app['twig']... ?

Thank you in advance!

EDIT

After several other tries still didn't get to the point (replies still welcome!) but I've found a workaround solution that could be useful to anyone will incur in a similar issue. Directly in my app.php I added this

$app->get('/{artist}', function (Silex\Application $app, $artist) use ($app)
{ 
 $object = new MyNamespace\MyController(); 
 $player = $object->getAlbum($artist); 
 return $app['twig']->render('player.twig', 
  array( 
    //passing my custom method return to twig
   'player' => $player,)); 
});

then in my player.twig I added:

    {{player | raw}}

And this basically means that I still need an anonymous function to get use of my custom method which is a working solution I'm not really happy with because:

  • I'm using 2 functions for 1 purpose.
  • The return value of getAlbum is dependent from the use of "raw" in twig.

SOLVED

The workflow described works fine. It was a distraction error: I've placed the namespace of my custom class after use Symfony\Component\HttpFoundation\Request; namespace declaration in PHP needs always to be at the top of the file, Silex wasn't able to injects $app and $request for this reason.

0

There are 0 best solutions below