{"id":1098,"date":"2025-06-12T12:53:30","date_gmt":"2025-06-12T04:53:30","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1098.html"},"modified":"2025-06-12T12:53:30","modified_gmt":"2025-06-12T04:53:30","slug":"symfony%e5%8a%9f%e8%83%bd%e6%b5%8b%e8%af%95%e5%ae%8c%e5%85%a8%e6%8c%87%e5%8d%97","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1098.html","title":{"rendered":"Symfony\u529f\u80fd\u6d4b\u8bd5\u5b8c\u5168\u6307\u5357"},"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<h3>Symfony&#21151;&#33021;&#27979;&#35797;&#23436;&#20840;&#25351;&#21335;<\/h3>\n<p>&#22312;&#29616;&#20195;&#36719;&#20214;&#24320;&#21457;&#20013;&#65292;&#21151;&#33021;&#27979;&#35797;&#26159;&#30830;&#20445;&#36719;&#20214;&#25353;&#39044;&#26399;&#24037;&#20316;&#30340;&#37325;&#35201;&#29615;&#33410;&#12290;Symfony &#26159;&#19968;&#20010;&#27969;&#34892;&#30340; PHP &#26694;&#26550;&#65292;&#23427;&#25552;&#20379;&#20102;&#20016;&#23500;&#30340;&#24037;&#20855;&#21644;&#24211;&#26469;&#24110;&#21161;&#24320;&#21457;&#32773;&#36827;&#34892;&#21151;&#33021;&#27979;&#35797;&#12290;&#19979;&#38754;&#26159;&#19968;&#20221;&#35814;&#32454;&#30340; Symfony &#21151;&#33021;&#27979;&#35797;&#25351;&#21335;&#65292;&#21253;&#25324;&#21019;&#24314;&#27979;&#35797;&#29992;&#20363;&#12289;&#37197;&#32622;&#27979;&#35797;&#29615;&#22659;&#20197;&#21450;&#20351;&#29992;&#19968;&#20123;&#24120;&#29992;&#30340;&#27979;&#35797;&#24037;&#20855;&#12290;<\/p>\n<h4>1. &#23433;&#35013;&#24517;&#35201;&#30340;&#20381;&#36182;<\/h4>\n<p>&#39318;&#20808;&#65292;&#30830;&#20445;&#20320;&#24050;&#32463;&#23433;&#35013;&#20102; Symfony &#21644;&#20854;&#27979;&#35797;&#22871;&#20214;&#12290;&#20320;&#21487;&#20197;&#36890;&#36807; Composer &#26469;&#23433;&#35013;&#65306;<\/p>\n<pre><code class=\"language-bash\">composer require --dev symfony\/tester<\/code><\/pre>\n<h4>2. &#21019;&#24314;&#27979;&#35797;&#30446;&#24405;&#32467;&#26500;<\/h4>\n<p>&#22312;&#20320;&#30340;&#39033;&#30446;&#26681;&#30446;&#24405;&#19979;&#21019;&#24314;&#19968;&#20010; <code>tests<\/code> &#30446;&#24405;&#65292;&#24182;&#22312;&#20854;&#20013;&#21019;&#24314;&#19968;&#20010; <code>FunctionalTests<\/code> &#25991;&#20214;&#22841;&#12290;&#36825;&#20010;&#25991;&#20214;&#22841;&#23558;&#23384;&#25918;&#25152;&#26377;&#30340;&#21151;&#33021;&#24615;&#27979;&#35797;&#31867;&#12290;<\/p>\n<h4>3. &#32534;&#20889;&#22522;&#26412;&#30340;&#27979;&#35797;&#29992;&#20363;<\/h4>\n<p>&#20197;&#19979;&#26159;&#19968;&#20010;&#31616;&#21333;&#30340;&#21151;&#33021;&#24615;&#27979;&#35797;&#29992;&#20363;&#65292;&#29992;&#20110;&#39564;&#35777;&#19968;&#20010;&#25511;&#21046;&#22120;&#26159;&#21542;&#33021;&#22815;&#27491;&#30830;&#22788;&#29702; GET &#35831;&#27714;&#24182;&#36820;&#22238;&#27491;&#30830;&#30340;&#21709;&#24212;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppTestsFunctional;\n\nuse SymfonyBundleFrameworkBundleTestWebTestCase;\nuse SymfonyComponentHttpFoundationResponse;\n\nclass UserControllerTest extends WebTestCase\n{\n    public function testIndexAction()\n    {\n        $client = static::createClient();\n        $crawler = $client-&gt;request('GET', '\/');\n\n        \/\/ &#26816;&#26597;&#39029;&#38754;&#26631;&#39064;\n        $this-&gt;assertStringContainsString('User List', $crawler-&gt;filter('title')-&gt;text());\n\n        \/\/ &#26816;&#26597;&#34920;&#21333;&#26159;&#21542;&#23384;&#22312;\n        $this-&gt;assertTrue($crawler-&gt;filter('form')-&gt;count() &gt; 0);\n\n        \/\/ &#26816;&#26597;&#34920;&#21333;&#39033;&#20540;\n        $emailField = $crawler-&gt;selectField('email');\n        $this-&gt;assertEquals('test@example.com', $emailField-&gt;getValue());\n    }\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#20351;&#29992;&#20102; Symfony &#30340; WebTestCase &#31867;&#26469;&#21019;&#24314;&#19968;&#20010;&#23458;&#25143;&#31471;&#65292;&#24182;&#21457;&#36865;&#19968;&#20010; GET &#35831;&#27714;&#21040; <code>\/<\/code> &#31471;&#28857;&#12290;&#28982;&#21518;&#65292;&#25105;&#20204;&#20351;&#29992; Crawler &#23545;&#35937;&#26469;&#35299;&#26512;&#21709;&#24212;&#24182;&#26816;&#26597;&#39029;&#38754;&#30340;&#20869;&#23481;&#12290;<\/p>\n<h4>4. &#37197;&#32622;&#27979;&#35797;&#29615;&#22659;<\/h4>\n<p>&#20026;&#20102;&#26356;&#22909;&#22320;&#27169;&#25311;&#29983;&#20135;&#29615;&#22659;&#65292;&#21487;&#20197;&#37197;&#32622;&#27979;&#35797;&#29615;&#22659;&#12290;&#22312; <code>config\/packages\/dev\/test.yaml<\/code> &#20013;&#28155;&#21152;&#20197;&#19979;&#37197;&#32622;&#65306;<\/p>\n<pre><code class=\"language-yaml\">framework:\n    test: true\n    testing:\n        database_connection:\n            driver: pdo_mysql\n            host: localhost\n            port: 3306\n            dbname: test_db\n            user: root\n            password: ''\n            charset: utf8mb4\n            auto_generate_schema: false<\/code><\/pre>\n<p>&#36825;&#26679;&#65292;&#24403;&#20320;&#36816;&#34892;&#27979;&#35797;&#26102;&#65292;Symfony &#23558;&#20250;&#20351;&#29992;&#36825;&#20123;&#37197;&#32622;&#26469;&#21019;&#24314;&#19968;&#20010;&#29420;&#31435;&#30340;&#25968;&#25454;&#24211;&#36830;&#25509;&#12290;<\/p>\n<h4>5. &#20351;&#29992;&#20854;&#20182;&#27979;&#35797;&#24037;&#20855;<\/h4>\n<p>&#38500;&#20102; WebTestCase&#65292;Symfony &#36824;&#25552;&#20379;&#20102;&#20854;&#20182;&#27979;&#35797;&#24037;&#20855;&#65292;&#22914; <code>ConsoleTestCase<\/code> &#29992;&#20110;&#27979;&#35797;&#21629;&#20196;&#34892;&#24037;&#20855;&#65292;<code>KernelTestCase<\/code> &#29992;&#20110;&#27979;&#35797;&#25972;&#20010;&#24212;&#29992;&#30340;&#29983;&#21629;&#21608;&#26399;&#31561;&#12290;<\/p>\n<h4>&#31034;&#20363;&#65306;&#20351;&#29992; ConsoleTestCase<\/h4>\n<p>&#20197;&#19979;&#26159;&#19968;&#20010;&#31616;&#21333;&#30340; ConsoleTestCase &#31034;&#20363;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppTestsFunctional;\n\nuse SymfonyBundleFrameworkBundleTestConsoleTestCase;\nuse SymfonyComponentConsoleInputInputInterface;\nuse SymfonyComponentConsoleOutputOutputInterface;\n\nclass CommandTest extends ConsoleTestCase\n{\n    protected function getApplication(): Application\n    {\n        return new Application(null, null);\n    }\n\n    public function testRunCommand()\n    {\n        $input = new InputInterface([]);\n        $output = new OutputInterface();\n\n        $command = $this-&gt;getApplication()-&gt;find('app:run-command');\n        $exitCode = $command-&gt;run($input, $output);\n\n        $this-&gt;assertEquals(0, $exitCode);\n        $this-&gt;assertStringContainsString('Command executed successfully', $output-&gt;getContents());\n    }\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#20351;&#29992;&#20102; Symfony &#30340; ConsoleTestCase &#31867;&#26469;&#27979;&#35797;&#19968;&#20010;&#21517;&#20026; <code>app:run-command<\/code> &#30340;&#21629;&#20196;&#12290;&#25105;&#20204;&#21019;&#24314;&#20102;&#19968;&#20010;&#36755;&#20837;&#25509;&#21475;&#21644;&#36755;&#20986;&#25509;&#21475;&#65292;&#24182;&#35843;&#29992; <code>run<\/code> &#26041;&#27861;&#26469;&#25191;&#34892;&#21629;&#20196;&#12290;&#26368;&#21518;&#65292;&#25105;&#20204;&#26816;&#26597;&#36864;&#20986;&#30721;&#21644;&#36755;&#20986;&#20869;&#23481;&#12290;<\/p>\n<p>&#36890;&#36807;&#20197;&#19978;&#27493;&#39588;&#65292;&#20320;&#21487;&#20197;&#24320;&#22987;&#32534;&#20889;&#21644;&#36816;&#34892; Symfony &#21151;&#33021;&#27979;&#35797;&#12290;&#38543;&#30528;&#39033;&#30446;&#30340;&#22686;&#38271;&#65292;&#20320;&#21487;&#20197;&#36880;&#28176;&#22686;&#21152;&#26356;&#22810;&#30340;&#27979;&#35797;&#29992;&#20363;&#21644;&#22797;&#26434;&#24615;&#27979;&#35797;&#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>&#21151;&#33021;&#27979;&#35797;&#26159;&#36719;&#20214;&#24320;&#21457;&#20013;&#30340;&#20851;&#38190;&#29615;&#33410;&#65292;&#30830;&#20445;&#24744;&#30340;&#24212;&#29992;&#31243;&#24207;&#33021;&#22815;&#27491;&#24120;&#24037;&#20316;&#12290;&#22312;Symfony&#65288;&#19968;&#20010;PHP&#30340;Web&#24212;&#29992;&#26694;&#26550;&#65289;&#20013;&#65292;&#21151;&#33021;&#27979;&#35797;&#27169;&#25311;&#29992;&#25143;&#20132;&#20114;&#24182;&#39564;&#35777;&#24212;&#29992;&#31243;&#24207;&#30340;&#34892;&#20026;&#26159;&#21542;&#27491;&#30830;&#12290;&#26412;&#25351;&#21335;&#23558;&#24102;&#24744;&#20174;&#35774;&#32622;&#24320;&#22987;&#65292;&#21040;&#26368;&#20339;&#23454;&#36341;&#32467;&#26463;&#65292;&#35814;&#32454;&#20171;&#32461;Symfony&#30340;&#21151;&#33021;&#27979;&#35797;&#12290;<\/p><p>&#24517;&#22791;&#26465;&#20214;<\/p><p>&#24050;&#23433;&#35013; Composer &#20381;&#36182;&#31649;&#29702;&#22120;&#12290;<\/p><p>Symfony&#39033;&#30446;&#35774;&#32622;<\/p><p>&#22522;&#26412;&#29702;&#35299;Symfony&#21644;PHP&#26159;&#38750;&#24120;&#37325;&#35201;&#30340;&#65292;&#21487;&#20197;&#24110;&#21161;&#20320;&#22312;&#24320;&#21457;Web&#24212;&#29992;&#26102;&#26356;&#39640;&#25928;&#22320;&#24037;&#20316;&#12290;Symfony&#26159;&#19968;&#20010;&#27969;&#34892;&#30340;&#24320;&#28304;&#26694;&#26550;&#65292;&#23427;&#25552;&#20379;&#20102;&#19968;&#22871;&#24378;&#22823;&#30340;&#24037;&#20855;&#21644;&#25216;&#26415;&#26469;&#24110;&#21161;&#24320;&#21457;&#32773;&#26500;&#24314;&#22797;&#26434;&#30340;Web&#24212;&#29992;&#31243;&#24207;&#12290;&#22914;&#26524;&#20320;&#23545;PHP&#26377;&#22522;&#26412;&#30340;&#20102;&#35299;&#65292;&#37027;&#20040;&#23398;&#20064;Symfony&#23558;&#20250;&#26356;&#21152;&#23481;&#26131;&#12290;\n&#22312;&#24320;&#22987;&#20351;&#29992;Symfony&#20043;&#21069;&#65292;&#24314;&#35758;&#20808;&#20102;&#35299;&#19968;&#19979;PHP&#30340;&#22522;&#30784;&#30693;&#35782;&#65292;&#22914;&#21464;&#37327;&#12289;&#25968;&#25454;&#31867;&#22411;&#12289;&#25511;&#21046;&#32467;&#26500;&#31561;&#12290;&#28982;&#21518;&#65292;&#20320;&#21487;&#20197;&#36890;&#36807;&#38405;&#35835;&#23448;&#26041;&#25991;&#26723;&#25110;&#21442;&#21152;&#19968;&#20123;&#25945;&#31243;&#26469;&#23398;&#20064;Symfony&#30340;&#22522;&#26412;&#27010;&#24565;&#21644;&#26368;&#20339;&#23454;&#36341;&#12290;<\/p><h2>&#35774;&#32622;&#27979;&#35797;&#29615;&#22659;<\/h2><p>&#22312;&#32534;&#20889;&#21151;&#33021;&#27979;&#35797;&#20043;&#21069;&#65292;&#20320;&#38656;&#35201;&#22312;Symfony&#20013;&#35774;&#32622;&#19968;&#20010;&#27979;&#35797;&#29615;&#22659;&#12290;&#23433;&#35013;PHPUnit&#65292;&#36825;&#26159;Symfony&#36873;&#25321;&#30340;&#27979;&#35797;&#24037;&#20855;&#65292;&#35831;&#36816;&#34892;<code>composer require --dev symfony\/phpunit-bridge<\/code>&#22312;&#20320;&#30340;&#39033;&#30446;&#30446;&#24405;&#19979;&#12290;<\/p><h2>&#21019;&#24314;&#24744;&#30340;&#31532;&#19968;&#20010;&#21151;&#33021;&#27979;&#35797;<\/h2><p>&#22312;Symfony&#20013;&#65292;&#36890;&#24120;&#20250;&#25193;&#23637;&#19968;&#20010;&#21151;&#33021;&#27979;&#35797;&#12290;<code>WebTestCase<\/code>&#29677;&#32423;&#65292;&#30001;&#20379;&#24212;&#30340;<code>symfony\/framework-bundle<\/code>&#22909;&#30340;&#65292;&#35831;&#25552;&#20379;&#38656;&#35201;&#32763;&#35793;&#30340;&#20869;&#23481;&#12290;<\/p><pre><code>&lt;?php\nnamespace AppTests;\nuse SymfonyBundleFrameworkBundleTestWebTestCase;\nclass DefaultControllerTest extends WebTestCase\n{\n   public function testIndex()\n   {\n      $client = static::createClient();\n      $crawler = $client-&gt;request('GET', '\/');\n\n      $this-&gt;assertResponseIsSuccessful();\n      $this-&gt;assertSelectorTextContains('h1', 'Hello World');\n   }\n}\n<\/code><\/pre><p>&#36825;&#20010;&#27979;&#35797;&#26816;&#26597;&#20027;&#39029;&#26159;&#21542;&#25104;&#21151;&#21152;&#36733;&#24182;&#20855;&#26377;&#39044;&#26399;&#30340;&#32467;&#26500;&#12290;<code>&lt;h1&gt;<\/code>&#26631;&#31614;&#20026; Hello World. &#22914;&#26524;&#27979;&#35797;&#22833;&#36133;&#65292;Symfony &#20250;&#25552;&#20379;&#35814;&#32454;&#30340;&#21453;&#39304;&#65292;&#24110;&#21161;&#36827;&#34892;&#35843;&#35797;&#12290;<\/p><h2>&#27979;&#35797;&#25968;&#25454;&#24211;&#20132;&#20114;&#25805;&#20316;<\/h2><p>&#20026;&#20102;&#27979;&#35797;&#25968;&#25454;&#24211;&#20132;&#20114;&#65292;&#20320;&#38656;&#35201;&#19968;&#20010;&#27979;&#35797;&#25968;&#25454;&#24211;&#12290;&#22312;&ldquo;&#37197;&#32622;&rdquo;&#19979;&#37197;&#32622;&#23427;&#12290;<code>test<\/code>&#29615;&#22659;&#12290;<code>.env.test<\/code>&#25991;&#20214;&#12290; &#20026;&#20102;&#30830;&#20445;&#25968;&#25454;&#38548;&#31163;&#65292;&#20351;&#29992;&#12290;<code>DAMADoctrineTestBundle<\/code>&#23427;&#25552;&#20379;&#20107;&#21153;&#27979;&#35797;&#65292;&#27599;&#27425;&#27979;&#35797;&#21518;&#37117;&#20250;&#22238;&#28378;&#26356;&#25913;&#12290;<\/p><h2>&#27491;&#22312;&#27979;&#35797;&#34920;&#21333;&#12290;<\/h2><p>&#27979;&#35797;&#34920;&#21333;&#23545;&#20110;&#39564;&#35777;&#29992;&#25143;&#36755;&#20837;&#26159;&#21542;&#27491;&#30830;&#22788;&#29702;&#33267;&#20851;&#37325;&#35201;&#12290;&#20026;&#27492;&#65292;&#35831;&#20351;&#29992;&#29228;&#34411;&#25552;&#20132;&#34920;&#21333;&#36827;&#34892;&#27979;&#35797;&#65306;<\/p><pre><code>&lt;?php\n\/\/ ... (rest of the test class)\n\npublic function testFormSubmission()\n{\n   $client = static::createClient();\n   $crawler = $client-&gt;request('GET', '\/submit-form');\n   $form = $crawler-&gt;selectButton('submit')-&gt;form([\n      'input_field' =&gt; 'value',\n   ]);\n   $client-&gt;submit($form);\n\n   $this-&gt;assertResponseRedirects('\/success');\n}\n<\/code><\/pre><p>&#22312;&#25552;&#20132;&#21518;&#65292;&#36825;&#20010;&#31034;&#20363;&#26029;&#35328;&#21709;&#24212;&#26159;&#19968;&#20010;&#37325;&#23450;&#21521;&#21040;&#25104;&#21151;&#39029;&#38754;&#30340;&#35831;&#27714;&#12290;<\/p><h2>&#27979;&#35797;&#23433;&#20840;<\/h2><p>&#27979;&#35797;&#29992;&#25143;&#36523;&#20221;&#39564;&#35777;&#21644;&#25480;&#26435;&#30830;&#20445;&#20102;&#24744;&#30340;&#23433;&#20840;&#25514;&#26045;&#27491;&#22312;&#26377;&#25928;&#36816;&#34892;&#12290;Symfony &#20801;&#35768;&#24744;&#22312;&#21151;&#33021;&#27979;&#35797;&#20013;&#27169;&#25311;&#24050;&#35748;&#35777;&#30340;&#20250;&#35805;&#65292;&#22914;&#19979;&#25152;&#31034;&#65306;<\/p><pre><code>&lt;?php\n\/\/ ... (rest of the test class)\n\npublic function testSecureArea()\n{\n   $client = static::createClient();\n   $client-&gt;loginUser($user);\n\n   $client-&gt;request('GET', '\/secure-area');\n   $this-&gt;assertResponseIsSuccessful();\n}\n<\/code><\/pre><p>&#39318;&#20808;&#65292;&#30830;&#20445;&#21019;&#24314;&#19968;&#20010;&#21453;&#26144;&#24744;&#31995;&#32479;&#30495;&#23454;&#29992;&#25143;&#29305;&#24449;&#30340;&#29992;&#25143;&#23545;&#35937;&#12290;<\/p><h2>&#26368;&#20339;&#23454;&#36341;<\/h2><p>&#27169;&#25311;&#26381;&#21153;&#65306;&#20351;&#29992;&#27169;&#25311;&#21644;&#26367;&#20195;&#29702;&#35770;&#65292;&#38548;&#31163;&#27979;&#35797;&#24182;&#36991;&#20813;&#20381;&#36182;&#22806;&#37096;&#31995;&#32479;&#12290;<\/p><p>&#27979;&#35797;&#25968;&#25454;&#65306;&#20351;&#29992;fixture&#21152;&#36733;&#29305;&#23450;&#30340;&#27979;&#35797;&#25968;&#25454;&#65292;&#20197;&#20415;&#24744;&#30340;&#27979;&#35797;&#19981;&#21463;&#29983;&#20135;&#25968;&#25454;&#24211;&#29366;&#24577;&#30340;&#24433;&#21709;&#12290;<\/p><p>&#27979;&#35797;&#32467;&#26500;&#65306;&#32534;&#20889;&#28165;&#26224;&#12289;&#26131;&#20110;&#29702;&#35299;&#30340;&#27979;&#35797; &#8211; &#22914;&#26524;&#21487;&#33021;&#30340;&#35805;&#65292;&#19968;&#20010;&#27979;&#35797;&#26041;&#27861;&#21482;&#21253;&#21547;&#19968;&#20010;&#26029;&#35328;&#12290;<\/p><h2>&#25345;&#32493;&#38598;&#25104;<\/h2><p>&#22312;&#24744;&#30340;&#27979;&#35797;&#37096;&#32626;&#23436;&#25104;&#21518;&#65292;&#35774;&#32622;&#25345;&#32493;&#38598;&#25104;&#65288;CI&#65289;&#31995;&#32479;&#20197;&#33258;&#21160;&#36816;&#34892;&#23427;&#20204;&#12290;&#36825;&#30830;&#20445;&#20102;&#27599;&#27425;&#20195;&#30721;&#26356;&#26032;&#21518;&#37117;&#33021;&#31435;&#21363;&#25910;&#21040;&#20219;&#20309;&#21151;&#33021;&#37096;&#20998;&#34987;&#30772;&#22351;&#30340;&#21453;&#39304;&#12290;<\/p><h2>&#32467;&#35770;&#12290;<\/h2><p>&#21151;&#33021;&#27979;&#35797;&#23545;&#20110;&#19968;&#20010;&#31283;&#23450;&#19988;&#21487;&#38752;&#30340;Symfony&#24212;&#29992;&#33267;&#20851;&#37325;&#35201;&#12290;&#25353;&#29031;&#36825;&#20010;&#25351;&#21335;&#65292;&#35774;&#32622;&#27979;&#35797;&#24182;&#23558;&#20854;&#32435;&#20837;&#24320;&#21457;&#27969;&#31243;&#65292;&#21487;&#20197;&#24110;&#21161;&#20320;&#22312;&#26089;&#26399;&#21457;&#29616;&#38382;&#39064;&#65292;&#24182;&#26377;&#20449;&#24515;&#22320;&#20132;&#20184;&#39640;&#36136;&#37327;&#30340;&#20135;&#21697;&#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>Symfony &#26159;&#19968;&#20010;&#27969;&#34892;&#30340; PHP &#26694;&#26550;&#65292;&#29992;&#20110;&#26500;&#24314;&#22823;&#22411; Web &#24212;&#29992;&#31243;&#24207;&#21644; API&#12290;&#23427;&#25552;&#20379;&#20102;&#35768;&#22810;&#24378;&#22823;&#30340;&#24037;&#20855;&#26469;&#24110;&#21161;&#24744;&#36827;&#34892;&#21151;&#33021;&#27979;&#35797;&#12290;<\/p>\n<h3>&#20160;&#20040;&#26159;&#21151;&#33021;&#27979;&#35797;&#65311;<\/h3>\n<p>&#21151;&#33021;&#27979;&#35797;&#26159;&#30830;&#23450;&#24212;&#29992;&#31243;&#24207;&#26159;&#21542;&#25353;&#29031;&#39044;&#26399;&#30340;&#26041;&#24335;&#25191;&#34892;&#30340;&#27979;&#35797;&#12290;&#36825;&#21253;&#25324;&#39564;&#35777;&#24212;&#29992;&#31243;&#24207;&#30340;&#21151;&#33021;&#24615;&#12289;&#24615;&#33021;&#21644;&#20854;&#20182;&#29305;&#24615;&#12290;<\/p>\n<h3>&#22914;&#20309;&#24320;&#22987;<\/h3>\n<ol>\n<li>\n<p><strong>&#23433;&#35013; Symfony &#30456;&#20851;&#36719;&#20214;<\/strong>&#65306;&#30830;&#20445;&#24744;&#30340;&#29615;&#22659;&#24050;&#27491;&#30830;&#37197;&#32622;&#20102; Composer &#21644; PHP&#12290;&#20351;&#29992;&#20197;&#19979;&#21629;&#20196;&#23433;&#35013;&#25152;&#38656;&#30340;&#20381;&#36182;&#39033;&#65306;<\/p>\n<pre><code class=\"language-bash\">composer require symfony\/symfony<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#21019;&#24314;&#39033;&#30446;<\/strong>&#65306;<\/p>\n<ul>\n<li>&#21019;&#24314;&#19968;&#20010;&#26032;&#30340; Symfony &#39033;&#30446;&#65288;<code>symfony create-project<\/code>&#65289;&#12290;<\/li>\n<li>&#20351;&#29992; <code>symfony new<\/code> &#21629;&#20196;&#21019;&#24314;&#19968;&#20010;&#26032;&#30340; Symfony &#39033;&#30446;&#65292;&#24182;&#25351;&#23450;&#39033;&#30446;&#30340;&#26681;&#30446;&#24405;&#12290;<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>&#32534;&#20889;&#27979;&#35797;<\/strong>&#65306;<\/p>\n<ul>\n<li>&#32534;&#20889;&#21333;&#20803;&#27979;&#35797;&#21644;&#38598;&#25104;&#27979;&#35797;&#20197;&#26816;&#26597;&#27599;&#20010;&#27169;&#22359;&#30340;&#21151;&#33021;&#12290;<\/li>\n<li>&#20351;&#29992; PHPUnit &#25110;&#31867;&#20284;&#30340;&#27979;&#35797;&#26694;&#26550;&#12290;<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>&#36816;&#34892;&#27979;&#35797;<\/strong>&#65306;<\/p>\n<ul>\n<li>&#22312;&#26412;&#22320;&#29615;&#22659;&#20013;&#36816;&#34892;&#27979;&#35797;&#65288;&#20363;&#22914;&#36890;&#36807; <code>phpunit<\/code> &#25110; <code>codeceptjs<\/code> &#31561;&#24037;&#20855;&#65289;&#12290;<\/li>\n<li>&#23545;&#20110; CI\/CD &#29615;&#22659;&#65292;&#21487;&#20197;&#20351;&#29992; Jenkins &#25110; Travis CI &#36827;&#34892;&#33258;&#21160;&#21270;&#27979;&#35797;&#12290;<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>&#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#20551;&#35774;&#25105;&#20204;&#26377;&#19968;&#20010;&#21517;&#20026; <code>User<\/code> &#30340;&#27169;&#22411;&#31867;&#65292;&#25105;&#20204;&#24819;&#27979;&#35797;&#23427;&#22914;&#20309;&#23384;&#20648;&#29992;&#25143;&#20449;&#24687;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppEntity;\n\nuse DoctrineORMMapping as ORM;\nuse ApiPlatformCoreAnnotationApiResource;\n\n\/**\n * @ORMEntity(repositoryClass=\"AppRepositoryUserRepository\")\n * @ApiResource(\n *     normalizationContext={\"groups\" = {\"users\"}}\n * )\n *\/\nclass User\n{\n    \/**\n     * @ORMId()\n     * @ORMGeneratedValue()\n     * @ORMColumn(type=\"integer\")\n     *\/\n    private $id;\n\n    \/**\n     * @ORMColumn(type=\"string\", length=255)\n     *\/\n    private $username;\n\n    \/**\n     * @ORMColumn(type=\"json\")\n     *\/\n    private $roles = [];\n\n    public function getId(): ?int\n    {\n        return $this-&gt;id;\n    }\n\n    public function getUsername(): ?string\n    {\n        return $this-&gt;username;\n    }\n\n    public function setUsername(string $username): self\n    {\n        $this-&gt;username = $username;\n\n        return $this;\n    }\n\n    public function getRoles(): array\n    {\n        $roles = [];\n        foreach ($this-&gt;roles as $role) {\n            $roles[] = $role-&gt;getName();\n        }\n        return $roles;\n    }\n\n    public function addRole(ROLE $role): self\n    {\n        $this-&gt;roles[] = $role;\n\n        return $this;\n    }\n\n    public function removeRole(ROLE $role): self\n    {\n        $this-&gt;roles = array_filter($this-&gt;roles, function (ROLE $rol) use ($role) {\n            return $rol !== $role;\n        });\n\n        return $this;\n    }\n}<\/code><\/pre>\n<h3>&#24635;&#32467;<\/h3>\n<p>&#21151;&#33021;&#27979;&#35797;&#26159;&#30830;&#20445;&#24212;&#29992;&#31243;&#24207;&#25353;&#39044;&#26399;&#24037;&#20316;&#30340;&#37325;&#35201;&#37096;&#20998;&#12290;&#20351;&#29992; Symfony &#26500;&#24314;&#30340;&#24212;&#29992;&#31243;&#24207;&#38750;&#24120;&#36866;&#21512;&#36827;&#34892;&#21151;&#33021;&#27979;&#35797;&#65292;&#22240;&#20026;&#23427;&#25552;&#20379;&#20102;&#19968;&#25972;&#22871;&#27979;&#35797;&#24037;&#20855;&#21644;&#26694;&#26550;&#65292;&#20351;&#24471;&#24320;&#21457;&#32773;&#33021;&#22815;&#36731;&#26494;&#22320;&#32534;&#20889;&#21644;&#31649;&#29702;&#27979;&#35797;&#29992;&#20363;&#12290;&#36890;&#36807;&#36981;&#24490;&#36825;&#20123;&#25351;&#21335;&#65292;&#24744;&#21487;&#20197;&#20026;&#24744;&#30340; Symfony &#24212;&#29992;&#31243;&#24207;&#28155;&#21152;&#24517;&#35201;&#30340;&#21151;&#33021;&#27979;&#35797;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; Symfony&#21151;&#33021;&#27979;&#35797;&#23436;&#20840;&#25351;&#21335; &#22312;&#29616;&#20195;&#36719;&#20214;&#24320;&#21457;&#038;#20..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[45],"tuisongtax":[],"class_list":["post-1098","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\/1098","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=1098"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1098"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1098"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1098"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}