{"id":1048,"date":"2025-06-12T11:25:48","date_gmt":"2025-06-12T03:25:48","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1048.html"},"modified":"2025-06-12T11:25:48","modified_gmt":"2025-06-12T03:25:48","slug":"%e5%a6%82%e4%bd%95%e5%9c%a8-symfony-%e4%b8%ad%e9%aa%8c%e8%af%81%e8%b7%af%e7%94%b1%e5%8f%82%e6%95%b0","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1048.html","title":{"rendered":"\u5982\u4f55\u5728 Symfony \u4e2d\u9a8c\u8bc1\u8def\u7531\u53c2\u6570"},"content":{"rendered":"<div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--1\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/dyA-1-400x300.jpg\" alt=\"Bug&#32534;&#35793;&#29422;\" class=\"wp-image-1842\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">Bug&#32534;&#35793;&#29422;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#22312; Symfony &#20013;&#65292;&#39564;&#35777;&#36335;&#30001;&#21442;&#25968;&#21487;&#20197;&#36890;&#36807;&#22810;&#31181;&#26041;&#24335;&#23454;&#29616;&#65292;&#21253;&#25324;&#20351;&#29992;&#27880;&#35299;&#21644;&#33258;&#23450;&#20041;&#39564;&#35777;&#22120;&#12290;&#19979;&#38754;&#25105;&#23558;&#35814;&#32454;&#20171;&#32461;&#36825;&#20004;&#31181;&#26041;&#27861;&#12290;<\/p>\n<h3>&#20351;&#29992;&#27880;&#35299;<\/h3>\n<ol>\n<li>\n<p><strong>&#23433;&#35013; Symfony &#23433;&#20840;&#32452;&#20214;<\/strong>&#65306;\n&#39318;&#20808;&#65292;&#30830;&#20445;&#20320;&#24050;&#32463;&#23433;&#35013;&#20102; Symfony &#30340;&#23433;&#20840;&#32452;&#20214;&#12290;&#22914;&#26524;&#27809;&#26377;&#23433;&#35013;&#65292;&#21487;&#20197;&#20351;&#29992; Composer &#36827;&#34892;&#23433;&#35013;&#65306;<\/p>\n<pre><code class=\"language-bash\">composer require symfony\/security-bundle<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#21019;&#24314;&#25511;&#21046;&#22120;<\/strong>&#65306;\n&#21019;&#24314;&#19968;&#20010;&#25511;&#21046;&#22120;&#26469;&#22788;&#29702;&#36335;&#30001;&#35831;&#27714;&#65292;&#24182;&#20351;&#29992;&#27880;&#35299;&#26469;&#39564;&#35777;&#21442;&#25968;&#12290;<\/p>\n<pre><code class=\"language-php\">namespace AppController;\n\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentRoutingAnnotationRoute;\nuse SymfonyComponentSecurityCoreAuthenticationTokenStorageTokenStorageInterface;\nuse SymfonyComponentSecurityCoreUserUserInterface;\nuse SymfonyComponentValidatorValidatorInterface;\n\nclass UserController extends AbstractController\n{\n   private $tokenStorage;\n   private $validator;\n\n   public function __construct(TokenStorageInterface $tokenStorage, ValidatorInterface $validator)\n   {\n       $this-&gt;tokenStorage = $tokenStorage;\n       $this-&gt;validator = $validator;\n   }\n\n   \/**\n    * @Route(\"\/user\/{id}\", name=\"show_user\")\n    *\/\n   public function showUser($id)\n   {\n       \/\/ &#33719;&#21462;&#24403;&#21069;&#29992;&#25143;\n       $user = $this-&gt;getUser();\n\n       \/\/ &#26816;&#26597;&#29992;&#25143;&#26159;&#21542;&#20855;&#26377;&#26597;&#30475;&#35813;&#29992;&#25143;&#30340;&#26435;&#38480;\n       if ($user !== null &amp;&amp; !$user-&gt;isGranted('VIEW_USER', $user)) {\n           throw new SymfonyComponentHttpExceptionResponse(\"You do not have permission to view this user.\", 403);\n       }\n\n       \/\/ &#33719;&#21462;&#29992;&#25143;&#20449;&#24687;\n       $userInformation = [\n           'id' =&gt; $id,\n           'name' =&gt; $user-&gt;getName(),\n           'email' =&gt; $user-&gt;getEmail(),\n       ];\n\n       return $this-&gt;render('user\/show.html.twig', ['userInformation' =&gt; $userInformation]);\n   }\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#20351;&#29992; <code>@Route<\/code> &#27880;&#35299;&#26469;&#23450;&#20041;&#36335;&#30001;&#65292;&#24182;&#36890;&#36807; <code>@Security<\/code> &#27880;&#35299;&#26469;&#39564;&#35777;&#29992;&#25143;&#26435;&#38480;&#12290;<\/p>\n<\/li>\n<\/ol>\n<h3>&#33258;&#23450;&#20041;&#39564;&#35777;&#22120;<\/h3>\n<p>&#22914;&#26524;&#20320;&#38656;&#35201;&#26356;&#22797;&#26434;&#30340;&#39564;&#35777;&#36923;&#36753;&#65292;&#21487;&#20197;&#32534;&#20889;&#33258;&#23450;&#20041;&#39564;&#35777;&#22120;&#12290;<\/p>\n<ol>\n<li>\n<p><strong>&#21019;&#24314;&#33258;&#23450;&#20041;&#39564;&#35777;&#22120;&#31867;<\/strong>&#65306;\n&#21019;&#24314;&#19968;&#20010;&#33258;&#23450;&#20041;&#39564;&#35777;&#22120;&#31867;&#65292;&#32487;&#25215; <code>SymfonyComponentValidatorConstraintValidator<\/code>.<\/p>\n<pre><code class=\"language-php\">namespace AppValidator;\n\nuse SymfonyComponentValidatorConstraint;\nuse SymfonyComponentValidatorExceptionUnexpectedValueException;\n\nclass UserIdConstraint extends Constraint\n{\n   public $message = 'The ID is invalid.';\n}\n\nclass UserIdValidator implements ConstraintValidatorInterface\n{\n   public function validate($value, Constraint $constraint)\n   {\n       if (!is_int($value) || $value &lt;= 0) {\n           throw new UnexpectedValueException($value, 'int');\n       }\n   }\n}<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#37197;&#32622;&#39564;&#35777;&#22120;<\/strong>&#65306;\n&#22312;&#25511;&#21046;&#22120;&#20013;&#37197;&#32622;&#39564;&#35777;&#22120;&#12290;<\/p>\n<pre><code class=\"language-php\">namespace AppController;\n\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentRoutingAnnotationRoute;\nuse SymfonyComponentSecurityCoreAuthenticationTokenStorageTokenStorageInterface;\nuse SymfonyComponentSecurityCoreUserUserInterface;\nuse SymfonyComponentValidatorValidatorInterface;\n\nclass UserController extends AbstractController\n{\n   private $tokenStorage;\n   private $validator;\n\n   public function __construct(TokenStorageInterface $tokenStorage, ValidatorInterface $validator)\n   {\n       $this-&gt;tokenStorage = $tokenStorage;\n       $this-&gt;validator = $validator;\n   }\n\n   \/**\n    * @Route(\"\/user\/{id}\", name=\"show_user\")\n    *\/\n   public function showUser($id)\n   {\n       \/\/ &#33719;&#21462;&#24403;&#21069;&#29992;&#25143;\n       $user = $this-&gt;getUser();\n\n       \/\/ &#28155;&#21152;&#33258;&#23450;&#20041;&#39564;&#35777;&#22120;\n       $this-&gt;addCustomConstraint(new UserIdConstraint());\n\n       \/\/ &#33719;&#21462;&#29992;&#25143;&#20449;&#24687;\n       $userInformation = [\n           'id' =&gt; $id,\n           'name' =&gt; $user-&gt;getName(),\n           'email' =&gt; $user-&gt;getEmail(),\n       ];\n\n       return $this-&gt;render('user\/show.html.twig', ['userInformation' =&gt; $userInformation]);\n   }\n\n   protected function addCustomConstraint(Constraint $constraint)\n   {\n       $this-&gt;validator-&gt;addConstraint($constraint);\n   }\n}<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>&#36890;&#36807;&#20197;&#19978;&#20004;&#31181;&#26041;&#27861;&#65292;&#20320;&#21487;&#20197;&#28789;&#27963;&#22320;&#39564;&#35777; Symfony &#36335;&#30001;&#21442;&#25968;&#65292;&#30830;&#20445;&#25968;&#25454;&#30340;&#23433;&#20840;&#24615;&#21644;&#23436;&#25972;&#24615;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--2\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/zp-400x300.jpg\" alt=\"&#40657;&#26495;Bug&#35762;&#24072;\" class=\"wp-image-1849\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#40657;&#26495;Bug&#35762;&#24072;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<body><h2>&#20171;&#32461;<\/h2><p>&#22312;Symfony&#20013;&#39564;&#35777;&#36335;&#30001;&#21442;&#25968;&#26159;&#19968;&#39033;&#26500;&#24314;&#31283;&#20581;&#19988;&#23433;&#20840;&#30340;Web&#24212;&#29992;&#31243;&#24207;&#30340;&#20851;&#38190;&#26041;&#38754;&#12290;&#22312;&#36825;&#31687;&#25351;&#21335;&#20013;&#65292;&#25105;&#20204;&#23558;&#25506;&#35752;&#22914;&#20309;&#21033;&#29992;Symfony&#20869;&#32622;&#30340;&#39564;&#35777;&#26426;&#21046;&#26469;&#30830;&#20445;&#24744;&#30340;&#36335;&#30001;&#21442;&#25968;&#31526;&#21512;&#24744;&#30340;&#35201;&#27714;&#65292;&#22312;&#23427;&#20204;&#21040;&#36798;&#25511;&#21046;&#22120;&#25805;&#20316;&#20043;&#21069;&#23601;&#36827;&#34892;&#39564;&#35777;&#12290;<\/p><h3>&#29702;&#35299;&#36335;&#30001;&#21442;&#25968;&#65288;Route Parameters&#65289;<\/h3><p>Symfony&#36335;&#30001;&#21442;&#25968;&#26159;&#22312;&#36335;&#30001;&#36335;&#24452;&#20013;&#30340;&#21160;&#24577;&#37096;&#20998;&#12290;&#20363;&#22914;&#65292;&#22312;&#31867;&#20284;&#20110;&#30340;&#36335;&#30001;&#27169;&#24335;&#20013;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992;&#36825;&#20123;&#21442;&#25968;&#26469;&#21019;&#24314;&#20855;&#26377;&#19981;&#21516;&#34892;&#20026;&#30340;URL&#12290;<code>\/article\/{id}<\/code>&#20320;&#22909;&#65292;&#35831;&#38382;&#26377;&#20160;&#20040;&#25105;&#21487;&#20197;&#24110;&#21161;&#20320;&#30340;&#21527;&#65311;<code>{id}<\/code>&#37096;&#20998;&#26159;&#19968;&#20010;&#20250;&#26367;&#25442;&#20026;&#23454;&#38469;&#25991;&#31456;ID&#30340;&#36335;&#30001;&#21442;&#25968;&#65292;&#24403;&#36335;&#30001;&#21305;&#37197;&#26102;&#12290;&#39564;&#35777;&#36825;&#20123;&#21442;&#25968;&#38750;&#24120;&#37325;&#35201;&#65292;&#20197;&#38450;&#27490;&#28508;&#22312;&#30340;&#38382;&#39064;&#65292;&#27604;&#22914;&#31867;&#22411;&#19981;&#21305;&#37197;&#12289;&#26080;&#25928;&#26684;&#24335;&#25110;SQL&#27880;&#20837;&#31561;&#23433;&#20840;&#28431;&#27934;&#12290;<\/p><h2>&#22522;&#26412;&#21442;&#25968;&#39564;&#35777;<\/h2><p>&#39318;&#20808;&#36827;&#34892;&#22522;&#26412;&#30340;&#39564;&#35777;&#65292;&#24744;&#21487;&#20197;&#30452;&#25509;&#22312;&#36335;&#30001;&#37197;&#32622;&#20013;&#20351;&#29992;Symfony&#32422;&#26463;&#12290;&#20363;&#22914;&#65306;\n# &#22312;routing.yml&#25991;&#20214;&#20013;&#23450;&#20041;\nbasic_validation_route:\n path: \/basic-validation\n defaults: { _controller: AppControllerBasicValidationController::handle }\n requirements:\n id: d+\n&#28982;&#21518;&#65292;&#22312;&#25511;&#21046;&#22120;&#20013;&#23454;&#29616;&#30456;&#24212;&#30340;&#22788;&#29702;&#36923;&#36753;&#65306;\n\/\/ &#22312;App\/Controller\/BasicValidationController.php&#20013;&#23450;&#20041;\nnamespace AppController;\n\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentRoutingAnnotationRoute;\n\nclass BasicValidationController extends AbstractController\n{\n \/**\n * @Route(&#8220;\/basic-validation\/{id}&#8221;, name=&#8221;basic_validation_route&#8221;)\n *\/\n public function handle(Request $request)\n {\n \/\/ &#26816;&#26597;ID&#26159;&#21542;&#20026;&#25972;&#25968;\n if (!is_numeric($request-&gt;get(&#8216;id&#8217;))) {\n throw new NotFoundHttpException(&#8220;Invalid ID&#8221;);\n }\n\n return [\n &#8216;message&#8217; =&gt; &#8220;The request is valid&#8221;,\n ];\n }\n}\n&#36825;&#27573;&#20195;&#30721;&#39318;&#20808;&#26816;&#26597;&#35831;&#27714;&#20013;&#30340;id&#21442;&#25968;&#26159;&#21542;&#20026;&#25972;&#25968;&#12290;&#22914;&#26524;&#19981;&#26159;&#65292;&#21017;&#25243;&#20986;&#19968;&#20010;404&#38169;&#35823;&#12290;&#22914;&#26524;&#26377;&#25928;&#65292;&#21017;&#36820;&#22238;&#19968;&#20010;&#25104;&#21151;&#28040;&#24687;&#12290;\n&#27880;&#24847;&#65306;&#36825;&#37324;&#20165;&#25552;&#20379;&#20102;&#19968;&#20010;&#31616;&#21333;&#30340;&#31034;&#20363;&#65292;&#23454;&#38469;&#24212;&#29992;&#20013;&#21487;&#33021;&#38656;&#35201;&#26681;&#25454;&#20855;&#20307;&#38656;&#27714;&#35843;&#25972;&#39564;&#35777;&#35268;&#21017;&#21644;&#22788;&#29702;&#36923;&#36753;&#12290;<\/p><pre><code>app.article_show:\n  path: \/article\/{id}\n  controller: AppControllerArticleController::show\n  requirements:\n    id: 'd+'\n<\/code><\/pre><p>&#35813;&#37197;&#32622;&#30830;&#20445;&#20102;&#36825;&#19968;&#28857;&#12290;<code>id<\/code>&#21442;&#25968;&#24517;&#39035;&#26159;&#19968;&#20010;&#25968;&#23383;&#65288;&#25110;&#19968;&#32452;&#25968;&#23383;&#65289;&#12290;&#22914;&#26524;&#29992;&#25143;&#23581;&#35797;&#36890;&#36807;&#38750;&#25968;&#23383;&#23383;&#31526;&#35775;&#38382;&#36825;&#20010;&#36335;&#30001;&#65292;&#37027;&#20040;&#21487;&#33021;&#20250;&#24341;&#21457;&#38169;&#35823;&#12290;<code>id<\/code>&#21442;&#25968;&#65292;&#36820;&#22238;&#19968;&#20010;404&#21709;&#24212;&#12290;<\/p><h2>&#20351;&#29992;&#27880;&#35299;&#36827;&#34892;&#39564;&#35777;<\/h2><p>&#22914;&#26524;&#20320;&#26356;&#21916;&#27426;&#20351;&#29992;&#27880;&#37322;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992;&#12290;<code>@ParamConverter<\/code>&#19982;&#32422;&#26463;&#30456;&#32467;&#21512;&#65292;&#21487;&#20197;&#36798;&#21040;&#30456;&#21516;&#30340;&#25928;&#26524;&#12290;&#39318;&#20808;&#65292;&#35831;&#30830;&#20445;&#24050;&#23433;&#35013;SensioFrameworkExtraBundle&#12290;<\/p><pre><code>composer require sensio\/framework-extra-bundle<\/code><\/pre><p>&#28982;&#21518;&#22312;&#20320;&#30340;&#25511;&#21046;&#22120;&#20013;&#65306;<\/p><pre><code>use SensioBundleFrameworkExtraBundleConfigurationParamConverter;\nuse SymfonyComponentValidationConstraints as Assert;\n\n\/**\n * @Route(\"\/article\/{id}\", name=\"article_show\")\n * @ParamConverter(\"id\", constraints={\n *     @AssertNotNull,\n *     @AssertType(type=\"digit\")\n * })\n *\/\npublic function show($id)\n{\n  \/\/ ...\n}\n<\/code><\/pre><p>&#36825;&#20010;&#20250;&#36716;&#25442;&#25104;&hellip;&hellip;<code>id<\/code>&#22312;&#35843;&#29992;&#25511;&#21046;&#22120;&#21160;&#20316;&#20043;&#21069;&#65292;&#20808;&#20351;&#29992;&#23450;&#20041;&#30340;&#32422;&#26463;&#39564;&#35777;&#36335;&#30001;&#21442;&#25968;&#12290;<\/p><h2>&#39640;&#32423;&#21442;&#25968;&#36716;&#25442;&#21644;&#39564;&#35777;<\/h2><p>&#23545;&#20110;&#26356;&#22797;&#26434;&#30340;&#39564;&#35777;&#22330;&#26223;&#65292;&#20320;&#21487;&#20197;&#23454;&#29616;&#33258;&#23450;&#20041;&#21442;&#25968;&#36716;&#25442;&#22120;&#12290;&#35753;&#25105;&#20204;&#28436;&#31034;&#19968;&#20010;&#33258;&#23450;&#20041;&#36716;&#25442;&#22120;&#65292;&#35813;&#36716;&#25442;&#22120;&#30830;&#20445;&#25552;&#20379;&#30340;&#29992;&#25143;&#21517;&#23384;&#22312;&#20110;&#25968;&#25454;&#24211;&#20013;&#65292;&#24182;&#23558;&#20854;&#36716;&#25442;&#20026;User&#23545;&#35937;&#12290;<\/p><pre><code>use SensioBundleFrameworkExtraBundleConfigurationParamConverter;\nuse SensioBundleFrameworkExtraBundleRequestParamConverterParamConverterInterface;\nuse SensioBundleFrameworkExtraBundleConfigurationRoute;\nuse SymfonyComponentHttpFoundationRequest;\nuse DoctrineORMEntityManagerInterface;\n\nclass UserParamConverter implements ParamConverterInterface\n{\n  private $entityManager;\n\n  \/\/ ...\n\n  public function apply(Request $request, ParamConverter $configuration)\n  {\n    $username = $request-&gt;attributes-&gt;get('username');\n    \/\/ Perform database lookup...\n    \/\/ If the user is not found, throw an exception...\n  }\n\n  public function supports(ParamConverter $configuration)\n  {\n    \/\/ ...\n  }\n}\n<\/code><\/pre><p>&#36825;&#20010;&#33258;&#23450;&#20041;&#36716;&#25442;&#22120;&#38656;&#35201;&#22312;&#26381;&#21153;&#37197;&#32622;&#20013;&#36827;&#34892;&#26631;&#35760;&#65292;&#20197;&#20415;Symfony&#33021;&#22815;&#35782;&#21035;&#23427;&#12290;<\/p><h2>&#22312;&#33258;&#23450;&#20041;&#26381;&#21153;&#20013;&#39564;&#35777;&#32422;&#26463;<\/h2><p>&#26377;&#26102;&#65292;&#24744;&#21487;&#33021;&#24076;&#26395;&#22312;&#26381;&#21153;&#23618;&#32780;&#19981;&#26159;&#25511;&#21046;&#22120;&#23618;&#39564;&#35777;&#32422;&#26463;&#12290;&#22312;&#36825;&#31181;&#24773;&#20917;&#19979;&#65292;&#24744;&#21487;&#20197;&#21033;&#29992;Symfony&#30340;Validator&#26381;&#21153;&#12290;<\/p><pre><code>use SymfonyComponentValidatorValidatorValidatorInterface;\n\nclass MyService\n{\n    private $validator;\n\n    public function __construct(ValidatorInterface $validator)\n    {\n        $this-&gt;validator = $validator;\n    }\n\n    public function validateUser($user)\n    {\n        $errors = $this-&gt;validator-&gt;validate($user);\n\n        if (count($errors) &gt; 0) {\n            \/\/ Handle errors...\n        }\n    }\n}\n<\/code><\/pre><p>&#36825;&#26679;&#65292;&#20320;&#21487;&#20197;&#25163;&#21160;&#35843;&#29992;&#39564;&#35777;&#22120;&#26469;&#23545;&#26381;&#21153;&#20013;&#30340;&#20219;&#20309;&#23545;&#35937;&#24212;&#29992;&#32422;&#26463;&#12290;<\/p><h2>&#32467;&#35770;&#12290;<\/h2><p>&#32508;&#19978;&#25152;&#36848;&#65292;&#22312;Symfony&#20013;&#39564;&#35777;&#36335;&#30001;&#21442;&#25968;&#38750;&#24120;&#31616;&#21333;&#19988;&#33267;&#20851;&#37325;&#35201;&#65292;&#36825;&#23545;&#20110;&#32500;&#25252;&#23433;&#20840;&#21644;&#31283;&#23450;&#30340;&#24212;&#29992;&#31243;&#24207;&#38750;&#24120;&#37325;&#35201;&#12290;&#20174;&#22522;&#26412;&#27169;&#24335;&#21040;&#33258;&#23450;&#20041;&#36716;&#25442;&#22120;&#21644;&#26381;&#21153;&#32423;&#39564;&#35777;&#65292;Symfony&#25552;&#20379;&#20102;&#30830;&#20445;&#24744;&#30340;&#24212;&#29992;&#33021;&#22815;&#24179;&#31283;&#22788;&#29702;&#25509;&#25910;&#21040;&#30340;&#25968;&#25454;&#25152;&#38656;&#30340;&#24037;&#20855;&#12290;<\/p><\/body>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--3\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/xygcfznnzczhsdmwydzhsmzzzmddnq-400x300.jpg\" alt=\"&#38271;&#24037;&#30721;&#22900;1523\" class=\"wp-image-2906\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#38271;&#24037;&#30721;&#22900;1523<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#22312; Symfony &#20013;&#39564;&#35777;&#36335;&#30001;&#21442;&#25968;&#26159;&#36890;&#36807;&#20351;&#29992; <code>RouteParamConverter<\/code> &#25110;&#32773; <code>RequestParametersConverter<\/code> &#26469;&#23454;&#29616;&#30340;&#12290;&#19979;&#38754;&#25105;&#23558;&#20998;&#21035;&#20171;&#32461;&#36825;&#20004;&#31181;&#26041;&#27861;&#12290;<\/p>\n<h3>1. &#20351;&#29992; RouteParamConverter<\/h3>\n<p><strong>&#21407;&#29702;<\/strong>: &#36335;&#30001;&#21442;&#25968;&#36716;&#25442;&#22120;&#65288;RouteParamConverter&#65289;&#20801;&#35768;&#20320;&#22312;&#36335;&#30001;&#23450;&#20041;&#26102;&#23601;&#28155;&#21152;&#39069;&#22806;&#30340;&#26816;&#26597;&#21644;&#39564;&#35777;&#26465;&#20214;&#12290;<\/p>\n<h4>&#31034;&#20363;&#20195;&#30721;&#65306;<\/h4>\n<pre><code class=\"language-php\">use SymfonyComponentRoutingGeneratorUrlGeneratorInterface;\nuse SymfonyComponentRoutingRouteCollection;\n\nclass MyController\n{\n    public function myAction()\n    {\n        $routeParams = $this-&gt;get('request')-&gt;attributes-&gt;all();\n\n        \/\/ &#26816;&#26597;&#36335;&#30001;&#21442;&#25968;&#26159;&#21542;&#20026;&#31354;&#25110;&#32773;&#19981;&#21512;&#27861;\n        if (!isset($routeParams['param']) || !is_string($routeParams['param'])) {\n            throw new Exception(\"Invalid route parameter\");\n        }\n\n        return \"Hello, \" . $routeParams['param'];\n    }\n}<\/code><\/pre>\n<h4>&#31034;&#20363;&#37197;&#32622;&#25991;&#20214;:<\/h4>\n<pre><code class=\"language-yaml\">my_route:\n    path: '\/example'\n    constraints:\n        param: { type: string, required: true }<\/code><\/pre>\n<h3>2. &#20351;&#29992; RequestParametersConverter<\/h3>\n<p><strong>&#21407;&#29702;<\/strong>: &#35831;&#27714;&#21442;&#25968;&#36716;&#25442;&#22120;&#65288;RequestParametersConverter&#65289;&#21487;&#20197;&#22312;&#35831;&#27714;&#22788;&#29702;&#20043;&#21069;&#23545;&#35831;&#27714;&#21442;&#25968;&#36827;&#34892;&#39564;&#35777;&#12290;<\/p>\n<h4>&#31034;&#20363;&#20195;&#30721;&#65306;<\/h4>\n<pre><code class=\"language-php\">use SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentHttpKernelExceptionBadRequestHttpException;\n\nclass MyController\n{\n    public function myAction(Request $request)\n    {\n        $routeParams = $request-&gt;attributes-&gt;all();\n\n        if (empty($routeParams)) {\n            throw new BadRequestHttpException('No route parameters provided');\n        }\n\n        if (!isset($routeParams['param']) || !is_string($routeParams['param'])) {\n            throw new BadRequestHttpException('Invalid route parameter');\n        }\n\n        return \"Hello, \" . $routeParams['param'];\n    }\n}<\/code><\/pre>\n<h4>&#31034;&#20363;&#37197;&#32622;&#25991;&#20214;:<\/h4>\n<pre><code class=\"language-yaml\">my_route:\n    path: '\/example'\n    requirements:\n        param: '[a-zA-Z0-9]+'<\/code><\/pre>\n<p>&#36825;&#20004;&#31181;&#26041;&#27861;&#37117;&#21487;&#20197;&#24110;&#21161;&#20320;&#26377;&#25928;&#22320;&#39564;&#35777;&#36335;&#30001;&#21442;&#25968;&#12290;&#22312;&#23454;&#38469;&#24212;&#29992;&#20013;&#65292;&#20320;&#21487;&#20197;&#26681;&#25454;&#38656;&#35201;&#36873;&#25321;&#21512;&#36866;&#30340;&#26041;&#27861;&#65292;&#24182;&#32467;&#21512;&#20854;&#20182;&#21151;&#33021;&#22914;&#39564;&#35777; HTTP &#26041;&#27861;&#12289;URL &#31561;&#26469;&#25552;&#39640;&#24212;&#29992;&#31243;&#24207;&#30340;&#23433;&#20840;&#24615;&#21644;&#29992;&#25143;&#20307;&#39564;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; &#22312; Symfony &#20013;&#65292;&#39564;&#35777;&#36335;&#30001;&#21442;&#25968;&#21487;&#20197;&#36890;&#36807;&#22810;&#31181;&#038;#2..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[45],"tuisongtax":[],"class_list":["post-1048","my1js","type-my1js","status-publish","hentry","my1js2nav-symfony"],"acf":{"qian_art_seotitle":"","qian_art_seotitle_source":{"label":"SEO\u6807\u9898","type":"text","formatted_value":""},"qian_art_seokws":"","qian_art_seokws_source":{"label":"SEO\u5173\u952e\u8bcd","type":"text","formatted_value":""},"qian_art_stzhong":"","qian_art_stzhong_source":{"label":"\u4e2d | \u77ed\u6807\u9898","type":"text","formatted_value":""}},"_links":{"self":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js\/1048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js"}],"about":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/types\/my1js"}],"author":[{"embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/users\/1"}],"wp:attachment":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/media?parent=1048"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1048"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1048"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}