Symfony Advent Calendar 2021 - 17日目の記事です!
PHPUnitテスト実行時、deprecated notices気になりますよね。。。
その対応時に役立つと嬉しいです
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を参考にしてください。
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