<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                {% raw %} # Symfony 驗證教程 > 原文: [http://zetcode.com/symfony/validation/](http://zetcode.com/symfony/validation/) Symfony 驗證教程展示了如何在 Symfony 應用中驗證數據。 在本教程中,我們使用手動驗證。 我們不使用教義注解。 ## Symfony Symfony 是一組可重用的 PHP 組件和一個用于 Web 項目的 PHP 框架。 Symfony 于 2005 年發布為免費軟件。Symfony 的原始作者是 Fabien Potencier。 Symfony 的靈感來自 Ruby on Rails,Django 和 Spring 框架。 ## Symfony 驗證 來自用戶的輸入必須經過驗證。 Symfony 提供了`Validator`組件來執行驗證任務。 該組件基于 Java 的 Bean 驗證規范。 驗證器旨在針對約束驗證對象。 約束是對條件為真的斷言。 Symfony 具有許多內置約束,包括`NotBlank`,`Email`,`Length`和`Isbn`。 也可以創建自定義約束。 ## Symfony 驗證示例 在示例中,我們有一個簡單的表單,其中包含兩個字段:`name`和`email`。 提交表單后,我們使用 Symfony 的`Validator`手動驗證字段。 在示例中,我們使用`Length`,`NotBlank`和`Email`約束。 ### 安裝組件 ```php $ composer create-project symfony/skeleton myval $ cd myval ``` 我們創建一個新的 Symfony 項目,然后轉到項目目錄。 ```php $ composer req maker server --dev ``` 我們安裝`symfony/maker-bundle`和`symfony/web-server-bundle`。 這些對于開發模式很有用。 請注意,我們正在使用包的別名。 ```php $ composer req twig annotations ``` 我們安裝`twig-bundle`和注解。 注解位于`sensio/framework-extra-bundle`中。 ```php $ composer req validator ``` `symfony/validator`包包含 Symfony 驗證工具。 ```php $ composer req security-csrf $ composer req monolog $ composer req property-access ``` 跨站點請求偽造需要`symfony/security-csrf`包,`symfony/monolog-bundle`用于記錄日志,`symfony/property-access`用于操縱 PHP 屬性。 ### 構建 Symfony 應用 ```php $ php bin/console make:controller HomeController ``` 我們創建一個`HomeController`。 `src/Controller/HomeController.php` ```php <?php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class HomeController extends AbstractController { /** * @Route("/home", name="home") */ public function index(): Response { return $this->render('home/index.html.twig'); } } ``` 這是一個簡單的控制器,可將包含 Web 表單的視圖發送給用戶。 ```php $ php bin/console make:controller FormController ``` 我們創建一個`FormController`來響應表單提交。 `src/Controller/FormController.php` ```php <?php namespace App\Controller; use Psr\Log\LoggerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\PropertyAccess\PropertyAccess; use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Validator\ValidatorInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class FormController extends AbstractController { /** * @Route("/sendForm", name="form") */ public function index(Request $request, ValidatorInterface $validator, LoggerInterface $logger): Response { $token = $request->request->get("token"); if (!$this->isCsrfTokenValid('myform', $token)) { $logger->info("CSRF failure"); return new Response("Operation not allowed", Response::HTTP_OK, ['content-type' => 'text/plain']); } $name = $request->request->get("name"); $email = $request->request->get("email"); $input = ['name' => $name, 'email' => $email]; $constraints = new Assert\Collection([ 'name' => [new Assert\Length(['min' => 2]), new Assert\NotBlank], 'email' => [new Assert\Email(), new Assert\notBlank], ]); $violations = $validator->validate($input, $constraints); if (count($violations) > 0) { $accessor = PropertyAccess::createPropertyAccessor(); $errorMessages = []; foreach ($violations as $violation) { $accessor->setValue($errorMessages, $violation->getPropertyPath(), $violation->getMessage()); } return $this->render('form/violations.html.twig', ['errorMessages' => $errorMessages]); } else { return new Response("Validation passed", Response::HTTP_OK, ['content-type' => 'text/plain']); } } } ``` 在`FormController`中,我們檢查 CSRF 令牌,驗證表單輸入值,并將響應發送回客戶端。 > **注意**:為簡單起見,我們將驗證代碼放入控制器中。 在生產應用中,最好將此類代碼放在單獨的服務類中。 ```php public function index(Request $request, ValidatorInterface $validator, LoggerInterface $logger) { ``` 我們注入了請求對象,驗證器對象和記錄器對象。 ```php $token = $request->request->get("token"); if (!$this->isCsrfTokenValid('myform', $token)) { $logger->info("CSRF failure"); return new Response("Operation not allowed", Response::HTTP_OK, ['content-type' => 'text/plain']); } ``` 我們檢索令牌并使用`isCsrfTokenValid()`方法對其進行驗證。 ```php $name = $request->request->get("name"); $email = $request->request->get("email"); $input = ['name' => $name, 'email' => $email]; ``` 我們獲取請求輸入參數,并將其放入數組中。 ```php $constraints = new Assert\Collection([ 'name' => [new Assert\Length(['min' => 2]), new Assert\NotBlank], 'email' => [new Assert\Email(), new Assert\notBlank] ]); ``` 我們創建約束的集合。 我們可以為單個值分配多個約束。 ```php $violations = $validator->validate($input, $constraints); ``` 我們使用`validate()`方法對照約束條件驗證輸入數據。 該方法返回可能的違規。 Symfony 驗證器返回`ConstraintViolationList`。 我們使用 Symfony 訪問器來處理列表。 ```php if (count($violations) > 0) { ``` 我們檢查是否有違規行為。 ```php $accessor = PropertyAccess::createPropertyAccessor(); $errorMessages = []; foreach ($violations as $violation) { $accessor->setValue($errorMessages, $violation->getPropertyPath(), $violation->getMessage()); } ``` Symfony `PropertyAccess`用于在將違規消息發送到模板之前對其進行處理。 `ConstraintViolationList`轉換為 PHP 數組,其中的鍵是表單字段,值是錯誤消息。 稍后使用`for`指令在 Twig 中處理該數組。 ```php return $this->render('form/violations.html.twig', ['errorMessages' => $errorMessages]); ``` 我們在單獨的頁面中呈現錯誤消息。 這通常是使用 Flash 消息完成的。 看看 [Symfony 保持表單值教程](/symfony/keepformvalues/)如何使用 Flash。 ```php } else { return new Response("Validation passed", Response::HTTP_OK, ['content-type' => 'text/plain']); } ``` 如果一切正常,我們將發送一條簡單消息驗證已通過。 `templates/home/index.html.twig` ```php {% extends 'base.html.twig' %} {% block title %}Home page{% endblock %} {% block body %} <form action="sendForm" method="post"> <input type="hidden" name="token" value="{{ csrf_token('myform') }}" /> <div> <label>Name:</label> <input type="text" name="name"> </div> <div> <label>Email</label> <input type="email" name="email"> </div> <button type="submit">Send</button> </form> {% endblock %} ``` 該表格包含兩個字段:姓名和電子郵件。 ```php <input type="hidden" name="token" value="{{ csrf_token('myform') }}" /> ``` 它還包含一個隱藏字段,以防止跨站點請求偽造。 `templates/form/violations.html.twig` ```php {% extends 'base.html.twig' %} {% block title %}Violations{% endblock %} {% block body %} <h2>Validation failed</h2> <ul> {% for field, errorMessage in errorMessages %} <li>{{ field }}: {{ errorMessage }}</li> {% endfor %} </ul> {% endblock %} ``` 在違規視圖中,我們瀏覽違規并列出它們。 ```php {% for field, errorMessage in errorMessages %} <li>{{ field }}: {{ errorMessage }}</li> {% endfor %} ``` 使用`for`指令,我們遍歷錯誤消息并顯示錯誤消息。 `templates/base.html.twig` ```php <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>{% block title %}Welcome!{% endblock %}</title> {% block stylesheets %}{% endblock %} </head> <body> {% block body %}{% endblock %} {% block javascripts %}{% endblock %} </body> </html> ``` 這是基本的 Twig 模板。 ```php $ php bin/console server:run ``` 我們啟動開發服務器。 然后找到`localhost:8000/home`網址以獲取表格。 在本教程中,我們驗證了 Symfony 應用中的簡單表單。 我們使用了手動驗證。 您可能也對以下相關教程感興趣: [Symfony 簡介](/symfony/intro/), [Symfony DBAL 教程](/symfony/dbal/), [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>

                              哎呀哎呀视频在线观看