php - Laravel ruta url con cadena de consulta
(3)
Lo siguiente era lo que necesitaba hacer:
Manejo todo mi enrutamiento en un proveedor de servicios, donde había definido la siguiente función:
private function registerRestfulController($prefix, $controllerClass)
{
Route::controller($prefix, $controllerClass, $controllerClass::getRouteNames());
}
getRouteNames
es un método estático en mi BaseController que convencionalmente devuelve rutas para que los controladores RESTful puedan tener rutas con nombre automáticas.
El problema que estaba encontrando era que esto definía el conjunto de comodines comodín en la ruta en sí. Para evitar eso, agrego lo siguiente a la función privada arriba:
foreach ($controllerClass::getRoutesNames() as $name) {
$route = Route::getRoutes()->getByName($name);
$cleanUri = preg_replace(''////{/w*/?/}/'', '''', $route->getUri());
$route->setUri($cleanUri);
}
Esto carga todas las rutas que está registrando en ese momento y elimina inmediatamente los comodines de la URI. Puede pasar fácilmente una lista booleana o "lista blanca" de nombres de ruta para los cuales desea conservar caracteres comodín, de modo que no pise todo el valor predeterminado de Laravel sin la intención. Una vez que ejecutas esto, comienza a trabajar automáticamente con las variables de cadena de consulta, que en este caso me parecen mucho más preferibles que las variables de ruta.
En el laravel 4 podría generar una url con cadenas de consulta usando el helper route (). Pero en 4.1 en lugar de:
$url = url(''admin.events'', array(''lang'' => ''en''));
// admineventsurl/?lang=en
Yo obtengo:
$url = url(''admin.events'', array(''lang'' => ''en''));
// admineventsurl/en
Hice algunas investigaciones y todos los métodos de laravel para generar url están usando los parámetros de esa manera. ¿Cómo puedo generar la url con cadenas de consulta?
Los métodos de ayuda de la route()
y la action()
Laravel admiten parámetros de URL.
Simplemente proporcione una matriz con valores clave para los parámetros de ruta. Por ejemplo:
route(''products.index'', [''manufacturer'' => ''Samsung'']);
// Returns ''http://localhost/products?manufacturer=Samsung''
También puede incluir sus parámetros de ruta (como ID y modelos) para acompañar estos parámetros:
route(''products.show'', [$product->id, ''model'' => ''T9X'']);
// Returns ''http://localhost/products/1?model=T9X''
Esto también es compatible con los métodos de acción:
action(''ProductController@index'', [''manufacturer'' => ''Samsung'']);
También puede proporcionar parámetros de consulta dentro de los link_to_route()
y link_to_action()
:
link_to_route(''products.index'', ''Products by Samsung'', [''model'' => ''Samsung'');
link_to_action(''ProductController@index'', ''Products by Samsung'', [''model'' => ''Samsung'']);
Nota al margen.
No estoy de acuerdo con la idea de @Steve Bauman (en su respuesta) de que rara vez se necesitan las URL de cadena de consulta, y creo que Laravel debería al menos considerar agregar la funcionalidad de cadena de consulta (de nuevo). Hay muchos casos en los que se desea una URL de cadena de consulta en lugar de un parámetro. basado "bonita url". Por ejemplo, un filtro de búsqueda complejo ...
example.com/search/red/large/rabid/female/bunny
... potencialmente puede referirse al mismo conjunto exacto de roedores que ...
example.com/search/bunny/rabid/large/female/red
... pero desde cualquier punto de vista (programación, análisis de marketing, SEO, facilidad de uso), es algo terrible. Aunque...
example.com/search?critter=bunny&gender=female&temperament=rabid&size=large&color=red
... es más largo y "más feo", en realidad es mejor en este caso no tan raro. Red: las URL amigables son excelentes para algunas cosas, las cadenas de consulta son excelentes para otras.
Responder a la pregunta original ...
Necesitaba una versión de url()
"cadena de consulta", así que copié la función, la modifiqué y la /app/start/global.php
en /app/start/global.php
:
/**
* Generate a querystring url for the application.
*
* Assumes that you want a URL with a querystring rather than route params
* (which is what the default url() helper does)
*
* @param string $path
* @param mixed $qs
* @param bool $secure
* @return string
*/
function qs_url($path = null, $qs = array(), $secure = null)
{
$url = app(''url'')->to($path, $secure);
if (count($qs)){
foreach($qs as $key => $value){
$qs[$key] = sprintf(''%s=%s'',$key, urlencode($value));
}
$url = sprintf(''%s?%s'', $url, implode(''&'', $qs));
}
return $url;
}
Ejemplo:
$url = qs_url(''sign-in'', array(''email''=>$user->email));
//http://example.loc/sign-in?email=chris%40foobar.com
Nota: Parece que la función url()
es conectable, es decir, puede reemplazarla. Busque en vendor/laravel/framework/src/Illuminate/Support/helpers.php
: la función url
está envuelta en un condicional if ( ! function_exists(''url''))
vendor/laravel/framework/src/Illuminate/Support/helpers.php
if ( ! function_exists(''url''))
. Pero probablemente tendrías que saltar a través de aros para hacerlo (es decir, hacer que laravel lo cargue antes de su versión).
Aclamaciones,
Chris