<?php
namespace App\RequestMapper;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
use Symfony\Component\HttpKernel\KernelEvents;
/**
* @author Azad KAYA <info@azadkaya.com>
*/
class RequestMapper implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER_ARGUMENTS=>[
['onControllerEvent', 10]
]
];
}
public function onControllerEvent(ControllerArgumentsEvent $controllerArgumentsEvent)
{
$this->setParametersToObject($controllerArgumentsEvent);
}
/**
* @throws \ReflectionException
* @throws \Exception
*/
public function setParametersToObject(ControllerArgumentsEvent $event)
{
$event->getRequest()->isXmlHttpRequest();
$getParameters = $event->getRequest()->query->all();
$postParameters = $event->getRequest()->request->all();;
$arguments = $event->getArguments();
foreach ($arguments as $argument){
if(is_object($argument)){
$argReflection = new \ReflectionClass($argument);
if(count($argReflection->getAttributes()) > 0){
foreach($argReflection->getAttributes() as $attr){
if($attr->getName() == 'App\RequestMapper\Annotations\DtoAnnotation'){
if($attr->getArguments()){
foreach ($attr->getArguments()['methods'] as $method){
if($method == 'POST')
$this->setParameters($postParameters, $argReflection, $argument);
else if($method == 'GET')
$this->setParameters($getParameters, $argReflection, $argument);
else
throw new \Exception(sprintf("Annotation methods parameter must be only POST, GET, PUT, DELETE. %s is not supported", $method));
}
}else{
$this->setParameters($postParameters, $argReflection, $argument);
$this->setParameters($getParameters, $argReflection, $argument);
}
}
}
}
}
}
}
public function setParameters($parameters, \ReflectionClass $argReflection, $argument)
{
foreach ($parameters as $key => $value){
if($argReflection->hasProperty($key)){
$argReflection->getProperty($key)->setAccessible(true);
$argReflection->getProperty($key)->setValue($argument,$value);
}
}
}
}