Symfony Advent Calendar 2021 - 17日目の記事です!
PHPUnitテスト実行時、deprecated notices気になりますよね。。。 その対応時に役立つと嬉しいです :bow:

deprecated noticesを「どう回避するか」「なぜ非推奨なのか」を探ることでアンチパターンを知ることができ、とてもいい勉強になりました。

add “[type]” as a native return type declaration

1x: Method "path/to/path" might add "[type]" as a native return type declaration in the future. Do the same in implementation "App\xxx\yyy" now to avoid errors or add an explicit @return annotation to suppress this message.

return typeを宣言しないことはSymfony5.4から非推奨、Symfony6から必須とのことです。

return typeを追加してくれるpatchも用意されているとのことなので、よかったら以下のURLを参考にしてください。

https://symfony.com/doc/current/setup/upgrade_major.html#upgrading-to-symfony-6-add-native-return-types

session.flash_bag” service is deprecated

9x: Since symfony/framework-bundle 5.1: The "session.flash_bag" service is deprecated, use "$session->getFlashBag()" instead.

session.flash_bagサービスはSymfony5.1、sessionサービスはSymfony5.3から非推奨、両サービスともSymfony6.0から削除されるとのことです。

そのためSessionサービスをインジェクションする代わりに、RequestStackサービスをインジェクションしてそこからgetSession()->getFlashBag()する対応をしました。

ref: https://symfony.com/blog/new-in-symfony-5-3-session-service-deprecation

class SomeService
{
	public function __construct(
-		private FlashBagInterface $flashBag,
+		private RequestStack      $requestStack,
	){}

	public function SomeMethod(): void
	{
	    ...
-		$this->flashBag->add('success', 'success-message');
+		$$session = $this->requestStack->getSession();
+		$session->getFlashBag()->add('success', 'success-message');
        ...
	}

}

Symfony\Component\Security\Core\User\UserProviderInterface::loadUserByUsername() deprecated

1x: Class "App\Service\xxx" should implement method "Symfony\Component\Security\Core\User\UserProviderInterface::loadUserByIdentifier(string $identifier): UserInterface": loads the user for the given user identifier (e.g. username or email). This method must throw UserNotFoundException if the user is not found.

UserProviderInterface::loadUserByUsername()はSymfony5.3からdeprecatedなので、代わりにloadUserByIdentifier()を実装するようにとのことです。

namespace Symfony\Component\Security\Core\User;

interface UserProviderInterface
{
    ...
    /**
     * @return UserInterface
     *
     * @throws UserNotFoundException
     *
     * @deprecated since Symfony 5.3, use loadUserByIdentifier() instead
     */
    public function loadUserByUsername(string $username);
}

Accessing the “validator” service directly from the container is deprecated

7x: Since symfony/framework-bundle 5.2: Accessing the "validator" service directly from the container is deprecated, use dependency injection instead.

service tagcontainer.privateのついたサービスは、コンテナから直接get($container->get('foo'))することは、Symfony 5.1から非推奨

代わりにインジェクションして使ってくださいとのことです。

ref: https://symfony.com/blog/new-in-symfony-5-1-deprecate-public-services-into-private-services

symfony5.2から新たに、form.factory, form.type.file, translator, security.csrf.token_manager, serializer,cache_clearer, filesystem and validatorはcontainer.privateとなり、$container->get('validator')は非推奨

(完全アンチパターンですが、KernelTestCaseにて$container->get('validator')をどうしても使いたくて、$container->get(ValidatorInterface::class)に変更したらdeprecated noticeはでなくなりました😅)

deprecated the request get method

(deprecation noticesはでませんでした)

- $request->get('seatch-keyword'); //deprecated
+ $request->query->get('seatch-keyword');

Symfony5.4から、Request::get()のショートカットを使うことは非推奨となりdiffのように出所は明示的にしようとのことです。

ref: https://symfony.com/blog/new-in-symfony-5-4-controller-changes#deprecated-the-request-get-method