gpt4 book ai didi

php - config.yml 中的 SilverStripe 类扩展

转载 作者:行者123 更新时间:2023-12-02 05:32:43 26 4
gpt4 key购买 nike

我注意到在某些情况下,当您编写一个扩展现有类的类时,您需要在 config.yml 文件中声明类扩展。

例如,我最近写了这段代码来删除 CMS 后端的“帮助”按钮。

mysite/code/Tweak.php

class Tweak extends LeftAndMainExtension
{
public function init()
{
parent::init();
/* Remove help link */
CMSMenu::remove_menu_item('Help');
}
}

mysite/code/Config.yml

LeftAndMain:
extensions:
- Tweak

问题一:为什么有些类扩展需要在config.yml中声明?为什么其他类扩展(例如扩展 DataObject 或 Page_Controller)不需要这个额外的步骤?

问题 2: 关于上述代码的具体问题,为什么我在配置文件中将 Tweaks 声明为 LeftAndMain 的扩展,但在我实际上正在扩展 php 文件 LeftAndMainExtension?

最佳答案

Question 1: Why do some class extensions need to be declared in config.yml? And why is this extra step not necessary for other class extensions (eg extending DataObject or Page_Controller)?

PHP 和 SilverStripe 术语之间存在重要区别。

在 SilverStripe 中,Extension 是一种在 SilverStripe 中实现的框架功能,它允许您修改对象的行为,而无需访问除公共(public)内容以外的任何内容。在这方面它与 Ruby 类似。

在 PHP 中,您可以使用 extends 关键字来定义现有类的子类。

在您的示例中,您使用的是 LeftAndMainExtension,这是一个 SilverStripe“扩展”- 这允许您修改 SilverStripe 管理区域中 CMS 菜单的行为,而它不会 从字面上扩展(用 PHP 术语)LeftAndMain

Question 2: Specific question about above code, why am I declaring Tweaks as an extension to LeftAndMain in the config file, but in the php file I'm actually extending LeftAndMainExtension?

如上所述,这就是 SilverStripe 的扩展系统的工作原理。它基本上遵循以下过程:

  • 您在继承的某个点创建了一个扩展(PHP 关键字)Extension 的类(您使用LeftAndMainExtension,它扩展了扩展名)。对于 DataObject,您可以使用 DataExtension
  • 您告诉 SilverStripe 将您的扩展应用于一个对象,在本例中是 LeftAndMain

命名是经过深思熟虑的,因此您可以轻松/直观地将对象及其相关扩展组合在一起:

Convention is for extension class names to end in Extension. This isn't a requirement but makes it clearer

- SilverStripe developer documentation

请注意,我故意将 Extension 大写以表示它是一个 SilverStripe 扩展类,而不是一个类的 PHP 扩展(class Foo extends Bar)。


框架如何执行这个过程的例子,基本上是这样的:

  • 对象已初始化
  • 框架分析 YAML 配置(或通过 Object::add_extension() 应用的扩展)进行扩展
  • 框架循环扩展,将 $this->owner 设置为当前对象,以便扩展可以从中访问公共(public)方法和属性
  • 框架返回最终对象

More info here.

关于php - config.yml 中的 SilverStripe 类扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38211308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com