有人可以用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
类 - 其工作方式与上述相同。