Hago una ruta como
Route::get('/{url1}', function ($url1) {
return ' url1: '.$url1;
})
->where('url1', '^(?!(string1|string2)$)');
y acceder a la URL como:
- domain/abc
no encontrado => incorrecto ??
- domain/string1
no encontrado => correcto
y más, cuando hago con
Route::get('/{url1}/{url2}', function ($url1) {
return ' url1: '.$url1;
})
->where('url1', '^(?!(string1|string2)$)');
y acceder a la URL como:
- domain/abc/abc
no encontrado => incorrecto ???
- domain/string1/abc
no encontrado => correcto
Cómo arreglar ese agradecimiento
regex
laravel
laravel-5
laravel-routing
Siglo de dele
fuente
fuente
Respuestas:
Intente con esto para el 1er escenario:
para el 2do escenario:
espero esta ayuda :)
fuente
domain/abc
pero no se encuentra?Prueba esto
Manera sucia de lograr esto
Una forma más en la que he intentado usando
RouteServiceProvider.php
Cambia tu
boot()
así.fuente
domain/string1
=> todavía se encuentras excluding
127.0.0.1:8000/domain/string2,
127.0.0.1:8000/domain/string1 `y estoy trabajando parahttp://127.0.0.1:8000/domain/abc
domain
, medomain
gustahttp://127.0.0.1:8000
y deberías probar127.0.0.1:8000/string1
...RouteServiceProvider
.Después de las pruebas, creo que es imposible lograr exactamente lo que quieres. Parece cuando desea excluir
string1
ystring2
debe aceptar que también las cadenas que comienzan constring1
ystring2
serán excluidas (por ejemplostring1aaa
).Al usar tales rutas:
el resultado será:
Creo que dicha limitación proviene de Laravel y no de regex. Si necesita aceptar también los parámetros que comienzan con
string1
ystring2
creo que debe hacerlo de manera manual de la siguiente manera:fuente
Prueba esta expresión regular:
fuente
http://domain/string1/abc
todavía se encuentra?En lugar de escribir una ruta para que coincida con cualquier otra cosa que no sean ciertas cadenas estáticas, me resulta más claro escribir dos rutas: una ruta para que coincida con ciertas cadenas estáticas, y otra ruta para que coincida con todo lo demás.
Lo que resulta en * :
domain
=> 200 encontradosdomain/
=> 200 encontradosdomain/abc
=> 200 encontradosdomain/string1
=> 404 No encontradodomain/string1/
=> 404 No encontradodomain/string1/abc
=> 404 No encontradodomain/string10
=> 200 encontradosdomain/string10/
=> 200 encontradosdomain/string10/abc
=> 200 encontradosdomain/string2
=> 404 No encontradodomain/string2/
=> 404 No encontradodomain/string2/abc
=> 404 No encontradodomain/string20
=> 200 encontradosdomain/string20/
=> 200 encontradosdomain/string20/abc
=> 200 encontradosMe parece más claro, porque no tengo que pensar en términos de exclusiones. Por el contrario, puedo pensar en igualar exactamente lo que quiero prohibir, y luego dejar que Laravel reaccione a todo lo demás (política abierta fallida). Es posible que esto no cumpla con sus criterios de diseño, pero creo que da como resultado un código más claro.
Además, el código es más eficiente.
?!
tiene que retroceder, que es, por definición, más costoso que la correspondencia hacia adelante.No tengo un entorno Laravel a mano, pero me arriesgaré a adivinar por qué tus intentos no funcionaron. Laravel utiliza Symfony Router, que no admite búsquedas en babosas . IIRC, cuando se detecta una búsqueda, Symfony aplica la búsqueda a toda la URL, no a la babosa a la que ha vinculado el patrón. Esto se mete con la idea del desarrollador de cómo funcionan los metacaracteres de anclajes (^, $) y codiciosos (*). Esto puede conducir a una mala experiencia al intentar que funcione, ya que el desarrollador opera bajo una suposición pero las bibliotecas subyacentes operan en otra.
* Revelación completa, escribí esto para Lumen y luego lo convertí mentalmente al formato Laravel. Es posible que haya algunos errores de traducción. Aquí está el Lumen original:
fuente