标签: slim-4

Slim 4 中的路由中间件不会停止调用路由中的可调用对象

我正在与 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)

问题是即使用户不是超级用户,应用程序也会继续执行。结果我得到了所有提供者的 …

php middleware routes slim-4

8
推荐指数
1
解决办法
2135
查看次数

如何在 slimframework v4 中添加树枝视图

我正在尝试在 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 中添加这样的树枝

php slim slim-4

7
推荐指数
2
解决办法
7702
查看次数

替换 notFoundHandler 设置

我正在从 Slim/3 迁移到 Slim/4。我已经找到或想出了我正在使用的所有功能的替代品,这些功能已被删除,除了404 Not Found Handler(现在已经消失的一部分App::$settings):

SlimApp::$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)

php slim slim-4

4
推荐指数
1
解决办法
1492
查看次数

如何在 slim 4 中设置和注入多个 PDO 数据库连接?

我可以创建一个实例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)

php pdo slim php-di slim-4

4
推荐指数
1
解决办法
2466
查看次数

如何从 Slim 4 中间件进行重定向?

我一直在测试新的 Slim 4 框架,并且重定向在普通类中对我来说工作得很好,但我似乎无法让它们在中间件中工作,中间件中的响应是由请求处理程序动态生成的(显然?)。当我尝试使用 Location 标头进行重定向时,它根本无法重定向,并且我的路线继续到原始位置。

\n\n

这里\xe2\x80\x99是我用于测试的身份验证中间件的基本版本:

\n\n
use 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

有人让这个工作吗?如果是这样,你是如何实现的?提前致谢。

\n

php response.redirect psr-7 slim-4

4
推荐指数
1
解决办法
6798
查看次数

如何使用 Slim-Skeleton 中演示的 PHP-DI 设置访问 slim4 的routeParser?

我已经基于 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() 。但目前我会满足于任何有效的方法。

php slim php-di slim-4

3
推荐指数
1
解决办法
1766
查看次数

在 Slim 4 中访问中间件中的路由参数

我想知道如何在 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__

这些似乎都没有包含参数。

php slim slim-4

3
推荐指数
1
解决办法
1535
查看次数

标签 统计

php ×7

slim-4 ×7

slim ×5

php-di ×2

middleware ×1

pdo ×1

psr-7 ×1

response.redirect ×1

routes ×1