juliangut/slim-controller

Slim 框架控制器创建器

1.5 2016-09-04 17:12 UTC

This package is auto-updated.

Last update: 2024-09-15 11:24:22 UTC


README

PHP version Latest Version License

Build status Style Code Quality Code Coverage Total Downloads

Slim3 控制器管理

注意:使用此包的用户应考虑迁移到 juliangut/slim-routing

路由类创建模板,允许您将控制器类定义为服务,以便从容器中轻松提取,并扩展基控制器类。

我强烈建议您不要使用此库,除非用于快速原型设计或特定用例。如果您真的想遵循 SOLID 原则,请不要使用此包,而是直接在控制器类中注入依赖项,使用容器创建和注入依赖项,或者尝试使用 PHP-DI 等其他容器,如 juliangut/slim-php-di

我无法强调这一点,此库旨在与默认 Slim 容器配合使用,并且仅在特定情况下使用。

安装

最佳安装方法是使用 Composer

composer require juliangut/slim-controller

然后包含自动加载文件

require_once './vendor/autoload.php';

使用方法

use \Jgut\Slim\Controller\Resolver;

// Define your controllers
$controllers = [
    'MyController',
];

// Create Slim app and fetch DI Container
$app = new \Slim\App();
$container = $app->getContainer();

// Register Controllers
foreach (Resolver::resolve($controllers) as $controller => $callback) {
    $container[$controller] = $callback;
}

// Define route (\MyController has already been registered)
$app->get('hello/app', '\MyController:dispatch');

// Run app
$app->run();

如果您的控制器实现了 Jgut\Slim\Controller\Controller,则 DI 容器会自动注入,您可以通过 getContainer 方法访问它。

如果您的控制器扩展了 Jgut\Slim\Controller\Base,您也可以像在 Closure 路由回调中那样直接访问容器服务。只需注意不要将具有与容器中服务相同名称的类属性定义为类属性。为此,容器被注入到控制器中,并定义了 __get__isset 魔术方法来查找容器。

use Jgut\Slim\Controller\Base as BaseController;

class MyController extends BaseController
{
    public function displatch($request, $response, array $args)
    {
        // Pull Twig view service given it was defined
        return $this->view->render($response, 'dispatch.twig');
    }
}

您可以使用解析器来定义您的 class 路由回调,并且不需要在这些类上实现 Controller 或扩展 Base,在这种情况下,您的控制器将无法访问容器,但它仍然是一个有效的回调。

重要注意

作为一般规则,直接注入容器被认为是坏做法,因为您实际上是在隐藏依赖项,通过从容器中获取它们,而不是在类中定义它们。您将使用容器作为服务定位器,而不是真正的 DIC。

注意

此控制器注册仅适用于不需要任何参数的构造函数的控制器。如果您需要在其 __construct() 方法中具有参数的控制器,您仍然可以受益于 \Jgut\Slim\Controller\Controller,但您必须自己注册它。

use Jgut\Slim\Controller\Controller;

$container['\MyController'] = function($container) {
    $controller = new \MyController('customParameter');

    // Set container into the controller
    if ($controller instanceof Controller) {
        $controller->setContainer($container);
    }

    return $controller;
}

贡献

发现错误或有功能请求? 请打开一个新问题。在查看现有问题之前

查看文件 CONTRIBUTING.md

许可

在 BSD-3-Clause 许可下发布。

请参阅源代码中包含的文件 LICENSE 以获取许可条款副本