Я создаю API, используя платформу Slim. В настоящее время я использую один файл для создания маршрута и пропускаю его:
$app->get('/', function($req, $resp){ //Code... })
Но я понимаю, что мой файл быстро растет. То, что я хочу сделать, это использовать контроллеры вместо этого, поэтому у меня будет класс контроллера и просто передайте методы экземпляра / статики на маршрут, как показано ниже
class HomeController { public static function index($req, $resp){} }
а затем передать функцию на маршрут
$app->get('/', HomeController::index);
Я пробовал это, но это не работает, и мне интересно, есть ли способ, которым я могу использовать его для управления моими файлами.
Поверните контроллер в функтор:
class HomeController { public function __invoke($req, $resp) {} }
и затем выполните следующие действия:
$app->get('/', HomeController::class);
Для справки см.
PHP 5.6 Slim 2.6.2
require 'vendor/autoload.php'; class HelloController { public static function index() { global $app; echo "<pre>"; var_dump($app->request); echo "</pre>"; } } $app = new \Slim\Slim(); $app->get('/', 'HelloController::index'); $app->run();
Обновление: PHP 5.6 Slim 3.0.0
require 'vendor/autoload.php'; class HelloController { public static function hello(\Slim\Http\Request $req, \Slim\Http\Response $response, $args) { echo "<pre>"; var_dump($args); echo "</pre>"; } } $app = new \Slim\App(); $app->get('/hello/{name}', 'HelloController::hello'); $app->run();
Проблема с маршрутизацией на основе классов в Slim 3.0 – это доступ к $this
/ $app
. Я думаю, вам нужно будет использовать global $app
для доступа к нему.
В моем домашнем проекте я использую группы маршрутов с require_once
. Что-то вроде
$app->group('/dashboard', function () { $this->group('/auctions', function () use ($app){ require_once('routes/dashboard/auctions.php'); }); $this->group('/rss', function () { require_once('routes/dashboard/rss.php'); }); $this->group('/settings', function () { require_once('routes/dashboard/settings.php'); }); });
Выглядит не так красиво, как может быть с чистыми классами, но работает, как ожидалось, со всеми функциями, доступными без дополнительного кодирования.
Быстрый маршрут Nikic – это очень минимальный маршрутизатор, поэтому некоторые из тонкостей больших фреймворков удалены. Вот базовое решение:
routes.php
use \Psr\Http\Message\ServerRequestInterface as Request; use \Psr\Http\Message\ResponseInterface as Response; $app->get('/', function($req, $resp, $args) use ($app){return FooBar::asdf($app, $req, $resp);});
использование контроллера \ Psr \ Http \ Message \ ServerRequestInterface в качестве запроса; использовать \ Psr \ Http \ Message \ ResponseInterface как ответ;
class FooBar{ static public function asdf(Slim\App $app, Request $req, Response $resp, $args = []) { return $resp->withJson(['asf']); } }