Route
Regole di Routing Predefinite
Le regole di routing predefinite di webman sono http://127.0.0.1:8787/{controller}/{azione}
.
Il controller predefinito è app\controller\IndexController
e l'azione predefinita è index
.
Ad esempio, accedendo a:
http://127.0.0.1:8787
si accederà per default al metodoindex
della classeapp\controller\IndexController
http://127.0.0.1:8787/foo
si accederà per default al metodoindex
della classeapp\controller\FooController
http://127.0.0.1:8787/foo/test
si accederà per default al metodotest
della classeapp\controller\FooController
http://127.0.0.1:8787/admin/foo/test
si accederà per default al metodotest
della classeapp\admin\controller\FooController
(riferimento a Multiapp)
Inoltre, webman dalla versione 1.4 supporta regole di routing più complesse, ad esempio
app
├── admin
│ └── v1
│ └── v2
│ └── v3
│ └── controller
│ └── IndexController.php
└── controller
├── v1
│ └── IndexController.php
└── v2
└── v3
└── IndexController.php
Quando desideri modificare un routing di richiesta, è necessario cambiare il file di configurazione config/route.php
.
Se vuoi disabilitare il routing predefinito, aggiungi l'impostazione seguente all'ultima riga del file di configurazione config/route.php
:
Route::disableDefaultRoute();
Routing a Chiusa
Aggiungere il seguente codice di routing nel file config/route.php
use support\Request;
Route::any('/test', function (Request $request) {
return response('test');
});
Nota
Poiché la funzione a chiusa non appartiene a nessun controller,$request->app
,$request->controller
e$request->action
saranno tutti stringhe vuote.
Quando l'indirizzo di accesso è http://127.0.0.1:8787/test
, verrà restituita la stringa test
.
Nota
Il percorso del routing deve iniziare con/
, ad esempio
use support\Request;
// Uso errato
Route::any('test', function (Request $request) {
return response('test');
});
// Uso corretto
Route::any('/test', function (Request $request) {
return response('test');
});
Routing per Classe
Aggiungere il seguente codice di routing nel file config/route.php
Route::any('/testclass', [app\controller\IndexController::class, 'test']);
Quando l'indirizzo di accesso è http://127.0.0.1:8787/testclass
, verrà restituito il valore di ritorno del metodo test
della classe app\controller\IndexController
.
Parametri di Routing
Se nel routing sono presenti parametri, vengono abbinati tramite {chiave}
, e i risultati dell'abbinamento vengono passati ai parametri del metodo del controller corrispondente (a partire dal secondo parametro), ad esempio:
// Abbina /user/123 /user/abc
Route::any('/user/{id}', [app\controller\UserController::class, 'get']);
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request, $id)
{
return response('Parametro ricevuto: '.$id);
}
}
Altri esempi:
use support\Request;
// Abbina /user/123, non abbina /user/abc
Route::any('/user/{id:\d+}', function (Request $request, $id) {
return response($id);
});
// Abbina /user/foobar, non abbina /user/foo/bar
Route::any('/user/{name}', function (Request $request, $name) {
return response($name);
});
// Abbina /user /user/123 e /user/abc [] indica opzionale
Route::any('/user[/{name}]', function (Request $request, $name = null) {
return response($name ?? 'tom');
});
// Abbina qualsiasi richiesta con prefisso /user/
Route::any('/user/[{path:.+}]', function (Request $request) {
return $request->path();
});
// Abbina tutte le richieste options : seguito da un'espressione regolare che indica le regole di quest'ultimo parametro
Route::options('[{path:.+}]', function () {
return response('');
});
Riepilogo sull'uso avanzato
La sintassi
[]
nella routing di Webman è principalmente utilizzata per gestire parti di percorso opzionali o corrispondere a routing dinamici, consentendoti di definire strutture di percorso e regole di corrispondenza più complesse
: per specificare espressioni regolari
Gruppi di Routing
A volte i routing contengono un gran numero di prefissi simili, in tal caso possiamo utilizzare gruppi di routing per semplificare la definizione. Ad esempio:
Route::group('/blog', function () {
Route::any('/create', function (Request $request) {return response('create');});
Route::any('/edit', function (Request $request) {return response('edit');});
Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");});
});
Equivalente a
Route::any('/blog/create', function (Request $request) {return response('create');});
Route::any('/blog/edit', function (Request $request) {return response('edit');});
Route::any('/blog/view/{id}', function (Request $request, $id) {return response("view $id");});
Uso annidato di group
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function (Request $request) {return response('create');});
Route::any('/edit', function (Request $request) {return response('edit');});
Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");});
});
});
Middleware di Routing
Possiamo impostare middleware per un singolo routing o un gruppo di routing.
Ad esempio:
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,
]);
# Esempio di uso errato (valido se webman-framework >= 1.5.7)
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function (Request $request) {return response('create');});
Route::any('/edit', function (Request $request) {return response('edit');});
Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");});
});
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
# Esempio di uso corretto
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function (Request $request) {return response('create');});
Route::any('/edit', function (Request $request) {return response('edit');});
Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");});
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
});
Routing di Tipo Risorsa
Route::resource('/test', app\controller\IndexController::class);
// Definire routing di risorsa specifici
Route::resource('/test', app\controller\IndexController::class, ['index','create']);
// Routing di risorsa non definita
// Un esempio di accesso a notify potrebbe essere un routing di tipo any a /test/notify o /test/notify/{id} con routeName uguale a test.notify
Route::resource('/test', app\controller\IndexController::class, ['index','create','notify']);
Verb | URI | Azione | Nome Route |
---|---|---|---|
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 |
Generazione di URL
Nota
Attualmente non è supportata la generazione di URL per gruppi di routing annidati
Ad esempio, per il routing:
Route::any('/blog/{id}', [app\controller\BlogController::class, 'view'])->name('blog.view');
Possiamo utilizzare il metodo seguente per generare l'URL di questo routing.
route('blog.view', ['id' => 100]); // Il risultato sarà /blog/100
Quando si utilizza l'URL del routing nella vista, puoi utilizzare questo metodo, in modo tale che, indipendentemente dalle variazioni delle regole di routing, l'URL verrà generato automaticamente, evitando modifiche massive ai file di vista a causa di cambiamenti negli indirizzi di routing.
Ottenere Informazioni sul Routing
Attraverso l'oggetto $request->route
possiamo ottenere informazioni sul routing della richiesta corrente, ad esempio
$route = $request->route; // Equivalente a $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());
}
Nota
Se la richiesta corrente non corrisponde a nessun routing configurato in config/route.php,$request->route
sarà null, il che significa che durante il routing predefinito$request->route
sarà null
Gestire il 404
Quando un routing non viene trovato, verrà restituito per default il codice di stato 404 e verranno visualizzati i contenuti relativi al 404.
Se uno sviluppatore desidera intervenire nel flusso di lavoro quando non viene trovato un routing, può utilizzare il metodo di fallback fornito da webman Route::fallback($callback)
. Ad esempio, il codice seguente reindirizza alla homepage quando non viene trovato un routing.
Route::fallback(function(){
return redirect('/');
});
Un altro esempio quando un routing non esiste e restituisce un dato JSON, utile per webman quando funge da API.
Route::fallback(function(){
return json(['code' => 404, 'msg' => '404 non trovato']);
});
Aggiungere Middleware al 404
Le richieste 404 predefinite non passeranno attraverso alcun middleware; se desideri aggiungere middleware a una richiesta 404, fai riferimento al codice seguente.
Route::fallback(function(){
return json(['code' => 404, 'msg' => '404 non trovato']);
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
Link correlati Pagine personalizzate per 404 e 500
Disabilitare il Routing Predefinito
// Disabilita il routing predefinito del progetto principale, senza influenzare i plugin dell'app
Route::disableDefaultRoute();
// Disabilita il routing dell'app admin del progetto principale, senza influenzare i plugin dell'app
Route::disableDefaultRoute('', 'admin');
// Disabilita il routing predefinito del plugin foo, senza influenzare il progetto principale
Route::disableDefaultRoute('foo');
// Disabilita il routing predefinito dell'app admin del plugin foo, senza influenzare il progetto principale
Route::disableDefaultRoute('foo', 'admin');
// Disabilita il routing predefinito di [\app\controller\IndexController::class, 'index']
Route::disableDefaultRoute([\app\controller\IndexController::class, 'index']);
Disattivazione del Routing Predefinito tramite Annotazioni
Possiamo disabilitare il routing predefinito di un controller tramite annotazioni, ad esempio:
namespace app\controller;
use support\annotation\DisableDefaultRoute;
#[DisableDefaultRoute]
class IndexController
{
public function index()
{
return 'index';
}
}
Allo stesso modo, possiamo disattivare il routing predefinito di un controller tramite un'annotazione, ad esempio:
namespace app\controller;
use support\annotation\DisableDefaultRoute;
class IndexController
{
#[DisableDefaultRoute]
public function index()
{
return 'index';
}
}
Interfaccia di Routing
// Imposta un routing per qualsiasi richiesta del metodo su $uri
Route::any($uri, $callback);
// Imposta un routing per le richieste get su $uri
Route::get($uri, $callback);
// Imposta un routing per le richieste post su $uri
Route::post($uri, $callback);
// Imposta un routing per le richieste put su $uri
Route::put($uri, $callback);
// Imposta un routing per le richieste patch su $uri
Route::patch($uri, $callback);
// Imposta un routing per le richieste delete su $uri
Route::delete($uri, $callback);
// Imposta un routing per le richieste head su $uri
Route::head($uri, $callback);
// Imposta un routing per le richieste options su $uri
Route::options($uri, $callback);
// Imposta routing per vari metodi di richiesta
Route::add(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'], $uri, $callback);
// Gruppi di routing
Route::group($path, $callback);
// Routing di risorsa
Route::resource($path, $callback, [$options]);
// Disabilita il routing
Route::disableDefaultRoute($plugin = '');
// Fallback del routing, imposta il routing di base
Route::fallback($callback, $plugin = '');
// Ottieni tutte le informazioni sul routing
Route::getRoutes();
Se l'uri non ha un routing corrispondente (incluso il routing predefinito), e il routing di fallback non è impostato, verrà restituito un 404.
Multiple Routing Configuration Files
Se desideri utilizzare più file di configurazione per gestire i routing, ad esempio nel caso di Multiapp dove ogni app ha la propria configurazione di routing, puoi caricare file di configurazione esterni utilizzando require
.
Ad esempio, nel file config/route.php
<?php
// Carica la configurazione di routing per l'app admin
require_once app_path('admin/config/route.php');
// Carica la configurazione di routing per l'app api
require_once app_path('api/config/route.php');