【发布时间】:2016-01-18 16:39:20
【问题描述】:
我使用 Slim 对我的控制器进行分组,并且通常为每个组扩展一个抽象的 BaseController。我使用基于类的路由:
/* SLIM 2.0 */
// Users API - extends BaseApiController
$app->post('/users/insert/' , 'Controller\Api\UserApiController:insert');
.
.
// Campaigns - extends BaseAdminController
$app->get('/campaigns/', 'Controller\CampaignController:index')->name('campaigns');
并且需要密码保护某些路由,有时我需要稍微不同的配置。 BaseApiController、BaseAdminController... 等等。有时我需要知道我在哪条路由中,以便我可以针对该路由执行某种行为。在这些情况下,我会有一个这样的辅助函数:
/* SLIM 2.0 */
// returns the current route's name
function getRouteName()
{
return Slim\Slim::getInstance()->router()->getCurrentRoute()->getName();
}
这会给我当前正在使用的路线名称。所以我可以做类似...
namespace Controller;
abstract class BaseController
{
public function __construct()
{
/* SLIM 2.0 */
// Do not force to login page if in the following routes
if(!in_array(getRouteName(), ['login', 'register', 'sign-out']))
{
header('Location: ' . urlFor('login'));
}
}
}
我找不到访问正在执行的路由名称的方法。我找到了这个链接
Slim 3 get current route in middleware
但是当我尝试时得到 NULL
$request->getAttribute('routeInfo');
我也尝试过建议的:
'determineRouteBeforeAppMiddleware' => true
我已经检查了每个 Slim3 对象的属性和方法,我似乎找不到 Slim3 的等价物,或者无法访问命名路由。看起来 Slim3 甚至没有跟踪它执行的路线,它只是......执行它。
这些是路由器类具有的以下方法,我怀疑这个值会在哪里:
//get_class_methods($container->get('router'));
setBasePath
map
dispatch
setDispatcher
getRoutes
getNamedRoute
pushGroup
popGroup
lookupRoute
relativePathFor
pathFor
urlFor
我希望有人做过类似的事情。当然,还有其他一些我可以做到这一点的 hacky 方法(一些我现在已经在考虑),但我更喜欢使用 Slim 来给我这些数据。有什么想法吗?
注意:我知道您可以使用中间件来做到这一点,但是我正在寻找一种不需要中间件的解决方案。我可以在触发路由实例化的类中使用的东西。 Slim2 可以,希望 Slim3 也有类似的功能。
【问题讨论】: