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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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
2025-01-10 15:47:30
Comments
Leave a Comment

Please login to continue.