【问题标题】:How to structure route controllers in slim framework 3 (mvc pattern)如何在 slim 框架 3 中构造路由控制器(mvc 模式)
【发布时间】:2016-08-29 17:36:55
【问题描述】:

我正在开发基于 Slim 框架的 API。遵循 mvc 模式,我希望我的路由是控制器驱动的,记录器和渲染器注入到每个控制器中。

作为起点,我检查了一些示例 mvc slim 骨架,并决定将我的结构基于一个特定的教程和示例项目 (http://jgrundner.com/slim-oo-004-controller-classes/)

在此设置中,注入是通过将路由器控制器添加到应用程序容器来完成的,如下所示:

$container = $app->getContainer();

$container['\App\Controllers\DefaultController'] = function($c){
    return new \App\Controllers\DefaultController(
        $c->get('logger'),
        $c->get('renderer')
    );
};

这样就可以得到一个干净的路由和控制器:

路线例如:

$app->get('/[{name}]', '\App\Controllers\DefaultController:index');

控制器例如:

namespace App\Controllers;

use Psr\Log\LoggerInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

    class DefaultController{
        private $logger;
        private $renderer;

        public function __construct(LoggerInterface $logger, $renderer){
            $this->logger   = $logger;
            $this->renderer = $renderer;
        }

        public function index(RequestInterface $request, ResponseInterface $response, $args){
            // Log message
            $this->logger->info("Slim-Skeleton '/' route");

            // Render index view
            return $this->renderer->render($response, 'index.phtml', $args);
        }

        public function throwException(RequestInterface $request, ResponseInterface $response, array $args){
            $this->logger->info("Slim-Skeleton '/throw' route");
            throw new \Exception('testing errors 1.2.3..');
        }
    }

扩展默认控制器保持控制器整洁,但需要先将每个新控制器对象添加到应用容器中,当您有很多类时,这似乎效率低下且混乱。

有没有更好的办法?

【问题讨论】:

标签: php url-routing slim


【解决方案1】:

您可以制作包含容器的基本控制器。

<?php

namespace App\Controller;

use Slim\Container;

class Controller
{
    var $container;

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

    public function __get($var)
    {
        return $this->container->{$var};
    }
}

和容器:

<?php

$container['App\Controller\Controller'] = function ($c) {
    return new App\Controller\Controller($c);
};

还有控制器

<?php

namespace App\Controllers;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use App\Controller\Controller;

class DefaultController extends Controller{

}

【讨论】:

  • @tirita_keniten 我知道这是可能的,但我听说到处添加完整的容器不是一个好主意,因为这会使测试变得困难。你能对此发表评论吗?
  • @Finglish 我想是这样,但这是我最好的做法。到目前为止,我没有任何问题来测试我的代码。对于调试,slim 框架非常好。否则,您可以使用 Illuminate/Facades 或其他外观包。所以你可以在任何地方调用静态类::方法。
猜你喜欢
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多