[英]How to get user input with twig and symfony?
我有一個簡單的add_user.html.twig
,它有幾個輸入字段name, age, color
我想在按下按鈕時傳遞(捕獲)用戶輸入並將這些字段中的值傳遞給要添加的控制器到數據庫
add_user.html.twig
<body>
<label for="username">User name:</label>
<input type="text" id="username" name="_username" />
<label for="color">Color:</label>
<input type="text" id="color" name="_color" />
<label for="age">Age:</label>
<input type="text" id="age" name="_age" />
<button type="submit">add</button>
</body>
</html>
在 UserController.php (在 Controllers 文件夾內)我有一個名為create()
的公共函數,它負責將數據添加到以結尾的數據庫中
return new Response( $this->render('user/add_user.html.twig', [
'controller_name' => 'UserController'
]));
現在我的問題是如何獲取用戶輸入的值並將它們傳遞給控制器
正如 Cerad 所說,你可以使用 Symfony 形式和 Doctrine ORM。 Symfony 文檔做得很好。
一步一步是我個人會做的(有幾種方法可以做到):
- 創建一個實體用戶,其中包含您需要的所有字段,如下所示,帶有約束、getter 和 setter。
/**
* @var string
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @param string $name
*/
public function setName(string $name): void
{
$this->name = $name;
}
- 創建一個表單 AddUserType,您可以在其中編寫所有字段和屬性,例如:
->add('name', TextType::class, [
'label' => 'Your name : ',
'attr' => [
'placeholder' => 'Name'
]
])
- 創建存儲庫 UserRepository(您可以使用 Symfony 命令行生成每個文件)以獲取請求數據庫的方法。 您可以在此處創建自己的方法。
- 創建一個 UserController ,例如您編寫 User 的新實例、AddUserType 的新實例、獲取用戶信息、在數據庫中持久化和刷新:
/**
* @Route("/add_user", name="add_user")
*/
public function add_user(Request $request, EntityManagerInterface $em)
{
//instance of User
$user = new User();
//instance of the form
$addUserForm = $this->createForm(AddUserType::class, $user);
//get infos
$addUserForm->handleRequest($request);
//Test if there is no error
if ($addUserForm->isSubmitted() && $addUserForm->isValid())
{
//Validate and push infos inside database
$em->persist($user);
$em->flush();
//Redirect to log in route if you want
return $this->redirectToRoute("login");
}
//Give the form to Twig
return $this->render('user/add_user.html.twig', [
'controller_name' => 'UserController', "addUserForm" =>$addUserForm->createView()
]);
}
- 創建視圖(有 3 種方法可以做到,但如果您想要更大的靈活性並擁有漂亮的表單,我建議您詳細說明表單):
{{ form_start(addUserForm)}}
<!--add fields-->
{{ form_label(addUserForm.name) }}
{{ form_widget(addUserForm.name) }}
<!--add other fields ..-->
<!--add buttons-->
<button type="submit">Register</button>
<button type="reset">Cancel</button>
{{ form_end(addUserForm) }}
如果你想用最低限度來快速測試它,它看起來像:
{{ form_start(addUserForm) }}
{{ form_widget(addUserForm) }}
<button type="sumbit">Register!</button>
{{ form_end(addUserForm) }}
首先讓檢查一切是否正常工作變得簡單,然后您可以添加更多參數和更多安全性,例如 CSRF 或密碼哈希、閃存消息、錯誤、電子郵件、角色等。
(我不知道我是否必須評論或添加另一個答案,但無論如何我的消息太長而無法發表評論..)表單構建器對象對應於表單的字段,一個好的做法是將它們編碼在里面類型文件 (AddUserType) 而不是在控制器內部。
要創建 AddUserType,有一些方法可以做到,但我建議從 Composer 創建它:
-首先從控制台命令進入您的項目文件夾。 - 使用以下命令檢查您是否已經擁有 symfony/form 和 symfony/maker-bundle 組件:
composer show -i
如果你有這些行就可以了,否則你必須安裝它們:
composer require symfony/form
composer require symfony/maker-bundle
*如果之前沒有做過,你必須創建你的數據庫並同步你的實體:
Php bin/console doctrine:database:create
*檢查您項目中的 env 文件以寫入您的數據庫信息、日志、用戶名、密碼等……這取決於您使用的是哪個數據庫。 *強制您的數據庫適合實體:
Php bin/console doctrine:schema:update –force
- 從 Composer 生成表單:
Php bin/console make:form
- 填寫所有字段、名稱、約束、類型等(您可以在 IDE 之后調整和更正此文件)之后,它將為您的項目生成文件。
還有另一種解決方案,但不推薦(因為您必須手動創建所有內容、文件、檢查所有實現的類或抽象類,如果您這樣做,Symfony 文檔是您最好的朋友 :p),您可以進入您的 IDE 並創建您需要的任何內容:您可以組織您的項目,但這里有一個示例:
->src ->Controller ->UserController.php
->AnyController.php
->Entity ->User.php
->AnyEntity.php
->Form ->AddUserType.php
->AnyType.php
->Repository ->AddUserRepository.php
->AnyRepository.php
->templates ->main ->index.html.twig
->user ->login.html.twig
->add_user.html.twig
->base.html.twig
無論如何,在創建或生成文件后,最好檢查是否包含所有用途、類是否擴展或實現了正確的類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.