Laravel路线不匹配模式

时间:2016-12-21 14:08:32

标签: php laravel pattern-matching laravel-5.3

在我的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模式不是?

2 个答案:

答案 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))$');