1. Go to this page and download the library: Download rezozero/tree-walker library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
rezozero / tree-walker example snippets
use RZ\TreeWalker\WalkerInterface;
use RZ\TreeWalker\WalkerContextInterface;
use RZ\TreeWalker\AbstractWalker;
use RZ\TreeWalker\Definition\ContextualDefinitionTrait;
class Dummy
{
// Current dummy identifier
private $id;
// Nested tree style current dummy parent identifier
private $parentDummyId;
public function hello(){
return 'Hey Ho!';
}
public function getId(){
return $this->id;
}
}
class NotADummy
{
// Nested tree style current dummy parent identifier
private $parentDummyId;
public function sayNothing(){
return '…';
}
}
class DummyWalkerContext implements WalkerContextInterface
{
private $dummyRepository;
private $notADummyRepository;
public function __construct($dummyRepository, $notADummyRepository)
{
$this->dummyRepository = $dummyRepository;
$this->notADummyRepository = $notADummyRepository;
}
public function getDummyRepository()
{
return $this->dummyRepository;
}
public function getNotADummyRepository()
{
return $this->notADummyRepository;
}
}
final class DummyChildrenDefinition
{
use ContextualDefinitionTrait;
public function __invoke(Dummy $dummy, WalkerInterface $walker): array
{
if ($this->context instanceof DummyWalkerContext) {
return array_merge(
$this->context->getDummyRepository()->findByParentDummyId($dummy->getId()),
$this->context->getNotADummyRepository()->findByParentDummyId($dummy->getId())
);
}
throw new \InvalidArgumentException('Context should be instance of ' . DummyWalkerContext::class);
}
}
final class DummyWalker extends AbstractWalker implements \IteratorAggregate
{
protected function initializeDefinitions(): void
{
/*
* All Tree-walker logic occurs here…
* You are free to code any logic to fetch your item children, and
* to alter it given your WalkerContextInterface such as security, request…
*/
$this->addDefinition(Dummy::class, new DummyChildrenDefinition($this->getContext()));
}
}
/*
* Some stupid recursive function to
* walk entire entities tree graph
*/
function everyDummySayHello(WalkerInterface $walker) {
if ($walker->getItem() instanceof Dummy) {
echo $walker->getItem()->hello();
}
if ($walker->getItem() instanceof NotADummy) {
echo $walker->getItem()->sayNothing();
}
if ($walker->count() > 0) {
foreach ($walker as $childWalker) {
// I love recursive functions…
everyDummySayHello($childWalker);
}
}
}
// -------------------------------------------------------
// Just provide some $entityManager to fetch your entities
// from a database, a file, or your fridge…
// -------------------------------------------------------
$dummyRepository = $entityManager->getRepository(Dummy::class);
$notADummyRepository = $entityManager->getRepository(NotADummy::class);
$firstItem = $dummyRepository->findOneById(1);
// Calling an AbstractWalker constructor is forbidden, always
// use static build method
$walker = DummyWalker::build(
$firstItem,
new DummyWalkerContext($dummyRepository, $notADummyRepository),
3 // max level count
);
everyDummySayHello($walker);
final class DummyChildrenDefinition
{
use ContextualDefinitionTrait;
public function isStoppingCollectionOnceInvoked(): bool
{
return true;
}
public function __invoke(Dummy $dummy, WalkerInterface $walker): array
{
// ...
}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.