search_api-8.x-1.15/src/ParamConverter/SearchApiConverter.php
src/ParamConverter/SearchApiConverter.php
<?php namespace Drupal\search_api\ParamConverter; use Drupal\Core\Config\Entity\ConfigEntityStorageInterface; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\ParamConverter\EntityConverter; use Drupal\Core\ParamConverter\ParamConverterInterface; use Drupal\Core\Session\AccountInterface; use Drupal\search_api\UnsavedIndexConfiguration; use Drupal\Core\TempStore\SharedTempStoreFactory; use Symfony\Component\Routing\Route; /** * Converts search indexes from path parameters to a temporary copy. * * This is done so that certain pages (like the "Fields" tab) can modify indexes * over several page requests without permanently saving the index in between. * * The code for this is largely taken from the views_ui module. */ class SearchApiConverter extends EntityConverter implements ParamConverterInterface { /** * The shared temporary storage factory. * * @var \Drupal\Core\TempStore\SharedTempStoreFactory */ protected $tempStoreFactory; /** * The currently logged-in user. * * @var \Drupal\Core\Session\AccountInterface */ protected $currentUser; /** * Constructs a new SearchApiConverter. * * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager * The entity manager. * @param \Drupal\Core\TempStore\SharedTempStoreFactory $temp_store_factory * The factory for the temp store object. * @param \Drupal\Core\Session\AccountInterface $user * The current user. */ public function __construct(EntityManagerInterface $entity_manager, SharedTempStoreFactory $temp_store_factory, AccountInterface $user) { parent::__construct($entity_manager); $this->tempStoreFactory = $temp_store_factory; $this->currentUser = $user; } /** * {@inheritdoc} */ public function convert($value, $definition, $name, array $defaults) { /** @var \Drupal\search_api\IndexInterface $entity */ $storage = $this->entityManager->getStorage('search_api_index'); if (!($storage instanceof ConfigEntityStorageInterface)) { return NULL; } if (!($entity = $storage->loadOverrideFree($value))) { return NULL; } // Get the temp store for this variable if it needs one. Attempt to load the // index from the temp store, update the currently logged-in user's ID and // store the lock metadata. $store = $this->tempStoreFactory->get('search_api_index'); $current_user_id = $this->currentUser->id() ?: session_id(); /** @var \Drupal\search_api\IndexInterface|\Drupal\search_api\UnsavedIndexConfiguration $index */ if ($index = $store->get($value)) { $index = new UnsavedIndexConfiguration($index, $store, $current_user_id); $index->setLockInformation($store->getMetadata($value)); $index->setEntityTypeManager($this->entityManager); } // Otherwise, create a new temporary copy of the search index. else { $index = new UnsavedIndexConfiguration($entity, $store, $current_user_id); } return $index; } /** * {@inheritdoc} */ public function applies($definition, $name, Route $route) { if (parent::applies($definition, $name, $route)) { return !empty($definition['tempstore']) && $definition['type'] === 'entity:search_api_index'; } return FALSE; } }