我使用Symfony 5.3.7,并使用@Assert注解,試圖在注冊時驗證一個新用戶。我試圖理解檔案的內容,但沒有任何進展。理想情況下,我希望能夠理解如何使用這些注解來驗證一個物體。我試著使用一個單獨的類,但在理解上毫無進展,盡管我確實想走這條路,以防我在其他地方重用這個組件。(我寧愿不在表單中驗證,但如果我必須這樣做的話,我可以這樣做) 物體
class User implements UserInterface
{
使用 TimestampableEntity。
/**。
* @var int
*
* @ORMId()
* @ORMGeneratedValue(strategy="IDENTITY")
* @ORMColumn(name="intUserId", type="integer", nullable=false)
*/
private int $id;
/**。
* @var string
*
* @ORMColumn(name="strFirstName", type="string", nullable=false)
*
* @AssertNotBlank
* @AssertLength(
* min = 2,
* max = 50,
* minMessage = "你的名字必須至少是{{限制}}個字符長"。
* maxMessage = "你的名字不能長于{{限制}}個字符"
* )
*/
private string $firstName;
/**。
* @var string
*
* @ORMColumn(name="strLastName", type="string", nullable=false)
*
* @AssertNotBlank
* @AssertLength(
* min = 2,
* max = 50,
* minMessage = "你的名字必須至少是{{限制}}個字符長"。
* maxMessage = "你的名字不能長于{{限制}}個字符"
* )
*/
private string $lastName;
/**。
* @var string
*
* @ORMColumn(name="strUsername", type="string", nullable=false)
*
* @AssertUnique()
* @AssertLength(
* min = 2,
* max = 15,
* minMessage = "你的名字必須至少是{{限制}}個字符長"。
* maxMessage = "你的名字不能長于{{限制}}個字符"
* )
*/
private string $username;
/**。
* @var string
*
* @ORMColumn(name="strPassword", type="string", nullable=false)
*
* @AssertNotNull()
* @AssertRegex(pattern = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$")
*
* @SecurityAssertUserPassword(message = "密碼不正確,請重試")
*/
private string $password;
/**。
* @var string
*
* @ORMColumn(name="strEmail", type="string", nullable=false)
*
* @AssertUnique()
* @AssertRegex(pattern = "[A-Z0-9._% -] @[A-Z0-9.-] . [A-Z]{2,}" )
*/
private string $email;
/**。
* @var boolean
*
* @ORMColumn(name="bolAcceptTermsConditions", type="bool", nullable=false)
*
* @AssertNotNull()
*/
private bool $acceptTermsAndConditions。
/**。
* @var boolean
*
* @ORMColumn(name="bolAcceptPrivacyPolicy", type="bool", nullable=false)
*
* @AssertNotNull()
*/
private bool $acceptPrivacyPolicy;
/**。
* @var boolean
*
* @ORMColumn(name="bolEmailOptIn", type="bool", nullable=false)
*
* @AssertNotNull()
*/
private bool $emailOptIn;
/**。
* 用戶建構式。
*
* @param string $firstName
* @param string $lastName
* @param string $username
* @param string $email
* @param string $password
*/
public function __construct()
string $firstName,
string $lastName,
string $username,
string $email。
string $password,
bool $acceptTermsAndConditions = false。
bool $acceptPrivacyPolicy = false,
bool $emailOptIn = false.
) {
$this-> firstName = $firstName;
$this->lastName = $lastName;
$this-> username = $username;
$this->email = $email;
$this->password = $password。
$this->acceptTermsAndConditions = $acceptTermsAndConditions;
$this-> acceptPrivacyPolicy = $acceptPrivacyPolicy;
$this->emailOptIn = $emailOptIn;
$this->dtmAdded = Carbon::now();
}
通常我會傳入新的物體或陣列,要么在驗證器中創建物體,要么類似于 控制器
public function register(Request $request) 。Response{
$registrationForm = $this-> createForm(RegistrationFormType::class);
$registrationForm->handleRequest($request)。
if ($registrationForm->isSubmitted() && $registrationForm->isValid() ) {
$newUserData = $registrationForm->getData()。
$user = new User(
$newUserData['firstName'/span>]。
$newUserData['lastName']。
$newUserData['email']。
$newUserData['username']。
$newUserData['password']。
$newUserData['termConditions']。
$newUserData['privacyPolicy'] 。
$newUserData['emailFrequency'].
);
return new RedirectResponse($request->headers->get('referer') ) 。
}
return new RedirectResponse($request-> headers->get('referer'))。
}
表格
<?php
declare(strict_types=1)。
namespace AppForm;
使用 SymfonyComponentFormAbstractType。
使用 SymfonyComponentFormExtensionCoreTypeCheckboxType。
使用 SymfonyComponentFormExtensionCoreTypeChoiceType。
使用 SymfonyComponent表單擴展核心型別EmailType。
使用 SymfonyComponentFormExtensionCoreTypePasswordType。
使用 SymfonyComponent表單擴展核心型別文本型別。
使用 SymfonyComponentFormFormBuilderInterface。
使用 SymfonyComponentOptionsResolverOptionsResolver。
class RegistrationFormType extends AbstractType
{
public const FORM_NAME = 'registrationForm'。
/***。
* 注冊表格的表格生成器
*
* @param FormBuilderInterface $builder
* @param array $options
*
* @return void
*/
public function buildForm(FormBuilderInterface $builder, array $options)。) void: $options.
{
$builder->add('firstName', TextType::class, [
'label' => 'firstname:',
'required' => true。
'attr' => [
'class' => 'form-input input type-text'。
'placeholder' => 'John',
],
]);
$builder->add('lastName', TextType::class, [
'label' => 'Lastname:',
'required' => true,
'attr' => [
'class' => 'form-input input type-text'。
'placeholder' => 'Doe'.
],
]);
$builder->add('email', EmailType::class, [
'label' => 'Email:',
'required' => true。
'attr' => [
'class' => 'form-input input-type-email'。
'placeholder' => '[email protected]'.
]
]);
$builder->add('username', TextType::class, [
'label' => '用戶名:',
'required' => true。
'attr' => [
'class' => 'form-input input type-text',
]
]);
$builder->add('password', PasswordType::class, [
'label' => 'password:',
'required' => true。
'attr' => [
'class' => 'form-input input type-email'。
]
]);
$builder->add('termConditions', CheckboxType::class, [
'label' => 'I accept the terms & conditions',
'required' => true,
]);
$builder->add('privacyPolicy', CheckboxType::class, [
'label' => '我已閱讀并理解隱私政策'。
'required' => true,
]);
$builder->add('emailFrequency', ChoiceType::class, [
'label' => 'Opt in to emails:',
'multiple' => false,
'expanded' => true,
'options' => [
'Yes' => true。
'No' => false,
],
]);
}
/**。
* @param OptionsResolver $resolver
*
* @return void
*/
public function configureOptions(OptionsResolver $resolver) 。void: $resolver.
{
$resolver->setDefaults([] )。
}
/**。
* @return string
*/
public function getBlockPrefix() 。string
{
return self: :FORM_NAME;
}
uj5u.com熱心網友回復:
所以問題在于你沒有將新的用戶物件傳遞給表單,所以在這種情況下驗證將不會發生。
你可以做的就是解決這個問題,在這種情況下,宣告表單的data_class為User
。public function configureOptions(OptionsResolver $resolver) 。void: $resolver.
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
而當你在動作中創建表單時,你需要向它傳遞一個新的用戶物件,就像:
$user = new User()。
$registrationForm = $this->createForm(RegistrationFormType::class, $user)。
而且你可以洗掉實體化和發送資料給用戶物體的部分
$user = new User(
$newUserData['firstName'/span>]。
$newUserData['lastName']。
$newUserData['email']。
$newUserData['username']。
$newUserData['password']。
$newUserData['termConditions']。
$newUserData['privacyPolicy'] 。
$newUserData['emailFrequency'].
);
相反,你應該直接使用物體管理器來保存新的用戶。 ,為此,你需要注入物體管理器,像這樣:
public function register(Request $request, EntityManagerInterface $entityManager)。) Response: Response.
并且只需使用它將用戶物件保存到資料庫中
if ($registrationForm-> isSubmitted() && $registrationForm->isValid() ) {
$entityManager->persist($user)。
$entityManager->flush()。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/310756.html
標籤:
