[CORE][Controller] Fix `Controller::__invoke` so it actually passes on the route parameters to the controller method. Add `Controller->string`, which gets a query parameter as a string value, or null if not set

This commit is contained in:
Hugo Sales 2021-09-05 19:41:06 +01:00
parent 330143e549
commit 1d5fd1aefa
Signed by: someonewithpc
GPG Key ID: 7D0C7EAFC9D835A0
1 changed files with 10 additions and 3 deletions

View File

@ -65,10 +65,11 @@ class Controller extends AbstractController implements EventSubscriberInterface
$this->request = $request; $this->request = $request;
$class = get_called_class(); $class = get_called_class();
$method = 'on' . ucfirst(strtolower($request->getMethod())); $method = 'on' . ucfirst(strtolower($request->getMethod()));
$attributes = array_diff_key($request->attributes->get('_route_params'), array_flip(['_format', '_fragment', '_locale', 'template', 'accept']));
if (method_exists($class, $method)) { if (method_exists($class, $method)) {
return $class::$method($request, $this->vars); return $class::$method($request, ...$attributes);
} else { } else {
return $class::handle($request, $this->vars); return $class::handle($request, ...$attributes);
} }
} }
@ -174,11 +175,15 @@ class Controller extends AbstractController implements EventSubscriberInterface
} }
/** /**
* Get and convert GET parameters. Can be called with `int`, `bool`, etc * Get and convert GET parameters. Can be called with `int`, `bool`, `string`, etc
* *
* @param string $name * @param string $name
* *
* @throws ValidatorException * @throws ValidatorException
* @throws Exception
*
* @return the value or null if no paramter exists
*
*/ */
public function __call(string $method, array $args) public function __call(string $method, array $args)
{ {
@ -189,6 +194,8 @@ class Controller extends AbstractController implements EventSubscriberInterface
return (int) $value; return (int) $value;
case 'bool': case 'bool':
return (bool) $value; return (bool) $value;
case 'string':
return (string) $value;
default: default:
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
Log::critical($m = "Method '{$method}' on class App\\Core\\Controller not found (__call)"); Log::critical($m = "Method '{$method}' on class App\\Core\\Controller not found (__call)");