paveldanilin/slimcontroller

此包已被弃用且不再维护。未建议替代包。

FrontController 模式

0.1 2017-09-05 00:10 UTC

This package is auto-updated.

Last update: 2020-08-16 10:15:08 UTC


README

FrontController 模式的实现。

依赖于 PSR 接口

  • Psr\Container\ContainerInterface
  • Psr\Http\Message\ServerRequestInterface
  • Psr\Http\Message\ResponseInterface

用法

Slim3

路由

$app->group('/v1', function() {
  $this->group('/system', function() {
    $this->map(['GET', 'POST', 'PUT', 'DELETE'], '/{controller}/{action}[/{params:.*}]', 'SystemFrontController:handle');
  });
});

容器

$container['SystemFrontController'] = function($c) {
  $settings = $c->get('settings')['systemFrontController'];
  return new Slim\Controller\FrontController([
    'startup_path' => '/site/controllers/',
    'namespace' => 'MyApp\\Controllers\\',
    'has_own_folder' => true,
    'route_key_controller' => 'controller',
    'route_key_action' => 'action',
    'route_key_exparams' => 'params',
    'on' => [
      'beforeControllerCall' => function($controller, $action, $request, $response, $args, $c) {
         $logger = $c->get('logger');
         $logger->info("container=$controller; action=$action; args=" . print_r($args, true));
      }
    ]
  ], $c);
};

示例

假设我们收到了一个 URL 为 'http://site.com/v1/system/auth/login' 的 GET 请求。根据路由设置(如上所述),此请求将由 'Auth' 控制器和 'Login' 动作处理。此控制器必须位于 '/site/controllers/Auth/AuthController.php' 文件中,并且必须声明为名为 AuthController 的类,并具有公共方法 login($request, $response, $args)。将在类构造函数中注入一个容器对象,因此您可以在控制器中访问应用程序的所有服务。

namespace MyApp\Controllers;

use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;

class AuthController 
{
    public function __construct(ContainerInterface $container) {
    }
    
    public function login(ServerRequestInterface $request, ResponseInterface $response, $args) {
        return $response;
    }
}