Eu faço uma rota como
Route::get('/{url1}', function ($url1) {
return ' url1: '.$url1;
})
->where('url1', '^(?!(string1|string2)$)');
e url de acesso como:
- domain/abc
não encontrado => incorreto ??
- domain/string1
não encontrado => correto
e mais, quando eu faço com
Route::get('/{url1}/{url2}', function ($url1) {
return ' url1: '.$url1;
})
->where('url1', '^(?!(string1|string2)$)');
e url de acesso como:
- domain/abc/abc
não encontrado => incorreto ???
- domain/string1/abc
não encontrado => correto
Como consertar esse agradecimento
Respostas:
Por favor, tente com isso para o 1º cenário:
para o segundo cenário:
espero que esta ajuda :)
fonte
domain/abc
mas não foi encontrado?Tente isto
Maneira impura de conseguir isso
Mais uma maneira de experimentar usando
RouteServiceProvider.php
Mude o seu
boot()
assim.fonte
domain/string1
=> ele ainda encontrous excluding
127.0.0.1:8000/domain/string2,
127.0.0.1:8000/domain/string1 `e trabalhando parahttp://127.0.0.1:8000/domain/abc
domain
,domain
gostohttp://127.0.0.1:8000
e você deve tentar127.0.0.1:8000/string1
, ...RouteServiceProvider
.Após os testes, acho impossível conseguir exatamente o que você deseja. Parece que você deseja excluir
string1
estring2
precisa concordar que também as strings que começam comstring1
estring2
serão excluídas (por exemplostring1aaa
).Ao usar essas rotas:
O resultado será:
Eu acredito que essa limitação vem do Laravel e não do regex. Se você precisa aceitar também parâmetros iniciados com
string1
estring2
acredito que você deve fazê-lo da maneira manual, como segue:fonte
Experimente esta regex:
fonte
http://domain/string1/abc
ainda encontrado?Em vez de escrever uma rota para corresponder a algo diferente de certas seqüências de caracteres estáticas, acho mais claro escrever duas rotas: uma rota para corresponder a certas seqüências estáticas e outra rota para corresponder a todo o resto.
O que resulta em * :
domain
=> 200 encontradodomain/
=> 200 encontradodomain/abc
=> 200 encontradodomain/string1
=> 404 Não encontradodomain/string1/
=> 404 Não encontradodomain/string1/abc
=> 404 Não encontradodomain/string10
=> 200 encontradodomain/string10/
=> 200 encontradodomain/string10/abc
=> 200 encontradodomain/string2
=> 404 Não encontradodomain/string2/
=> 404 Não encontradodomain/string2/abc
=> 404 Não encontradodomain/string20
=> 200 encontradodomain/string20/
=> 200 encontradodomain/string20/abc
=> 200 encontradoAcho isso mais claro, porque não preciso pensar em termos de exclusões. Em vez disso, posso pensar em combinar exatamente o que quero proibir e deixar o Laravel reagir a todo o resto (falha na política de abertura). Isso pode não atender aos seus critérios de design, mas acredito que resulta em um código mais claro.
Além disso, o código é mais eficiente.
?!
precisa voltar atrás, o que, por definição, é mais caro que a correspondência direta.Não tenho um ambiente Laravel à mão, mas arriscarei um palpite sobre por que suas tentativas não funcionaram. O Laravel usa o Symfony Router, que não suporta buscas em slugs . IIRC, quando uma busca é detectada, o Symfony aplica a busca a toda a URL, não à lesma à qual você vinculou o padrão. Isso mexe com a idéia do desenvolvedor de como os meta-caracteres âncoras (^, $) e gananciosos (*) funcionam. Isso pode levar a uma experiência ruim na tentativa de fazê-lo funcionar, pois o desenvolvedor opera sob uma suposição, mas as bibliotecas subjacentes operam em outra.
* Divulgação completa, escrevi isso para o Lumen e depois o converti mentalmente para o formato Laravel. É possível que haja alguns erros de tradução. Aqui está o Lumen original:
fonte