我正在使用Silex微框架来构建一个非常简单的应用程序。 Silex文档简要说明了如何使用控制器作为类来保持代码的组织,我也发现这篇有用的文章谈论相同的实践: https://igor.io/2012/11/09/scaling-silex.html 但仍然无法解决我的问题
问题:
在我的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
Whic让我觉得myNamespace和Silex名称空间之间存在命名空间冲突?!
我做错了什么? 这是在我的自定义控制器中显示$ app的正确方法,以便使用return $ app [' twig'] ...?
提前谢谢!
修改
经过其他几次尝试仍然没有达到目的(回复仍然欢迎!)但我发现一个可能对任何人都有用的解决方案解决方案会遇到类似的问题。直接在我的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}}
这基本上意味着我仍然需要一个匿名函数来使用我的自定义方法,这是一个我不满意的工作解决方案,因为:
解决
描述的工作流程正常。这是一个分心错误:我在使用Symfony \ Component \ HttpFoundation \ Request之后放置了我的自定义类的命名空间; PHP中的名称空间声明始终位于文件的顶部,因此Silex无法注入$ app和$ request。