Yönlendirme
Varsayılan Yönlendirme Kuralları
webman'in varsayılan yönlendirme kuralı http://127.0.0.1:8787/{kontrolcü}/{aksiyon}
şeklindedir.
Varsayılan kontrolcü olarak app\controller\IndexController
ve varsayılan aksiyon olarak index
kullanılır.
Örneğin:
http://127.0.0.1:8787
adresine gidildiğinde varsayılan olarakapp\controller\IndexController
sınıfınınindex
metodu çağrılır.http://127.0.0.1:8787/foo
adresine gidildiğinde varsayılan olarakapp\controller\FooController
sınıfınınindex
metodu çağrılır.http://127.0.0.1:8787/foo/test
adresine gidildiğinde varsayılan olarakapp\controller\FooController
sınıfınıntest
metodu çağrılır.http://127.0.0.1:8787/admin/foo/test
adresine gidildiğinde varsayılan olarakapp\admin\controller\FooController
sınıfınıntest
metodu çağrılır (bkz. Çoklu Uygulama).
Ayrıca webman 1.4 sürümünden itibaren daha karmaşık varsayılan yönlendirme desteği sunmaktadır:
app
├── admin
│ └── v1
│ └── v2
│ └── v3
│ └── controller
│ └── IndexController.php
└── controller
├── v1
│ └── IndexController.php
└── v2
└── v3
└── IndexController.php
Bir isteğin yönlendirme yolunu değiştirmek istediğinizde config/route.php
konfigürasyon dosyasını düzenlemelisiniz.
Varsayılan yönlendirmeyi kapatmak istiyorsanız, config/route.php
dosyasının en alt satırına şu konfigürasyonu ekleyin:
Route::disableDefaultRoute();
Kapatma Yönlendirme
config/route.php
dosyasına aşağıdaki yönlendirme kodunu ekleyin:
Route::any('/test', function ($request) {
return response('test');
});
Not
Kapatma fonksiyonu herhangi bir kontrolcüye ait olmadığı için,$request->app
$request->controller
$request->action
tümü boş dize olacaktır.
http://127.0.0.1:8787/test
adresine gidildiğinde, test
dizesi döndürülecektir.
Not
Yönlendirme yolu/
ile başlamalıdır, örneğin
// Yanlış kullanım
Route::any('test', function ($request) {
return response('test');
});
// Doğru kullanım
Route::any('/test', function ($request) {
return response('test');
});
Sınıf Yönlendirmesi
config/route.php
dosyasına aşağıdaki yönlendirme kodunu ekleyin:
Route::any('/testclass', [app\controller\IndexController::class, 'test']);
http://127.0.0.1:8787/testclass
adresine gidildiğinde, app\controller\IndexController
sınıfının test
metodunun dönüş değeri alınacaktır.
Yönlendirme Parametreleri
Eğer yönlendirme içinde parametre varsa, eşleşen sonuçlar ilgili kontrolcü metodlarına parametre olarak iletilir (ikinci parametreden başlayarak sırayla iletilir), örneğin:
// /user/123 veya /user/abc eşleşir
Route::any('/user/{id}', [app\controller\UserController::class, 'get']);
namespace app\controller;
class UserController
{
public function get($request, $id)
{
return response('Parametre alındı: '.$id);
}
}
Daha fazla örnek:
// /user/123 eşleşir, /user/abc eşleşmez
Route::any('/user/{id:\d+}', function ($request, $id) {
return response($id);
});
// /user/foobar eşleşir, /user/foo/bar eşleşmez
Route::any('/user/{name}', function ($request, $name) {
return response($name);
});
// /user, /user/123 ve /user/abc eşleşir
Route::any('/user[/{name}]', function ($request, $name = null) {
return response($name ?? 'tom');
});
// Tüm options istekleri eşleşir
Route::options('[{path:.+}]', function () {
return response('');
});
Yönlendirme Grupları
Bazı durumlarda yönlendirme büyük miktarda aynı ön ek içerir, bu durumda yönlendirme grupları kullanarak tanımlamayı basitleştirebiliriz. Örneğin:
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");});
});
Aşağıdaki tanımlamaya eşittir:
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");});
Grup içi grup kullanımı
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");});
});
});
Rotalama Ara Katman
Belirli bir rotayı veya rotalar grubunu bir ara katmanla donatabiliriz.
Örneğin:
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,
]);
Uyarı:
webman-framework <= 1.5.6 sürümünde->middleware()
yönlendirme ara katmanı gruplarından sonra etkili olduğunda, geçerli yönlendirme mevcut grubun altında olmalıdır.
# Yanlış Kullanım Örneği (webman-framework >= 1.5.7 sürümünden itibaren bu kullanım geçerlidir)
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,
]);
# Doğru Kullanım Örneği
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,
]);
});
Kaynak Tipi Rotalar
Route::resource('/test', app\controller\IndexController::class);
// Özel kaynak rotaları
Route::resource('/test', app\controller\IndexController::class, ['index','create']);
// Tanımlanmayan kaynak rotalar
// notify adresine erişildiğinde her ikisi de /test/notify veya /test/notify/{id} routeName olarak test.notify olur
Route::resource('/test', app\controller\IndexController::class, ['index','create','notify']);
Fiil | URI | Eylem | Rota Adı |
---|---|---|---|
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 Oluşturma
Not
Geçici olarak iç içe geçmiş rotaların URL'sini oluşturmayı desteklememektedir.
Örneğin rotası:
Route::any('/blog/{id}', [app\controller\BlogController::class, 'view'])->name('blog.view');
Bu rotanın URL'sini aşağıdaki yöntemle oluşturabiliriz.
route('blog.view', ['id' => 100]); // Sonuç /blog/100 olur
Görünümde rota URL'sini kullanırken bu yöntemi kullanarak, rota kuralları nasıl değişirse değişsin, URL otomatik olarak oluşturulur ve rota adresi değişikliğinden kaynaklanan çok sayıda görünüm dosyasını değiştirmekten kaçınılır.
Rota Bilgilerini Almak
Not
webman-framework >= 1.3.2 gerektirir
$request->route
nesnesi aracılığıyla mevcut istek rotası bilgilerini alabiliriz, örneğin
$route = $request->route; // $route = request()->route; ile eşdeğerdir
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()); // Bu özellik webman-framework >= 1.3.16 gerektirir
}
Not
Eğer mevcut istek config/route.php dosyasında yapılandırılan herhangi bir rotayla eşleşmiyorsa,$request->route
null olacaktır, yani varsayılan rotaya giderken,$request->route
null olacaktır.
404 Durumu İşleme
Rota bulunamadığında varsayılan olarak 404 durum kodu döner ve public/404.html
dosyası içeriğini görüntüler.
Geliştiriciler, rota bulunamadığında iş sürecine müdahale etmek için webman'in sağladığı geriye düşük rota Route::fallback($callback)
yöntemini kullanabilirler. Örneğin, aşağıdaki kod mantığı, rota bulunamadığında ana sayfaya yönlendirmeyi içerir.
Route::fallback(function(){
return redirect('/');
});
Bunun yanı sıra, rota bulunamadığında bir json verisi döndürmek, webman'in API arayüzü olarak kullanıldığında oldukça kullanışlıdır.
Route::fallback(function(){
return json(['code' => 404, 'msg' => '404 not found']);
});
İlgili bağlantı Özel 404 500 sayfaları
Rota Arayüzü
// $uri'nin herhangi bir yöntem isteği rota atanıyor
Route::any($uri, $callback);
// $uri'nin get isteği rota atanıyor
Route::get($uri, $callback);
// $uri'nin isteği rota atanıyor
Route::post($uri, $callback);
// $uri'nin put isteği rota atanıyor
Route::put($uri, $callback);
// $uri'nin patch isteği rota atanıyor
Route::patch($uri, $callback);
// $uri'nin delete isteği rota atanıyor
Route::delete($uri, $callback);
// $uri'nin head isteği rota atanıyor
Route::head($uri, $callback);
// birden fazla istek türünü aynı anda atayan rota
Route::add(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'], $uri, $callback);
// grup rota
Route::group($path, $callback);
// kaynak rota
Route::resource($path, $callback, [$options]);
// rota devre dışı bırakma
Route::disableDefaultRoute($plugin = '');
// geriye düşük rota, varsayılan rota koruyucuyu ayarlama
Route::fallback($callback, $plugin = '');
Eğer uri'ye karşılık gelen bir rota yoksa (varsayılan rota dahil), ve geriye düşük rota da ayarlanmamışsa, 404 hatası döner.
Birden Fazla Rota Yapılandırma Dosyası
Eğer rotaları yönetmek için birden fazla rota yapılandırma dosyası kullanmak istiyorsanız, örneğin [çoklu uygulama] (multiapp.html) durumunda her uygulamanın kendi rota yapılandırmasına sahip olduğu zaman, dışarıdan rota yapılandırma dosyalarını yüklemek için require
yöntemini kullanabilirsiniz.
Örneğin config/route.php
içinde
<?php
// admin uygulamasının rota yapılandırmasını yükle
require_once app_path('admin/config/route.php');
// api uygulamasının rota yapılandırmasını yükle
require_once app_path('api/config/route.php');