Silex将应用程序和请求传递给控制器类
我想要一个简单的方法来访问我的控制器类中的$ app和$ request。 该文件说要做到这一点,
public function action(Application $app, Request $request) {
 // Do something.
}
但是不得不向每种方法注入$ app和$ request。 有没有办法在默认情况下将$ app和$ request包含到每个控制器,也许使用构造函数? 我希望能够以$ this-> app的形式使用它。
谢谢。
在Controllers as Services部分的文档中,您可以看到如何通过构造函数向控制器类注入依赖项 - 在这种情况下是存储库。
这是可能的 :
  在你的项目的某个地方创建一个ControllerResolver.php ,并把它放在里面: 
namespace MyProject;
use SilexControllerResolver as BaseControllerResolver;
class ControllerResolver extends BaseControllerResolver
{
    protected function instantiateController($class)
    {
        return new $class($this->app);
    }
}
  然后在您的应用程序中注册(在$app->run(); ): 
$app['resolver'] = function ($app) {
    return new MyProjectControllerResolver($app, $app['logger']);
};
现在您可以为您的应用程序创建一个基本控制器,例如:
namespace MyProject;
use SilexApplication;
use SymfonyComponentHttpFoundationResponse;
abstract class BaseController
{
    public $app;
    public function __construct(Application $app)
    {
        $this->app = $app;
    }
    public function getParam($key)
    {
        $postParams = $this->app['request_stack']->getCurrentRequest()->request->all();
        $getParams = $this->app['request_stack']->getCurrentRequest()->query->all();
        if (isset($postParams[$key])) {
            return $postParams[$key];
        } elseif (isset($getParams[$key])) {
            return $getParams[$key];
        } else {
            return null;
        }
    }
    public function render($view, array $parameters = array())
    {
        $response = new Response();
        return $response->setContent($this->app['twig']->render($view, $parameters));
    }
}
并扩展它:
class HomeController extends BaseController
{
    public function indexAction()
    {
        // now you can use $this->app
        return $this->render('home.html.twig');
    }
}
上一篇: Silex passing app and request to controller classes
下一篇: HOME Error with rpy2
