Pasar variable fija de la ruta al controlador en Laravel

Estoy tratando de pasar una variable a través de mi ruta a mi controlador, pero tengo múltiples rutas (categorías) que conducen al mismo controlador, es decir,

Route::get('/category1/{region}/{suburb?}', 'SearchController@search'); Route::get('/category2/{region}/{suburb?}', 'SearchController@search'); 

Hacer que / categoría1, 2, etc. sea un parámetro / {categoría} no es una opción y no quiero hacer una función de controlador por separado para cada categoría.

¿Cómo envío el primer segmento de la url a mi controlador de búsqueda? es decir, categoría1 o categoría2?

En la actualidad el controlador es el siguiente:

 public function search($region, $suburb = null) { } 

¡Gracias!

Puede especificar una máscara para su parámetro de {categoría} para que se ajuste al formato “categoría [0-9] +” para que coincida con la ruta.

 Route::get('/{category}/{region}/{suburb?}', 'SearchController@search') ->where('category', 'category[0-9]+'); 

Ahora, su url de ejemplo (de los comentarios) www.a.com/var1/var2/var3 solo coincidirá con la ruta si var1 coincide con la categoría regex dada.

Puede encontrar más información en la documentación para los parámetros de ruta aquí .

Editar

Sí, esto puede funcionar con una matriz de valores de cadena. Es una expresión regular, por lo que solo necesita poner su matriz de valores de cadena en ese contexto:

 Route::get('/{category}/{region}/{suburb?}', 'SearchController@search') ->where('category', 'hairdresser|cooper|fletcher'); 

O bien, si tiene la matriz construida en otro lugar:

 $arr = ['hairdresser', 'cooper', 'fletcher']; // run each array entry through preg_quote and then glue // the resulting array together with pipes Route::get('/{category}/{region}/{suburb?}', 'SearchController@search') ->where('category', implode('|', array_map('preg_quote', $arr))); 

Editar 2 (soluciones para solicitud original)

Su pregunta original fue cómo pasar el segmento de categoría codificado al controlador. Si, por algún motivo, no desea utilizar la solución anterior, tiene otras dos opciones.

Opción 1: no pase el valor, solo acceda a los segmentos de la solicitud en el controlador.

 public function search($region, $suburb = null) { $category = \Request::segment(1); dd($category); } 

Opción 2: modifique los parámetros de ruta utilizando un filtro antes (L4) o antes de middleware (L5).

Antes de que los filtros (y middleware) tengan acceso al objeto de ruta, y pueden usar los métodos en el objeto de ruta para modificar los parámetros de ruta. Estos parámetros de ruta finalmente pasan a la acción del controlador. Los parámetros de ruta se almacenan como una matriz asociativa, por lo que debe tenerse en cuenta al tratar de obtener el orden correcto.

Si usa Laravel 4, necesitaría un filtro anterior. Defina las rutas para usar el filtro anterior y pase el valor codificado para agregarlo a los parámetros.

 Route::get('/hairdresser/{region}/{suburb?}', ['before' => 'shiftParameter:hairdresser', 'uses' => 'SearchController@search']); Route::get('/cooper/{region}/{suburb?}', ['before' => 'shiftParameter:cooper', 'uses' => 'SearchController@search']); Route::get('/fletcher/{region}/{suburb?}', ['before' => 'shiftParameter:fletcher', 'uses' => 'SearchController@search']); Route::filter('shiftParameter', function ($route, $request, $value) { // save off the current route parameters $parameters = $route->parameters(); // unset the current route parameters foreach($parameters as $name => $parameter) { $route->forgetParameter($name); } // union the new parameters and the old parameters $parameters = ['customParameter0' => $value] + $parameters; // loop through the new set of parameters to add them to the route foreach($parameters as $name => $parameter) { $route->setParameter($name, $parameter); } }); 

Si usa Laravel 5, necesitaría definir un nuevo antes del middleware. Agregue la nueva clase al directorio de aplicaciones / Http / Middleware y regístrelo en la variable $routeMiddleware en la aplicación / Http / Kernel.php. La lógica es básicamente la misma, con un aro adicional para pasar parámetros al middleware.

 // the 'parameters' key is a custom key we're using to pass the data to the middleware Route::get('/hairdresser/{region}/{suburb?}', ['middleware' => 'shiftParameter', 'parameters' => ['hairdresser'], 'uses' => 'SearchController@search']); Route::get('/cooper/{region}/{suburb?}', ['middleware' => 'shiftParameter', 'parameters' => ['cooper'], 'uses' => 'SearchController@search']); Route::get('/fletcher/{region}/{suburb?}', ['middleware' => 'shiftParameter', 'parameters' => ['fletcher'], 'uses' => 'SearchController@search']); // middleware class to go in app/Http/Middleware // generate with "php artisan make:middleware" statement and copy logic below class ShiftParameterMiddleware { public function handle($request, Closure $next) { // get the route from the request $route = $request->route(); // save off the current route parameters $parameters = $route->parameters(); // unset the current route parameters foreach ($parameters as $name => $parameter) { $route->forgetParameter($name); } // build the new parameters to shift onto the array // from the data passed to the middleware $newParameters = []; foreach ($this->getParameters($request) as $key => $value) { $newParameters['customParameter' . $key] = $value; } // union the new parameters and the old parameters $parameters = $newParameters + $parameters; // loop through the new set of parameters to add them to the route foreach ($parameters as $name => $parameter) { $route->setParameter($name, $parameter); } return $next($request); } /** * Method to get the data from the custom 'parameters' key added * on the route definition. */ protected function getParameters($request) { $actions = $request->route()->getAction(); return $actions['parameters']; } } 

Ahora, con la configuración del filtro (o middleware) y en uso, la categoría se pasará al método del controlador como primer parámetro.

 public function search($category, $region, $suburb = null) { dd($category); }