1. Go to this page and download the library: Download phpsoftbox/router library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
phpsoftbox / router example snippets
use PhpSoftBox\Http\Message\Response;
use PhpSoftBox\Http\Message\ServerRequest;
use PhpSoftBox\Http\Message\Uri;
use PhpSoftBox\Router\{RouteCollector, RouteResolver, Dispatcher, Router, UrlGenerator};
$routes = new RouteCollector();
$routes->get('/hello', fn($r) => new Response(200, [], 'OK'))->name('hello');
$routes->get('/users/{id}/{extra?}', [UserController::class, 'show'])->name('user.show');
$router = new Router(new RouteResolver($routes), new Dispatcher(), $routes);
// Обработка входящего запроса
$request = new ServerRequest('GET', new Uri('https://example.com/hello'));
$response = $router->handle($request); // 200 OK
// Генерация URL по имени
$urlGenerator = new UrlGenerator($routes, $request);
$url = $urlGenerator->generate('user.show', ['id' => 42]); // "/users/42"
$rc = new RouteCollector();
// Обычные маршруты
$rc->get('/posts', [PostController::class, 'index'])->name('posts.index');
$rc->get('/posts/{slug}', [PostController::class, 'show'])->name('posts.show');
$rc->post('/posts', [PostController::class, 'store'])->name('posts.store');
// Invokable-класс
$rc->get('/ping', PingAction::class);
// Опциональные параметры: сегмент "/{slug?}" можно опустить
$rc->get('/blog/{slug?}', [BlogController::class, 'show']);
// Wildcard-параметры: захватывают несколько сегментов пути
$rc->get('/docs/{path*}', [DocsController::class, 'show'])->name('docs.show');
$rc->get('/docs/{path*?}', [DocsController::class, 'showOptional'])->name('docs.optional');
// Ограничение по хосту и метод ANY
$rc->any('/internal/ping', [SysController::class, 'ping'])->host('api.example.com');
// Несколько допустимых хостов
$rc->get('/admin', [AdminController::class, 'index'])->host([
'admin.example.com',
'admin-mirror.example.com',
]);
// Именованные маршруты
$rc->get('/u/{id}', [UserController::class, 'show'])->name('users.show');
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Psr\Http\Message\ServerRequestInterface;
use PhpSoftBox\Http\Message\Response;
$rc = new RouteCollector();
// Глобальный middleware
$rc->addMiddleware(new class implements MiddlewareInterface {
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): \Psr\Http\Message\ResponseInterface {
return $handler->handle($request);
}
});
// Группа с префиксом и своим набором middleware
$rc->group(function (RouteCollector $r) {
$r->get('/users', fn($r) => new Response(200));
})
->prefix('/api')
->middlewares([new class implements MiddlewareInterface {
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): \Psr\Http\Message\ResponseInterface {
return $handler->handle($request);
}
}])
->apply();
use PhpSoftBox\Auth\Middleware\AuthMiddleware;
use PhpSoftBox\Session\CsrfMiddleware;
$rc->resource('/users', UserController::class)
->except([])
->middlewares([new AuthMiddleware()])
->routeMiddlewares([
'store' => [new CsrfMiddleware()],
'update' => [new CsrfMiddleware()],
])
->namePrefix('users')
->appendRestoreMethod()
->routeParameter('user')
->apply();
// Сгенерирует: GET /users (users.index), GET /users/{user} (users.show), POST /users (users.store),
// GET /users/create (users.create), GET /users/{user}/edit (users.edit),
// PUT /users/{user} (users.update), DELETE /users/{user} (users.destroy),
// POST /users/{user}/restore (users.restore)
use PhpSoftBox\Application\Middleware\KernelRouteMiddlewareResolver;
use PhpSoftBox\Router\Dispatcher;
$dispatcher = new Dispatcher(
handlerResolver: null,
middlewareResolver: new KernelRouteMiddlewareResolver($kernel->middlewareManager(), $container),
);
use PhpSoftBox\Router\RequestContext;
use PhpSoftBox\Router\UrlGenerator;
$context = RequestContext::fromRequest($request);
$context->setHost('tenant.example.com');
$context->setScheme('https');
$urlGenerator = new UrlGenerator($routes, context: $context);
use App\Entity\User\User;
// маршрут: GET /users/{user}
public function show(User $user): ResponseInterface
{
// $user уже загружен из ORM
}
use PhpSoftBox\Router\Attributes\ResolveEntity;
public function show(#[ResolveEntity(withDeleted: true, with: ['roles', 'profile'])] User $user): ResponseInterface
{
}
public function show(#[ResolveEntity(column: 'slug')] Article $article): ResponseInterface
{
}
use PhpSoftBox\Router\Binding\ScopedBindingsResolverInterface;
final class AppScopedBindingsResolver implements ScopedBindingsResolverInterface
{
public function supports(object $parent, object $child, array $context = []): bool
{
// определить, поддерживается ли пара сущностей
}
public function isScoped(object $parent, object $child, array $context = []): bool
{
// вернуть true, если сущности действительно связаны
}
}
$routes = new RouteCollector();
$resolver = new RouteResolver($routes);
$router = new Router($resolver, new Dispatcher(), $routes);
use PhpSoftBox\Router\Handler\ContainerHandlerResolver;
use PhpSoftBox\Router\Dispatcher;
$dispatcher = new Dispatcher(new ContainerHandlerResolver($container));
$router = new Router(new RouteResolver($routes), $dispatcher, $routes);
final class CreateNodeSchema extends ApiSchema
{
public function rules(): array
{
return ['name' => [new PresentValidation(), new StringValidation()]];
}
}
final class CreateNodeAction
{
public function __invoke(CreateNodeSchema $schema): ResponseInterface
{
$data = $schema->validated();
// ...
}
}
$resolver = new ContainerHandlerResolver($container, [$projectResolver]);
use PhpSoftBox\Router\Cache\RouteCache;
use PhpSoftBox\Router\RouteCollector;
$collector = new RouteCollector();
$collector->get('/users/{id}', [UserController::class, 'show'])->validators(['id' => ParamTypesEnum::INT]);
$cache = new RouteCache($cacheStorage);
$cache->dump($collector, 'dev');
$routes = $cache->load('dev');
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.