簡體   English   中英

如何使用 twig 和 symfony 獲取用戶輸入?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM