online - urlencode php
Laravel-Usar comodÃn(: any?) Para TODAS las rutas? (7)
Laravel 5
Esta solución funciona bien en Laravel 5:
Route::get(''/admin'', function () {
// url /admin
});
Route::get(''/{any}'', function ($any) {
// any other url, subfolders also
})->where(''any'', ''.*'');
Lumen 5
Esto es para Lumen en su lugar:
$app->get(''/admin'', function () use ($app) {
//
});
$app->get(''/{any:.*}'', function ($any) use ($app) {
//
});
Estoy teniendo un problema con el enrutamiento.
Estoy trabajando en un CMS, y necesito dos rutas principales. /admin
y /(:any)
. El controlador de admin
se usa para la ruta /admin
, y el controlador de view
debe usarse para cualquier otra cosa que no sea /admin
. Desde el controlador de view
, luego analizaré la url y mostraré el contenido correcto.
Esto es lo que tengo:
Route::get(array(''admin'', ''admin/dashboard''), array(''as'' => ''admin'', ''uses'' =>''admin.dashboard@index''));
Route::any(''(:any)'', ''view@index'');
La primera ruta funciona, pero la segunda no. Jugué un poco con esto, y parece que si uso (:any)
sin el signo de interrogación, solo funciona si pongo algo después de /
. Si coloco el signo de interrogación allí, no funciona en absoluto.
Quiero que todas las siguientes rutas vayan a ver @ index:
/
/something
/something/something
/something/something/something
/something/something/something/something
...etc...
¿Es posible sin hardcoding un montón de (:any?)/(:any?)/(:any?)/(:any?)
Any (:any?)/(:any?)/(:any?)/(:any?)
Any (:any?)/(:any?)/(:any?)/(:any?)
Any (:any?)/(:any?)/(:any?)/(:any?)
(Que ni siquiera sé que funciona)?
¿Cuál es la mejor manera de hacerlo?
Agregue esto al final del archivo de rutas
App::missing(function($exception)
{
return View::make(''notfound'');
});
de http://scotch.io/tutorials/simple-and-easy-laravel-routing
Alcanzar un estado de 404 me parece un poco malo. Esto puede provocarle todo tipo de problemas al iniciar sesión en el 404. Recientemente me encontré con el mismo problema de enrutamiento de comodines en Laravel 4 y lo resolví con el siguiente fragmento:
Route::any(''{slug}'', function($slug)
{
//do whatever you want with the slug
})->where(''slug'', ''([A-z/d-//_.]+)?'');
Esto debería resolver su problema de forma controlada. La expresión regular se puede simplificar a:
''(.*)?''
Pero debes usar esto bajo tu propio riesgo.
Editar (adición):
Como esto sobrescribe muchas rutas, debería considerar envolverlo en una declaración de "Aplicación :: antes":
App::before(function($request) {
//put your routes here
});
De esta forma, no sobrescribirá las rutas personalizadas que defina más adelante.
Editar: Ha habido cierta confusión desde el lanzamiento de Laravel 4 con respecto a este tema, esta respuesta estaba dirigida a Laravel 3.
Hay algunas formas de abordar esto.
El primer método es hacer coincidir (:any)/(:all?)
:
Route::any(''(:any)/(:all?)'', function($first, $rest=''''){
$page = $rest ? "{$first}/{$rest}" : $first;
dd($page);
});
No es la mejor solución porque se divide en múltiples parámetros, y por alguna razón (: todos) no funciona solo (¿error?)
La segunda solución es usar una expresión regular, esta es una mejor manera que la anterior en mi opinión.
Route::any( ''(.*)'', function( $page ){
dd($page);
});
Hay un método más, que le permite verificar si hay páginas cms incluso cuando la ruta puede haber coincidido con otros patrones, siempre que esas rutas devuelvan un 404. Este método modifica el detector de eventos definido en routes.php
:
Event::listen(''404'', function() {
$page = URI::current();
// custom logic, else
return Response::error(''404'');
});
Sin embargo, mi método preferido es # 2. Espero que esto ayude. Hagas lo que hagas, asegúrate de definir todas tus otras rutas por encima de estas rutas de captura, todas las rutas definidas después nunca se dispararán.
Gracias por la solución William. Sin embargo, los métodos 1 y 2 ya no funcionan en Laravel 4, y para usar la solución n. ° 3 en Laravel 4, deberá activar el evento 404 en su archivo start / global.php.
App::error(function(Exception $exception, $code)
{
// i.o. -> this is our catchall!
// http://.com/questions/13297278/laravel-using-any-wildcard-for-all-routes
Event::fire(''404'');
return View::make(''error'')->with(''exception'', $exception)->with(''code'', $code);
Log::error($exception);
});
Ahora podemos manejar esto en nuestro archivo routes.php:
Event::listen(''404'', function() {
// url?
$url = Request::path();
// LOGIC HERE
// else
return View::make(''error'');
});
Tener un andamio de lumen básico. En mi caso, tengo 2 aplicaciones frontend y rutas api
<?php // routes/web.php
/** @var /Laravel/Lumen/Routing/Router $router */
$router->group([
''prefix'' => ''/api/v1'',
''namespace'' => ''App/Http/Controllers''
], function () use ($router) {
require ''routes-group1.php'';
require ''routes-group2.php'';
// ...
});
$router->get(''/admin{any:.*}'', function () {
return file_get_contents(''../public/a/index.html'');
});
$router->get(''{any:.*}'', function () {
return file_get_contents(''../public/m/index.html'');
});
Route::get("{path}", "SomeController@serve")->where(''path'', ''.+'');
El código anterior capturará las sub urls recursivas que mencionó:
/
/something
/something/something
/something/something/something
/something/something/something/something
Cualquier otro caso especial, como admin / *, puede capturar antes de este.