You are here

public function AliasStorage::save in Zircon Profile 8.0

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Path/AliasStorage.php \Drupal\Core\Path\AliasStorage::save()

Saves a path alias to the database.

@thrown \InvalidArgumentException Thrown when either the source or alias has not a starting slash.

Parameters

string $source: The internal system path.

string $alias: The URL alias.

string $langcode: (optional) The language code of the alias.

int|null $pid: (optional) Unique path alias identifier.

Return value

array|false FALSE if the path could not be saved or an associative array containing the following keys:

  • source (string): The internal system path with a starting slash.
  • alias (string): The URL alias with a starting slash.
  • pid (int): Unique path alias identifier.
  • langcode (string): The language code of the alias.
  • original: For updates, an array with source, alias and langcode with the previous values.

Overrides AliasStorageInterface::save

File

core/lib/Drupal/Core/Path/AliasStorage.php, line 55
Contains \Drupal\Core\Path\AliasStorage.

Class

AliasStorage
Provides a class for CRUD operations on path aliases.

Namespace

Drupal\Core\Path

Code

public function save($source, $alias, $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED, $pid = NULL) {
  if ($source[0] !== '/') {
    throw new \InvalidArgumentException(sprintf('Source path %s has to start with a slash.', $source));
  }
  if ($alias[0] !== '/') {
    throw new \InvalidArgumentException(sprintf('Alias path %s has to start with a slash.', $alias));
  }
  $fields = array(
    'source' => $source,
    'alias' => $alias,
    'langcode' => $langcode,
  );

  // Insert or update the alias.
  if (empty($pid)) {
    $query = $this->connection
      ->insert('url_alias')
      ->fields($fields);
    $pid = $query
      ->execute();
    $fields['pid'] = $pid;
    $operation = 'insert';
  }
  else {

    // Fetch the current values so that an update hook can identify what
    // exactly changed.
    $original = $this->connection
      ->query('SELECT source, alias, langcode FROM {url_alias} WHERE pid = :pid', array(
      ':pid' => $pid,
    ))
      ->fetchAssoc();
    $fields['pid'] = $pid;
    $query = $this->connection
      ->update('url_alias')
      ->fields($fields)
      ->condition('pid', $pid);
    $pid = $query
      ->execute();
    $fields['original'] = $original;
    $operation = 'update';
  }
  if ($pid) {

    // @todo Switch to using an event for this instead of a hook.
    $this->moduleHandler
      ->invokeAll('path_' . $operation, array(
      $fields,
    ));
    Cache::invalidateTags([
      'route_match',
    ]);
    return $fields;
  }
  return FALSE;
}