我知道这会有点奇怪,所以我会尽量简明扼要。
我正在为Grav开发一个插件。我已经确定实现我的目标的最有效的方法是扩展一个基类,Pages。
结构看起来像这样:
这在实际中是什么样子的。
$grav = Grav::instance( array( 'loader‘=> $loader ) );
受保护的静态$diMap = .....'pages‘=> 'Grav\Common\Page\Pages','pagesProcessor’=>‘Grav\Common\Processor\PagesProcessor’,.....;受保护的$processors = .....‘'pagesProcessor',.....;公共静态函数实例(数组实例= []) { if (!self::$ $values ){ self::$instance = static::load($values);.....return self::$instance;}受保护静态函数加载(数组$values) { $container =新静态($values);.....$container->registerServices($container);return $container;}受保护的函数registerServices() { foreach (self::$diMap as $serviceKey => $serviceClass) { .....$this->registerService($serviceKey,$serviceClass);.....}} protected function registerService($serviceKey,$serviceClass) { $this$serviceKey = function ($c) use ($serviceClass) { return new $serviceClass($c);};}
尝试{ $grav->process();}
public function process() { foreach ($ $processor ->$processor as $processor) {$processor= $this$processor;.....$processor->process();.....} .....}
公共函数进程(Grav__construct){$this->$container= $container;}公共函数__construct(){ .....$ $this->container->fireEvent('onPagesInitialized',->容器‘pages’->init();新事件([‘pages’=> $this->容器‘pages’]));.....}
公共静态函数getSubscribedEvents() { return [ 'onPagesInitialized‘=> 'onPagesInitialized',0 ];}公共函数onPagesInitialized(Event $event) { //在此执行操作...}
哇塞。好的。
现在,我想要做的是扩展Pages.php (上面没有列出),这样我就可以修改它的一些本地没有setter的受保护属性。问题是,在grav被初始化之前,没有办法告诉它使用扩展方法。
我总是可以创建一个扩展类的新实例,初始化它,并覆盖现有的实例,但这意味着有效地强制初始化两次,这意味着加倍的处理时间,这是非常无效的。
我想做的事情如下:
Pages.php <-我不能更改此设置:
class Pages
{
protected $grav;
protected $instances;
protected $children;
protected $routes = [];
public function __construct(Grav $c)
{
$this->grav = $c;
}
.....
public function init()
{
.....
$this->instances = [];
$this->children = [];
$this->routes = [];
$this->buildPages();
}
.....
PagesExtended.php <-我的类
class PagesExtended extends Pages
{
public function __construct(Pages $original)
{
// set the properties of this class to the original instance
parent = $original;
}
public function setInstances(Array $newInstances){
$this->instances = $newInstances;
}
.....
}
然后在我的Plugin.php中
public function onPagesInitialized(Event $event) {
// Do things here...
$this->grav['pages'] = new PagesExtended($event['pages']);
}
我唯一能想到的另一件事就是某种__call技巧。
所以..。有什么想法?
EDIT
好吧..。我仍然想知道这是否可以做到,但事实证明grav“冻结”了这些服务,所以它们不能被覆盖。现在不是很开心。
发布于 2018-06-23 07:50:28
事实证明,无论我尝试扩展什么类,在grav环境中都是不可能完成的。它永远不能通过插件来完成,因为那些类被grav“冻结”了。
发布于 2018-06-22 00:33:31
我不知道您真正想要实现什么,但是您的Page自定义方法必须返回一些东西,并且它们在Twig中使用。
我经常把页面的自定义数据放在页面的页眉中。在我的插件中,它获取自定义数据($oldHeader = $page->header()
),计算素材,并将最终结果作为自定义新属性($page->header($newHeader)
)再次添加到Page对象中,然后在Twig中我可以访问并打印出我的页面的这些新数据({{ page.header.data_generated_in_plugin }}
)。
这样,我可以在不覆盖Page类的情况下做任何事情。
https://stackoverflow.com/questions/50828370
复制相似问题