在我的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
模式不是?
答案 0 :(得分:1)
因为网址都是/transaction/{value}
,所以它将获得最后一个。
如果您将/transaction/{txId}
更改为/transaction/tx/{txId}
,则路线就会清楚。
路由只能获得一个路由,因此当您将前缀(此时为/transaction
)分配给它不起作用的两个网址时。
您也可以使用/transaction/TX{txId}
,在控制器中,您可以在TX
变量之前txId
。{/ p>
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))$');
希望这有效!
答案 1 :(得分:1)
在路线
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))$');