Php 如何在slim framework 3(mvc模式)中构造路由控制器
我正在开发一个基于Slim框架的API。遵循mvc模式,我希望我的路由由控制器驱动,并将记录器和渲染器注入每个控制器 作为一个起点,我检查了许多示例mvc slim Skeleton,并决定将我的structor基于一个特定的教程和示例项目() 在此设置中,注入是通过将路由器控制器添加到应用程序容器中来完成的,如下所示: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']
$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框架非常好。否则,可以使用照明/立面或其他立面包。因此,您可以在任何地方调用静态类::方法