PHP Slim Framework Create Controller

Estoy creando una API usando el framework Slim. Actualmente utilizo un solo archivo para crear la ruta y pasarle un cierre:

$app->get('/', function($req, $resp){ //Code... }) 

Pero me doy cuenta de que mi archivo ha crecido rápidamente. Lo que quiero hacer es usar controladores en su lugar, así que tendré una clase de controlador y simplemente pasaré los métodos de instancia / estáticos a la ruta, como a continuación

 class HomeController { public static function index($req, $resp){} } 

y luego pasar la función a la ruta

 $app->get('/', HomeController::index); 

Intenté esto, pero no funciona, y me pregunto si hay alguna forma de que pueda usarlo para administrar mis archivos.

Convierte el controlador en un functor:

 class HomeController { public function __invoke($req, $resp) {} } 

y luego enruta así:

 $app->get('/', HomeController::class); 

Como referencia, ver

PHP 5.6 Slim 2.6.2

 require 'vendor/autoload.php'; class HelloController { public static function index() { global $app; echo "
"; var_dump($app->request); echo "

"; } } $app = new \Slim\Slim(); $app->get('/', 'HelloController::index'); $app->run();

Actualización: 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 "
"; var_dump($args); echo "

"; } } $app = new \Slim\App(); $app->get('/hello/{name}', 'HelloController::hello'); $app->run();

El problema con el enrutamiento basado en clases en Slim 3.0 es el acceso a $this / $app . Creo que necesitarás usar global $app para acceder a él.

En mi proyecto favorito utilizo grupos de rutas con require_once . Algo como

 $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'); }); }); 

No parece tan bello como podría ser con clases puras pero funciona como se espera con todas las características accesibles sin encoding adicional.

La ruta rápida de Nikic es un enrutador muy minimalista, por lo que se eliminan algunas de las sutilezas de los marcos más grandes. Aquí hay una solución básica:

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);}); 

uso del controlador \ Psr \ Http \ Message \ ServerRequestInterface como Solicitud; use \ Psr \ Http \ Message \ ResponseInterface como respuesta;

 class FooBar{ static public function asdf(Slim\App $app, Request $req, Response $resp, $args = []) { return $resp->withJson(['asf']); } } 

Manera pulida de usar un controlador como un objeto (no de una manera estática)

en index.php

 namespace MyApp; use \Psr\Http\Message\ServerRequestInterface as Request; use \Psr\Http\Message\ResponseInterface as Response; require __DIR__ . '/../vendor/autoload.php'; $app->get('/myroute', [new Controller\MyClass, 'get']); // <=== that is pretty slick and neat $app->post('/myroute', [new Controller\MyClass, 'post']); $app->map(['GET', 'POST'], '/myotherrout', [new Controller\MyOtherClass, 'run']); 

en Controller / MyClass:

 namespace MyApp\Controller; class MyClass{ public function __construct(){ //some code } public function get(\Slim\Http\Request $request, \Slim\Http\Response $response, $args = []) { //some foobar code } public function post(\Slim\Http\Request $request, \Slim\Http\Response $response, $args = []) { //some other code } 

El controlador \ MyClass se resuelve mediante el uso de autocarga de PSR