Routen
Standard-Routing-Regeln
Die Standard-Routing-Regel für webman ist http://127.0.0.1:8787/{Controller}/{Aktion}
.
Der Standard-Controller ist app\controller\IndexController
, und die Standardaktion ist index
.
Beispiel für einen Zugriff:
http://127.0.0.1:8787
führt standardmäßig zur Methodeindex
der Klasseapp\controller\IndexController
http://127.0.0.1:8787/foo
führt standardmäßig zur Methodeindex
der Klasseapp\controller\FooController
http://127.0.0.1:8787/foo/test
führt standardmäßig zur Methodetest
der Klasseapp\controller\FooController
http://127.0.0.1:8787/admin/foo/test
führt standardmäßig zur Methodetest
der Klasseapp\admin\controller\FooController
(siehe Mehrere Anwendungen)
Webman unterstützt seit Version 1.4 auch komplexere Standardrouten, wie zum Beispiel:
app
├── admin
│ └── v1
│ └── v2
│ └── v3
│ └── controller
│ └── IndexController.php
└── controller
├── v1
│ └── IndexController.php
└── v2
└── v3
└── IndexController.php
Wenn Sie die Standardroute für einen bestimmten Request ändern möchten, bearbeiten Sie bitte die Konfigurationsdatei config/route.php
.
Falls Sie die Standardroute deaktivieren möchten, fügen Sie bitte folgende Konfiguration in die Konfigurationsdatei config/route.php
ein:
Route::disableDefaultRoute();
Closure-Routen
Fügen Sie in der Datei config/route.php
den folgenden Routen-Code hinzu:
Route::any('/test', function ($request) {
return response('test');
});
Hinweis
Da Closure-Funktionen keinen bestimmten Controller haben, sind$request->app
,$request->controller
und$request->action
alle leer.
Wenn Sie die Adresse http://127.0.0.1:8787/test
aufrufen, wird der String test
zurückgegeben.
Hinweis
Der Routenpfad muss mit/
beginnen, zum Beispiel:
// Falsche Verwendung
Route::any('test', function ($request) {
return response('test');
});
// Richtige Verwendung
Route::any('/test', function ($request) {
return response('test');
});
Class-Routen
Fügen Sie in der Datei config/route.php
den folgenden Routen-Code hinzu:
Route::any('/testclass', [app\controller\IndexController::class, 'test']);
Wenn Sie die Adresse http://127.0.0.1:8787/testclass
aufrufen, wird der Rückgabewert der Methode test
der Klasse app\controller\IndexController
zurückgegeben.
Routenparameter
Wenn in der Route Parameter vorhanden sind, so werden diese mit {Schlüssel}
zugewiesen und das Ergebnis wird an die entsprechenden Methodenparameter des Controllers übergeben (beginnend ab dem zweiten Parameter), zum Beispiel:
// Matcht /user/123 /user/abc
Route::any('/user/{id}', [app\controller\UserController::class, 'get']);
namespace app\controller;
class UserController
{
public function get($request, $id)
{
return response('Parameter erhalten'.$id);
}
}
Weitere Beispiele:
// Matcht /user/123, matcht nicht /user/abc
Route::any('/user/{id:\d+}', function ($request, $id) {
return response($id);
});
// Matcht /user/foobar, matcht nicht /user/foo/bar
Route::any('/user/{name}', function ($request, $name) {
return response($name);
});
// Matcht /user, /user/123 und /user/abc
Route::any('/user[/{name}]', function ($request, $name = null) {
return response($name ?? 'tom');
});
// Matcht alle Option-Anfragen
Route::options('[{path:.+}]', function () {
return response('');
});
Routen-Gruppierung
Manchmal enthalten Routen viele gleiche Präfixe. In solchen Fällen kann die Definition durch Routen-Gruppierung vereinfacht werden. Zum Beispiel:
Route::group('/blog', function () {
Route::any('/create', function ($request) {return response('create');});
Route::any('/edit', function ($request) {return response('edit');});
Route::any('/view/{id}', function ($request, $id) {return response("view $id");});
});
Äquivalent zu
Route::any('/blog/create', function ($request) {return response('create');});
Route::any('/blog/edit', function ($request) {return response('edit');});
Route::any('/blog/view/{id}', function ($request, $id) {return response("view $id");});
Verschachtelte Gruppierungen:
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function ($request) {return response('create');});
Route::any('/edit', function ($request) {return response('edit');});
Route::any('/view/{id}', function ($request, $id) {return response("view $id");});
});
});
Routen-Middleware
Es ist möglich, einzelnen oder eine Gruppe von Routen Middleware zuzuweisen. Zum Beispiel:
Route::any('/admin', [app\admin\controller\IndexController::class, 'index'])->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
Route::group('/blog', function () {
Route::any('/create', function () {return response('create');});
Route::any('/edit', function () {return response('edit');});
Route::any('/view/{id}', function ($request, $id) {response("view $id");});
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
Hinweis:
In webman-framework <= 1.5.6, wenn->middleware()
auf eine Gruppe von Routen angewendet wird, muss die aktuelle Route in dieser Gruppe enthalten sein.
# Falsches Beispiel (ab webman-framework >= 1.5.7 ist diese Verwendung gültig)
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function ($request) {return response('create');});
Route::any('/edit', function ($request) {return response('edit');});
Route::any('/view/{id}', function ($request, $id) {return response("view $id");});
});
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
# Richtiges Beispiel
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function ($request) {return response('create');});
Route::any('/edit', function ($request) {return response('edit');});
Route::any('/view/{id}', function ($request, $id) {return response("view $id");});
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
});
Ressourcenorientierte Routen
Route::resource('/test', app\controller\IndexController::class);
// Spezifische ressourcenorientierte Routen
Route::resource('/test', app\controller\IndexController::class, ['index','create']);
// Nicht-standardmäßige ressourcenorientierte Routen
// Wenn beispielsweise auf die Adresse notify zugegriffen wird, ist eine any-Typ-Route mit /test/notify oder /test/notify/{id} zulässig. Die routeName wird test.notify sein.
Route::resource('/test', app\controller\IndexController::class, ['index','create','notify']);
Verb | URI | Aktion | Routenname |
---|---|---|---|
GET | /test | index | test.index |
GET | /test/create | create | test.create |
POST | /test | store | test.store |
GET | /test/{id} | show | test.show |
GET | /test/{id}/edit | edit | test.edit |
PUT | /test/{id} | update | test.update |
DELETE | /test/{id} | destroy | test.destroy |
PUT | /test/{id}/recovery | recovery | test.recovery |
URL-Generierung
Hinweis:
Verschachtelte Gruppen-Routen für die URL-Generierung werden derzeit nicht unterstützt.
Beispiel-Route:
Route::any('/blog/{id}', [app\controller\BlogController::class, 'view'])->name('blog.view');
Sie können die URL dieser Route mit der folgenden Methode generieren:
route('blog.view', ['id' => 100]); // Ergebnis: /blog/100
Wenn Sie beim Verwenden der Routen-URLs in Ansichten diese Methode verwenden, wird die URL automatisch generiert, unabhängig davon, wie sich die Routenadresse ändert, um Veränderungen in den Ansichtsdateien zu vermeiden.
Routeninformationen abrufen
Hinweis
Erfordert webman-framework >= 1.3.2
Über das $request->route
-Objekt können wir die aktuellen Routeninformationen der Anforderung abrufen, zum Beispiel
$route = $request->route; // Gleichbedeutend mit $route = request()->route;
if ($route) {
var_export($route->getPath());
var_export($route->getMethods());
var_export($route->getName());
var_export($route->getMiddleware());
var_export($route->getCallback());
var_export($route->param()); // Dieses Feature erfordert webman-framework >= 1.3.16
}
Hinweis
Wenn die aktuelle Anfrage keiner der Routen in der Konfigurationsdateiconfig/route.php
entspricht, ist$request->route
null, d.h. bei Verwendung der Standardroute ist$request->route
null.
Behandlung von 404-Fehlern
Wenn die Route nicht gefunden wird, wird standardmäßig der Statuscode 404 zurückgegeben und der Inhalt der Datei public/404.html
ausgegeben.
Wenn ein Entwickler in den Geschäftsprozess eingreifen möchte, wenn die Route nicht gefunden wird, kann er die Methode Route::fallback($callback)
von webman nutzen. Zum Beispiel leitet der folgende Code die Anfrage auf die Startseite um, wenn die Route nicht gefunden wird.
Route::fallback(function(){
return redirect('/');
});
Beispielsweise kann bei einer API-Schnittstelle von webman ein JSON-Datenobjekt zurückgegeben werden, wenn die Route nicht vorhanden ist, was sehr nützlich ist.
Route::fallback(function(){
return json(['code' => 404, 'msg' => '404 not found']);
});
Verknüpfung Anpassung von 404- und 500-Seiten
Routen-Schnittstelle
// Legt eine Route für beliebige Methodenanfragen $uri fest
Route::any($uri, $callback);
// Legt eine Route für die GET-Anfrage $uri fest
Route::get($uri, $callback);
// Legt eine Route für die POST-Anfrage $uri fest
Route::post($uri, $callback);
// Legt eine Route für die PUT-Anfrage $uri fest
Route::put($uri, $callback);
// Legt eine Route für die PATCH-Anfrage $uri fest
Route::patch($uri, $callback);
// Legt eine Route für die DELETE-Anfrage $uri fest
Route::delete($uri, $callback);
// Legt eine Route für die HEAD-Anfrage $uri fest
Route::head($uri, $callback);
// Legt gleichzeitig Routen für mehrere Anfragetypen fest
Route::add(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'], $uri, $callback);
// Gruppenroute
Route::group($path, $callback);
// Ressourcenroute
Route::resource($path, $callback, [$options]);
// Deaktiviert die Standardroute
Route::disableDefaultRoute($plugin = '');
// Fallback-Route, legt einen Standard-Fallback für die Route fest
Route::fallback($callback, $plugin = '');
Wenn es keine entsprechende Route für die URI gibt (einschließlich der Standardroute) und keine Fallback-Route festgelegt ist, wird ein 404 zurückgegeben.
Mehrere Routenkonfigurationsdateien
Wenn Sie mehrere Routenkonfigurationsdateien zur Verwaltung der Routen verwenden möchten, z.B. mehrere Anwendungen, in denen jede Anwendung eine eigene Routenkonfiguration hat, können Sie externe Routenkonfigurationsdateien mit require
laden.
Zum Beispiel in config/route.php
<?php
// Lädt die Routenkonfiguration der Admin-Anwendung
require_once app_path('admin/config/route.php');
// Lädt die Routenkonfiguration der API-Anwendung
require_once app_path('api/config/route.php');