2016-12-21 6 views
2

In meiner Laravel routes/web.php Datei habe ich die folgenden zwei Routen definiert:Laravel Route passend nicht Muster

Route::get('transaction/{id}', ['uses' => '[email protected]'])->name('transaction.show'); 
Route::get('transaction/{txId}', ['uses' => '[email protected]'])->name('transaction.showByTxId'); 

In meinem RouteServicesProvider I definiert haben die beiden folgenden Muster:

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

Jedes Mal, wenn ich gehe zu transaction/<id> das Routing funktioniert ordnungsgemäß, solange id eine Ganzzahl ist. Wenn ich jedoch beispielsweise zu transaction/TX874-152268 gehe, stimmt es mit keiner Route überein, und ich erhalte den Fehler NotFoundHttpException in RouteCollection.php.

Ich habe die Regex TxID validiert und es gibt eine vollständige Übereinstimmung: https://regex101.com/r/kDZR4L/1

Meine Frage: wie kommt es nur mein id Muster während mein txId Muster korrekt funktioniert, ist es nicht?

+0

@ WiktorStribiżew danke, ich habe versucht, aber kein Glück. Es sieht viel schöner aus :-) – pbond

Antwort

1

In der Route

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

ich nach vorn aufgenommen hatte Schrägstriche am Anfang und Ende des Strings. Dies sollte nicht berücksichtigt werden, wenn ein Muster an Route::pattern übergeben wird. Also folgendes funktioniert:

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

Da die URLs beide /transaction/{value} sind, wird es die letzte erhalten. Wenn Sie /transaction/{txId} zu /transaction/tx/{txId} ändern, wird es für die Routen klar sein.

Routen können nur eins erhalten. Wenn Sie also den beiden URLs das Präfix (zu diesem Zeitpunkt /transaction) zuweisen, funktioniert es nicht.

Sie können auch verwenden /transaction/TX{txId}, in Ihrem Controller können Sie TX vor der txId Variable.

public function showByTxId($txId) { 
    $txid = "TX".$txid; 
} 

Edit:

entfernen die / den Start hinzuzufügen. 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))$');

Ich hoffe, das funktioniert!

+0

Das sollte egal sein, oder? Ich mache genau das gleiche für 'users/{id}' und 'users/{username}} mit den Regex' [0-9] + 'und' [A-Za-z] + 'bzw. das funktioniert. – pbond

+0

Ich stimme zu, aber lass es versuchen. Wenn es funktioniert, ist es nett;) @pbond Btw, pay.nl ist ein goede betalingsprovider;) –

+0

Ich habe versucht, Ihren Vorschlag, aber kein Glück: Ich habe die Regex nicht mehr mit dem 'TX' Teil abgestimmt und' TX' vorangestellt in 'web.php' zu' {txId} ', aber das funktioniert leider auch nicht. – pbond