Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在slim framework 3(mvc模式)中构造路由控制器_Php_Url Routing_Slim - Fatal编程技术网

Php 如何在slim framework 3(mvc模式)中构造路由控制器

Php 如何在slim framework 3(mvc模式)中构造路由控制器,php,url-routing,slim,Php,Url Routing,Slim,我正在开发一个基于Slim框架的API。遵循mvc模式,我希望我的路由由控制器驱动,并将记录器和渲染器注入每个控制器 作为一个起点,我检查了许多示例mvc slim Skeleton,并决定将我的structor基于一个特定的教程和示例项目() 在此设置中,注入是通过将路由器控制器添加到应用程序容器中来完成的,如下所示: $container = $app->getContainer(); $container['\App\Controllers\DefaultController']

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

作为一个起点,我检查了许多示例mvc slim Skeleton,并决定将我的structor基于一个特定的教程和示例项目()

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

$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..');
        }
    }
扩展默认控制器可以使控制器保持整洁,但需要首先将每个新的控制器对象添加到应用程序容器中,这在有很多类的情况下显得效率低下且杂乱无章


有更好的方法吗?

您可以制作包含容器的basecontroller


@tirita\u keniten我知道这是可能的,但我听说到处添加完整的容器不是一个好主意,因为这会使测试变得困难。你能对此发表评论吗?@Finglish我想可以,但这是我的最佳实践。到目前为止,我没有任何问题来测试我的代码。对于调试,slim框架非常好。否则,可以使用照明/立面或其他立面包。因此,您可以在任何地方调用静态类::方法