<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                {% raw %} # Symfony 保留表單值 > 原文: [http://zetcode.com/symfony/keepformvalues/](http://zetcode.com/symfony/keepformvalues/) Symfony 保留表單值教程展示了在表單提交失敗后如何在表單提交后保持表單值。 在本教程中,我們進行傳統的表單提交; 我們不使用表單構建器。 ## Symfony Symfony 是一組可重用的 PHP 組件和一個用于 Web 項目的 PHP 框架。 Symfony 于 2005 年發布為免費軟件。Symfony 的原始作者是 Fabien Potencier。 Symfony 受到 Spring 框架的極大啟發。 ## 保留表單值 用戶提交表單后,將由應用進行驗證。 當驗證失敗時,應用將用戶重定向回表單,顯示驗證錯誤。 最好將已輸入的值保留在表格中。 ## Symfony 保留表單值示例 在示例中,我們有一個簡單的表單,其中包含兩個字段:名稱和電子郵件。 提交表單后,我們檢查 CSRF 保護并使用 Symfony 的`Validator`驗證輸入值。 我們將輸入的值存儲到會話中,以在提交失敗時取回它們。 ### 建立應用 我們首先使用`composer`建立應用。 ```php $ composer create-project symfony\skeleton formkeepvals $ cd formkeepvals ``` 我們創建一個新的 Symfony 骨架項目,然后進入新創建的項目目錄。 ```php $ composer require twig annot validator ``` 我們安裝了三個基本的 Symfony 包:`twig`,`annot`和`validator`。 包可能具有別名。 例如,`symfony/validator`具有兩個別名:`validator`和`validation`。 有關更多詳細信息,請檢查 [Symfony 食譜服務器](https://flex.symfony.com/)。 ```php $ composer require symfony/security-csrf $ composer require symfony/monolog-bundle ``` 跨站點請求偽造需要`security-csrf`包,而日志記錄則需要`monolog-bundle`包。 ```php $ composer require symfony/property-access ``` 我們安裝了`PropertyAccess`組件,該組件用于方便讀取和寫入對象和數組的屬性/鍵。 ```php $ composer require maker server --dev ``` 我們安裝制造商組件和開發服務器。 ```php $ php bin/console make:controller HomeController ``` 我們創建一個`HomeController`。 控制器將表單發送給客戶端。 `src/Controller/HomeController.php` ```php <?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; class HomeController extends AbstractController { /** * @Route("/home", name="home") */ public function index() { return $this->render('home/index.html.twig'); } } ``` 這是一個簡單的控制器,可將包含 Web 表單的視圖發送給用戶。 ```php $ php bin/console make:controller MessageController ``` 我們創建一個`MessageController`來響應表單提交。 `src/Controller/MessageController.php` ```php <?php namespace App\Controller; use App\Service\ValidationService; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class MessageController extends AbstractController { /** * @Route("/message", name="message") */ public function index(Request $request, ValidationService $validator) { $token = $request->get("token"); $valid = $validator->validateToken($token); if (!$valid) { return new Response("Operation not allowed", Response::HTTP_BAD_REQUEST, ['content-type' => 'text/plain']); } $name = $request->request->get("name"); $email = $request->request->get("email"); $input = ['name' => $name, 'email' => $email]; $errorMessages = $validator->validateInput($input); if (count($errorMessages) > 0) { $session = $request->getSession(); $session->set('name', $name); $session->set('email', $email); foreach ($errorMessages as $key => $val) { $this->addFlash($key, $val); } return $this->redirectToRoute('home'); } else { return new Response("User saved", Response::HTTP_OK, ['content-type' => 'text/plain']); } } } ``` 在`MessageController`中,我們檢查 CSRF 令牌,驗證表單輸入值,并將響應發送回客戶端。 ```php public function index(Request $request, ValidationService $validator) { ``` 驗證委派給`ValidationService`,后者被注入到方法中。 ```php $token = $request->get("token"); $valid = $validator->validateToken($token); if (!$valid) { return new Response("Operation not allowed", Response::HTTP_BAD_REQUEST, ['content-type' => 'text/plain']); } ``` 我們獲得 CSRF 令牌并對其進行驗證。 如果驗證失敗,我們將帶有錯誤消息的響應發送回客戶端。 ```php $name = $request->request->get("name"); $email = $request->request->get("email"); $input = ['name' => $name, 'email' => $email]; $errorMessages = $validator->validateInput($input); ``` 我們檢索表單輸入值,并使用驗證服務對其進行驗證。 如果驗證服務失敗,它將返回錯誤消息。 ```php if (count($errorMessages) > 0) { $session = $request->getSession(); $session->set('name', $name); $session->set('email', $email); ... ``` 如果有一些錯誤消息,我們將輸入值添加到會話中,以便我們可以在重定向后檢索它們。 ```php foreach ($errorMessages as $key => $val) { $this->addFlash($key, $val); } ``` 我們將消息添加到 Flash 包中; 閃存袋用于存儲臨時消息,例如我們的驗證消息。 ```php return $this->redirectToRoute('home'); ``` 我們使用`redirectToRoute()`重定向回表單。 `src/Service/ValidationService.php` ```php <?php namespace App\Service; use Psr\Log\LoggerInterface; use Symfony\Component\Security\Csrf\CsrfToken; use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Validator\ValidatorInterface; use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface; use Symfony\Component\PropertyAccess\PropertyAccessorInterface; class ValidationService { private $tokenManager; private $validator; private $accessor; private $logger; public function __construct(CsrfTokenManagerInterface $tokenManager, ValidatorInterface $validator, PropertyAccessorInterface $accessor, LoggerInterface $logger) { $this->tokenManager = $tokenManager; $this->validator = $validator; $this->accessor = $accessor; $this->logger = $logger; } public function validateToken($token): bool { $csrf_token = new CsrfToken('myform', $token); $isValid = $this->tokenManager->isTokenValid($csrf_token); if (!$isValid) { $this->logger->error("CSRF failure"); } return $isValid; } public function validateInput(array $input): array { $constraints = new Assert\Collection([ 'name' => [new Assert\Length(['min' => 2]), new Assert\NotBlank], 'email' => [new Assert\Email, new Assert\NotBlank], ]); $violations = $this->validator->validate($input, $constraints); if (count($violations) > 0) { $this->logger->info("Validation failed"); $messages = []; foreach ($violations as $violation) { $this->accessor->setValue($messages, $violation->getPropertyPath(), $violation->getMessage()); } return $messages; } else { return []; } } } ``` `ValidationService`檢查 CSRF 令牌并驗證輸入。 ```php public function __construct(CsrfTokenManagerInterface $tokenManager, ValidatorInterface $validator, PropertyAccessorInterface $accessor, LoggerInterface $logger) { $this->tokenManager = $tokenManager; $this->validator = $validator; $this->accessor = $accessor; $this->logger = $logger; } ``` 我們在構造器中注入了四個對象:令牌管理器,驗證器,屬性訪問器和記錄器。 ```php public function validateToken($token): bool { $csrf_token = new CsrfToken('myform', $token); $isValid = $this->tokenManager->isTokenValid($csrf_token); if (!$isValid) { $this->logger->error("CSRF failure"); } return $isValid; } ``` 此代碼使用令牌管理器驗證 CSRF 令牌。 ```php $constraints = new Assert\Collection([ 'name' => [new Assert\Length(['min' => 2]), new Assert\NotBlank], 'email' => [new Assert\Email, new Assert\NotBlank], ]); ``` 這些是驗證表單輸入的約束。 ```php $violations = $this->validator->validate($input, $constraints); ``` 使用驗證器,我們可以驗證表單輸入值。 ```php if (count($violations) > 0) { $this->logger->info("Validation failed"); $messages = []; foreach ($violations as $violation) { $this->accessor->setValue($messages, $violation->getPropertyPath(), $violation->getMessage()); } return $messages; } else { return []; } ``` 如果存在一些違規行為,我們將記錄故障并生成驗證錯誤消息。 為了構建消息,我們利用 Symfony 屬性訪問器。 如果沒有違規,我們將返回一個空數組。 `templates/home/index.html.twig` ```php {% extends 'base.html.twig' %} {% block title %}Home page{% endblock %} {% block stylesheets %} <style> .topmargin { margin-top: 10px; } </style> {% endblock %} {% block body %} <section class="ui container topmargin"> <form class="ui form" action="message" method="post"> <input type="hidden" name="token" value="{{ csrf_token('myform') }}" /> {% for msg in app.flashes('name') %} <div class="ui small red message"> {{ msg }} </div> {% endfor %} <div class="field"> <label>Name:</label> <input type="text" name="name" value="{{app.session.get('name')}}"> </div> {% for msg in app.flashes('email') %} <div class="ui small red message"> {{ msg }} </div> {% endfor %} <div class="field"> <label>Email</label> <input type="text" name="email" , value="{{app.session.get('email')}}"> </div> <button class="ui button" type="submit">Send</button> </form> </section> {% endblock %} ``` 主頁上有一個表格。 該表格包含兩個字段:姓名和電子郵件。 ```php <input type="hidden" name="token" value="{{ csrf_token('myform') }}" /> ``` 它還包含一個隱藏字段,以防止跨站點請求偽造。 ```php {% for msg in app.flashes('name') %} <div class="ui small red message"> {{ msg }} </div> {% endfor %} ``` 如果閃存包中有一些錯誤消息,我們將顯示它們。 ```php <input type="text" name="name" value="{{app.session.get('name')}}"> ``` 輸入標簽從會話中檢索其值(如果有)。 重定向到表單后,這很有用。 `templates/base.html.twig` ```php <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>{% block title %}Welcome!{% endblock %}</title> <link href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css" rel="stylesheet"> {% block stylesheets %}{% endblock %} </head> <body> {% block body %}{% endblock %} <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.1/semantic.min.js"></script> {% block javascripts %}{% endblock %} </body> </html> ``` 這是基本的 Twig 模板。 它包含語義 UI CSS 框架。 在本教程中,我們驗證了 Symfony 應用中的簡單表單。 您可能也對以下相關教程感興趣: [Symfony 簡介](/symfony/intro/), [Symfony 服務教程](/symfony/service/), [Symfony Flash 消息](/symfony/flash/), [Symfony 表單教程](/symfony/form/) , [PHP 教程](/lang/php/)或列出[所有 Symfony 教程](/all/#symfony)。 {% endraw %}
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看