【问题标题】:Slim3 Container good practice?Slim3 Container 的好习惯?
【发布时间】:2016-08-20 07:32:38
【问题描述】:

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

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

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

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

我的问题是我必须将 $container 传递给我创建的每个单个控制器类,因为我需要控制器中的容器上下文来进行路由等。

然后我像这样构建一个单例容器类:

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


   }

现在我所有的控制器都从控制器类扩展... 我现在的问题是……这是个好主意还是有理由不这样做? 我感谢每一个输入

【问题讨论】:

    标签: php routing rendering containers slim


    【解决方案1】:

    我已经用 Slim 框架构建了一些 API,并且还尝试了很多方法来完成它(当然是以正确的方式)。我在 Slim 框架上实现了 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');
        }
    }
    

    希望对你有帮助。

    【讨论】:

    • 这更像是一个 RouteAction 而不是一个控制器,因为在使用 __invoke() 时该类不能有多个操作
    • 哦,我明白了。我猜你想使用 Facades 来调用容器。我建议你使用照明/立面。你可以关注this link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多