Forked from adamsafr/AbstractBySlugAndActiveSearcher.php
Created
April 9, 2020 04:09
-
-
Save Microtribute/c6e9d19db86a480fd54f1be24b237c8a to your computer and use it in GitHub Desktop.
Symfony: ParamConverter usage example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace FrontEndBundle\Request\ParamConverter; | |
use Doctrine\Bundle\DoctrineBundle\Registry; | |
use Doctrine\Common\Persistence\ObjectRepository; | |
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; | |
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | |
abstract class AbstractBySlugAndActiveSearcher | |
{ | |
/** | |
* @param ParamConverter $configuration | |
* @param Registry|null $registry | |
* | |
* @return bool | |
*/ | |
final protected function isObjectSupported(ParamConverter $configuration, Registry $registry = null) | |
{ | |
if ($configuration->getConverter() !== $this->getConverterName()) { | |
return false; | |
} | |
if (!$this->isEntityManagerFound($registry)) { | |
return false; | |
} | |
$className = $configuration->getClass(); | |
if ($className === null) { | |
return false; | |
} | |
$em = $registry->getManagerForClass($className); | |
if ($em->getClassMetadata($className)->getName() !== $this->getEntityClassName()) { | |
return false; | |
} | |
return true; | |
} | |
/** | |
* @param Registry|null $registry | |
* | |
* @return bool | |
*/ | |
private function isEntityManagerFound(Registry $registry = null) | |
{ | |
return null !== $registry && count($registry->getManagers()) > 0; | |
} | |
/** | |
* @param ObjectRepository $repository | |
* @param string $slug | |
* | |
* @return object | |
* | |
* @throws NotFoundHttpException | |
*/ | |
protected function getEntity(ObjectRepository $repository, $slug) | |
{ | |
$entity = $repository->findOneBy([ | |
'slug' => $slug, | |
'active' => true, | |
]); | |
if ($entity === null) { | |
throw new NotFoundHttpException(); | |
} | |
return $entity; | |
} | |
/** | |
* @return string | |
*/ | |
abstract protected function getEntityClassName(); | |
/** | |
* @return string | |
*/ | |
abstract protected function getConverterName(); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace FrontEndBundle\Request\ParamConverter; | |
use Doctrine\Bundle\DoctrineBundle\Registry; | |
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; | |
use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\ParamConverterInterface; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | |
use AppBundle\Entity\Category; | |
class CatalogCategoryParamConverter extends AbstractBySlugAndActiveSearcher implements ParamConverterInterface | |
{ | |
/** | |
* @var Registry | |
*/ | |
protected $registry; | |
/** | |
* CatalogCategoryParamConverter constructor. | |
* | |
* @param Registry|null $registry | |
*/ | |
public function __construct(Registry $registry = null) | |
{ | |
$this->registry = $registry; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function apply(Request $request, ParamConverter $configuration) | |
{ | |
$categorySlug = $request->attributes->get('categorySlug'); | |
if ($categorySlug === null) { | |
throw new NotFoundHttpException(); | |
} | |
$repository = $this->registry | |
->getManagerForClass($configuration->getClass()) | |
->getRepository($configuration->getClass()); | |
$request->attributes->set($configuration->getName(), $this->getEntity($repository, $categorySlug)); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function supports(ParamConverter $configuration) | |
{ | |
return $this->isObjectSupported($configuration, $this->registry); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
protected function getEntityClassName() | |
{ | |
return Category::class; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
protected function getConverterName() | |
{ | |
return 'catalog_category_converter'; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace FrontEndBundle\Controller; | |
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; | |
use Symfony\Bundle\FrameworkBundle\Controller\Controller; | |
use Symfony\Component\HttpFoundation\Request; | |
use AppBundle\Entity\Category; | |
class CatalogController extends Controller | |
{ | |
/** | |
* @ParamConverter("category", class="AppBundle:Category", converter="catalog_category_converter") | |
* | |
* @param Request $request | |
* @param Category $category | |
* | |
* @return \Symfony\Component\HttpFoundation\Response | |
*/ | |
public function indexAction(Request $request, Category $category) | |
{ | |
// ... | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Param Converters | |
frontend.param_converter.catalog_category_converter: | |
class: FrontEndBundle\Request\ParamConverter\CatalogCategoryParamConverter | |
arguments: | |
- '@doctrine' | |
tags: | |
- { name: request.param_converter, converter: catalog_category_converter } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment