【问题标题】:How to create base class for all my symfony controllers如何为我所有的 symfony 控制器创建基类
【发布时间】:2017-03-30 01:16:36
【问题描述】:

我想为我在 Symfony 中的所有控制器创建一个基本控制器类,我对 Symfony 很陌生,所以不要对愚蠢的问题生气。我问这个问题是因为我不能做这样的事情

    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    class AbstractController extends Controller
    {
        public function __construct()
        {
            //...... check access level
            $user = $this->getUser(); //This is not working, I don't have access to the Controller(the base class) properties
        }
    }

现在是我的控制器之一

    class UserController extends AbstractController
    {
        public deleteUserAction(Request $request)
        {
          var_dump($this);// this will dump an empty class that is not instance of Symfony\Bundle\FrameworkBundle\Controller\Controller
          //.... delete user
        }
    }

最好的方法是什么?请... 编辑.... 我真正想做的是检查用户权限级别是否足以访问特定控制器(例如 UserController)中的特定操作(例如 deleteUserAction()),我有一个类将权限级别附加到所有控制器中的所有操作.如果检查发生在父控制器(例如 BaseController 的构造函数)中,它在 UserController->deleteUserAction() 之前执行但在基本控制器中我无权访问 $this,则检查将非常有效。 我已经尝试过选民和 ACL,但对我的情况没有帮助。 提前致谢。

【问题讨论】:

  • 您所做的继承方式很好,尽管您可能希望将AbstractController 实际上设为abstract$this instanceof Abstractcontroller in UserController 应该返回 true(考虑到您没有使用不同的命名空间或正确处理它们)。
  • 您不能在 Controller::__construct() 中做任何事情,因为尚未设置容器。就是行不通。您可以做的是创建一个控制器侦听器类,该类将在控制器完全构造后和调用控制器操作之前调用。这是一个有点高级的话题。可能只想检查操作中的权限以开始。 symfony.com/doc/current/event_dispatcher.html

标签: php symfony controller abstract-base-class


【解决方案1】:

我认为第二个是创建自己的类并在其中使用通用函数的最佳方式。

如果您想添加控制器的一些常用功能,那么将其添加到 Symfony 默认控制器中是不正确的方法,相反您可以创建 BaseController 并使用 BaseController 和您的 @987654323 扩展您的所有控制器@。

通过这种方式,symfony 的默认控制器保持不变。

【讨论】:

    【解决方案2】:

    只需使用服务控制器...共享:

    http://symfony.com/doc/current/controller/service.html

    【讨论】:

      猜你喜欢
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 2020-11-07
      • 1970-01-01
      相关资源
      最近更新 更多