需要父级的最优雅方法:: __ construct()

  • 本文关键字:方法 construct php oop
  • 更新时间 :
  • 英文 :


说我有以下控制器结构:

class Controller {
    public function __construct(){
       $this->accessControl();
    }
}
class Account extends Controller {
   public function __construct(User $user){
      parent::__construct();
      $this->user = $user;
   }
}

如何要求其他开发人员在其子控制器中明确调用parent::__construct()?它包含诸如访问控制等的关键内容

到目前为止,我决定将所有功能从父构建器包装到init()方法中,该方法将initialized属性设置为TRUE,然后在路由器中检查此属性。如果不是真的 - 抛出异常。

public $initialized = false;
class Controller {
    public function __construct(){
       $this->init();
    }
}
protected function init(){
   $this->accessControl();
   $this->initialized = true;
}
class Router {
    public function process($path){
       $controller = new User();
       if(!$controller instanceof Controller || !$controller->initialized){
          throw new Exception('Error');
       }
    }
}

它闻起来不好?

在symfony console命令中需要相同的情况,其中构造函数必须添加命令名称和定义

他们在添加命令的单个地方像这样处理。因此,您在路由器中检查控制器的方法是相同的。我会为此,而不是将责任放在抽象控制器或某些反射。


另一方面,应该在安全层级别上检查accessControl(),而不是在路由器中检查。

您使用哪个框架?

您可以使用EventUbscriber和Framework事件将其从路由器中解脱出来?

是的,闻起来很糟糕。

如何要求其他开发人员明确调用父:: __ construct(( 他们的子控制器?

好吧,首先,您应该信任开发人员。另一个问题是如何确保所有控制器都有访问控制。为了确保这一点,您必须通过测试覆盖所有控制器。因此,对于每个控制器,应检查未经授权的用户是否可以访问它。

到目前为止,我决定将父构建器的所有功能都包装到 init()initialized属性设置为true的方法,然后检查此 路由器中的属性。

实际上,您的init函数没有值,因为您只是从__construct移动代码(在一天结束时,您必须确保开发人员调用init函数 - 请参阅,仅更改名称;((。您还可以在__construct本身中设置initialized

if(!$controller instanceof Controller || !$controller->initialized){
    throw new Exception('Error');
}

因此,您最终将执行开发人员检查控制器是否已初始化,在每个地方都将使用。

我想您不能使代码万无一失。您必须信任开发人员做正确的事情并教育新团队成员。当然,您应该通过测试介绍所有代码

有一个很好的播客,这对您的问题很明显:"与Ryan Takerada和Matt Machuga一起使用安全圆桌"。

最新更新