Rudra FrameworkRudra Framework

Маршруты объявляются либо:

  • в методах контроллеров через атрибут #[Routing(...)],
  • либо в файле routes.php контейнера через фасад Router.
#[Routing(url: '')]
public function index(): void
{
    // ...
}

Маршрут с переменным значением:

#[Routing(url: 'page/:slug')]
public function page(string $slug)

Несколько маршрутов с параметрами:

#[Routing(url: 'page/:slug')]
#[Routing(url: 'page/:slug/category/:id')]
public function page(string $slug = 'home', int $id = 1): void
{
    // ...
}

Маршруты с параметрами являющимися регулярными выражениями:

#[Routing(url: 'named3/:[\d]{1,3}')]
#[Routing(url: 'namestr/:[a-z]{1,3}')]

Маршруты с указанием методов запроса:

#[Routing(url: 'read/:id', method: 'GET')]
public function read(int $id)
#[Routing(url: 'create/:id', method: 'POST')]
public function create(int $id)
#[Routing(url: 'update/:id', method: 'PUT|PATCH')]
public function update(int $id)
#[Routing(url: 'delete/:id', method: 'DELETE')]
public function delete(int $id)
#[Routing(url: 'any/:id', method: 'GET|POST|PUT|PATCH|DELETE')]
public function any(int $id)

✅ Также можно указывать маршруты напрямую в файле routes.php контейнера.
⚠️Чтобы избежать автоматической регистрации маршрутов через атрибуты, файл routes.php должен возвращать пустой массив:

return [];
use Rudra\Router\RouterFacade as Router;
use App\Containers\Web\Controller\IndexController;
// Ручная регистрация через фасад
Router::get('hello/:name', function ($name) {
    echo "Hello $name!";
});
Router::get('web/index',  [IndexController::class, 'actionIndex']);

C Middleware:

Router::get('web/index', [IndexController::class, 'actionIndex'], [
    'before' => [BeforeMiddleware::class],
    'after'  => [AfterMiddleware::class]
]);

Вариант объявления маршрута методом set:

Router::set([
	'url' => 'web/index', 
	'method' => 'GET', 
	'controller' => IndexController::class, 
	'action' => 'actionIndex'
]);

C Middleware:

Router::set([
	'url' => 'web/index',
	'method' => 'GET',
	'controller' => IndexController::class,
	'action' => 'actionIndex',
	'middleware' => [
		'before' => [BeforeMiddleware::class],
		'after'  => [AfterMiddleware::class]
	]
]);

Также есть удобный метод для работы c REST api:

// REST-маршруты:
Router::resource('api/:id', RestController::class);
// GET → read(), POST → create(), PUT → update(), DELETE → delete()

// Свои имена методов:
Router::resource('api/:id', MainController::class, [
    'actionIndex', 'actionAdd', 'actionUpdate', 'actionDrop'
]);

⚠️ Примечание для legacy-проектов: если в config/setting.local.yml установлено attributes: false, маршруты можно объявлять через DocBlock-аннотации:

/**
 * @Routing(url="page/:slug", method="GET")
 */