Я пытаюсь изменить поведение метода Gedmo \ Tree \ RepositoryUtils-> buildTree (), потому что я хотел бы изменить способ построения возвращаемого массива.
Я стараюсь:
У меня есть класс:
<?php namespace MyCorp\CMSBundle\Util; use Doctrine\Common\Persistence\Mapping\ClassMetadata; use Doctrine\Common\Persistence\ObjectManager; use Gedmo\Exception\InvalidArgumentException; /** * Description of jsandjqTreeCompatibleRepositoryUtils * * @author peterrus */ class jsandjqTreeCompatibleRepositoryUtils extends Gedmo\Tree\RepositoryUtils { public function buildTree(array $nodes, array $options = array()) { $meta = $this->getClassMetadata(); $nestedTree = $this->repo->buildTreeArray($nodes); $default = array( 'decorate' => false, 'rootOpen' => '<ul>', 'rootClose' => '</ul>', 'childOpen' => '<li>', 'childClose' => '</li>', 'nodeDecorator' => function ($node) use ($meta) { // override and change it, guessing which field to use if ($meta->hasField('title')) { $field = 'title'; } elseif ($meta->hasField('name')) { $field = 'name'; } else { throw new InvalidArgumentException("Cannot find any representation field"); } return $node[$field]; } ); $options = array_merge($default, $options); // If you don't want any html output it will return the nested array if (!$options['decorate']) { return $nestedTree; } if (!count($nestedTree)) { return ''; } $build = function($tree) use (&$build, &$options) { $output = is_string($options['rootOpen']) ? $options['rootOpen'] : $options['rootOpen']($tree); foreach ($tree as $node) { $output .= is_string($options['childOpen']) ? $options['childOpen'] : $options['childOpen']($node); $output .= $options['nodeDecorator']($node); if (count($node['children']) > 0) { $output .= $build($node['children']); } $output .= $options['childClose']; } return $output . $options['rootClose']; }; return $build($nestedTree); } } ?>
Теперь я пытаюсь использовать этот класс вместо того, который используется по умолчанию при вызове
$pagerepo = $this->getDoctrine()->getRepository('MyCorpCMSBundle:Page');
Выполняя следующее приведение типов:
$pagerepo = (jsandjqTreeCompatibleRepositoryUtils) $this->getDoctrine()->getRepository('MyCorpCMSBundle:Page');
Но поскольку это не джава, это невозможно.
Что я делаю не так?
Может быть, немного поздно, но мне нужно было сделать то же самое – вот решение на тот случай, если кому-то это понадобится:
Ваш класс хранилища:
namespace Acme\Model\Repository; use Doctrine\ORM\EntityManager; use Gedmo\Tree\Entity\Repository\NestedTreeRepository; use Doctrine\ORM\Mapping\ClassMetadata; use MyNamespace\GenericBundle\Repository\RepositoryUtils as MyRepositoryUtils; /** * Group Repository */ class CategoryRepository extends NestedTreeRepository { /** * @param EntityManager $em * @param ClassMetadata $class */ public function __construct(EntityManager $em, ClassMetadata $class) { parent::__construct($em, $class); $this->repoUtils = new MyRepositoryUtils($this->_em, $this->getClassMetadata(), $this->listener, $this); } }
в MyRepositoryUtils вы можете перезаписать метод buildTree:
namespace MyNamespace\GenericBundle\Repository; use Doctrine\Common\Persistence\Mapping\ClassMetadata; use Doctrine\Common\Persistence\ObjectManager; use Gedmo\Exception\InvalidArgumentException; use Gedmo\Tree\RepositoryUtils as GedmoRepositoryUtils; class RepositoryUtils extends GedmoRepositoryUtils { /** * {@inheritDoc} */ public function buildTree(array $nodes, array $options = array()) { } }