8

我想要一种在我的控制器类中访问 $app 和 $request 的简单方法。文件说要这样做,

public function action(Application $app, Request $request) {
 // Do something.
}

但是必须将 $app 和 $request 注入每个方法看起来并不正确。有没有办法在默认情况下将 $app 和 $request 包含到每个控制器中,也许使用构造函数?我希望能够将它用作 $this->app。

谢谢。

4

2 回答 2

3

在文档的Controllers as Services部分中,您可以看到如何通过构造函数将依赖项注入控制器类 - 在这种情况下是存储库。

于 2013-07-10T05:37:22.123 回答
1

这是可能的 :

在您的项目中创建一个ControllerResolver.php地方并将其放入:

namespace MyProject;

use Silex\ControllerResolver as BaseControllerResolver;

class ControllerResolver extends BaseControllerResolver
{
    protected function instantiateController($class)
    {
        return new $class($this->app);
    }
}

然后在您的应用中注册它(之前$app->run();):

$app['resolver'] = function ($app) {
    return new \MyProject\ControllerResolver($app, $app['logger']);
};

现在您可以为您的应用程序创建一个基本控制器,例如:

namespace MyProject;

use Silex\Application;
use Symfony\Component\HttpFoundation\Response;

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');
    }
}
于 2017-02-18T23:12:10.923 回答