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