使用 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'));
}
}
}
我找不到访问正在执行的路由名称的方法。我找到了这个链接
但是当我尝试时我得到 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 有类似的功能。