我正在与 Slim4 中的授权中间件苦苦挣扎。这是我的代码:
$app = AppFactory::create();
$app->add(new Authentication());
$app->group('/providers', function(RouteCollectorProxy $group){
$group->get('/', 'Project\Controller\ProviderController:get');
})->add(new SuperuserAuthorization());
Run Code Online (Sandbox Code Playgroud)
身份验证中间件检查用户并正常工作。
ProviderController 中的get方法是
public function get(Request $request, Response $response): Response{
$payload = [];
foreach(Provider::all() as $provider){
$payload[] = [
'id' => $provider->id,
'name' => $provider->name,
];
}
$response->getBody()->write(json_encode($payload));
return $response;
}
Run Code Online (Sandbox Code Playgroud)
SuperuserAuthorization 看起来像这样
class SuperuserAuthorization{
public function __invoke(Request $request, RequestHandler $handler): Response{
$response = $handler->handle($request);
$authorization = explode(" ", $request->getHeader('Authorization')[0]);
$user = User::getUserByApiKey($authorization[1]);
if(! Role::isSuperuser($user)){
return $response->withStatus(403);//Forbidden
}
return $response;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是即使用户不是超级用户,应用程序也会继续执行。结果我得到了所有提供者的 …
我正在尝试在 slim v4 中添加树枝视图
在 slim v3 中,我们在容器中添加了 twig-view
$container['view'] = function ($c) {
$view = new \Slim\Views\Twig('path/to/templates', [
'cache' => 'path/to/cache'
]);
// Instantiate and add Slim specific extension
$router = $c->get('router');
$uri = \Slim\Http\Uri::createFromEnvironment(new \Slim\Http\Environment($_SERVER));
$view->addExtension(new \Slim\Views\TwigExtension($router, $uri));
return $view;
};
Run Code Online (Sandbox Code Playgroud)
但我不能在 slim v4 中添加这样的树枝
我正在从 Slim/3 迁移到 Slim/4。我已经找到或想出了我正在使用的所有功能的替代品,这些功能已被删除,除了404 Not Found Handler(现在已经消失的一部分App::$settings):
Slim
App::$settings已被删除,已实施多个中间件以替换每个单独设置的功能。
有中间件notFoundHandler吗?如果没有,我该如何实施?
我的以前看起来像这样:
use Slim\Container;
$config = new Container();
$config['notFoundHandler'] = function (Container $c) {
return function (Request $request, Response $response) use ($c): Response {
$page = new Alvaro\Pages\Error($c);
return $page->notFound404($request, $response);
};
};
Run Code Online (Sandbox Code Playgroud) 我可以创建一个实例PDO并成功注入它。我PDO::class直接定义了并将其注入到构造函数中__construct(PDO $pdo)。我需要类似的东西PDO1::class并按PDO2::class如下方式注入它:__construct(PDO1 $pdo1, PDO2 $pdo2)但这显然不起作用。只有一个PDO类,我需要做的是它的 2 个具有不同数据库凭据的实例。
最好的方法是什么?
我通过这样的 PDO 设置了一个数据库定义,它可以工作:
文件: dependencies.php
use DI\ContainerBuilder;
use Psr\Container\ContainerInterface;
return function (ContainerBuilder $containerBuilder) {
$containerBuilder->addDefinitions([
PDO::class => function (ContainerInterface $c) {
$dbSettings = $c->get('settings')['db1'];
$dsn = 'mysql:host=' . $dbSettings['host'] . ';dbname=' . $dbSettings['dbname'];
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
return new PDO($dsn, $dbSettings['user'], $dbSettings['pass'], $options);
},
]);
};
Run Code Online (Sandbox Code Playgroud)
文件: index.php
... …Run Code Online (Sandbox Code Playgroud) 我一直在测试新的 Slim 4 框架,并且重定向在普通类中对我来说工作得很好,但我似乎无法让它们在中间件中工作,中间件中的响应是由请求处理程序动态生成的(显然?)。当我尝试使用 Location 标头进行重定向时,它根本无法重定向,并且我的路线继续到原始位置。
\n\n这里\xe2\x80\x99是我用于测试的身份验证中间件的基本版本:
\n\nuse Psr\\Http\\Message\\ServerRequestInterface as Request;\nuse Psr\\Http\\Message\\ResponseInterface as Response;\nuse Psr\\Http\\Server\\RequestHandlerInterface as RequestHandler;\n\nclass AuthMiddleware extends Middleware {\n\n public function __invoke(Request $request, RequestHandler $handler): Response {\n $response = $handler->handle($request);\n $loggedInTest = false;\n if ($loggedInTest) {\n echo "User authorized.";\n return $response;\n } else {\n echo "User NOT authorized.";\n return $response->withHeader(\'Location\', \'/users/login\')->withStatus(302);\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n有人让这个工作吗?如果是这样,你是如何实现的?提前致谢。
\n我已经基于 SlimPHP 团队的Slim Skeleton应用程序设置了一个新应用程序。在我的路由定义中,我希望能够访问Slim4 文档 中所述的路由解析器。因此,例如,我希望能够编辑骨架的app/routes.php文件,如下所示:
$app->get('/', function (Request $request, Response $response) {
$routeParser = $app->getRouteCollector()->getRouteParser(); // this doesn't work
$response->getBody()->write('Hello world! ' . $routeParser->urlFor('something'));
return $response;
});
Run Code Online (Sandbox Code Playgroud)
这是有道理的,但$app->getRouteCollector()->getRouteParser()不起作用,因为$app这里没有定义。但我认为我们应该调用$this->getRouteCollector()->getRouteParser();,但这会给出错误:"Call to undefined method DI\\Container::getRouteCollector()"。
看来我的困惑显然是关于依赖注入,这对我来说是新的,而且对我来说并不自然。老实说,我很想在其他地方定义 $routeParser 变量(在 index.php 内?),这样我就可以在任何路由定义中访问它,而不必每次都调用 $app->getRouteCollector()->getRouteParser() 。但目前我会满足于任何有效的方法。
我想知道如何在 Slim 4 的中间件中访问路由参数。
如果我定义了一个带有占位符和附加中间件的路由:
<?php
// ...
$app
->get('/{userId}', Controller::class)
->add(Middleware::class);
Run Code Online (Sandbox Code Playgroud)
我想{userId}在调用控制器之前访问中间件的值:
class Middleware
{
function __invoke($request, $handler)
{
// Resolve user ID in this scope?..
return $handler->handle($request);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道在 Slim 3 中我们可以访问 request object 的属性,但是,它在 Slim 4 中不起作用。 route 对象的属性包含以下条目:
__routingResults____route____basePath__这些似乎都没有包含参数。