silverstripe init()函数

问题描述 投票:-2回答:2

有人可以在Silverstripe中解释这段代码:

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

init函数究竟是什么?

什么parent::init();

完全在代码中做

php silverstripe
2个回答
1
投票

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

你可以在php documentation找到更多相关信息


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类 - 工作方式与上面说明的相同。

© www.soinside.com 2019 - 2024. All rights reserved.