首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖KNP DoctrineBehaviors“底层”

覆盖KNP DoctrineBehaviors“底层”
EN

Stack Overflow用户
提问于 2016-06-13 14:36:27
回答 1查看 183关注 0票数 0

我正在编写一个SEO包,它主要由两个部分组成:

  • 一个表单扩展(用于在表单中添加段塞/title/desc字段)
  • 包含实体侧字段的一个可设置的特征

在此之上,我想要攀爬在KNP DoctrineBehaviors的肩膀上,使用懒散的特性。

我的问题是:在我的建筑中,可携带的特性将被我的可感知特性所使用,而不是最终的课程。在DoctrineBehaviors的内部,我发现特征检查是由一个ClassAnalyzer类完成的,它使用以下方法:

代码语言:javascript
复制
/**
     * Return TRUE if the given object use the given trait, FALSE if not
     * @param ReflectionClass $class
     * @param string $traitName
     * @param boolean $isRecursive
     */
    public function hasTrait(\ReflectionClass $class, $traitName, $isRecursive = false)
    {
        if (in_array($traitName, $class->getTraitNames())) {
            return true;
        }

        $parentClass = $class->getParentClass();

        if ((false === $isRecursive) || (false === $parentClass) || (null === $parentClass)) {
            return false;
        }

        return $this->hasTrait($parentClass, $traitName, $isRecursive);
    }

递归部分检查所有祖先类,但不检查特征中包含的特征。

我头顶上有两个解决方案:

  • 在KNP DoctrineBehaviors上提交一个拉请求,并将这种递归模式扩展到特性(我最终会这样做)
  • 多余的这部分

DoctrineBehaviors不是一个“常规”包,意思是没有在AppKernel中注册。我怎样才能扩展这个部分呢?

谢谢你的答复,

尼古拉斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-14 07:29:41

由于对(vendor/knplabs/doctrine-behaviors/config/orm-services.yml).的仔细阅读,我签入了DoctrineBehaviors配置文件DoctrineBehaviors。

KNP在这里向DoctrineBehaviors包中使用的监听器和类提供所有参数,如:

代码语言:javascript
复制
parameters:
    knp.doctrine_behaviors.reflection.class_analyzer.class: Knp\DoctrineBehaviors\Reflection\ClassAnalyzer
    knp.doctrine_behaviors.reflection.is_recursive: true
    knp.doctrine_behaviors.translatable_subscriber.class: Knp\DoctrineBehaviors\ORM\Translatable\TranslatableSubscriber
# next...

因此,我只是在参数ClassAnalyser部分中使用了我自己的config.yml实例的第一个参数。对于记录,带有祖先特征的递归循环检查:

代码语言:javascript
复制
     /**
     * Return TRUE if the given object use the given trait, FALSE if not
     * Extends from ClassAnalyzer::hasTrait to check in ancestors traits as well
     * @param \ReflectionClass $class
     * @param string $traitName
     * @param boolean $isRecursive
     */
    public function hasTrait(\ReflectionClass $class, $traitName, $isRecursive = false)
    {
        $classTraits = $class->getTraitNames();

        // Trait directly present in final class
        if (in_array($traitName, $classTraits)) {
            return true;
        }

        // Check in parents traits
        foreach($classTraits as $classTrait) {
            $traitObject = new \ReflectionClass($classTrait);

            if($this->hasTrait($traitObject, $traitName, $isRecursive)) {
                return true;
            }
        }

        // Check in parents classes
        $parentClass = $class->getParentClass();

        if ((false === $isRecursive) || (false === $parentClass) || (null === $parentClass)) {
            return false;
        }

        return $this->hasTrait($parentClass, $traitName, $isRecursive);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37792543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档