Yönlendirme
Varsayılan Yönlendirme Kuralları
webman'ın varsayılan yönlendirme kuralı http://127.0.0.1:8787/{denetleyici}/{hareket}
olarak belirlenmiştir.
Varsayılan denetleyici app\controller\IndexController
, varsayılan hareket ise index
olarak tanımlanmıştır.
Örneğin erişim sağlayarak:
http://127.0.0.1:8787
adresi varsayılan olarakapp\controller\IndexController
sınıfınınindex
metoduna erişecektir.http://127.0.0.1:8787/foo
adresi varsayılan olarakapp\controller\FooController
sınıfınınindex
metoduna erişecektir.http://127.0.0.1:8787/foo/test
adresi varsayılan olarakapp\controller\FooController
sınıfınıntest
metoduna erişecektir.http://127.0.0.1:8787/admin/foo/test
adresi varsayılan olarakapp\admin\controller\FooController
sınıfınıntest
metoduna erişecektir (bkz. Çoklu Uygulamalar).
Ayrıca webman 1.4 sürümünden itibaren daha karmaşık varsayılan yönlendirme yapılarını desteklemektedir. Örneğin:
app
├── admin
│ └── v1
│ └── v2
│ └── v3
│ └── controller
│ └── IndexController.php
└── controller
├── v1
│ └── IndexController.php
└── v2
└── v3
└── IndexController.php
Bir isteğin yönlendirmesini değiştirmek istediğinizde config/route.php
yapılandırma dosyasını değiştirmeniz gerekmektedir.
Varsayılan yönlendirmeyi kapatmak istiyorsanız, config/route.php
dosyasının sonuna aşağıdaki yapılandırmayı ekleyin:
Route::disableDefaultRoute();
Closure Yönlendirme
config/route.php
dosyasına aşağıdaki yönlendirme kodunu ekleyin:
use support\Request;
Route::any('/test', function (Request $request) {
return response('test');
});
Not
Closure fonksiyonları herhangi bir denetleyiciye ait olmadığı için,$request->app
$request->controller
$request->action
tümü boş string olacaktır.
http://127.0.0.1:8787/test
adresine erişildiğinde test
dizesi döndürülecektir.
Not
Yönlendirme yolu/
ile başlamalıdır. Örneğin:
use support\Request;
// Hatalı kullanım
Route::any('test', function (Request $request) {
return response('test');
});
// Doğru kullanım
Route::any('/test', function (Request $request) {
return response('test');
});
Sınıf Yönlendirme
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 erişildiğinde app\controller\IndexController
sınıfının test
metodunun dönüş değeri döndürülecektir.
Yönlendirme Parametreleri
Yönlendirmede parametre mevcutsa, {key}
ile eşleştirilebilir ve eşleşme sonuçları ilgili denetleyici metodunun parametrelerine (ikinci parametreden başlayarak) aktarılacaktır. Örneğin:
// /user/123 /user/abc eşleştirir
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('Alınan parametre: '.$id);
}
}
Diğer örnekler:
use support\Request;
// /user/123 eşleştirir, /user/abc eşleştirmez
Route::any('/user/{id:\d+}', function (Request $request, $id) {
return response($id);
});
// /user/foobar eşleştirir, /user/foo/bar eşleştirmez
Route::any('/user/{name}', function (Request $request, $name) {
return response($name);
});
// /user, /user/123 ve /user/abc'yi eşleştirir [] isteğe bağlıdır
Route::any('/user[/{name}]', function (Request $request, $name = null) {
return response($name ?? 'tom');
});
// /user/ ile başlayan herhangi bir isteği eşleştirir
Route::any('/user/[{path:.+}]', function (Request $request) {
return $request->path();
});
// Tüm options isteklerini eşleştirir : ile düzenli ifade belirtir.
Route::options('[{path:.+}]', function () {
return response('');
});
Gelişmiş kullanım özetle:
[]
sentaksı Webman yönlendirmelerinde isteğe bağlı yol parçalarını işlemek veya dinamik yönlendirmeleri eşleştirmek için kullanılır; bu sayede yönlendirme için daha karmaşık yol yapıları ve eşleştirme kuralları tanımlamanıza olanak tanır.
: ile düzenli ifade belirtilir.
Yönlendirme Grupları
Bazen yönlendirmelerde büyük miktarda aynı ön ek bulunur; bu durumda yönlendirme gruplarını kullanarak tanımı basitleştirebiliriz. Örneğin:
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("görünüm $id");});
});
Bu, aşağıdaki ile eşdeğerdir:
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("görünüm $id");});
Gruplar iç içe kullanılabilir:
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("görünüm $id");});
});
});
Yönlendirme Ara Katmanları
Belirli bir yönlendirmeye veya bir grup yönlendirmeye ara katman ayarlayabiliriz. Ö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("görünüm $id");});
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
# Hatalı kullanım örneği (webman-framework >= 1.5.7'de bu kullanım geçerlidir)
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("görünüm $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 $request) {return response('create');});
Route::any('/edit', function (Request $request) {return response('edit');});
Route::any('/view/{id}', function (Request $request, $id) {return response("görünüm $id");});
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
});
Kaynak Yönlendirmesi
Route::resource('/test', app\controller\IndexController::class);
// Belirli kaynak yönlendirmesi
Route::resource('/test', app\controller\IndexController::class, ['index','create']);
// Tanımsız kaynak yönlendirmesi
// Örneğin notify erişim adresi, hem any tipi yönlendirme /test/notify veya /test/notify/{id} olarak geçerdir. routeName test.notify'dir.
Route::resource('/test', app\controller\IndexController::class, ['index','create','notify']);
Fiil | URI | Eylem | Yönlendirme 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
Gruplandırılmış gövde oluşturma URL'sini desteklememektedir.
Yönlendirme örneği:
Route::any('/blog/{id}', [app\controller\BlogController::class, 'view'])->name('blog.view');
Bu yönlendirme URL'sini oluşturmak için aşağıdaki gibi bir yöntem kullanabiliriz.
route('blog.view', ['id' => 100]); // Sonuç: /blog/100
Görünümlerde yönlendirme URL'lerini kullanırken bu yöntemi kullanabilirsiniz; böylece yönlendirme kuralları değişse bile URL otomatik olarak oluşturulacak ve yönlendirme adreslerinde meydana gelen değişikliklerin çok sayıda görünüm dosyasında güncellenmesini önlemiş olacaksınız.
Yönlendirme Bilgilerini Alma
$request->route
nesnesi ile mevcut isteğin yönlendirme 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());
}
Not
Mevcut isteğinconfig/route.php
dosyasında yapılandırılmış herhangi bir yönlendirme ile eşleşmemesi durumunda,$request->route
null olacaktır. Bu da demektir ki varsayılan yönlendirme kullanılırken$request->route
null'dır.
404 Hatasını İşleme
Yönlendirme bulunamadığında varsayılan olarak 404 durum kodu döndürülür ve 404 ile ilgili içerik görüntülenir.
Geliştiricilerin yönlendirme bulunamadığında iş akışına katılmalarını sağlamak için webman'da sağlanan geri dönüş yönlendirmesini Route::fallback($callback)
yöntemini kullanabilirsiniz. Örneğin, aşağıdaki kodda yönlendirme bulunamadığında kullanıcı anasayfaya yönlendirilir.
Route::fallback(function(){
return redirect('/');
});
Başka bir örnekte, yönlendirme mevcut değilse JSON verisi döndürülür. Bu, webman API arayüzü olarak kullanıldığında oldukça kullanışlıdır.
Route::fallback(function(){
return json(['code' => 404, 'msg' => '404 bulunamadı']);
});
404'e Ara Katman Ekleme
Varsayılan 404 isteği herhangi bir ara katmandan geçmez; eğer 404 isteklerine ara katman eklemek istiyorsanız, aşağıdaki kod örneğine başvurabilirsiniz.
Route::fallback(function(){
return json(['code' => 404, 'msg' => '404 bulunamadı']);
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
İlgili bağlantılar Özel 404 500 Sayfası
Varsayılan Yönlendirmeyi Kapatma
// Ana proje varsayılan yönlendirmesini kapatın, uygulama eklentilerini etkilemez
Route::disableDefaultRoute();
// Ana projenin admin uygulamasının yönlendirmesini kapatın, uygulama eklentilerini etkilemez
Route::disableDefaultRoute('', 'admin');
// foo eklentisinin varsayılan yönlendirmesini kapatın, ana projeyi etkilemez
Route::disableDefaultRoute('foo');
// foo eklentisinin admin uygulamasının varsayılan yönlendirmesini kapatın, ana projeyi etkilemez
Route::disableDefaultRoute('foo', 'admin');
// [\app\controller\IndexController::class, 'index'] denetleyicisinin varsayılan yönlendirmesini kapatın
Route::disableDefaultRoute([\app\controller\IndexController::class, 'index']);
Anotasyon ile Varsayılan Yönlendirmeyi Kapatma
Belirli bir denetleyicinin varsayılan yönlendirmesini anotasyon ile kapatabiliriz. Örneğin:
namespace app\controller;
use support\annotation\DisableDefaultRoute;
#[DisableDefaultRoute]
class IndexController
{
public function index()
{
return 'index';
}
}
Aynı şekilde, belirli bir denetleyicinin varsayılan yönlendirmesini anotasyon ile kapatabiliriz. Örneğin:
namespace app\controller;
use support\annotation\DisableDefaultRoute;
class IndexController
{
#[DisableDefaultRoute]
public function index()
{
return 'index';
}
}
Yönlendirme Arabirimi
// $uri'nin herhangi bir yöntem isteği için yönlendirmesini ayarlama
Route::any($uri, $callback);
// $uri'nin get isteği için yönlendirmesini ayarlama
Route::get($uri, $callback);
// $uri'nin post isteği için yönlendirmesini ayarlama
Route::post($uri, $callback);
// $uri'nin put isteği için yönlendirmesini ayarlama
Route::put($uri, $callback);
// $uri'nin patch isteği için yönlendirmesini ayarlama
Route::patch($uri, $callback);
// $uri'nin delete isteği için yönlendirmesini ayarlama
Route::delete($uri, $callback);
// $uri'nin head isteği için yönlendirmesini ayarlama
Route::head($uri, $callback);
// $uri'nin options isteği için yönlendirmesini ayarlama
Route::options($uri, $callback);
// Birden çok istek türü için yönlendirme ayarlama
Route::add(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'], $uri, $callback);
// Gruplandırılmış yönlendirme
Route::group($path, $callback);
// Kaynak yönlendirmesi
Route::resource($path, $callback, [$options]);
// Yönlendirmeyi devre dışı bırak
Route::disableDefaultRoute($plugin = '');
// Geri dönüş yönlendirmesi, varsayılan yönlendirmeyi ayarla
Route::fallback($callback, $plugin = '');
// Tüm yönlendirme bilgilerini alma
Route::getRoutes();
Eğer uri
ile karşılık gelen bir yönlendirme yoksa (varsayılan yönlendirme dahil), ve geri dönüş yönlendirmesi de ayarlanmamışsa, 404 hatası döner.
Birden Fazla Yönlendirme Yapılandırma Dosyası
Yönlendirmeleri yönetmek için birden fazla yönlendirme yapılandırma dosyası kullanmak istiyorsanız, örneğin çoklu uygulamalarda her uygulamanın kendi yönlendirme yapılandırmasına sahip olması durumunda, require
dış dosyayı yükleme yöntemi ile dış yönlendirme yapılandırma dosyalarını yükleyebilirsiniz. Örneğin config/route.php
dosyasında:
<?php
// admin uygulaması altındaki yönlendirme yapılandırmasını yükle
require_once app_path('admin/config/route.php');
// api uygulaması altındaki yönlendirme yapılandırmasını yükle
require_once app_path('api/config/route.php');