The Story of one brave user's Request
Request
Response
http_foundation
http_kernel
flow process
flow objects
Drupal core
Bootstrap +
GET /search?s=Drupal+8 HTTP/1.1
Host: dru.io
User-Agent: Mozilla/5.0 (Macintosh)
Accept: text/html,application/xhtml+xml
Referer: http://dru.io/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
...$_SERVER['HTTP_ACCEPT']
$_SERVER['HTTP_HOST']
$_SERVER['HTTP_REFERER']
$_SERVER['REMOTE_ADDR']
$_SERVER['REMOTE_HOST']
$_SERVER['REMOTE_PORT']
$_SERVER['SCRIPT_URI']
$_REQUEST['...']
$_POST['...']
$_GET['...']
...$request = Request::createFromGlobals();
\Symfony\Component\HttpFoundation\Request {
...
public function initialize(...) {
$this->request = new ParameterBag($request);
$this->query = new ParameterBag($query);
$this->attributes = new ParameterBag($attributes);
$this->cookies = new ParameterBag($cookies);
$this->files = new FileBag($files);
$this->server = new ServerBag($server);
$this->headers = new HeaderBag(
$this->server->getHeaders()
);
...
}
...
}
$request->get('host');
$request->getHost();In HTTP
In PHP
In Symfony
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 06 Feb 2018 15:21:49 GMT
Content-Type: text/html; charset=utf-8
Keep-Alive: timeout=60
X-Drupal-Cache: HIT
Content-Encoding: gzip
Transfer-Encoding: chunked
...
<!DOCTYPE html>
...public function send() {
$this->sendHeaders();
$this->sendContent();
...
}HTTP/1.1 200 OK
Cache-Control: must-revalidate, no-cache, private
Content-Encoding: gzip
Content-Language: en
Content-Type: application/json
Vary: Accept-Encoding
X-Drupal-Ajax-Token: 1
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
Content-Length: 1822
...
{"command":"settings","settings":{"ajaxPageState"...
...AjaxResponse
HtmlResponse
http_kernel
flow process
collect
execute
defines how requests are handled within your application.
Route definition:
urls are case insensitive, ~8.3 https://www.drupal.org/node/2852554
/hc/issue/{issue_id}/edit\Drupal\hc_issue\Form\IssueEditForm
/admin/content
/node/add/{node_type}, /node/add/{node}
/file/progress/{key}
route_callbacks:
- 'views.route_subscriber:routes'core/modules/node/node.routing.ymlhc_issue.view:
path: '/hc/issue/{issue_id}'
defaults:
_controller: '\Drupal\hc_issue\Controller\IssueController::view'
_title: 'View'
requirements:
_permission: 'access content'
Drupal\Core\EventSubscriber\EntityRouteProviderSubscribercore/modules/views/views.routing.ymlDrupal\Core\EventSubscriber\EntityRouteProviderSubscriberYML
CLASS
define
alter
/var/www/html$ drupal dev kernel.request
---------------------------------------------------------------------- -----------------------------------
Class Method
---------------------------------------------------------------------- -----------------------------------
Drupal\Core\EventSubscriber\OptionsRequestSubscriber onRequest: 1000
Drupal\Core\EventSubscriber\RedirectLeadingSlashesSubscriber redirect: 1000
Drupal\Core\EventSubscriber\AuthenticationSubscriber onKernelRequestAuthenticate: 300
Drupal\devel\EventSubscriber\ErrorHandlerSubscriber registerErrorHandler: 256
Drupal\devel\EventSubscriber\ThemeInfoRebuildSubscriber rebuildThemeInfo: 256
Drupal\Core\EventSubscriber\RedirectResponseSubscriber sanitizeDestination: 100
Drupal\Core\EventSubscriber\AjaxResponseSubscriber onRequest: 50
Symfony\Component\HttpKernel\EventListener\RouterListener onKernelRequest: 32
Drupal\Core\EventSubscriber\AuthenticationSubscriber onKernelRequestFilterProvider: 31
Drupal\user\EventSubscriber\MaintenanceModeSubscriber onKernelRequestMaintenance: 31
Drupal\Core\EventSubscriber\MaintenanceModeSubscriber onKernelRequestMaintenance: 30
Drupal\dynamic_page_cache\EventSubscriber\DynamicPageCacheSubscriber onRouteMatch: 27
Drupal\Core\Routing\RoutePreloader onRequest: 0
Drupal\Core\EventSubscriber\ReplicaDatabaseIgnoreSubscriber checkReplicaServer: 0
---------------------------------------------------------------------- -----------------------------------use Symfony\Component\HttpKernel\HttpKernel as SymfonyKernelMiddleware;
SymfonyKernelMiddleware::handleRaw(Request $request, $type = self::MASTER_REQUEST) {
...
$event = new GetResponseEvent($this, $request, $type);
$this->dispatcher->dispatch(KernelEvents::REQUEST, $event);
...
// load controller
$controller = $this->resolver->getController($request)
...
$event = new FilterControllerEvent($this, $controller, $request, $type);
$this->dispatcher->dispatch(KernelEvents::CONTROLLER, $event);
$controller = $event->getController();
// controller arguments
$arguments = $this->argumentResolver->getArguments($request, $controller);
$event = new FilterControllerArgumentsEvent($this, $controller, $arguments, $request, $type);
$this->dispatcher->dispatch(KernelEvents::CONTROLLER_ARGUMENTS, $event);
$controller = $event->getController();
$arguments = $event->getArguments();
// call controller
$response = call_user_func_array($controller, $arguments);
...
}Routing
Founder @
Co- Founder @
Vladyslav Moyseenko, a.k.a vlad.dancer
&