試圖用一個表單和ajax請求來注冊一個新用戶(因為它將成為一個模式化的表單),在試圖驗證表單時遇到了障礙。當請求被處理時,它指出用戶在密碼驗證器中為空。我不明白如何通過這一點或允許這一條路線來允許用戶注冊。
我試著更新了安全yaml,改變了路由
。加載初始頁面的控制器
<?php
declare(strict_types=1)。
namespace AppController;
使用 AppEntityUser。
使用 AppFormRegistrationFormType。
使用 AppRepositoryUserRepository。
使用 SymfonyBundleFrameworkBundleControllerAbstractController。
使用 SymfonyComponentRoutingAnnotationRoute。
use SymfonyComponentHttpFoundationResponse;
class HomeController extends AbstractController
{
/**。
* 無檔案的功能
*
* @Route("/", name="index")
*
* @return Response
*/
public function index(UserRepository $userRepository) 。Response:
{
$user = new User()。
$registerForm = $this->createForm(RegistrationFormType::class, $user)。
//dd($userRepository->getUserByUserIdentifier('[email protected]'));
$pageContent = [
'registerForm' => $registerForm-> createView(),
];
return $this-> render('base.html.twig', $pageContent) 。
}
處理請求的controller
<?php
declare(strict_types=1)。
namespace AppControllerSecurity;
使用 AppEntityUser。
使用 AppFormRegistrationFormType。
使用 DoctrineORMEntityManagerInterface。
使用 SymfonyBundleFrameworkBundleControllerAbstractController。
使用 SymfonyComponentHttpFoundationRedirectResponse。
使用 SymfonyComponentHttpFoundationRequest;
使用 SymfonyComponentHttpFoundationResponse。
使用 SymfonyComponentRoutingAnnotationRoute。
/**。
*無檔案的類
*/
class RegistrationController extends AbstractController
{
/**。
* 注冊一個新的用戶。
*
* @Route("/ajax/registration", name="registration")
*
* @return Response
*/
public function register(Request $request, EntityManagerInterface $entityManager)。) Response: Response.
{
$user = new User()。
$registrationForm = $this->createForm(RegistrationFormType::class, $user)。
$registrationForm-> handleRequest($request)。
//dd("I'm here after request");
if ($registrationForm->isSubmitted() && $registrationForm->isValid() ) {
$entityManager->persist($user)。
$entityManager->flush()。
return new RedirectResponse($request->headers->get('referer') )。
}
return new RedirectResponse($request-> headers->get('referer'))。
}
}
將被創建的用戶物體
declare(strict_types=1)。
namespace AppEntity。
use AppEntityTraitTimestampableEntity;
use DoctrineORMMapping as ORM;
使用 SymfonyComponentPasswordHasherHasherUserPasswordHasherInterface。
使用 SymfonyComponent安全核心用戶用戶界面。
use SymfonyComponentSecurityCoreValidatorConstraints as SecurityAssert;
使用 SymfonyComponentValidatorConstraints as Assert;
/**。
*
* @ORMTable(name="tblUser")
* @ORMEntity(repositoryClass=UserRepository::class)
*/
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()
*
* @SecurityAssertUserPassword(message = "密碼不正確,請重試" )
*/
private string $password;
/**。
* @var string
*
* @ORMColumn(name="strEmail", type="string", nullable=false)
*
* @AssertUnique()
* @AssertEmail()
*/
private string $email;
/**。
* @var bool
*
* @ORMColumn(name="bolAcceptTermsConditions", type="boolean", nullable=false)
*
* @AssertNotNull()
*/
private bool $acceptTermsAndConditions。
/**。
* @var bool
*
* @ORMColumn(name="bolAcceptPrivacyPolicy", type="boolean", nullable=false)
*
* @AssertNotNull()
*/
private bool $acceptPrivacyPolicy;
/**。
* @var bool
*
* @ORMColumn(name="bolEmailOptIn", type="boolean", nullable=false)
*
* @AssertNotNull()
*/
private bool $emailOptIn;
/**.
* @return string
*/
public function getFullName() 。string
{
return $this-> firstName . " " 。$this->lastName;
}
/**.
* @return string
*/
public function getFirstName() 。string
{
return $this-> firstName;
}
/**。
* @return string
*/
public function getLastName() 。string
{
return $this-> lastName;
}
/**。
* @return string
*/
public function getEmail() 。string
{
return $this->email。
}
public function getRoles()。
{
// TODO: 實作getRoles()方法。
}
/**。
* @return string
*/
public function getPassword()。string
{
return $this-> password;
}
/***。
* 未記錄的函式
*
* @return boolean
*/
public function getAcceptTermsAndConditions()。bool
{
return $this-> acceptTermsAndConditions;
}
/***。
* 未記錄的功能
*
* @return boolean
*/
public function getAcceptPrivacyPolicy()。bool
{
return $this-> acceptPrivacyPolicy;
}
/***。
* 未記錄的函式
*
* @return boolean
*/
public function getEmailOptIn() 。bool
{
return $this-> emailOptIn;
}
/**。
* @return void
*/
public function getSalt()
{
// TODO: 實作getSalt()方法。
}
public function eraseCredentials()
{
// TODO: 實作eraseCredentials()方法。
}
/**。
* @return string
*/
public function getUserIdentifier() 。string
{
return $this-> username;
}
/**。
* @return string
*/
public function getUsername() 。string
{
return $this-> username;
}
/***。
* 未記錄的函式
*
* @param string $firstname
*
* @return void
*/
title">setFirstName(string $firstname)
{
$this-> firstName = $firstname;
}
/**.
* 未記錄的功能
*
* @param string $lastName
* @return void
*/
public function setLastName setLastName setLastName */ title">setLastName(string $lastName)
{
$this->lastName = $lastName;
}
title">setEmail(string $email)
{
$this->email = $email;
}
title">setUsername(string $username)
{
$this-> username = $username;
}
title">setPassword(string $password)
{
$this-> password = $password;
}
title">setAcceptTermsAndConditions(bool $accepted)
{
$this->acceptTermsAndConditions = $accepted;
}
title">setAcceptPrivacyPolicy(bool $accepted)
{
$this-> acceptPrivacyPolicy = $accepted;
}
public function setEmailOptIn title">setEmailOptIn(bool $accepted)
{
$this->emailOptIn = $accepted;
}
public function getId()
{
return $this-> id;
}
}
表單包含所有欄位,并被映射到用戶物體。我們正在努力確定如何在不對整個注冊系統進行重大改造的情況下使其正常作業。
security.yaml
security:
encoders:
AppEntityUser:
algorithm: auto
enable_authenticator_manager: true。
password_hashers:
SymfonyComponentSecurityCoreUserPasswordAuthenticatedUserInterface。'auto'/span>
提供者。
#users_in_memory: { memory: null }
app_user_provider:
物體。
class: AppEntityUser: AppEnter
property。
防火墻。
dev:
pattern: ^/(_(profiler|wdt)|css|images|js) /)
安全。false)
main:
lazy: true: true.
provider: app_user_provider.
custom_authenticator:
- AppSecurityLoginFormAuthenticator: AppSecurityLoginFormAuthenticator
logout。
path: logout: logout.
容易 途徑 到 控制 訪問 for large sections of your site
# 注意。 title">控制 那 匹配 將 被 使用
access_control。
# - {路徑。^/admin, roles: ROLE_ADMIN }
# - { path: ^/profile, roles: ROLE_USER }
- { 路徑: /registration, roles: 公眾訪問}
uj5u.com熱心網友回復:
修復了,現在可以添加一個新的用戶,將對他們被引導的位置做一些改變,但是這不在這個問題的范圍之內。
注冊控制器:需要修復以回傳和顯示表單中存在的錯誤,以及在登錄后重定向到主頁。
<?php
declare(strict_types=1)。
namespace AppControllerSecurity;
使用 AppEntityUser。
使用 AppFormRegistrationFormType。
使用 DoctrineORMEntityManagerInterface。
使用 SymfonyBundleFrameworkBundleControllerAbstractController。
使用 SymfonyComponentHttpFoundationRedirectResponse。
使用 SymfonyComponentHttpFoundationRequest;
使用 SymfonyComponentHttpFoundationResponse。
使用 SymfonyComponentPasswordHasherHasherUserPasswordHasherInterface。
使用 SymfonyComponentRoutingAnnotationRoute。
/**。
*無檔案的類
*/
class RegistrationController extends AbstractController
{
/**。
* 注冊方法
*
* @Route("/registration", name="registration")
*
* @return Response
*/
public function register(Request $request。EntityManagerInterface $entityManager,
UserPasswordHasherInterface $passwordHasher)。) Response: Response.
{
$user = new User()。
$registrationForm = $this->createForm(RegistrationFormType::class, $user)。
$registrationForm-> handleRequest($request)。
dd($user->getUsername())。
if ($registrationForm->isSubmitted() && $registrationForm->isValid() ) {
$password = $passwordHasher->hashPassword($user, $user->getPlainPassword() ) 。
$user->setPassword($password)。
//dd($user->getPlainPassword(), $user->getPassword());
$entityManager->persist($user)。
$entityManager->flush()。
$pageContent = [
'registrationForm' => $registrationForm-> createView(),
];
return $this-> render('base.html.twig', $pageContent) 。
}
$pageContent = [
'registrationForm' => $registrationForm-> createView(),
'formErrors' => $registrationForm-> getErrors()
];
return new RedirectResponse($request->headers->get('referer') )。
}
}
用戶物體:在斷言的作業方式和周圍的限制方面犯了一些錯誤,因為沒有必要而被洗掉。
<?php
declare(strict_types=1)。
namespace AppEntity。
use AppEntityTraitTimestampableEntity;
use CarbonCarbon;
use DoctrineORMMapping as ORM;
使用 SymfonyComponent安全核心用戶用戶界面。
use SymfonyComponentSecurityCoreValidatorConstraints as SecurityAssert;
使用 SymfonyComponentValidatorConstraints as Assert;
/**。
*
* @ORMTable(name="tblUser")
* @ORMEntity(repositoryClass=UserRepository::class)
*/
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)
*
* @AssertLength(
* min = 2,
* max = 15,
* minMessage = "你的名字必須至少是{{限制}}個字符長"。
* maxMessage = "你的名字不能長于{{限制}}個字符"
* )
*/
private string $username;
/**。
* @var string
*
* @ORMColumn(name="strPassword", type="string", nullable=false)
*
*/
private string $password;
/**。
*用于表格注冊的普通字串密碼
*
* @var string
*
*/
private string $plainPassword;
/**。
* @var string
*
* @ORMColumn(name="strEmail", type="string", nullable=false)
*
* @AssertNotNull()
* @AssertEmail()
*/
private string $email;
/**。
* @var bool
*
* @ORMColumn(name="bolAcceptTermsConditions", type="boolean", nullable=false)
*
* @AssertNotNull()
*/
private bool $acceptTermsAndConditions。
/**。
* @var bool
*
* @ORMColumn(name="bolAcceptPrivacyPolicy", type="boolean", nullable=false)
*
* @AssertNotNull()
*/
private bool $acceptPrivacyPolicy;
/**。
* @var bool
*
* @ORMColumn(name="bolEmailOptIn", type="boolean", nullable=false)
*
* @AssertNotNull()
*/
private bool $emailOptIn;
public function __construct()。
{
$this->dateAdded = Carbon::now();
}
/**。
* @return string
*/
public function getFullName() 。string
{
return $this-> firstName . " " 。$this->lastName;
}
/**.
* @return string
*/
public function getFirstName() 。string
{
return $this-> firstName;
}
/**。
* @return string
*/
public function getLastName() 。string
{
return $this-> lastName;
}
/**。
* @return string
*/
public function getEmail() 。string
{
return $this->email。
}
public function getRoles()。
{
// TODO: 實作getRoles()方法。
}
/**。
* @return string
*/
public function getPassword()。string
{
return $this-> password;
}
public function getPlainPassword()。string
{
return $this->lainPassword。
}
/***。
* 未記錄的函式
*
* @return boolean
*/
public function getAcceptTermsAndConditions()。bool
{
return $this-> acceptTermsAndConditions;
}
/***。
* 未記錄的功能
*
* @return boolean
*/
public function getAcceptPrivacyPolicy()。bool
{
return $this-> acceptPrivacyPolicy;
}
/***。
* 未記錄的函式
*
* @return boolean
*/
public function getEmailOptIn() 。bool
{
return $this-> emailOptIn;
}
/**。
* @return void
*/
public function getSalt()
{
// TODO: 實作getSalt()方法。
}
public function eraseCredentials()
{
// TODO: 實作eraseCredentials()方法。
}
/**。
* @return string
*/
public function getUserIdentifier() 。string
{
return $this-> username;
}
/**。
* @return string
*/
public function getUsername() 。string
{
return $this-> username;
}
/***。
* 未記錄的函式
*
* @param string $firstname
*
* @return void
*/
title">setFirstName(string $firstname)
{
$this-> firstName = $firstname;
}
/**.
* 未記錄的功能
*
* @param string $lastName
* @return void
*/
public function setLastName setLastName setLastName */ title">setLastName(string $lastName)
{
$this->lastName = $lastName;
}
title">setEmail(string $email)
{
$this->email = $email;
}
title">setUsername(string $username)
{
$this-> username = $username;
}
public function setPlainPassword($password)
{
$this-> plainPassword = $password;
}
title">setPassword(string $password)
{
$this-> password = $password;
}
title">setAcceptTermsAndConditions(bool $accepted)
{
$this->acceptTermsAndConditions = $accepted;
}
title">setAcceptPrivacyPolicy(bool $accepted)
{
$this-> acceptPrivacyPolicy = $accepted;
}
public function setEmailOptIn title">setEmailOptIn(bool $accepted)
{
$this->emailOptIn = $accepted;
}
public function getId()
{
return $this-> id;
}
}
將在注冊后添加自動登錄功能,但不是在這個階段。 Symfony Docs, symfony casts and Bogdan George Moza
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328356.html
標籤:
