php - component - Enrutamiento de Symfony2 a los controladores que usan parámetros de cadena de consulta
symfony request (1)
Actualmente vivo en Bizzaro World con un cliente.
Debido a que la aplicación Symfony que estamos escribiendo tiene la respuesta inyectada en una página en otra aplicación, estamos forzados a tener solo una URL para la aplicación, pero afortunadamente conseguimos que la cadena de consulta nos sea transmitida intacta.
Como tal, tengo que hacer exactamente lo contrario de cómo Symfony hace las cosas, una especie de enfoque MVC de la vieja escuela. Necesito el enrutamiento para trabajar a través de parámetros de cadena de consulta, el enrutamiento al controlador correcto y la prestación de la respuesta correcta, y no utilizar el enfoque de ruta estándar y sano.
Por lo tanto, las URL serían http://www.bizzaro.com/appname?route=%2fblog
y no http://www.bizzaro.com/appname/blog
, y así sucesivamente.
Hay buenos ejemplos en la sección de enrutamiento sobre cómo garantizar que las cadenas de consulta se pasen como parámetros a las acciones del controlador, pero no para este enfoque más bien regresivo.
¿Dónde empiezo siquiera?
Implementé la solución 2 propuesta por Corentin Dandoy a continuación, pero modificada ligeramente para evitar un bucle al buscar la raíz.
namespace AppBundle/Controller;
use Symfony/Component/HttpFoundation/Request;
use Symfony/Component/Routing/Exception/ResourceNotFoundException;
use Symfony/Bundle/FrameworkBundle/Controller/Controller;
class FrontControllerControllerController extends Controller
{
/**
* Forward the request to the appropriate controller
* @param Request $request
* @return /Symfony/Component/HttpFoundation/Response
*/
public function indexAction(Request $request)
{
// get the parameter that specifies the route to the ''real'' homepage controller
$homeroute = $this->container->getParameter(''homeroute'');
$route = $request->query->get(''route'');
// Convert the query-string route into a valid path route
$path = ''/''.$route;
// if it is the route, then use the ''real'' homepage controller, otherwise you end up in a routing loop!
if ($path === ''/'')
{
$match = $this->get(''router'')->match(''/'' . $homeroute);
} else {
try {
$match = $this->get(''router'')->match($path);
} catch (ResourceNotFoundException $e) {
throw $this->createNotFoundException(''The route does not exist'');
}
}
$params = array(
''request'' => $request,
);
return $this->forward($match[''_controller''], $params);
}
}
SOLUCIÓN 1
Una solución simple (no escalable) es esta:
namespace AppBundle/Controller;
use Symfony/Component/HttpFoundation/Request;
use Symfony/Component/HttpFoundation/Response;
use Sensio/Bundle/FrameworkExtraBundle/Configuration/Route;
class MainController
{
/**
* @Route("/app", name="bizarro_app")
*/
public function mainAction(Request $request)
{
$route = $request->query->get(''route'');
switch ($route) {
case ''blog'':
return $this->blogAction($request);
default:
throw $this->createNotFoundException(''The route does not exist'');
}
}
protected function blogAction(Request $request)
{
// Your blog page here
return new Response(''...'');
}
}
SOLUCIÓN 2
Si no te importa tener los dos tipos de rutas disponibles, puedes probar esto:
namespace AppBundle/Controller;
use Symfony/Component/HttpFoundation/Request;
use Symfony/Component/HttpFoundation/Response;
use Symfony/Component/Routing/Exception/ResourceNotFoundException;
use Sensio/Bundle/FrameworkExtraBundle/Configuration/Route;
class MainController
{
/**
* @Route("/app", name="bizarro_app")
*/
public function mainAction(Request $request)
{
$route = $request->query->get(''route'');
// Convert the query-string route into a valid path
$path = ''/''.$route;
try {
$match = $this->get(''router'')->match($path);
} catch (ResourceNotFoundException $e) {
throw $this->createNotFoundException(''The route does not exist'');
}
$params = array(
''request'' => $request,
);
return $this->forward($match[''_controller''], $params);
}
/**
* @Route("/blog", name="bizarro_blog")
*/
public function blogAction(Request $request)
{
// Your blog page here
return new Response(''...'');
}
}
De esta forma, se beneficia del componente de enrutamiento Sf2. Tenga en cuenta que no lo he probado yo mismo.