{"id":1093,"date":"2025-06-12T12:44:48","date_gmt":"2025-06-12T04:44:48","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1093.html"},"modified":"2025-06-12T12:44:48","modified_gmt":"2025-06-12T04:44:48","slug":"%e5%a6%82%e4%bd%95%e5%9c%a8symfony%e4%b8%ad%e5%90%91%e6%9c%8d%e5%8a%a1%e6%b7%bb%e5%8a%a0%e6%a0%87%e7%ad%be","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1093.html","title":{"rendered":"\u5982\u4f55\u5728Symfony\u4e2d\u5411\u670d\u52a1\u6dfb\u52a0\u6807\u7b7e"},"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;&#20320;&#21487;&#20197;&#36890;&#36807;&#21019;&#24314;&#33258;&#23450;&#20041;&#30340;&#26631;&#31614;&#31867;&#26469;&#20026;&#26381;&#21153;&#28155;&#21152;&#39069;&#22806;&#30340;&#20449;&#24687;&#12290;&#20197;&#19979;&#26159;&#19968;&#20010;&#31616;&#21333;&#30340;&#31034;&#20363;&#65292;&#23637;&#31034;&#20102;&#22914;&#20309;&#22312;Symfony&#20013;&#21019;&#24314;&#21644;&#20351;&#29992;&#33258;&#23450;&#20041;&#26631;&#31614;&#12290;<\/p>\n<h3>1. &#21019;&#24314;&#26631;&#31614;&#31867;<\/h3>\n<p>&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#21019;&#24314;&#19968;&#20010;&#26631;&#31614;&#31867;&#12290;&#20551;&#35774;&#25105;&#20204;&#35201;&#21019;&#24314;&#19968;&#20010;<code>RoleTag<\/code>&#31867;&#65292;&#29992;&#20110;&#34920;&#31034;&#26381;&#21153;&#30340;&#35282;&#33394;&#12290;<\/p>\n<pre><code class=\"language-php\">\/\/ src\/Component\/RoleTag.php\nnamespace AppComponent;\n\nclass RoleTag {\n    private $role;\n    private $description;\n\n    public function __construct(string $role, string $description) {\n        $this-&gt;role = $role;\n        $this-&gt;description = $description;\n    }\n\n    public function getRole(): string {\n        return $this-&gt;role;\n    }\n\n    public function getDescription(): string {\n        return $this-&gt;description;\n    }\n}<\/code><\/pre>\n<h3>2. &#27880;&#20876;&#26631;&#31614;&#31867;&#21040;&#23481;&#22120;<\/h3>\n<p>&#25509;&#19979;&#26469;&#65292;&#20320;&#38656;&#35201;&#23558;&#36825;&#20010;&#26631;&#31614;&#31867;&#27880;&#20876;&#21040;Symfony&#30340;&#23481;&#22120;&#20013;&#12290;&#36825;&#21487;&#20197;&#36890;&#36807;&#37197;&#32622;&#25991;&#20214;&#25110;&#26381;&#21153;&#31649;&#29702;&#22120;&#26469;&#23454;&#29616;&#12290;<\/p>\n<h4>&#20351;&#29992;&#37197;&#32622;&#25991;&#20214;&#65288;<code>config\/services.yaml<\/code>&#65289;<\/h4>\n<pre><code class=\"language-yaml\"># config\/services.yaml\nservices:\n    app.role_tag:\n        class: AppComponentRoleTag\n        arguments:\n            - 'admin'\n            - 'Administrator role'<\/code><\/pre>\n<h4>&#20351;&#29992;&#26381;&#21153;&#31649;&#29702;&#22120;<\/h4>\n<p>&#22914;&#26524;&#20320;&#26356;&#21916;&#27426;&#20351;&#29992;&#26381;&#21153;&#31649;&#29702;&#22120;&#65292;&#21487;&#20197;&#22312;&#25511;&#21046;&#22120;&#25110;&#20854;&#20182;&#22320;&#26041;&#27880;&#20837;&#26631;&#31614;&#31867;&#12290;<\/p>\n<pre><code class=\"language-php\">\/\/ src\/Controller\/YourController.php\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationResponse;\n\nclass YourController extends AbstractController\n{\n    public function index()\n    {\n        \/\/ &#33719;&#21462;&#26631;&#31614;&#23454;&#20363;\n        $tag = $this-&gt;get('app.role_tag');\n\n        \/\/ &#36755;&#20986;&#26631;&#31614;&#20449;&#24687;\n        echo \"Role: {$tag-&gt;getRole()}n\";\n        echo \"Description: {$tag-&gt;getDescription()}n\";\n\n        return new Response(\"Hello, World!\");\n    }\n}<\/code><\/pre>\n<h3>3. &#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#20197;&#19979;&#26159;&#19968;&#20010;&#23436;&#25972;&#30340;&#31034;&#20363;&#20195;&#30721;&#65292;&#23637;&#31034;&#20102;&#22914;&#20309;&#22312;Symfony&#20013;&#21019;&#24314;&#12289;&#27880;&#20876;&#21644;&#20351;&#29992;&#33258;&#23450;&#20041;&#26631;&#31614;&#12290;<\/p>\n<pre><code class=\"language-php\">\/\/ src\/Component\/RoleTag.php\nnamespace AppComponent;\n\nclass RoleTag {\n    private $role;\n    private $description;\n\n    public function __construct(string $role, string $description) {\n        $this-&gt;role = $role;\n        $this-&gt;description = $description;\n    }\n\n    public function getRole(): string {\n        return $this-&gt;role;\n    }\n\n    public function getDescription(): string {\n        return $this-&gt;description;\n    }\n}\n\n\/\/ src\/config\/services.yaml\nservices:\n    app.role_tag:\n        class: AppComponentRoleTag\n        arguments:\n            - 'admin'\n            - 'Administrator role'\n\n\/\/ src\/Controller\/YourController.php\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationResponse;\n\nclass YourController extends AbstractController\n{\n    public function index()\n    {\n        \/\/ &#33719;&#21462;&#26631;&#31614;&#23454;&#20363;\n        $tag = $this-&gt;get('app.role_tag');\n\n        \/\/ &#36755;&#20986;&#26631;&#31614;&#20449;&#24687;\n        echo \"Role: {$tag-&gt;getRole()}n\";\n        echo \"Description: {$tag-&gt;getDescription()}n\";\n\n        return new Response(\"Hello, World!\");\n    }\n}<\/code><\/pre>\n<p>&#36890;&#36807;&#36825;&#31181;&#26041;&#24335;&#65292;&#20320;&#21487;&#20197;&#22312;Symfony&#20013;&#36731;&#26494;&#22320;&#20026;&#26381;&#21153;&#28155;&#21152;&#26631;&#31614;&#65292;&#24182;&#22312;&#38656;&#35201;&#26102;&#35775;&#38382;&#36825;&#20123;&#26631;&#31614;&#20449;&#24687;&#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>&#27010;&#35272;<\/h2><p>&#22312;&#20351;&#29992;Symfony&#26694;&#26550;&#26102;&#65292;&#26381;&#21153;&#23481;&#22120;&#22312;&#31649;&#29702;&#24212;&#29992;&#31243;&#24207;&#32452;&#20214;&#26041;&#38754;&#36215;&#30528;&#33267;&#20851;&#37325;&#35201;&#30340;&#20316;&#29992;&#12290;&#23427;&#20204;&#36890;&#36807;&#20801;&#35768;&#26381;&#21153;&#26631;&#35760;&#20174;&#32780;&#20197;&#27169;&#22359;&#21270;&#21644;&#39640;&#25928;&#30340;&#26041;&#24335;&#32452;&#32455;&#20195;&#30721;&#12290;&#26412;&#25945;&#31243;&#23558;&#24341;&#23548;&#24744;&#20102;&#35299;&#22914;&#20309;&#22312;Symfony&#20013;&#23545;&#26381;&#21153;&#36827;&#34892;&#26631;&#35760;&#65292;&#23637;&#31034;&#22914;&#20309;&#21033;&#29992;&#26631;&#31614;&#30340;&#21147;&#37327;&#26469;&#26377;&#25928;&#22320;&#32452;&#32455;&#20195;&#30721;&#24211;&#12290;<\/p><h3>&#29702;&#35299;&#26381;&#21153;&#26631;&#31614;<\/h3><p>&#22312;&#28145;&#20837;&#25506;&#35752;&#22914;&#20309;&#20026;&#26381;&#21153;&#28155;&#21152;&#26631;&#31614;&#20043;&#21069;&#65292;&#35753;&#25105;&#20204;&#20808;&#28548;&#28165;&#19968;&#19979;&#20160;&#20040;&#26159;&#26381;&#21153;&#26631;&#31614;&#12290;&#22312;Symfony&#20013;&#65292;&#19968;&#20010;&#26631;&#31614;&#26159;&#19968;&#31181;&#26631;&#35760;&#26041;&#24335;&#65292;&#29992;&#20110;&#26631;&#35782;&#29305;&#23450;&#29992;&#36884;&#30340;&#26381;&#21153;&#65292;&#36825;&#20351;&#24471;&#20854;&#20182;&#26381;&#21153;&#25110;Symfony&#26412;&#36523;&#21487;&#20197;&#26681;&#25454;&#26576;&#20123;&#26465;&#20214;&#35782;&#21035;&#21644;&#21033;&#29992;&#36825;&#20123;&#26381;&#21153;&#65292;&#32780;&#26080;&#38656;&#30693;&#36947;&#23427;&#20204;&#30340;&#23454;&#38469;&#26381;&#21153;ID&#12290;&#24403;&#22788;&#29702;&#20107;&#20214;&#12289;&#32534;&#35793;&#20256;&#36882;&#31561;&#26102;&#29305;&#21035;&#26377;&#29992;&#12290;&#24635;&#30340;&#26469;&#35828;&#65292;&#23427;&#26377;&#21161;&#20110;&#23558;&#26381;&#21153;&#25353;&#36923;&#36753;&#32452;&#20998;&#31867;&#24182;&#31616;&#21270;&#37197;&#32622;&#12290;<\/p><h2>&#22522;&#26412;&#26631;&#27880;<\/h2><p>&#22312;Symfony&#20013;&#20026;&#26381;&#21153;&#28155;&#21152;&#26631;&#31614;&#38750;&#24120;&#31616;&#21333;&#12290;&#26381;&#21153;&#23450;&#20041;&#36890;&#24120;&#20301;&#20110;&#37197;&#32622;&#25991;&#20214;&#20013;&#65292;&#22914; services.yaml &#25991;&#20214;&#12290;<code>services.yaml<\/code>&#20026;&#20102;&#28155;&#21152;&#26631;&#31614;&#65292;&#24744;&#21482;&#38656;&#32534;&#36753;&#26381;&#21153;&#23450;&#20041;&#20197;&#21253;&#21547;&#35813;&#26631;&#31614;&#21363;&#21487;&#12290;<code>tags<\/code>&#23646;&#24615;&#65306;<\/p><pre><code>services:\n  app.my_service:\n    class: AppServiceMyService\n    tags:\n      - { name: 'my.custom.tag' }\n<\/code><\/pre><p>&#22312;&#19978;&#36848;&#20363;&#23376;&#20013;&#65292;<code>app.my_service<\/code>&#20320;&#27491;&#22312;&#26631;&#35760;&#30340;&#26381;&#21153;&#26159;&#20160;&#20040;&#65311;<code>my.custom.tag<\/code>&#36825;&#20351;&#24471;Symfony&#21644;&#24744;&#30340;&#24212;&#29992;&#31243;&#24207;&#22312;&#24517;&#35201;&#26102;&#33021;&#22815;&#35782;&#21035;&#27492;&#26381;&#21153;&#65292;&#36890;&#36807;&#20854;&#26631;&#31614;&#36827;&#34892;&#21306;&#20998;&#12290;<\/p><h2>&#19982;&#32534;&#35793;&#22120;&#36890;&#36807;&#36335;&#36827;&#34892;&#20132;&#20114;<\/h2><p>&#22312;Symfony&#20013;&#65292;&#26631;&#31614;&#65288;tags&#65289;&#30340;&#19968;&#20010;&#20027;&#35201;&#29992;&#36884;&#26159;&#22312;&#32534;&#35793;&#22120;&#65288;Compiler Passes&#65289;&#20013;&#20351;&#29992;&#12290;&#19968;&#20010;&#32534;&#35793;&#22120;&#65288;Compiler Pass&#65289;&#20801;&#35768;&#20320;&#22312;&#32534;&#35793;&#36807;&#31243;&#20013;&#23545;&#26381;&#21153;&#23481;&#22120;&#36827;&#34892;&#25805;&#20316;&#65292;&#36890;&#24120;&#26159;&#23545;&#24102;&#26377;&#26576;&#20123;&#26631;&#31614;&#30340;&#26381;&#21153;&#36827;&#34892;&#26816;&#26597;&#21644;&#20462;&#25913;&#12290;&#20197;&#19979;&#26159;&#22914;&#20309;&#21019;&#24314;&#19968;&#20010;&#25910;&#38598;&#24102;&#26377;&#26631;&#31614;&#30340;&#26381;&#21153;&#30340;&#32534;&#35793;&#22120;&#65288;Compiler Pass&#65289;&#30340;&#20363;&#23376;&#12290;<code>my.custom.tag<\/code>&#23427;&#20204;&#34987;&#22788;&#29702;&#65306;<\/p><pre><code>namespace AppDependencyInjectionCompiler;\n\nuse SymfonyComponentDependencyInjectionCompilerCompilerPassInterface;\nuse SymfonyComponentDependencyInjectionContainerBuilder;\n\nclass MyCustomTagPass implements CompilerPassInterface\n{\n    public function process(ContainerBuilder $container)\n    {\n        $taggedServices = $container-&gt;findTaggedServiceIds('my.custom.tag');\n\n        \/\/ Do something with the tagged services\n        \/\/ e.g., add them to another service through method calls\n        foreach ($taggedServices as $id =&gt; $tags) {\n            \/\/ Process tagged services\n        }\n    }\n}\n<\/code><\/pre><p>&#36825;&#20010;&#32534;&#35793;&#22120;&#36890;&#36807;&#38598;&#21512;&#24182;&#22788;&#29702;&#25152;&#26377;&#24102;&#26377;&#26631;&#31614;&#30340;&#26381;&#21153;&#12290;<code>my.custom.tag<\/code>&#20801;&#35768;&#24744;&#23545;&#23427;&#20204;&#36827;&#34892;&#25805;&#20316;&#65292;&#20363;&#22914;&#23558;&#20854;&#27880;&#20837;&#21040;&#38598;&#21512;&#20013;&#25110;&#20462;&#25913;&#20854;&#23450;&#20041;&#12290;<\/p><h2>&#39640;&#32423;&#29992;&#27861;<\/h2><p>&#23545;&#20110;&#26356;&#39640;&#32423;&#30340;&#35201;&#27714;&#65292;&#26631;&#31614;&#21487;&#20197;&#21253;&#21547;&#39069;&#22806;&#30340;&#21442;&#25968;&#65292;&#22312;&#32534;&#35793;&#22120;&#36890;&#36807;&#26102;&#21487;&#20197;&#20351;&#29992;&#36825;&#20123;&#21442;&#25968;&#12290;&#20197;&#19979;&#26159;&#24744;&#22914;&#20309;&#26356;&#26032;&#26381;&#21153;&#23450;&#20041;&#20197;&#21253;&#25324;&#26631;&#31614;&#23646;&#24615;&#30340;&#26041;&#27861;&#65306;<\/p><pre><code>services:\n  app.my_service:\n    class: AppServiceMyService\n    tags:\n      - { name: 'my.custom.tag', priority: 100 }\n<\/code><\/pre><p>&#22312;&#36825;&#31181;&#24773;&#20917;&#19979;&#65292;<code>priority<\/code>&#36825;&#26159;&#26381;&#21153;&#26631;&#31614;&#30340;&#19968;&#20010;&#20219;&#24847;&#23646;&#24615;&#65292;&#29992;&#20110;&#25552;&#20379;&#19978;&#19979;&#25991;&#12290;&#22312;&#36807;&#31243;&#32534;&#35793;&#26399;&#38388;&#65292;&#21487;&#20197;&#26816;&#32034;&#24182;&#20351;&#29992;&#27492;&#23646;&#24615;&#26469;&#65292;&#20363;&#22914;&#65292;&#25353;&#20248;&#20808;&#32423;&#23545;&#26381;&#21153;&#36827;&#34892;&#25490;&#24207;&#65306;<\/p><pre><code>foreach ($taggedServices as $id =&gt; $tags) {\n    \/\/ Assume each service has the 'priority' attribute\n    $priority = $tags[0]['priority'];\n\n    \/\/ You could now sort or filter services based on $priority\n}\n<\/code><\/pre><p>&#26631;&#31614;&#30340;&#21487;&#29992;&#24615;&#21462;&#20915;&#20110;&#24212;&#29992;&#31243;&#24207;&#38656;&#35201;&#23436;&#25104;&#30340;&#20219;&#21153;&#12290;&#36890;&#36807;&#23646;&#24615;&#65292;&#26631;&#31614;&#25104;&#20026;&#19981;&#20165;&#26631;&#35760;&#32780;&#19988;&#26681;&#25454;&#23450;&#20041;&#22312;&#23427;&#20204;&#30340;&#26631;&#31614;&#20013;&#30340;&#29305;&#24449;&#21160;&#24577;&#37197;&#32622;&#26381;&#21153;&#30340;&#24378;&#22823;&#26041;&#24335;&#12290;<\/p><h2>&#26631;&#27880;&#36890;&#36807;&#27880;&#37322;<\/h2><p>&#22312;&#26576;&#20123;&#24773;&#20917;&#19979;&#65292;&#24744;&#21487;&#33021;&#24076;&#26395;&#36890;&#36807;&#30452;&#25509;&#22312;PHP&#31867;&#25991;&#20214;&#20013;&#30340;&#27880;&#37322;&#26469;&#26631;&#35760;&#26381;&#21153;&#65292;&#36825;&#23545;&#20110;&#19987;&#27880;&#20110;&#39046;&#22495;&#39537;&#21160;&#35774;&#35745;&#29305;&#21035;&#26041;&#20415;&#12290;Symfony 3.3 &#24341;&#20837;&#20102;&#33258;&#21160;&#37197;&#32622;&#21644;&#20381;&#36182;&#27880;&#20837;&#21151;&#33021;&#65292;&#20351;&#24744;&#21487;&#20197;&#36731;&#26494;&#23454;&#29616;&#36825;&#19968;&#28857;&#12290;&#20551;&#35774;&#24744;&#24050;&#32463;&#21551;&#29992;&#20102;&#36825;&#20123;&#21151;&#33021;&#65292;&#21487;&#20197;&#36825;&#26679;&#26631;&#35760;&#24744;&#30340;&#26381;&#21153;&#65306;<\/p><pre><code>use SymfonyComponentDependencyInjectionAnnotationService;\n\n\/**\n * @Service(tags={\"name\": \"my.custom.tag\"})\n *\/\nclass MyService\n{\n    \/\/ ...\n}\n<\/code><\/pre><p>&#23545;&#19981;&#36215;&#65292;&#24744;&#30340;&#38382;&#39064;&#19981;&#26159;&#24456;&#28165;&#26970;&#65292;&#35831;&#24744;&#37325;&#26032;&#25551;&#36848;&#19968;&#19979;&#12290;<code>@Service<\/code>&#19968;&#20010;&#27880;&#35299;&#65292;&#29992;&#20110;&#26631;&#35760;<code>MyService<\/code>&#37197;&#32622;&#33258;&#21160;&#23436;&#25104;&#27169;&#24335;&#24050;&#20934;&#22791;&#23601;&#32490;&#12290;<\/p><h2>&#32467;&#35770;<\/h2><p>&#22312;Symfony&#26694;&#26550;&#20013;&#65292;&#26631;&#31614;&#26381;&#21153;&#26159;&#19968;&#39033;&#19981;&#21487;&#25110;&#32570;&#30340;&#25484;&#25569;&#26694;&#26550;&#26381;&#21153;&#23481;&#22120;&#25216;&#33021;&#30340;&#20851;&#38190;&#37096;&#20998;&#12290;&#23427;&#20801;&#35768;&#23454;&#29616;&#39640;&#31243;&#24230;&#30340;&#35299;&#32806;&#12289;&#21487;&#25193;&#23637;&#24615;&#21644;&#28789;&#27963;&#24615;&#12290;&#20174;&#31616;&#21333;&#30340;&#26631;&#35782;&#21040;&#29992;&#20110;&#32534;&#35793;&#22120;&#20256;&#36882;&#20013;&#30340;&#22797;&#26434;&#27880;&#20837;&#31574;&#30053;&#65292;&#26381;&#21153;&#26631;&#31614;&#21487;&#20197;&#26174;&#33879;&#31616;&#21270;&#21644;&#22686;&#24378;&#24212;&#29992;&#31243;&#24207;&#30340;&#25805;&#20316;&#22797;&#26434;&#24615;&#65292;&#20026;&#26550;&#26500;&#25552;&#20379;&#24040;&#22823;&#30340;&#26426;&#20250;&#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;&#20026;&#26381;&#21153;&#28155;&#21152;&#26631;&#31614;&#26159;&#19968;&#31181;&#24120;&#35265;&#30340;&#20570;&#27861;&#65292;&#23588;&#20854;&#26159;&#22312;&#22788;&#29702;&#22823;&#37327;&#25968;&#25454;&#26102;&#65292;&#36890;&#36807;&#23558;&#26631;&#31614;&#19982;&#29305;&#23450;&#30340;&#25968;&#25454;&#23545;&#35937;&#20851;&#32852;&#36215;&#26469;&#21487;&#20197;&#25552;&#39640;&#24212;&#29992;&#31243;&#24207;&#30340;&#28789;&#27963;&#24615;&#21644;&#24615;&#33021;&#12290;<\/p>\n<h3>1. &#23433;&#35013;&#24182;&#35774;&#32622;&#26631;&#31614;<\/h3>\n<p>&#39318;&#20808;&#65292;&#30830;&#20445;&#24744;&#24050;&#32463;&#23433;&#35013;&#20102;<code>doctrine-orm<\/code>, <code>doctrine-extensions<\/code>&#21644;<code>symfony<\/code>&#30340;&#30456;&#20851;&#21253;&#12290;&#22914;&#26524;&#23578;&#26410;&#23433;&#35013;&#65292;&#21487;&#20197;&#36890;&#36807;&#20197;&#19979;&#21629;&#20196;&#36827;&#34892;&#23433;&#35013;&#65306;<\/p>\n<pre><code class=\"language-bash\">composer require doctrine\/orm\ncomposer require doctrine\/orm-doctrine-extensions\ncomposer require symfony\/symfony<\/code><\/pre>\n<p>&#28982;&#21518;&#65292;&#22312;&#24744;&#30340;&#39033;&#30446;&#26681;&#30446;&#24405;&#19979;&#21019;&#24314;&#19968;&#20010;&#26032;&#30340;&#25991;&#20214;&#22841;&#65288;&#20363;&#22914; <code>tags<\/code>&#65289;&#65292;&#24182;&#22312;&#20854;&#20013;&#32534;&#20889;&#19968;&#20010;&#21517;&#20026; <code>Taggable.php<\/code> &#30340;&#26032;&#25991;&#20214;&#65292;&#29992;&#20110;&#23450;&#20041;&#26381;&#21153;&#30340;&#26631;&#31614;&#23646;&#24615;&#12290;<\/p>\n<h3>2. &#21019;&#24314;&#26631;&#31614;&#26381;&#21153;<\/h3>\n<p>&#25509;&#19979;&#26469;&#65292;&#21019;&#24314;&#19968;&#20010;&#21517;&#20026; <code>TaggableService.php<\/code> &#30340;&#26032;&#25991;&#20214;&#65292;&#24182;&#22312;&#20854;&#20013;&#28155;&#21152;&#20197;&#19979;&#20195;&#30721;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppService;\n\nuse DoctrineORMMapping as ORM;\nuse SymfonyComponentSecurityCoreAuthenticationTokenStorageTokenStorageInterface;\nuse SymfonyComponentSecurityCoreUserUserInterface;\nuse SymfonyComponentSecurityCoreExceptionBadCredentialsException;\nuse SymfonyComponentSecurityCoreExceptionUsernameNotFoundException;\nuse SymfonyComponentSecurityCoreExceptionAccessDeniedException;\nuse SymfonyComponentHttpFoundationRequestStack;\n\n\/**\n * @ORMEntity(repositoryClass=\"AppRepositoryTagRepository\")\n *\/\nclass TaggableService implements UserInterface\n{\n    private $tokenStorage;\n    private $requestStack;\n\n    public function __construct(TokenStorageInterface $tokenStorage, RequestStack $requestStack)\n    {\n        $this-&gt;tokenStorage = $tokenStorage;\n        $this-&gt;requestStack = $requestStack;\n    }\n\n    \/**\n     * @return mixed\n     *\/\n    public function getRoles()\n    {\n        return ['ROLE_USER'];\n    }\n\n    \/**\n     * @return string\n     *\/\n    public function getUsername()\n    {\n        \/\/ &#22312;&#36825;&#37324;&#33719;&#21462;&#29992;&#25143;&#30340;&#36523;&#20221;&#39564;&#35777;&#20196;&#29260;\n        return $this-&gt;tokenStorage-&gt;getToken()-&gt;getUser()-&gt;getUsername();\n    }\n\n    \/**\n     * @param string $password\n     *\n     * @throws BadCredentialsException\n     * @throws UsernameNotFoundException\n     * @throws AccessDeniedException\n     *\/\n    public function authenticatePassword($password)\n    {\n        if (!$this-&gt;tokenStorage-&gt;getToken()) {\n            throw new UsernameNotFoundException('No token found');\n        }\n\n        $user = $this-&gt;tokenStorage-&gt;getToken()-&gt;getUser();\n\n        if ($user instanceof UserInterface &amp;&amp; !$user-&gt;checkPassword($password)) {\n            throw new BadCredentialsException('Invalid password');\n        }\n    }\n}<\/code><\/pre>\n<h3>3. &#37197;&#32622;&#26381;&#21153;<\/h3>\n<p>&#26368;&#21518;&#65292;&#22312;&#24744;&#30340;&#24212;&#29992;&#37197;&#32622;&#25991;&#20214;&#20013;&#65292;&#21551;&#29992;&#26381;&#21153;&#27880;&#20837;&#65306;<\/p>\n<pre><code class=\"language-yaml\">services:\n    # ...\n    AppTaggableService:\n        class: AppServiceTaggableService\n        arguments: [\"@security.token_storage\", \"@request_stack\"]\n        tags:\n            - { name: security.service.user }<\/code><\/pre>\n<p>&#29616;&#22312;&#65292;&#24744;&#21487;&#20197;&#22312;&#25511;&#21046;&#22120;&#25110;&#20854;&#20182;&#32452;&#20214;&#20013;&#20351;&#29992; <code>TaggableService<\/code> &#26469;&#31649;&#29702;&#29992;&#25143;&#30340;&#26435;&#38480;&#21644;&#35748;&#35777;&#12290;&#20363;&#22914;&#65292;&#24744;&#21487;&#20197;&#21019;&#24314;&#19968;&#20010;&#26041;&#27861;&#26469;&#26816;&#26597;&#24403;&#21069;&#29992;&#25143;&#26159;&#21542;&#20855;&#26377;&#26576;&#20010;&#29305;&#23450;&#30340;&#26381;&#21153;&#26435;&#38480;&#65306;<\/p>\n<pre><code class=\"language-php\">public function checkServicePermission($serviceName): bool\n{\n    $taggableService = $this-&gt;getDoctrine()-&gt;getRepository(TaggableService::class)-&gt;findOneBy(['name' =&gt; $serviceName]);\n\n    return $taggableService !== null;\n}<\/code><\/pre>\n<h3>&#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#20197;&#19979;&#26159;&#23436;&#25972;&#30340;&#19968;&#20010;&#20363;&#23376;&#65292;&#23637;&#31034;&#20102;&#22914;&#20309;&#20351;&#29992; <code>TaggableService<\/code> &#26469;&#23454;&#29616;&#26381;&#21153;&#26435;&#38480;&#25511;&#21046;&#65306;<\/p>\n<pre><code class=\"language-php\">\/\/ AppControllerIndexController.php\nuse AppServiceTaggableService;\nuse SymfonyComponentRoutingAnnotationRoute;\n\nclass IndexController extends Controller\n{\n    #[Route('\/services', name: 'services')]\n    public function servicesAction(): Response\n    {\n        $taggableService = $this-&gt;getDoctrine()-&gt;getRepository(TaggableService::class)-&gt;findOneBy([]);\n\n        if ($taggableService) {\n            $permissionGranted = $this-&gt;checkServicePermission($taggableService-&gt;getName());\n\n            if ($permissionGranted) {\n                \/\/ &#36825;&#37324;&#26159;&#24744;&#30340;&#19994;&#21153;&#36923;&#36753;...\n            } else {\n                $this-&gt;addFlash('error', 'You don't have permission to access this service.');\n            }\n        } else {\n            $this-&gt;addFlash('error', 'This is an unknown service.');\n        }\n\n        return $this-&gt;render('@YourApplication\/Services.html.twig');\n    }\n}\n<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#39318;&#20808;&#20174;&#25968;&#25454;&#24211;&#26597;&#35810;&#20986;&#19968;&#20010;&#26381;&#21153;&#23545;&#35937;&#65292;&#28982;&#21518;&#26816;&#26597;&#23427;&#26159;&#21542;&#26377;&#30456;&#24212;&#30340;&#26435;&#38480;&#12290;&#22914;&#26524;&#27809;&#26377;&#26435;&#38480;&#65292;&#21017;&#26174;&#31034;&#38169;&#35823;&#28040;&#24687;&#12290;&#22914;&#26524;&#26377;&#26435;&#38480;&#65292;&#25105;&#20204;&#21487;&#20197;&#25191;&#34892;&#19994;&#21153;&#36923;&#36753;&#12290;<\/p>\n<p>&#36825;&#20010;&#31616;&#21333;&#30340;&#31034;&#20363;&#23637;&#31034;&#20102;&#22914;&#20309;&#22312; Symfony &#20013;&#20351;&#29992;&#26631;&#31614;&#26469;&#31616;&#21270;&#26435;&#38480;&#31649;&#29702;&#12290;&#26681;&#25454;&#23454;&#38469;&#38656;&#27714;&#65292;&#24744;&#21487;&#20197;&#25193;&#23637;&#27492;&#21151;&#33021;&#20197;&#25903;&#25345;&#26356;&#22810;&#31867;&#22411;&#30340;&#26631;&#31614;&#21644;&#26356;&#22797;&#26434;&#30340;&#26435;&#38480;&#25511;&#21046;&#31995;&#32479;&#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;&#20320;&#21487;&#20197;&#36890;&#36807;&#21019;&#24314;&#33258;&#23450;&#20041;&#30340;&#26631;&#038;#316..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[45],"tuisongtax":[],"class_list":["post-1093","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\/1093","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=1093"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1093"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1093"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}