【发布时间】: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