在我的Laravel routes/web.php文件中,我定义了以下两条路由:
Route::get('transaction/{id}', ['uses' => 'PaynlTransactionController@show'])->name('transaction.show');
Route::get('transaction/{txId}', ['uses' => 'PaynlTransactionController@showByTxId'])->name('transaction.showByTxId');在我的RouteServicesProvider中,我定义了以下两种模式:
Route::pattern('id', '[0-9]+');
Route::pattern('txId', '/^(TX(1[0-9]\d|[2-9]\d\d)-(1[0-9]\d\d\d\d|[2-9]\d\d\d\d\d))$/');每当我进入transaction/<id>时,只要id是一个整数,路由就能正常工作。但是,例如,当我转到transaction/TX874-152268时,它不匹配任何路由,并且接收到NotFoundHttpException in RouteCollection.php错误。
我已经验证了txId正则表达式,它给出了一个完全匹配的结果:https://regex101.com/r/kDZR4L/1
我的问题是:为什么只有我的id模式才能正常工作,而我的txId模式却不能正常工作?
发布于 2016-12-21 14:25:17
在路线上
Route::pattern('txId', '/^(TX(1[0-9]\d|[2-9]\d\d)-(1[0-9]\d\d\d\d|[2-9]\d\d\d\d\d))$/'); 我在字符串的开头和结尾都包含了正斜杠。在将模式传递给Route::pattern时不应该包括这一点。因此,以下工作:
Route::pattern('txId', '^(TX(1[0-9]\d|[2-9]\d\d)-(1[0-9]\d\d\d\d|[2-9]\d\d\d\d\d))$'); 发布于 2016-12-21 14:11:05
因为urls都是/transaction/{value},所以它将得到最后一个。
如果您将/transaction/{txId}更改为/transaction/tx/{txId},那么路线将是明确的。
路由只能得到一个,所以当您将前缀(此时为/transaction)分配给这两个urls时,它都无法工作。
您还可以使用/transaction/TX{txId},在控制器中,您可以在txId变量之前通过txId。
public function showByTxId($txId) {
$txid = "TX".$txid;
}编辑:
删除/,添加开始。Route::pattern('txId', '^(TX(1[0-9]\d|[2-9]\d\d)-(1[0-9]\d\d\d\d|[2-9]\d\d\d\d\d))$');
希望这行得通!
https://stackoverflow.com/questions/41264712
复制相似问题