Symfony/Http-foundation组件是如何处理Http请求和响应的
How does the Symfony/Http-foundation component handles Http request and response
我被分配到一个项目,该项目需要包含 Symfony 组件以重新组织其业务逻辑。但是,我在查看 Symfony HTTP 基础文档时感到困惑。希望这里有人能帮我解释一下这个组件如何处理用户的 Http 请求和响应。
基本上,我在项目中所做的是:
有一个 PHP 页面使用请求的 URL 和方法
创建请求对象
使用 ApiRouter 将代码定向到所需的控制器
在控制器中,它会将 HTTP 请求发送到服务器并根据请求 URL 将响应转换为 Symfony Response 对象。
location.php
class GetLocation
{
public function __construct($q)
{
$request = Request::create('location?v=full&q=' .
urlencode($q), 'GET'); //simulates a request using the url
$rest_api = new RestApi(); //passing the request to api router
$rest_api->apiRouter($request);
}
}
ApiRouter.php
//location router
$location_route = new Route(
'/location',
['controller' => 'LocationController']
);
$api_routes->add('location_route', $location_route);
//Init RequestContext object
$context = new RequestContext();
//generate the context from user passed $request
$context->fromRequest($request);
// Init UrlMatcher object matches the url path with router
// Find the current route and returns an array of attributes
$matcher = new UrlMatcher($api_routes, $context);
try {
$parameters = $matcher->match($request->getPathInfo());
extract($parameters, EXTR_SKIP);
ob_start();
$response = new Response(ob_get_clean());
} catch (ResourceNotFoundException $exception) {
$response = new Response('Not Found', 404);
} catch (Exception $exception) {
$response = new Response('An error occurred', 500);
}
我想知道的是我的理解对不对?还有方法Request:createFromGlobal是什么意思,这个和Request:create(URL)
有什么区别
如果我的问题需要更具体,请告诉我。
首先你的问题比较简单:
Request::createFromGlobals()
将根据一些 PHP 全局变量创建请求,例如$_SERVER
、$_GET
和 $_POST
,这意味着它将根据我们 "in" 的当前请求创建一个请求,即触发我们应用程序的用户请求。另一方面,Request::create()
将在不应用此上下文的情况下构建一个 "new" 请求,这意味着您必须传递某些信息,例如路径和 HTTP-method 您自己。
现在关于您的代码及其是否有效。简短的回答是,可能不会。在 GetLocation 中,您创建一个新请求和一个新路由器,并在控制器内部创建一个路由,然后将其添加到路由器。这意味着除非在 GetLocation 之前执行控制器代码,否则路由在路由器中不可用,这意味着永远不会调用控制器。
您可能想查看以下系列:Create your own PHP Framework inside the symfony docs, especially the parts from The HttpFoundation Component 之后。希望这会为您解决问题。
我被分配到一个项目,该项目需要包含 Symfony 组件以重新组织其业务逻辑。但是,我在查看 Symfony HTTP 基础文档时感到困惑。希望这里有人能帮我解释一下这个组件如何处理用户的 Http 请求和响应。
基本上,我在项目中所做的是:
有一个 PHP 页面使用请求的 URL 和方法
创建请求对象
使用 ApiRouter 将代码定向到所需的控制器
在控制器中,它会将 HTTP 请求发送到服务器并根据请求 URL 将响应转换为 Symfony Response 对象。
location.php
class GetLocation
{
public function __construct($q)
{
$request = Request::create('location?v=full&q=' .
urlencode($q), 'GET'); //simulates a request using the url
$rest_api = new RestApi(); //passing the request to api router
$rest_api->apiRouter($request);
}
}
ApiRouter.php
//location router
$location_route = new Route(
'/location',
['controller' => 'LocationController']
);
$api_routes->add('location_route', $location_route);
//Init RequestContext object
$context = new RequestContext();
//generate the context from user passed $request
$context->fromRequest($request);
// Init UrlMatcher object matches the url path with router
// Find the current route and returns an array of attributes
$matcher = new UrlMatcher($api_routes, $context);
try {
$parameters = $matcher->match($request->getPathInfo());
extract($parameters, EXTR_SKIP);
ob_start();
$response = new Response(ob_get_clean());
} catch (ResourceNotFoundException $exception) {
$response = new Response('Not Found', 404);
} catch (Exception $exception) {
$response = new Response('An error occurred', 500);
}
我想知道的是我的理解对不对?还有方法Request:createFromGlobal是什么意思,这个和Request:create(URL)
有什么区别如果我的问题需要更具体,请告诉我。
首先你的问题比较简单:
Request::createFromGlobals()
将根据一些 PHP 全局变量创建请求,例如$_SERVER
、$_GET
和 $_POST
,这意味着它将根据我们 "in" 的当前请求创建一个请求,即触发我们应用程序的用户请求。另一方面,Request::create()
将在不应用此上下文的情况下构建一个 "new" 请求,这意味着您必须传递某些信息,例如路径和 HTTP-method 您自己。
现在关于您的代码及其是否有效。简短的回答是,可能不会。在 GetLocation 中,您创建一个新请求和一个新路由器,并在控制器内部创建一个路由,然后将其添加到路由器。这意味着除非在 GetLocation 之前执行控制器代码,否则路由在路由器中不可用,这意味着永远不会调用控制器。
您可能想查看以下系列:Create your own PHP Framework inside the symfony docs, especially the parts from The HttpFoundation Component 之后。希望这会为您解决问题。