symfony 相关问题

Symfony既指用于构建Web应用程序的PHP框架,也指构建框架的一组组件。此标记指的是当前支持的主要版本2.x,3.x和4.x.或者,您可以使用相应的标记指定确切的版本。此标记不应用于有关Symfony 1.x的问题。请改用Symfony1标签。

如何使用约束属性对 symfony dto 进行单元测试

我有一个新创建的 Symfony 7 应用程序,并且有一个名为:AuthCallbackDto 的 DTO 我有一个新创建的 Symfony 7 应用程序,并且有一个名为:AuthCallbackDto 的 DTO <?php declare(strict_types=1); namespace App\Application\Model\Auth; use Symfony\Component\Validator\Constraints as Assert; readonly class AuthCallbackDto { public function __construct( #[Assert\NotBlank(message: 'The `code` value cannot be blank')] #[Assert\Length(min: 5)] private string $code, #[Assert\NotBlank(message: 'The `session_state` value cannot be blank')] #[Assert\Length(min: 5)] private string $session_state, ) { } public function getCode(): string { return $this->code; } public function getSessionState(): string { return $this->session_state; } } 我在控制器中使用它,如下所示: <?php declare(strict_types=1); namespace App\Application\Controller\Auth; use App\Application\Model\Auth\AuthCallbackDto; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Attribute\AsController; use Symfony\Component\HttpKernel\Attribute\MapQueryString; use Symfony\Component\Routing\Attribute\Route; #[AsController] class Callback { #[Route('/auth/callback', name: 'auth/callback', methods: ['GET'])] public function test( #[MapQueryString] AuthCallbackDto $authCallbackDto, ): Response { return new JsonResponse([ 'code' => $authCallbackDto->getCode(), 'session_state' => $authCallbackDto->getSessionState() ]); } } 如果代码或 session_state 值不存在或 < 5 characters then an error is thrown. This is good! http://localhost:8000/auth/callback?code=oihiohoih&session_state=34f34f34f - 有效(好) http://localhost:8000/auth/callback?code=&session_state= - 失败(好) 'http://localhost:8000/auth/callback?code=123&session_state=123 - 失败(好) 由于过于自信,我决定为 DTO 类编写一个非常小的单元测试。然而,我随后注意到当我从控制台运行 PHP Unit 时,约束属性没有被应用。测试中的异常永远不会抛出。 任何人都可以告诉我我做错了什么还是我只是假设太多? 这是我的单元测试: <?php declare(strict_types=1); namespace App\Tests\Unit\Application\Model\Auh; use App\Application\Model\Auth\AuthCallbackDto; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; class AuhCallbackDtoTest extends TestCase { /** * @return array<array<int, string|bool>> */ public static function dtoData(): array { return [ [ '', '', true, ], [ 'someCodeABC12344', 'someSessionState', false, ], ]; } #[DataProvider('dtoData')] public function testDtoCanBeCreated(string $code, string $sessionState, bool $exception): void { if ($exception) { $this->expectException(\Exception::class); } $dto = new AuthCallbackDto($code, $sessionState); self::assertEquals($dto->getCode(), $code); self::assertEquals($dto->getSessionState(), $sessionState); } } 我尝试使用控制台调试验证规则,看起来不错: bin/console debug:validator 'App\Application\Model\Auth\AuthCallbackDto' App\Application\Model\Auth\AuthCallbackDto ------------------------------------------ +---------------+--------------------------------------------------+--------------------------+---------------------------------------------------------------------------------+ | Property | Name | Groups | Options | +---------------+--------------------------------------------------+--------------------------+---------------------------------------------------------------------------------+ | code | property options | | [ | | | | | "cascadeStrategy" => | | | | | "None", | | | | | "autoMappingStrategy" => | | | | | "None", | | | | | "traversalStrategy" => | | | | | "None" | | | | | ] | | code | Symfony\Component\Validator\Constraints\NotBlank | Default, AuthCallbackDto | [ | | | | | "allowNull" => | | | | | false, | | | | | "message" => "The `code` | | | | | value cannot be blank", | | | | | "normalizer" => | | | | | null, | | | | | "payload" => | | | | | null | | | | | ] | | code | Symfony\Component\Validator\Constraints\Length | Default, AuthCallbackDto | [ | | | | | "charset" => | | | | | "UTF-8", | | | | | "charsetMessage" => "This | | | | | value does not match the expected {{ charset }} charset.", | | | | | "countUnit" => | | | | | "codepoints", | | | | | "exactMessage" => "This | | | | | value should have exactly {{ limit }} character.|This value should have exactly | | | | | {{ limit }} characters.", | | | | | "max" => | | | | | null, | | | | | "maxMessage" => "This value | | | | | is too long. It should have {{ limit }} character or less.|This value is too | | | | | long. It should have {{ limit }} characters or less.", | | | | | "min" => 5, | | | | | "minMessage" => "This value | | | | | is too short. It should have {{ limit }} character or more.|This value is too | | | | | short. It should have {{ limit }} characters or more.", | | | | | "normalizer" => | | | | | null, | | | | | "payload" => | | | | | null | | | | | ] | | session_state | property options | | [ | | | | | "cascadeStrategy" => | | | | | "None", | | | | | "autoMappingStrategy" => | | | | | "None", | | | | | "traversalStrategy" => | | | | | "None" | | | | | ] | | session_state | Symfony\Component\Validator\Constraints\NotBlank | Default, AuthCallbackDto | [ | | | | | "allowNull" => | | | | | false, | | | | | "message" => "The | | | | | `session_state` value cannot be blank", | | | | | "normalizer" => | | | | | null, | | | | | "payload" => | | | | | null | | | | | ] | | session_state | Symfony\Component\Validator\Constraints\Length | Default, AuthCallbackDto | [ | | | | | "charset" => | | | | | "UTF-8", | | | | | "charsetMessage" => "This | | | | | value does not match the expected {{ charset }} charset.", | | | | | "countUnit" => | | | | | "codepoints", | | | | | "exactMessage" => "This | | | | | value should have exactly {{ limit }} character.|This value should have exactly | | | | | {{ limit }} characters.", | | | | | "max" => | | | | | null, | | | | | "maxMessage" => "This value | | | | | is too long. It should have {{ limit }} character or less.|This value is too | | | | | long. It should have {{ limit }} characters or less.", | | | | | "min" => 5, | | | | | "minMessage" => "This value | | | | | is too short. It should have {{ limit }} character or more.|This value is too | | | | | short. It should have {{ limit }} characters or more.", | | | | | "normalizer" => | | | | | null, | | | | | "payload" => | | | | | null | | | | | ] | +---------------+--------------------------------------------------+--------------------------+---------------------------------------------------------------------------------+ 我可以更新 DTO 的构造函数以进行一些标准的 Webmozart 静态断言调用,但当应用程序按预期运行时,这是不必要的。 ... public function __construct( #[Assert\NotBlank] #[Assert\Length(min: 5)] private string $code, #[Assert\NotBlank] #[Assert\Length(min: 5)] private string $session_state, ) { \Webmozart\Assert\Assert::notEmpty($this->code); \Webmozart\Assert\Assert::minLength($code, 5); \Webmozart\Assert\Assert::notEmpty($this->session_state); \Webmozart\Assert\Assert::minLength($this->session_state, 5); } ... 那些 Assert 属性来自 Symfony Validator 组件。 PHP 不会自动在其上运行业务逻辑。但它确实在框架中做到了这一点。 您需要将其传递给 symfony 验证器。 但是,由于您正在测试控制器,因此您可以创建一个 WebTestCase 来代替。您可以通过发送请求并验证响应来(功能上)测试您的控制器。简而言之,就像您的应用程序是一个“黑匣子”一样运行功能测试。 有关更多信息,请参阅本章:https://symfony.com/doc/current/testing.html#write-your-first-application-test 如果你真的不想要这个,并且你真的想测试你的 Dto。您必须使用 Symfony 验证器验证您的 Dto。 class AuhCallbackDtoTest extends TestCase { public function testInvalidDto(): void { $validator = Validation::createValidator(); $dto = new AuthCallbackDto("", ""); $errors = $validator->validate($dto); $this->assertCount(2, (array)$errors); // there are 2 errors // You can check specifically for the error and the error message too } } 仅供参考,我还没有真正测试过这一点。因此 Validation::createValidator() 可能需要一些额外的配置来理解这些构造函数属性,但我并不完全确定。

回答 1 投票 0

如何在 KNPMenuBundle 中将“当前”类别更改为“活动”

我想知道,将“当前”类更改为“活动”以便 Bootstrap 能够正确使用它的最佳方法是什么? 我想过复制并覆盖 knp_menu_html.twig 但我...

回答 2 投票 0

twig 函数 encore_entry_link_tags('app') 和 encore_entry_script_tags('app') 都会导致内部服务器错误

我正在本地建立一个新的 Pimcore 网站,但我似乎无法使提到的 twig 功能正常工作。我收到此错误消息 当我注释掉 encore_entry_link_tags('app') 时,

回答 1 投票 0

教义迁移表整理

尝试找到一种方法来以编程方式创建具有特定排序规则的表,但似乎找不到正确执行此操作的方法。我正在使用“doctrine/doctrine-migrations-bundle”:“2.1.*@dev”...

回答 4 投票 0

哪里可以更改表单文本框的大小?

我在控制器中制作表单,如下所示。 $form = $this->createFormBuilder($row) ->add('评论',null,array('标签' => '输入评论')) 然后在树枝文件中... {{form_widget(表单。

回答 5 投票 0

在symfony项目中,在Booking实体的控制器中,我想检查用户是否有角色,然后重定向它们

这段代码是symfony项目的基础和路线的基础,在这个函数onAuthenticationSuccess中,我有以下代码来检查用户是否具有特定角色,然后我尝试重新定向...

回答 1 投票 0

API 平台中的条件必需属性

我是API平台的新手,我想问是否有一种方法可以有条件地要求实体的属性。例如,我有一个实体 User,它具有两个属性:HasCar 和 CarModel。汽车模型...

回答 1 投票 0

如何获取具有数组类型的doctrine2字段的不同值

我有 FOSUser 表,用户具有数据类型数组的角色,这些角色以序列化形式保存在数据库中,我尝试执行不同的查询,但它单独返回每一行,这是 h...

回答 1 投票 0

如何模拟您正在使用 Prophecy 测试的类中的方法?

我想第一次使用Prophecy(“phpspec/prophecy-phpunit”)为我的类创建单元测试。我想测试一个调用同一服务中另一个函数的函数,这是代码...

回答 3 投票 0

在 Symfony 6 中使用 node_modules

我想在我的 Symfony 6 项目中使用一些node_modules。例如,羽毛图标。但我不知道如何在不将这些文件复制到公共文件夹或使用 CDN 的情况下包含这些文件。 我有

回答 1 投票 0

如何修改 Symfony 实体 Getter 方法以在 REST API 响应中返回仅日期值?

我目前正在开发一个基于 Symfony 的 REST API 应用程序,其中我遇到了与从实体字段返回的日期值的格式相关的特定要求。在我的实体内,我...

回答 1 投票 0

用户和角色在 symfony 2.8 中是不同的实体

我正在开发一个项目,因为我需要针对不同实体的用户和角色的解决方案。 用户实体 用户 ID 文件名 名字 电子邮件 角色实体 角色 ID 角色 用户角色实体 ID 我们...

回答 3 投票 0

Symfony2:获取用户实体中组的角色,但避免在实体内部查询

我的 User 实体实现了 UserInterface,因此提供了 getRoles() 方法。在我的系统中,一个用户可以属于多个组。一个组可以有多个角色。因此,用户的角色可以是

回答 1 投票 0

登录 Symfony Monolog Slackwebhookhandler 时出现问题

我在通过 monolog 登录 Symfony 的 Slackwebhookhandler 时遇到问题。我的整个 monolog.yaml 包含在下面。我最不喜欢的是我什至没有在任何地方看到任何关于...的错误消息

回答 1 投票 0

无法使用docker和symfony 7在postgresql数据库中插入数据

我在docker上有Symfony postgresql,安装了数据库, 使用 adminer 作为数据库的 ui。 作为实体(类/模型),我有三个表:User、UserProfile 和 PostEvent。 在

回答 1 投票 0

序列化“App\Entity\User”类的对象时检测到循环引用(配置限制:1)

我遇到的问题给了我这个错误: 序列化对象时检测到循环引用 类“App\Entity\User”(配置限制:1) 我有一个企业...

回答 10 投票 0

JMSserializer 反序列化相关 Doctrine 实体

我有这样的json: “相关集合”:[ { 编号:1, 名称:“某事”, 国家: { 编号:1 } }, { 编号:2, 名称:“东西2”, 国家: { ...

回答 2 投票 0

format_datetime 过滤器未以法语显示日期

我正在尝试使用 Twig 过滤器 format_datetime 以法语显示日期。例如,这段代码: '2024-05-05 23:39:12'|format_datetime(locale='fr',pattern="EEEE dd MMMM YYYY") 应该...

回答 1 投票 0

在 Symfony 上定义两条具有相同基础的路由

我有两条路线 GET /users/{id} 和 POST /users/{id}/file。 当我尝试调用第二个 (POST /users/{id}/file) 时,收到错误 405 不允许方法。 我使用 Symfony 6.4。 我的路线已定义

回答 2 投票 0

使用路径在表单标签中链接

在我的注册表中,我有一个复选框“我接受条款”,并希望将“条款”一词链接到我的条款页面。 有没有办法使用路由将链接添加到表单标签? (最好没有

回答 7 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.