有人可以在 Silverstripe :
中解释此代码public function init() {
RSSFeed::linkToFeed($this->Link() . "rss");
parent::init();
}
init函数究竟是什么?
parent::init();
在代码中完全做到了
答案 0 :(得分:1)
在php类中,当你覆盖父类的方法时,你仍然可以使用这个代码调用父类,它将帮助你在实际方法的开头放一些代码而不删除它。
了解更多相关信息答案 1 :(得分:0)
最高级的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
类 - 工作方式与上述相同。