slim 中的 $response->withRedirect() 方法不为在中间件中创建的树枝呈现全局变量
$response->withRedirect() method in slim not rendering global variable for twig created in middleware
<?php
namespace Auto\middleware;
class registrationMiddleware{
public $container;
public function __construct($container){
$this->container=$container;
// $container is the $app instance passed from the route
}
public function __invoke($request,$response,$next){
$this->container->getContainer()->view->getEnvironment()->addGlobal('error','error');
$response=$next($request,$response);
return $response->withRedirect($this->container->getContainer()->get('router')->pathFor('redirect'));
}
}
渲染时不输出全局变量(错误)。
请务必记住,您的浏览器对视图、模板和全局变量一无所知。它所看到的只是一个 HTTP 响应,其中包含一个状态代码、一些 header 和 (可选) 一个 body.
正常响应的状态代码为 200,body 包含浏览器应显示的内容。
Slim $response->withRedirect
方法创建一个带有状态代码的 HTTP 响应,告诉浏览器重定向(301、302 或 307)。虽然这样的响应可以包含 body,但它通常只是浏览器不会自动重定向的后备。标准的现代浏览器永远不会呈现此内容,因为一旦它看到状态代码,它就会向响应的 Location
header 中给出的 URL 发送一个新请求,并显示从那里到用户的内容而不是。
一旦用户被重定向,重定向之前就没有上下文遗留下来。浏览器请求了一个新的 URL,您的应用程序将收到该新请求并对其进行处理,而无法查看之前发生的情况。不会有全局变量、视图或任何其他在重定向之前遗留下来的东西。唯一保留的信息将是您明确保存到 cookie 或 session(由 cookie 引用)的内容。
所有这一切的最终结果是您不能在同一段代码中既显示带有视图的内容又发出 HTTP 重定向。
<?php
namespace Auto\middleware;
class registrationMiddleware{
public $container;
public function __construct($container){
$this->container=$container;
// $container is the $app instance passed from the route
}
public function __invoke($request,$response,$next){
$this->container->getContainer()->view->getEnvironment()->addGlobal('error','error');
$response=$next($request,$response);
return $response->withRedirect($this->container->getContainer()->get('router')->pathFor('redirect'));
}
}
渲染时不输出全局变量(错误)。
请务必记住,您的浏览器对视图、模板和全局变量一无所知。它所看到的只是一个 HTTP 响应,其中包含一个状态代码、一些 header 和 (可选) 一个 body.
正常响应的状态代码为 200,body 包含浏览器应显示的内容。
Slim $response->withRedirect
方法创建一个带有状态代码的 HTTP 响应,告诉浏览器重定向(301、302 或 307)。虽然这样的响应可以包含 body,但它通常只是浏览器不会自动重定向的后备。标准的现代浏览器永远不会呈现此内容,因为一旦它看到状态代码,它就会向响应的 Location
header 中给出的 URL 发送一个新请求,并显示从那里到用户的内容而不是。
一旦用户被重定向,重定向之前就没有上下文遗留下来。浏览器请求了一个新的 URL,您的应用程序将收到该新请求并对其进行处理,而无法查看之前发生的情况。不会有全局变量、视图或任何其他在重定向之前遗留下来的东西。唯一保留的信息将是您明确保存到 cookie 或 session(由 cookie 引用)的内容。
所有这一切的最终结果是您不能在同一段代码中既显示带有视图的内容又发出 HTTP 重定向。