Slim 4 从中间件分配树枝参数

Slim 4 assign twig parameters from middleware

我正在尝试将我网站的代码从 Slim v2 升级到 v4。我不是铁杆程序员,所以我遇到了问题。 在 Slim v2 中,我有一些中间件,我可以在执行路由代码之前将参数分配给 Twig 视图。 现在,我正在尝试使用 Slim v4 进行管理,但没有成功。

我有一个容器:

$container = new \DI\Container();

我有看法:

$container->set('view', function(\Psr\Container\ContainerInterface $container) {
    return Twig::create(__DIR__ . '/views');
});

我尝试从中间件使用它:

$this->get('view')->offsetSet('fbloginurl', $loginUrl); 

但是在呈现视图时没有附加内容。

如果我尝试从内部路线使用相同的方法,它工作正常。

示例路线:

$app->get('/', function ($request, $response, $args) {
   
    $params = array(...);
    return $this->get('view')->render($response, 'index.html', $params);
});

有两种可能的失败。首先,DI 容器可能总是 return 一个新实例,因此它不会将变量存储在正确的实例中,并且它们不会在 twig 模板中呈现。其次,您在路线示例中使用了不同的方法。您通过 $params 变量传递变量,并通过这种方式将它们提供给模板。

因此您可以将 $this->get('view') 存储在变量中或将变量作为 $params 的第三个参数传递。

编辑:您还可以检查 DI\Container 中的变量是否已经存在,然后 return 实例。

所以这是一个测试代码:

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Slim\Factory\AppFactory;
use Slim\Views\Twig;
use Slim\Routing\RouteContext;

require 'vendor/autoload.php';
require 'config.php';
lib\Cookie::init();

$container = new \DI\Container();

$container->set('view', function($container) {
    return Twig::create(__DIR__ . '/views');
});

$container->set('flash', function ($container) {
    return new \Slim\Flash\Messages();
});

$container->get('view')->getEnvironment()->addGlobal('flash', $container->get('flash'));

AppFactory::setContainer($container);

$app = AppFactory::create();

$app->addErrorMiddleware(true, false, false);

$fb = new Facebook\Facebook([
  'app_id' => '...',
  'app_secret' => '...',
  'default_graph_version' => '...',
  ]);

$beforeMiddleware = function (Request $request, RequestHandler $handler) use ($fb) {
    $response = $handler->handle($request);
    if (!isset($_SESSION['fbuser'])) {
        $helper = $fb->getRedirectLoginHelper();
        $permissions = ['email'];
        $loginUrl = $helper->getLoginUrl('...', $permissions);
        $this->get('view')->offsetSet('fbloginurl', $loginUrl);       
    }
    else {
        $this->get('view')->offsetSet('fbuser', $_SESSION['fbuser']);
    }
    $uri = $request->getUri();

    $this->get('view')->offsetSet('currenturl', $uri);

    return $response;
};


$app->add($beforeMiddleware);

$app->get('/test', function (Request $request, Response $response, $args) {
    $oViewParams = new \lib\ViewParams("home", "", "", "", "");
    $oProfession = new \models\Profession();
    $oBlogPost = new models\BlogPost();
    $oBlogTopic = new models\BlogTopic();
    $professions = $oProfession->getProfessionsWithLimit(14);
    $posts = $oBlogPost->getMainPagePosts();

    echo $this->get('view')->offsetGet('fbloginurl'); 
    $params = array('professions' => $professions,
        'posts' => $posts,
        'viewp' => $oViewParams->getMassParams());
    return $this->get('view')->render($response, 'index.html', $params);
});

$app->run();

当我在中间件中使用 echo $this->get('view')->offsetGet('fbloginurl'); 时,它会出现。当我在路线中使用相同的路线时,没有任何显示...