Issue #2922487 by Wim Leers, Jo Fitzgerald, Berdir, tedbow, borisson_, dawehner, alexpott: Follow-up for #2910211: fix all deprecation warnings

8.7.x
Alex Pott 2018-09-20 15:47:52 +01:00
parent 887e1dcd24
commit 68c0fd81dc
No known key found for this signature in database
GPG Key ID: 31905460D4A69276
5 changed files with 48 additions and 8 deletions

View File

@ -179,17 +179,25 @@ class ContentEntityNormalizer extends NormalizerBase {
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* The entity.
* @param array $context
* Normalization/serialization context.
*
* @return string
* The entity URI.
*/
protected function getEntityUri(EntityInterface $entity) {
protected function getEntityUri(EntityInterface $entity, array $context = []) {
// Some entity types don't provide a canonical link template, at least call
// out to ->url().
if ($entity->isNew() || !$entity->hasLinkTemplate('canonical')) {
return $entity->url('canonical', []);
}
$url = $entity->urlInfo('canonical', ['absolute' => TRUE]);
return $url->setRouteParameter('_format', 'hal_json')->toString();
$url = $entity->toUrl('canonical', ['absolute' => TRUE]);
if (!$url->isExternal()) {
$url->setRouteParameter('_format', 'hal_json');
}
$generated_url = $url->toString(TRUE);
$this->addCacheableDependency($context, $generated_url);
return $generated_url->getGeneratedUrl();
}
/**

View File

@ -3,8 +3,10 @@
namespace Drupal\hal\Normalizer;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\file\FileInterface;
use Drupal\hal\LinkManager\LinkManagerInterface;
/**
@ -69,4 +71,19 @@ class FileEntityNormalizer extends ContentEntityNormalizer {
return $data;
}
/**
* {@inheritdoc}
*/
protected function getEntityUri(EntityInterface $entity, array $context = []) {
assert($entity instanceof FileInterface);
// https://www.drupal.org/project/drupal/issues/2277705 introduced a hack
// in \Drupal\file\Entity\File::url(), but EntityInterface::url() was
// deprecated in favor of ::toUrl(). The parent implementation now calls
// ::toUrl(), but this normalizer (for File entities) needs to override that
// back to the old behavior because it relies on said hack, not just to
// generate the value for the 'uri' field of a file (see ::normalize()), but
// also for the HAL normalization's '_links' value.
return file_create_url($entity->getFileUri());
}
}

View File

@ -55,8 +55,14 @@ class EntityReferenceFieldItemNormalizer extends FieldItemNormalizer {
// Add a 'url' value if there is a reference and a canonical URL. Hard
// code 'canonical' here as config entities override the default $rel
// parameter value to 'edit-form.
if ($url = $entity->url('canonical')) {
$values['url'] = $url;
if ($entity->hasLinkTemplate('canonical') && $url = $entity->toUrl('canonical')->toString(TRUE)) {
$this->addCacheableDependency($context, $url);
$values['url'] = $url->getGeneratedUrl();
}
// @todo Remove in https://www.drupal.org/project/drupal/issues/2925520
// @see \Drupal\hal\Normalizer\FileEntityNormalizer
elseif ($entity->getEntityTypeId() === 'file') {
$values['url'] = file_create_url($entity->getFileUri());
}
}

View File

@ -4,6 +4,7 @@ namespace Drupal\Tests\serialization\Unit\Normalizer;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\GeneratedUrl;
use Drupal\Core\TypedData\Type\IntegerInterface;
use Drupal\Core\TypedData\TypedDataInterface;
use Drupal\Core\Entity\EntityRepositoryInterface;
@ -11,6 +12,7 @@ use Drupal\Core\Entity\FieldableEntityInterface;
use Drupal\Core\Field\FieldItemInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
use Drupal\Core\Url;
use Drupal\locale\StringInterface;
use Drupal\serialization\Normalizer\EntityReferenceFieldItemNormalizer;
use Drupal\Tests\UnitTestCase;
@ -106,9 +108,17 @@ class EntityReferenceFieldItemNormalizerTest extends UnitTestCase {
public function testNormalize() {
$test_url = '/test/100';
$generated_url = (new GeneratedUrl())->setGeneratedUrl($test_url);
$url = $this->prophesize(Url::class);
$url->toString(TRUE)
->willReturn($generated_url);
$entity = $this->prophesize(EntityInterface::class);
$entity->url('canonical')
->willReturn($test_url)
$entity->hasLinkTemplate('canonical')
->willReturn(TRUE);
$entity->toUrl('canonical')
->willReturn($url)
->shouldBeCalled();
$entity->uuid()
->willReturn('080e3add-f9d5-41ac-9821-eea55b7b42fb')

View File

@ -125,7 +125,6 @@ trait DeprecationListenerTrait {
'CommentType is deprecated in Drupal 8.4.x and will be removed before Drupal 9.0.x. Use \Drupal\node\Plugin\migrate\source\d7\NodeType instead.',
'CommentVariablePerCommentType is deprecated in Drupal 8.4.x and will be removed before Drupal 9.0.x. Use \Drupal\node\Plugin\migrate\source\d6\NodeType instead.',
'The Drupal\migrate_drupal\Plugin\migrate\source\d6\i18nVariable is deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0. Instead, use Drupal\migrate_drupal\Plugin\migrate\source\d6\VariableTranslation',
'Implicit cacheability metadata bubbling (onto the global render context) in normalizers is deprecated since Drupal 8.5.0 and will be removed in Drupal 9.0.0. Use the "cacheability" serialization context instead, for explicit cacheability metadata bubbling. See https://www.drupal.org/node/2918937',
'Adding or retrieving messages prior to the container being initialized was deprecated in Drupal 8.5.0 and this functionality will be removed before Drupal 9.0.0. Please report this usage at https://www.drupal.org/node/2928994.',
'The "serializer.normalizer.file_entity.hal" normalizer service is deprecated: it is obsolete, it only remains available for backwards compatibility.',
'The Symfony\Component\ClassLoader\ApcClassLoader class is deprecated since Symfony 3.3 and will be removed in 4.0. Use `composer install --apcu-autoloader` instead.',