我正在编写一个SEO包,它主要由两个部分组成:
在此之上,我想要攀爬在KNP DoctrineBehaviors的肩膀上,使用懒散的特性。
我的问题是:在我的建筑中,可携带的特性将被我的可感知特性所使用,而不是最终的课程。在DoctrineBehaviors的内部,我发现特征检查是由一个ClassAnalyzer类完成的,它使用以下方法:
/**
* 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);
}递归部分检查所有祖先类,但不检查特征中包含的特征。
我头顶上有两个解决方案:
DoctrineBehaviors不是一个“常规”包,意思是没有在AppKernel中注册。我怎样才能扩展这个部分呢?
谢谢你的答复,
尼古拉斯
发布于 2016-06-14 07:29:41
由于对(vendor/knplabs/doctrine-behaviors/config/orm-services.yml).的仔细阅读,我签入了DoctrineBehaviors配置文件DoctrineBehaviors。
KNP在这里向DoctrineBehaviors包中使用的监听器和类提供所有参数,如:
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实例的第一个参数。对于记录,带有祖先特征的递归循环检查:
/**
* 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);
}https://stackoverflow.com/questions/37792543
复制相似问题