silverstripe init() function


silverstripe init() function

有人可以用Silverstripe解释这段代码吗:

public function init() {
    RSSFeed::linkToFeed($this->Link() . "rss");   
    parent::init();
}

初始化函数到底是什么?

什么parent::init();

完全在代码中执行

在php类中,当您覆盖父类的方法时,您仍然可以使用此代码调用父类,它将帮助您将一些代码放在真实方法的开头而不删除它。

您可以在PHP文档中找到有关它的更多信息

upmost init() 方法在 Controller 类中定义。然后 ContentController 扩展了 Controller,它覆盖了 Controller 类的 init() 方法,但它也在第一行调用 parent::init()。然后,通常您像这样定义所有页面控制器类(对于任何新页面类型),在下面的示例中为默认Page_Controller类定义:

class Page_Controller extends ContentController {
  public function init() {
    parent::init();
    // do your own stuff here
  }
}

所以这是传统的基于 PHP 的类扩展机制,但 Silverstripe 还允许你使用 Extensions 和 Data Extensions,这基本上是扩展了已经存在的控制器、数据对象的功能。我不会详细介绍这个...您可以在此处找到有关此内容的更多信息:https://docs.silverstripe.org/en/4/developer_guides/extending/extensions/

我通常在我的控制器类中有这样的东西:

class Page_Controller extends ContentController {
  public function init() {
    parent::init();
    // do your own stuff here
    $this->extend('updateInit');
  }
}

请注意上面的$this->extend('updateInit');行。

我可以在某处为 YAML 配置文件中的 Page_Controller 类定义另一个扩展,然后在该类中定义 updateInit() 方法。 示例:

class Page_Controller_Extension extends Extension {
  public function updateInit() {
    // do some more stuff here
  }
}

。在这种情况下,您将在 YAML 配置文件中有类似的东西:

---
Name: siteextensions
After:
  - 'framework/*'
  - 'cms/*'
---
Page_Controller:
  extensions:
    - Page_Controller_Extension

请注意,这并不是扩展类的传统方式,就像在PHP中那样,它更像是为控制器类定义一些装饰器。另外,要引用父项或要修饰的对象,您不能只使用 $this ,您需要使用 $this->owner 。示例如下:

class Page_Controller_Extension extends Extension {
  public function updateInit() {
    // do some more stuff here
    if ($this->owner->IsFeatured) {
      // do something here
    }
  }
}

您通常会修饰扩展 Extension 类的控制器,如果要修饰 DataObjects,则可以扩展 DataExtension 类 - 其工作方式与上述相同。