微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – Silex中的自定义BaseController

我在Silex 1.3.4中创建了一个简单的应用程序,我希望有一个基本控制器,它将有__construct方法接受$app和$request.然后,所有继承控制器应该具有各自的构造函数调用父控制器构造方法.

//Use statements here....

class AppController
{
  public function __construct(Application $app, Request $request){
    $this->app = $app;
    $this->request = $request;
   }
 }

继承控制器的编写如下:

//Use statements here....

class ItemsController extends AppController
{
  public function __construct(Application $app, Request $request){
    parent::__construct($app, $request);
   }

  public function listAction()
  {
    //code here without having to pass the application and request objects
   }
 }

我决定路由的方法如下所示:

   $app->post(
     '/items/list', 'MySilexTestDrive\Controller\ItemsController::listAction'
   )->bind('list');

我正在考虑使用调度程序并覆盖那里的一些进程并以我自己的方式创建我的控制器实例,但我不知道如何以及如果这是一个好主意.

有没有做过类似事情的人?请帮忙.

解决方法:

您可以使用ServiceControllerServiceProvider将控制器定义为应用程序中的服务.但是你不能以这种方式注入请求.顺便说一句,您可以有多个请求,如果您进行子请求,请求实例可以更改.您可以注入RequestStack,然后在需要获取当前请求时调用$requestStack-> getCurrentRequest().

$app = new Silex\Application();

abstract class AppController
{
    protected $app;
    protected $requestStack;

    public function __construct(Silex\Application $app, Symfony\Component\HttpFoundation\RequestStack $requestStack)
    {
        $this->app = $app;
        $this->requestStack = $requestStack;
    }

    public function getRequest()
    {
        return $this->requestStack->getCurrentRequest();
    }
}

class ItemsController extends AppController
{
    public function listAction()
    {
        $request = $this->getRequest();
        // ...
    }
}

$app->register(new Silex\Provider\ServiceControllerServiceProvider());

$app['items.controller'] = $app->share(function() use ($app) {
    return new ItemsController($app, $app['request_stack']);
});

$app->get('/items/list', "items.controller:listAction");

做这样的事情有意义吗?我不这么认为.特别是如果框架通过类型提示为您提供请求实例.做就是了

public function listAction(Application $app, Request $request)
{
    // ...
}

并与之合作.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐