082a0130c2
Signed-off-by: Gergely POLONKAI (W00d5t0ck) <polesz@w00d5t0ck.info>
109 lines
3.2 KiB
PHP
109 lines
3.2 KiB
PHP
<?php
|
|
|
|
namespace Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter;
|
|
|
|
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationInterface;
|
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Doctrine\Common\Persistence\ManagerRegistry;
|
|
|
|
/*
|
|
* This file is part of the Symfony framework.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* This source file is subject to the MIT license that is bundled
|
|
* with this source code in the file LICENSE.
|
|
*/
|
|
|
|
/**
|
|
* DoctrineParamConverter.
|
|
*
|
|
* @author Fabien Potencier <fabien@symfony.com>
|
|
*/
|
|
class DoctrineParamConverter implements ParamConverterInterface
|
|
{
|
|
/**
|
|
* @var ManagerRegistry
|
|
*/
|
|
protected $registry;
|
|
|
|
public function __construct(ManagerRegistry $registry = null)
|
|
{
|
|
$this->registry = $registry;
|
|
}
|
|
|
|
public function apply(Request $request, ConfigurationInterface $configuration)
|
|
{
|
|
$class = $configuration->getClass();
|
|
$options = $this->getOptions($configuration);
|
|
|
|
// find by identifier?
|
|
if (false === $object = $this->find($class, $request, $options)) {
|
|
// find by criteria
|
|
if (false === $object = $this->findOneBy($class, $request, $options)) {
|
|
throw new \LogicException('Unable to guess how to get a Doctrine instance from the request information.');
|
|
}
|
|
}
|
|
|
|
if (null === $object && false === $configuration->isOptional()) {
|
|
throw new NotFoundHttpException(sprintf('%s object not found.', $class));
|
|
}
|
|
|
|
$request->attributes->set($configuration->getName(), $object);
|
|
|
|
return true;
|
|
}
|
|
|
|
protected function find($class, Request $request, $options)
|
|
{
|
|
if (!$request->attributes->has('id')) {
|
|
return false;
|
|
}
|
|
|
|
return $this->registry->getRepository($class, $options['entity_manager'])->find($request->attributes->get('id'));
|
|
}
|
|
|
|
protected function findOneBy($class, Request $request, $options)
|
|
{
|
|
$criteria = array();
|
|
$metadata = $this->registry->getManager($options['entity_manager'])->getClassMetadata($class);
|
|
foreach ($request->attributes->all() as $key => $value) {
|
|
if ($metadata->hasField($key)) {
|
|
$criteria[$key] = $value;
|
|
}
|
|
}
|
|
|
|
if (!$criteria) {
|
|
return false;
|
|
}
|
|
|
|
return $this->registry->getRepository($class, $options['entity_manager'])->findOneBy($criteria);
|
|
}
|
|
|
|
public function supports(ConfigurationInterface $configuration)
|
|
{
|
|
if (null === $this->registry) {
|
|
return false;
|
|
}
|
|
|
|
if (null === $configuration->getClass()) {
|
|
return false;
|
|
}
|
|
|
|
$options = $this->getOptions($configuration);
|
|
|
|
// Doctrine Entity?
|
|
return ! $this->registry->getManager($options['entity_manager'])
|
|
->getMetadataFactory()
|
|
->isTransient($configuration->getClass());
|
|
}
|
|
|
|
protected function getOptions(ConfigurationInterface $configuration)
|
|
{
|
|
return array_replace(array(
|
|
'entity_manager' => null,
|
|
), $configuration->getOptions());
|
|
}
|
|
}
|