View 如何在Silex中的自定义控制器中渲染细枝模板?

View 如何在Silex中的自定义控制器中渲染细枝模板?,view,controller,twig,render,silex,View,Controller,Twig,Render,Silex,我正在使用Silex microframework构建一个非常简单的应用程序。 Silex文档简要说明了如何使用controller作为类来组织代码,我还发现这篇有用的文章讨论了相同的实践: 但还是不能解决我的问题 问题: 在我的app.php中,我正在使用 $app->get('/{artist}', 'MyNamespace\\MyController::getAlbum'); 这是有效的。MyController是使用psr-4通过composer正确加载的类。 目前getAlbu

我正在使用Silex microframework构建一个非常简单的应用程序。 Silex文档简要说明了如何使用controller作为类来组织代码,我还发现这篇有用的文章讨论了相同的实践: 但还是不能解决我的问题

问题:

在我的app.php中,我正在使用

$app->get('/{artist}', 'MyNamespace\\MyController::getAlbum');
这是有效的。MyController是使用psr-4通过composer正确加载的类。 目前getAlbum($artist)的返回方法是
return$player
相反,我想做的是从getAlbum返回一个细枝视图,类似于:

return $app['twig']->render('player.twig', $player);
为此,我尝试在自定义类/控制器中执行以下操作:

use Silex\Application;
use Symfony\Component\HttpFoundation\Request;
[...]
        public function getAlbum(Request $request, Application $app, $artist)
但当我尝试访问路由页面时,会产生以下错误:

ReflectionException in ControllerResolver.php line 43:
Class MyNamespace\Request does not exist
这让我觉得myNamespace和Silex命名空间之间存在命名空间冲突

我做错了什么? 为了使用return$app['twig'],这是使$app在我的自定义控制器中可见的正确方法吗

提前谢谢你

编辑

在其他几次尝试之后,仍然没有达到目的(回复仍然是受欢迎的!),但我发现了一个解决方案,它可能对任何人都有用,因为任何人都会遇到类似的问题。我直接在我的app.php中添加了这个

$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,)); 
});
然后在我的player.twig中,我添加了:

    {{player | raw}}
这基本上意味着我仍然需要一个匿名函数来使用我的自定义方法,这是一个我不太满意的工作解决方案,因为:

  • 我使用两个函数来实现一个目的
  • getAlbum的返回值取决于在twig中使用“raw”
已解决

所描述的工作流工作正常。这是一个分散注意力的错误:我将自定义类的名称空间放在使用Symfony\Component\HttpFoundation\Request之后;
PHP中的名称空间声明需要始终位于文件的顶部,Silex因此无法注入$app和$request。

我觉得这一切都很好。
Request
Application
的名称空间导入是正确的,并且您尝试呈现视图的方式也是正确的。但令我惊讶的是(如果我理解正确的话)您只有在尝试返回
return$app['twig']->render(…)
,而不是使用
return$player
)时才会出现错误,这是我无法相信的,因为问题显然是由函数参数而不是返回值引起的。顺便说一句:我建议在容器中所有操作方法的名称后面加上后缀“Action”。在MyMamespace中是否可能有一个请求类?你能完全粘贴你的控制器类吗?@BlueM不完全正确,只要我尝试传递Request$Request,Application$app,错误就会出现,我现在已经尝试在myapp.php中直接执行以下操作,这对我的案例有效(但仍然无法理解为什么上面的方法不起作用):
$app->get('/{artist}',function(Silex\Application$app,$artist)使用($app){$object=new MyNamespace\MyController();$player=$object->getAlbum($artist);返回$app['twig']->render('player.twig',array('player'=>$player,);})
,然后只需{{player | raw}在我的twig@mTorres在我的命名空间中没有请求类:好的,您使用的是什么版本的silex?它应该自动检测请求参数并注入它(请参阅和)。这一切对我来说都很好。
Request
Application
的名称空间导入是正确的,而且您尝试呈现视图的方式也是正确的。但令我惊讶的是(如果我理解正确的话)您只有在尝试返回
return$app['twig']->render(…)时才会出现错误
,而不是使用
return$player
–这是我无法相信的,因为问题显然是由函数参数而不是返回值引起的。顺便说一句:我建议添加后缀“Action”容器中所有操作方法的名称。是否可能在MyMamespace中有一个请求类?是否可以完全粘贴控制器类?@BlueM不完全正确,只要我尝试传递Request$Request,Application$app,就会出现错误。我现在尝试直接在myapp.php中执行以下操作,该操作适用于我的案例(但仍然无法理解上述方法不起作用的原因):
$app->get('/{artist}',函数(Silex\Application$app,$artist)使用($app){$object=new MyNamespace\MyController();$player=$object->getAlbum($artist);返回$app['twig']->render('player.twig',array('player'=>$player,);});
,然后{{player | raw}}在我的twig@mTorres在我的命名空间中没有请求类:好的,您使用的是什么版本的silex?它应该自动检测请求参数并注入它(请参阅和)。这一切对我来说都很好。
Request
Application
的名称空间导入是正确的,而且您尝试呈现视图的方式也是正确的。但令我惊讶的是(如果我理解正确的话)您只有在尝试返回
return$app['twig']->render(…)时才会出现错误
,而不是使用
return$player
–这是我无法相信的,因为问题显然是由函数参数而不是返回值引起的。顺便说一句:我建议添加后缀“Action”容器中所有操作方法的名称。是否可能在MyMamespace中有一个请求类?是否可以完全粘贴控制器类?@BlueM不完全正确,只要我尝试传递Request$Request,Application$app,就会出现错误。我现在尝试直接在myapp.php中执行以下操作,该操作适用于我的案例(但仍然无法理解上述方法不起作用的原因):
$app->get('/{artist}',函数(Silex\Application$app,$artist)使用($app){$object=new MyNamespace\MyController();$player=$object->getAlbum($artist);返回$app['twig']->render('player.twig',array('