Есть ли какая-то схема маршрутов и как написать структуру с помощью SlimPhp?
Например, я создал папку api с index.php для хранения ВСЕХ моих маршрутов:
$app->get('/api/shirt/{id}', function (Request $request, Response $response) { //CODE }); $app->get('/api/some-other-endpoint/{id}', function (Request $request, Response $response) //CODE });
Но через некоторое время я понял, что мой индексный файл станет довольно большим.
Итак, как я могу управлять маршрутами конечных точек? Использование классов, контроллеров, действий?
Где я могу найти документацию об этих конкретных концепциях?
Я использую контроллер (названный Action в этом примере) и все еще имеет всю маршрутизацию в один файл.
Кроме того, я использую группировку, я могу, потому что она дает лучшую структуру (на мой взгляд). Я пытаюсь сделать классы Action настолько малыми, насколько это возможно, что мне не нужно искать файл маршрутов для получения класса, который я хочу изменить.
Вот пример:
Маршруты-Файл :
$app->get('/user/{name}', [ShowUserAction::class, 'showUser'])->setName('user'); $app->get('/login', [LoginUserAction::class, 'showLogin'])->setName('login'); $app->group('/api', function () { $this->get('/images', [ImagesApi::class, 'getImages'])->setName('api.images'); $this->get('/tags', [ImagesApi::class, 'getTags'])->setName('api.tags'); $this->get('/notifications', [UserNotificationsApiAction::class, 'getNotifications'])->setName('api.notifications'); $this->get('/bubbleCount', [BubbleCountApiAction::class, 'getBubbleCount'])->setName('api.bubbleCount'); }); $app->group('/review', function() use ($currentUser) { $this->get('', [ReviewAction::class, 'showReviewOverview'])->setName('review.overview')->setName('review') $this->get('/{type}', [ReviewAction::class, 'showReviewWithType'])->setName('review.type') $this->get('/{type}/{id}', [ReviewAction::class, 'showReview'])->setName('review.type.id') });
Класс действия :
class LoginUserAction { public function __construct() { } // with parameters public function showLogin(Request $request, Response $response) { if ($this->currentUser->isLoggedIn()) { return $response->withRedirect($this->router->pathFor('index')); } return $this->view->render($response, 'user/login.twig'); } public function doLogin(Request $request, Response $response) { // check user name password and then login } }
У меня обычно есть собственный маршрутизатор, прежде чем я подключу маршрутизатор Slim, чтобы определить, какой маршрут использовать на основе пути после домена:
общественности / index.php
chdir(dirname(__DIR__)); require_once 'vendor/autoload.php'; $app = new Slim\App; require 'app/routes/index.php'; $app->run();
приложение / маршруты / index.php
$_url = parse_url($_SERVER['REQUEST_URI']); $_routes = explode('/',$_url['path']); $_baseRoute = $_routes[1]; switch ($_baseRoute) { case 'api': $_routeFile = 'app/api/' . $_routes[2] . '.php'; break; default: $_routeFile = 'app/routes/' . $_baseRoute . '.php'; break; } if (file_exists($_routeFile)) { require $_routeFile; } else { die('Invalid API request'); }