如何解决Slim 4 从中间件分配树枝参数
我正在尝试将我网站的代码从 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 容器可能总是返回一个新实例,因此它不会将变量存储在正确的实例中,也不会在 twig 模板中呈现。其次,您在路线示例中使用了不同的方法。您通过 $params
变量传递变量,并通过这种方式将它们提供给模板。
因此您可以将 $this->get('view')
存储在变量中或将变量作为 $params
的第三个参数传递。
编辑:您还可以检查 DI\Container 中的变量是否已经存在,然后返回实例。
,所以这是一个测试代码:
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');
时,它会出现。当我在路线中使用相同的内容时,没有任何显示...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。