Slim3 Контейнер хорошая практика?

Здравствуйте, я изучаю PHP и создаю REST API с помощью Slim3 Framework. Я создаю маршруты, как это:

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

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

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

Моя проблема заключалась в том, что я должен был передать контейнер $ каждому созданному классу Single Controller IV’e, потому что мне нужен контекст контейнера в контроллере для маршрутизации и т. Д.

затем я создаю контейнер класса 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;
}}

теперь все мои контроллеры выходят из класса контроллеров …
мой вопрос сейчас … это хорошая идея или есть причина не делать это так?
я благодарен за каждый вклад

0

Решение

Я создал несколько API-интерфейсов с Slim Framework, а также попробовал так много методов, чтобы сделать это (конечно, правильно). Я реализовал шаблон MVC на Slim Framework. Пример кода ниже:

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

Я надеюсь, что это помогает.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]