繁体   English   中英

Slim3 Container的良好做法?

[英]Slim3 Container good practice?

您好,我正在学习PHP,我正在使用Slim3 Framework构建REST API。 我创建这样的路线:

$container['HomeController'] = function () {
    return new HomeController();
};

$currentContainer = CurrentContainer::getInstance();   
$currentContainer->setContainer($container);

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

我的问题是我必须将$ container传递给创建的每个Single Controller Class,因为我需要Controller中的容器上下文才能进行路由等。

然后即时通讯建立Singleton容器类,如下所示:

class CurrentContainer
{

    private static $instance;
    private $container;

    private function __construct()
    {
    }

    private function __clone()
    {
    }

    public static function getInstance()
    {
        if (self::$instance == null) {
        self::$instance = new CurrentContainer();
        }
        return self::$instance;
    }

    public function setContainer($container)
    {
        $this->container = $container;
    }

    /**
     * @return mixed
     */
    public function getContainer()
    {
        return $this->container;
    }
}

因此,现在可以像这样创建“ MainController”:

class Controller
{


    /**
     * @var mixed
     */
    protected $view;

    /**
     * @var
    */
    protected $router;

    public function __construct()
    {
        $container = CurrentContainer::getInstance()->getContainer();
        $this->view = $container->view;
        $this->router = $container->router;
    }


   }

现在我所有的Controllers都是从Controller类扩展的...我的问题是...这是一个好主意,还是有理由不这样做呢? 我很感谢每一次输入

我已经使用Slim Framework构建了一些API,还尝试了许多方法来完成它(当然是以正确的方式)。 我在Slim Framework上实现了MVC模式。 下面的代码示例:

  1. 对于控制器,我创建了一个基本控制器,该控制器注入了容器。 所以代码:
<?php

namespace App\Controller;

use Slim\Container;

class Controller
{
    protected $container;

    public function __construct(Container $container)
    {
        $this->container = $container;
    }

    public function __get($name)
    {
        return $this->container->get($name);
    }
}
  1. 我将基本控制器加载到依赖项容器上。
<?php

// controller
$container['controller'] = function ($c) {
    return new App\Controller\Controller($c);
};
  1. 因此,我可以从控制器获取容器。
<?php

namespace App\Controller;

use App\Controller\Controller;
use Slim\Http\Request;
use Slim\Http\Response;

class HomeController extends Controller
{
    public function __invoke(Request $request, Response $response, $args)
    {
        return $this->renderer->render($response, 'home');
    }
}

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM