Slim3 容器良好实践?
Slim3 Container good practice?
你好,我正在学习 PHP,我正在使用 Slim3 框架构建 REST API。我这样创建路线:
$container['HomeController'] = function () {
return new HomeController();
};
$currentContainer = CurrentContainer::getInstance();
$currentContainer->setContainer($container);
$app->get('/', 'HomeController:index')->setName("index");
我的问题是我必须将 $container 传递给每个创建的单个控制器 Class,因为我需要控制器中的容器上下文来进行路由等
然后我像这样构建一个单例容器Class:
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;
}
}
现在我所有的控制器都从控制器扩展 class...
我现在的问题是……这是个好主意还是有理由不那样做?
我感谢每一个输入
我已经使用 Slim Framework 构建了一些 API,并且还尝试了很多方法来完成它(当然是以正确的方式)。我在 Slim Framework 上实现了 MVC 模式。下面的代码示例:
- 对于控制器,我创建了一个注入容器的基本控制器。所以代码:
<?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);
}
}
- 我在依赖项容器上加载了基础控制器。
<?php
// controller
$container['controller'] = function ($c) {
return new App\Controller\Controller($c);
};
- 所以我可以从控制器获取容器。
<?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');
}
}
希望对您有所帮助。
你好,我正在学习 PHP,我正在使用 Slim3 框架构建 REST API。我这样创建路线:
$container['HomeController'] = function () {
return new HomeController();
};
$currentContainer = CurrentContainer::getInstance();
$currentContainer->setContainer($container);
$app->get('/', 'HomeController:index')->setName("index");
我的问题是我必须将 $container 传递给每个创建的单个控制器 Class,因为我需要控制器中的容器上下文来进行路由等
然后我像这样构建一个单例容器Class:
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;
}
}
现在我所有的控制器都从控制器扩展 class... 我现在的问题是……这是个好主意还是有理由不那样做? 我感谢每一个输入
我已经使用 Slim Framework 构建了一些 API,并且还尝试了很多方法来完成它(当然是以正确的方式)。我在 Slim Framework 上实现了 MVC 模式。下面的代码示例:
- 对于控制器,我创建了一个注入容器的基本控制器。所以代码:
<?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);
}
}
- 我在依赖项容器上加载了基础控制器。
<?php
// controller
$container['controller'] = function ($c) {
return new App\Controller\Controller($c);
};
- 所以我可以从控制器获取容器。
<?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');
}
}
希望对您有所帮助。