Update to drupal 8.0.0-rc1. For more information, see https://www.drupal.org/node/2582663
This commit is contained in:
parent
eb34d130a8
commit
f32e58e4b1
8476 changed files with 211648 additions and 170042 deletions
|
@ -35,8 +35,9 @@ trait LinkGeneratorTrait {
|
|||
* @see \Drupal\Core\Utility\LinkGeneratorInterface::generate() for details
|
||||
* on the arguments, usage, and possible exceptions.
|
||||
*
|
||||
* @return string
|
||||
* An HTML string containing a link to the given route and parameters.
|
||||
* @return \Drupal\Core\GeneratedLink
|
||||
* A GeneratedLink object containing a link to the given route and
|
||||
* parameters and bubbleable metadata.
|
||||
*/
|
||||
protected function l($text, Url $url) {
|
||||
return $this->getLinkGenerator()->generate($text, $url);
|
||||
|
|
|
@ -19,6 +19,8 @@ namespace Drupal\Core\Routing;
|
|||
* The route match object contains useful information about the selected route
|
||||
* as well as the raw and upcast parameters derived from the incoming
|
||||
* request.
|
||||
*
|
||||
* @ingroup routing
|
||||
*/
|
||||
interface RouteMatchInterface {
|
||||
|
||||
|
|
|
@ -369,116 +369,6 @@ class UrlGenerator implements UrlGeneratorInterface {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function generateFromPath($path = NULL, $options = array(), $collect_bubbleable_metadata = FALSE) {
|
||||
$generated_url = $collect_bubbleable_metadata ? new GeneratedUrl() : NULL;
|
||||
|
||||
$request = $this->requestStack->getCurrentRequest();
|
||||
$current_base_path = $request->getBasePath() . '/';
|
||||
$current_base_url = $request->getSchemeAndHttpHost() . $current_base_path;
|
||||
$current_script_path = '';
|
||||
$base_path_with_script = $request->getBaseUrl();
|
||||
if (!empty($base_path_with_script)) {
|
||||
$script_name = $request->getScriptName();
|
||||
if (strpos($base_path_with_script, $script_name) !== FALSE) {
|
||||
$current_script_path = ltrim(substr($script_name, strlen($current_base_path)), '/') . '/';
|
||||
}
|
||||
}
|
||||
|
||||
// Merge in defaults.
|
||||
$options += array(
|
||||
'fragment' => '',
|
||||
'query' => array(),
|
||||
'absolute' => FALSE,
|
||||
'prefix' => '',
|
||||
);
|
||||
|
||||
// A duplicate of the code from
|
||||
// \Drupal\Component\Utility\UrlHelper::isExternal() to avoid needing
|
||||
// another function call, since performance inside url() is critical.
|
||||
if (!isset($options['external'])) {
|
||||
$colonpos = strpos($path, ':');
|
||||
// Avoid calling drupal_strip_dangerous_protocols() if there is any slash
|
||||
// (/), hash (#) or question_mark (?) before the colon (:) occurrence -
|
||||
// if any - as this would clearly mean it is not a URL. If the path starts
|
||||
// with 2 slashes then it is always considered an external URL without an
|
||||
// explicit protocol part.
|
||||
$options['external'] = (strpos($path, '//') === 0)
|
||||
|| ($colonpos !== FALSE
|
||||
&& !preg_match('![/?#]!', substr($path, 0, $colonpos))
|
||||
&& UrlHelper::stripDangerousProtocols($path) == $path);
|
||||
}
|
||||
|
||||
if (isset($options['fragment']) && $options['fragment'] !== '') {
|
||||
$options['fragment'] = '#' . $options['fragment'];
|
||||
}
|
||||
|
||||
if ($options['external']) {
|
||||
// Split off the fragment.
|
||||
if (strpos($path, '#') !== FALSE) {
|
||||
list($path, $old_fragment) = explode('#', $path, 2);
|
||||
// If $options contains no fragment, take it over from the path.
|
||||
if (isset($old_fragment) && !$options['fragment']) {
|
||||
$options['fragment'] = '#' . $old_fragment;
|
||||
}
|
||||
}
|
||||
// Append the query.
|
||||
if ($options['query']) {
|
||||
$path .= (strpos($path, '?') !== FALSE ? '&' : '?') . UrlHelper::buildQuery($options['query']);
|
||||
}
|
||||
if (isset($options['https'])) {
|
||||
if ($options['https'] === TRUE) {
|
||||
$path = str_replace('http://', 'https://', $path);
|
||||
}
|
||||
elseif ($options['https'] === FALSE) {
|
||||
$path = str_replace('https://', 'http://', $path);
|
||||
}
|
||||
}
|
||||
// Reassemble.
|
||||
$url = $path . $options['fragment'];
|
||||
return $collect_bubbleable_metadata ? $generated_url->setGeneratedUrl($url) : $url;
|
||||
}
|
||||
else {
|
||||
$path = ltrim($this->processPath('/' . $path, $options, $generated_url), '/');
|
||||
}
|
||||
|
||||
if (!isset($options['script'])) {
|
||||
$options['script'] = $current_script_path;
|
||||
}
|
||||
// The base_url might be rewritten from the language rewrite in domain mode.
|
||||
if (!isset($options['base_url'])) {
|
||||
if (isset($options['https'])) {
|
||||
if ($options['https'] === TRUE) {
|
||||
$options['base_url'] = str_replace('http://', 'https://', $current_base_url);
|
||||
$options['absolute'] = TRUE;
|
||||
}
|
||||
elseif ($options['https'] === FALSE) {
|
||||
$options['base_url'] = str_replace('https://', 'http://', $current_base_url);
|
||||
$options['absolute'] = TRUE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$options['base_url'] = $current_base_url;
|
||||
}
|
||||
}
|
||||
elseif (rtrim($options['base_url'], '/') == $options['base_url']) {
|
||||
$options['base_url'] .= '/';
|
||||
}
|
||||
$base = $options['absolute'] ? $options['base_url'] : $current_base_path;
|
||||
$prefix = empty($path) ? rtrim($options['prefix'], '/') : $options['prefix'];
|
||||
|
||||
if ($options['absolute'] && $collect_bubbleable_metadata) {
|
||||
$generated_url->addCacheContexts(['url.site']);
|
||||
}
|
||||
|
||||
$path = str_replace('%2F', '/', rawurlencode($prefix . $path));
|
||||
$query = $options['query'] ? ('?' . UrlHelper::buildQuery($options['query'])) : '';
|
||||
$url = $base . $options['script'] . $path . $query . $options['fragment'];
|
||||
return $collect_bubbleable_metadata ? $generated_url->setGeneratedUrl($url) : $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Passes the path to a processor manager to allow alterations.
|
||||
*/
|
||||
|
|
|
@ -16,84 +16,6 @@ use Symfony\Cmf\Component\Routing\VersatileGeneratorInterface;
|
|||
*/
|
||||
interface UrlGeneratorInterface extends VersatileGeneratorInterface {
|
||||
|
||||
/**
|
||||
* Generates an internal or external URL.
|
||||
*
|
||||
* @param string $path
|
||||
* (optional) The internal path or external URL being linked to, such as
|
||||
* "node/34" or "http://example.com/foo". The default value is equivalent to
|
||||
* passing in '<front>'. A few notes:
|
||||
* - If you provide a full URL, it will be considered an external URL.
|
||||
* - If you provide only the path (e.g. "node/34"), it will be
|
||||
* considered an internal link. In this case, it should be a system URL,
|
||||
* and it will be replaced with the alias, if one exists. Additional query
|
||||
* arguments for internal paths must be supplied in $options['query'], not
|
||||
* included in $path.
|
||||
* - If you provide an internal path and $options['alias'] is set to TRUE, the
|
||||
* path is assumed already to be the correct path alias, and the alias is
|
||||
* not looked up.
|
||||
* - The special string '<front>' generates a link to the site's base URL.
|
||||
* - If your external URL contains a query (e.g. http://example.com/foo?a=b),
|
||||
* then you can either URL encode the query keys and values yourself and
|
||||
* include them in $path, or use $options['query'] to let this method
|
||||
* URL encode them.
|
||||
*
|
||||
* @param array $options
|
||||
* (optional) An associative array of additional options, with the following
|
||||
* elements:
|
||||
* - 'query': An array of query key/value-pairs (without any URL-encoding) to
|
||||
* append to the URL.
|
||||
* - 'fragment': A fragment identifier (named anchor) to append to the URL.
|
||||
* Do not include the leading '#' character.
|
||||
* - 'absolute': Defaults to FALSE. Whether to force the output to be an
|
||||
* absolute link (beginning with http:). Useful for links that will be
|
||||
* displayed outside the site, such as in an RSS feed.
|
||||
* - 'alias': Defaults to FALSE. Whether the given path is a URL alias
|
||||
* already.
|
||||
* - 'external': Whether the given path is an external URL.
|
||||
* - 'language': An optional language object. If the path being linked to is
|
||||
* internal to the site, $options['language'] is used to look up the alias
|
||||
* for the URL. If $options['language'] is omitted, the language will be
|
||||
* obtained from
|
||||
* \Drupal::languageManager()->getCurrentLanguage(LanguageInterface::TYPE_URL).
|
||||
* - 'https': Whether this URL should point to a secure location. If not
|
||||
* defined, the current scheme is used, so the user stays on HTTP or HTTPS
|
||||
* respectively. TRUE enforces HTTPS and FALSE enforces HTTP.
|
||||
* - 'base_url': Only used internally by a path processor, for example, to
|
||||
* modify the base URL when a language dependent URL requires so.
|
||||
* - 'prefix': Only used internally, to modify the path when a language
|
||||
* dependent URL requires so.
|
||||
* - 'script': Added to the URL between the base path and the path prefix.
|
||||
* Defaults to empty string when clean URLs are in effect, and to
|
||||
* 'index.php/' when they are not.
|
||||
* - 'entity_type': The entity type of the object that called _url(). Only
|
||||
* set if _url() is invoked by Drupal\Core\Entity\Entity::uri().
|
||||
* - 'entity': The entity object (such as a node) for which the URL is being
|
||||
* generated. Only set if _url() is invoked by Drupal\Core\Entity\Entity::uri().
|
||||
* @param bool $collect_bubbleable_metadata
|
||||
* (optional) Defaults to FALSE. When TRUE, both the generated URL and its
|
||||
* associated bubbleable metadata are returned.
|
||||
*
|
||||
* @return string|\Drupal\Core\GeneratedUrl
|
||||
* A string containing a URL to the given path.
|
||||
* When $collect_bubbleable_metadata is TRUE, a GeneratedUrl object is
|
||||
* returned, containing the generated URL plus bubbleable metadata.
|
||||
*
|
||||
* @throws \Drupal\Core\Routing\GeneratorNotInitializedException.
|
||||
*
|
||||
* @deprecated in Drupal 8.0.x-dev and will be removed before Drupal 8.0.0.
|
||||
* To generate URLs for Drupal routes (that is, most pages generated by
|
||||
* Drupal), see UrlGeneratorInterface::generateFromRoute() instead. For
|
||||
* non-routed local URIs relative to the base path (like robots.txt) see
|
||||
* \Drupal\Core\Utility\UnroutedUrlAssembler.
|
||||
*
|
||||
* @see static::generateFromRoute()
|
||||
* @see \Drupal\Core\Utility\UnroutedUrlAssembler
|
||||
* @see \Drupal\Core\Url
|
||||
* @see \Drupal\Core\GeneratedUrl
|
||||
*/
|
||||
public function generateFromPath($path = NULL, $options = array(), $collect_bubbleable_metadata = FALSE);
|
||||
|
||||
/**
|
||||
* Gets the internal path (system path) of a route.
|
||||
*
|
||||
|
|
135
core/lib/Drupal/Core/Routing/routing.api.php
Normal file
135
core/lib/Drupal/Core/Routing/routing.api.php
Normal file
|
@ -0,0 +1,135 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Hooks and documentation related to the routing system.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup routing Routing API
|
||||
* @{
|
||||
* Route page requests to code based on URLs.
|
||||
*
|
||||
* @section sec_overview Overview and terminology
|
||||
* The Drupal routing system defines how Drupal responds to URL requests that
|
||||
* the web server passes on to Drupal. The routing system is based on the
|
||||
* @link http://symfony.com Symfony framework. @endlink The central idea is
|
||||
* that Drupal subsystems and modules can register routes (basically, URL
|
||||
* paths and context); they can also register to respond dynamically to
|
||||
* routes, for more flexibility. When Drupal receives a URL request, it will
|
||||
* attempt to match the request to a registered route, and query dynamic
|
||||
* responders. If a match is made, Drupal will then instantiate the required
|
||||
* classes, gather the data, format it, and send it back to the web browser.
|
||||
* Otherwise, Drupal will return a 404 or 403 response.
|
||||
*
|
||||
* The following sections of this topic provide an overview of the routing API.
|
||||
* For more detailed information, see
|
||||
* https://www.drupal.org/developing/api/8/routing
|
||||
*
|
||||
* @section sec_register Registering simple routes
|
||||
* To register a route, add lines similar to this to a module_name.routing.yml
|
||||
* file in your top-level module directory:
|
||||
* @code
|
||||
* dblog.overview:
|
||||
* path: '/admin/reports/dblog'
|
||||
* defaults:
|
||||
* _controller: '\Drupal\dblog\Controller\DbLogController::overview'
|
||||
* _title: 'Recent log messages'
|
||||
* requirements:
|
||||
* _permission: 'access site reports'
|
||||
* @endcode
|
||||
* Some notes:
|
||||
* - The first line is the machine name of the route. Typically, it is prefixed
|
||||
* by the machine name of the module that defines the route, or the name of
|
||||
* a subsystem.
|
||||
* - The 'path' line gives the URL path of the route (relative to the site's
|
||||
* base URL).
|
||||
* - The 'defaults' section tells how to build the main content of the route,
|
||||
* and can also give other information, such as the page title and additional
|
||||
* arguments for the route controller method. There are several possibilities
|
||||
* for how to build the main content, including:
|
||||
* - _controller: A callable, usually a method on a page controller class
|
||||
* (see @ref sec_controller below for details).
|
||||
* - _form: A form controller class. See the
|
||||
* @link form_api Form API topic @endlink for more information about
|
||||
* form controllers.
|
||||
* - _entity_form: A form for editing an entity. See the
|
||||
* @link entity_api Entity API topic @endlink for more information.
|
||||
* - The 'requirements' section is used in Drupal to give access permission
|
||||
* instructions (it has other uses in the Symfony framework). Most
|
||||
* routes have a simple permission-based access scheme, as shown in this
|
||||
* example. See the @link user_api Permission system topic @endlink for
|
||||
* more information about permissions.
|
||||
*
|
||||
* See https://www.drupal.org/node/2092643 for more details about *.routing.yml
|
||||
* files, and https://www.drupal.org/node/2122201 for information on how to
|
||||
* set up dynamic routes. The @link events Events topic @endlink is also
|
||||
* relevant to dynamic routes.
|
||||
*
|
||||
* @section sec_placeholders Defining routes with placeholders
|
||||
* Some routes have placeholders in them, and these can also be defined in a
|
||||
* module_name.routing.yml file, as in this example from the Block module:
|
||||
* @code
|
||||
* entity.block.edit_form:
|
||||
* path: '/admin/structure/block/manage/{block}'
|
||||
* defaults:
|
||||
* _entity_form: 'block.default'
|
||||
* _title: 'Configure block'
|
||||
* requirements:
|
||||
* _entity_access: 'block.update'
|
||||
* @endcode
|
||||
* In the path, '{block}' is a placeholder - it will be replaced by the
|
||||
* ID of the block that is being configured by the entity system. See the
|
||||
* @link entity_api Entity API topic @endlink for more information.
|
||||
*
|
||||
* @section sec_controller Route controllers for simple routes
|
||||
* For simple routes, after you have defined the route in a *.routing.yml file
|
||||
* (see @ref sec_register above), the next step is to define a page controller
|
||||
* class and method. Page controller classes do not necessarily need to
|
||||
* implement any particular interface or extend any particular base class. The
|
||||
* only requirement is that the method specified in your *.routing.yml file
|
||||
* returns:
|
||||
* - A render array (see the
|
||||
* @link theme_render Theme and render topic @endlink for more information).
|
||||
* This render array is then rendered in the requested format (HTML, dialog,
|
||||
* modal, AJAX are supported by default). In the case of HTML, it will be
|
||||
* surrounded by blocks by default: the Block module is enabled by default,
|
||||
* and hence its Page Display Variant that surrounds the main content with
|
||||
* blocks is also used by default.
|
||||
* - A \Symfony\Component\HttpFoundation\Response object.
|
||||
* As a note, if your module registers multiple simple routes, it is usual
|
||||
* (and usually easiest) to put all of their methods on one controller class.
|
||||
*
|
||||
* If the route has placeholders (see @ref sec_placeholders above) the
|
||||
* placeholders will be passed to the method (using reflection) by name.
|
||||
* For example, the placeholder '{myvar}' in a route will become the $myvar
|
||||
* parameter to the method.
|
||||
*
|
||||
* Additionally, if a parameter is typed to one of the following special classes
|
||||
* the system will pass those values as well.
|
||||
*
|
||||
* - \Symfony\Component\HttpFoundation\Request: The raw Symfony request object.
|
||||
* It is generally only useful if the controller needs access to the query
|
||||
* parameters of the request. By convention, this parameter is usually named
|
||||
* $request.
|
||||
* - \Psr\Http\Message\ServerRequestInterface: The raw request, represented
|
||||
* using the PSR-7 ServerRequest format. This object is derived as necessary
|
||||
* from the Symfony request, so if either will suffice the Symfony request
|
||||
* will be slightly more performant. By convention this parameter is usually
|
||||
* named $request.
|
||||
* - \Drupal\Core\Routing\RouteMatchInterface: The "route match" data from
|
||||
* this request. This object contains various standard data derived from
|
||||
* the request and routing process. Consult the interface for details.
|
||||
*
|
||||
* Most controllers will need to display some information stored in the Drupal
|
||||
* database, which will involve using one or more Drupal services (see the
|
||||
* @link container Services and container topic @endlink). In order to properly
|
||||
* inject services, a controller should implement
|
||||
* \Drupal\Core\DependencyInjection\ContainerInjectionInterface; simple
|
||||
* controllers can do this by extending the
|
||||
* \Drupal\Core\Controller\ControllerBase class. See
|
||||
* \Drupal\dblog\Controller\DbLogController for a straightforward example of
|
||||
* a controller class.
|
||||
*
|
||||
* @}
|
||||
*/
|
Reference in a new issue