AliasStorage::save

public AliasStorage::save($source, $alias, $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED, $pid = NULL)

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 56

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)) {
    $try_again = FALSE;
    try {
      $query = $this->connection->insert(static::TABLE)
        ->fields($fields);
      $pid = $query->execute();
    }
    catch (\Exception $e) {
      // If there was an exception, try to create the table.
      if (!$try_again = $this->ensureTableExists()) {
        // If the exception happened for other reason than the missing table,
        // propagate the exception.
        throw $e;
      }
    }
    // Now that the table has been created, try again if necessary.
    if ($try_again) {
      $query = $this->connection->insert(static::TABLE)
        ->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.
    try {
      $original = $this->connection->query('SELECT source, alias, langcode FROM {url_alias} WHERE pid = :pid', array(':pid' => $pid))
        ->fetchAssoc();
    }
    catch (\Exception $e) {
      $this->catchException($e);
      $original = FALSE;
    }
    $fields['pid'] = $pid;
    $query = $this->connection->update(static::TABLE)
      ->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;
}
doc_Drupal
2016-10-29 08:44:15
Comments
Leave a Comment

Please login to continue.