{"id":1070,"date":"2025-06-12T12:00:02","date_gmt":"2025-06-12T04:00:02","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1070.html"},"modified":"2025-06-12T12:00:02","modified_gmt":"2025-06-12T04:00:02","slug":"%e5%a6%82%e4%bd%95%e5%9c%a8symfony%e4%b8%ad%e6%8f%90%e4%be%9b%e9%9d%99%e6%80%81%e6%96%87%e4%bb%b6","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1070.html","title":{"rendered":"\u5982\u4f55\u5728Symfony\u4e2d\u63d0\u4f9b\u9759\u6001\u6587\u4ef6"},"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;&#25552;&#20379;&#38745;&#24577;&#25991;&#20214;&#36890;&#24120;&#28041;&#21450;&#20197;&#19979;&#20960;&#20010;&#27493;&#39588;&#65306;<\/p>\n<ol>\n<li>\n<p><strong>&#21019;&#24314;&#38745;&#24577;&#25991;&#20214;&#30446;&#24405;<\/strong>&#65306;\n&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#22312;&#39033;&#30446;&#20013;&#21019;&#24314;&#19968;&#20010;&#29992;&#20110;&#23384;&#25918;&#38745;&#24577;&#25991;&#20214;&#30340;&#30446;&#24405;&#12290;&#20363;&#22914;&#65292;&#20320;&#21487;&#20197;&#21019;&#24314;&#19968;&#20010; <code>public<\/code> &#30446;&#24405;&#12290;<\/p>\n<\/li>\n<li>\n<p><strong>&#37197;&#32622;&#36335;&#30001;<\/strong>&#65306;\n&#20320;&#38656;&#35201;&#22312; <code>routing.yml<\/code> &#25991;&#20214;&#20013;&#37197;&#32622;&#36335;&#30001;&#26469;&#25351;&#21521;&#36825;&#20123;&#38745;&#24577;&#25991;&#20214;&#12290;&#20363;&#22914;&#65306;<\/p>\n<pre><code class=\"language-yaml\">app_homepage:\n   path: \/\n   defaults: { _controller: 'AppBundleControllerDefaultController::index' }<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#35774;&#32622;&#25511;&#21046;&#22120;<\/strong>&#65306;\n&#28982;&#21518;&#65292;&#20320;&#38656;&#35201;&#21019;&#24314;&#19968;&#20010;&#25511;&#21046;&#22120;&#26469;&#22788;&#29702;&#35831;&#27714;&#24182;&#36820;&#22238;&#38745;&#24577;&#25991;&#20214;&#12290;&#20363;&#22914;&#65306;<\/p>\n<pre><code class=\"language-php\">namespace AppBundleController;\n\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationResponse;\n\nclass DefaultController extends AbstractController\n{\n   public function index()\n   {\n       return new Response(file_get_contents('public\/index.html'));\n   }\n}<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#30830;&#20445;&#30446;&#24405;&#26435;&#38480;<\/strong>&#65306;\n&#30830;&#20445; <code>public<\/code> &#30446;&#24405;&#30340;&#26435;&#38480;&#20801;&#35768; Web &#26381;&#21153;&#22120;&#35775;&#38382;&#23427;&#12290;&#20363;&#22914;&#65292;&#22312; Linux &#19978;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992;&#20197;&#19979;&#21629;&#20196;&#65306;<\/p>\n<pre><code class=\"language-bash\">chmod -R 755 public<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#27979;&#35797;&#38745;&#24577;&#25991;&#20214;<\/strong>&#65306;\n&#26368;&#21518;&#65292;&#20320;&#21487;&#20197;&#36890;&#36807;&#27983;&#35272;&#22120;&#35775;&#38382;&#20320;&#30340;&#24212;&#29992;&#65292;&#26597;&#30475;&#26159;&#21542;&#33021;&#22815;&#27491;&#30830;&#26174;&#31034;&#38745;&#24577;&#25991;&#20214;&#12290;<\/p>\n<\/li>\n<\/ol>\n<h3>&#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#20197;&#19979;&#26159;&#19968;&#20010;&#23436;&#25972;&#30340;&#31034;&#20363;&#65292;&#23637;&#31034;&#20102;&#22914;&#20309;&#22312; Symfony &#20013;&#25552;&#20379;&#38745;&#24577;&#25991;&#20214;&#65306;<\/p>\n<h4>1. &#21019;&#24314;&#38745;&#24577;&#25991;&#20214;&#30446;&#24405;<\/h4>\n<pre><code class=\"language-bash\">mkdir public<\/code><\/pre>\n<h4>2. &#32534;&#36753; <code>routing.yml<\/code><\/h4>\n<pre><code class=\"language-yaml\">app_homepage:\n    path: \/\n    defaults: { _controller: 'AppBundleControllerDefaultController::index' }<\/code><\/pre>\n<h4>3. &#21019;&#24314;&#25511;&#21046;&#22120;<\/h4>\n<pre><code class=\"language-php\">namespace AppBundleController;\n\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationResponse;\n\nclass DefaultController extends AbstractController\n{\n    public function index()\n    {\n        \/\/ &#36820;&#22238;&#38745;&#24577;&#25991;&#20214;&#30340;&#20869;&#23481;\n        return new Response(file_get_contents('public\/index.html'));\n    }\n}<\/code><\/pre>\n<h4>4. &#32534;&#36753; <code>index.html<\/code> &#25991;&#20214;<\/h4>\n<p>&#22312; <code>public<\/code> &#30446;&#24405;&#19979;&#21019;&#24314;&#19968;&#20010; <code>index.html<\/code> &#25991;&#20214;&#65292;&#24182;&#28155;&#21152;&#19968;&#20123;&#31616;&#21333;&#30340; HTML &#20869;&#23481;&#65306;<\/p>\n<pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"UTF-8\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n    &lt;title&gt;Symfony Static File Example&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;h1&gt;Welcome to Symfony!&lt;\/h1&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<h4>5. &#35774;&#32622;&#30446;&#24405;&#26435;&#38480;<\/h4>\n<pre><code class=\"language-bash\">chmod -R 755 public<\/code><\/pre>\n<h4>6. &#27979;&#35797;&#38745;&#24577;&#25991;&#20214;<\/h4>\n<p>&#25171;&#24320;&#27983;&#35272;&#22120;&#65292;&#35775;&#38382; <code>http:\/\/localhost\/your-symfony-app\/app\/web\/index.html<\/code>&#65292;&#20320;&#24212;&#35813;&#33021;&#22815;&#30475;&#21040; &#8220;Welcome to Symfony!&#8221; &#30340;&#39029;&#38754;&#12290;<\/p>\n<p>&#36890;&#36807;&#20197;&#19978;&#27493;&#39588;&#65292;&#20320;&#23601;&#21487;&#20197;&#22312; Symfony &#20013;&#25104;&#21151;&#25552;&#20379;&#38745;&#24577;&#25991;&#20214;&#20102;&#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>&#26381;&#21153;&#38745;&#24577;&#25991;&#20214;&#65292;&#20363;&#22914;&#22270;&#29255;&#12289;JavaScript &#21644; CSS &#25991;&#20214;&#65292;&#26159; Web &#24212;&#29992;&#24320;&#21457;&#20013;&#30340;&#22522;&#26412;&#32452;&#25104;&#37096;&#20998;&#12290;Symfony &#26159;&#19968;&#20010;&#24378;&#22823;&#30340;&#22810;&#21151;&#33021; PHP &#26694;&#26550;&#65292;&#36890;&#36807;&#39640;&#25928;&#21644;&#21487;&#25193;&#23637;&#30340;&#23454;&#36341;&#31616;&#21270;&#20102;&#36825;&#19968;&#36807;&#31243;&#12290;&#22312;&#26412;&#25945;&#31243;&#20013;&#65292;&#25105;&#20204;&#23558;&#25506;&#32034;&#20351;&#29992; Symfony &#24320;&#21457;&#24212;&#29992;&#31243;&#24207;&#26102;&#20026;&#38745;&#24577;&#25991;&#20214;&#25552;&#20379;&#22810;&#31181;&#26041;&#27861;&#12290;<\/p><h2>&#29702;&#35299;Symfony&#30340;&#20844;&#20849;&#30446;&#24405;<\/h2><p>&#22312;Symfony&#20013;&#65292;&#20844;&#20849;&#30446;&#24405;&#29992;&#20110;&#25918;&#32622;&#30452;&#25509;&#36890;&#36807;&#27983;&#35272;&#22120;&#35775;&#38382;&#30340;&#25991;&#20214;&#12290;&#36825;&#21253;&#25324;&#24744;&#30340;&#38745;&#24577;&#36164;&#20135;&#65292;&#22914;&#22270;&#29255;&#12289;&#26679;&#24335;&#34920;&#21644;&#33050;&#26412;&#12290;<\/p><pre><code>project\/\n    public\/\n        css\/\n        js\/\n        images\/\n<\/code><\/pre><p>&#35753;&#25105;&#20204;&#20808;&#20174;&#26368;&#31616;&#21333;&#30340;&#20837;&#25163;&#25506;&#32034;&#19968;&#19979;&#12290;<\/p><h3>&#22522;&#26412;&#38745;&#24577;&#25991;&#20214;&#26381;&#21153;<\/h3><p>&#19968;&#26086;&#23558;&#25991;&#20214;&#25918;&#22312;&#20844;&#20849;&#30446;&#24405;&#19979;&#30340;&#36866;&#24403;&#20301;&#32622;&#65292;&#23601;&#21487;&#20197;&#22312;&#27169;&#26495;&#20013;&#24341;&#29992;&#23427;&#20204;&#20102;&#65306;<\/p><pre><code>&lt;!-- Accessing an image --&gt;\n&lt;img src=\"\/images\/logo.png\" alt=\"Logo\"&gt;<\/code><\/pre><p>&#36825;&#26159;&#19968;&#20010;&#24341;&#29992;CSS&#25991;&#20214;&#30340;&#31034;&#20363;&#65306;<\/p><pre><code>&lt;!-- Adding a stylesheet --&gt;\n&lt;link rel=\"stylesheet\" href=\"\/css\/style.css\"&gt;<\/code><\/pre><p>&#23545;&#20110;JavaScript&#25991;&#20214;&#65306;<\/p><pre><code>&lt;!-- Referencing a JavaScript file --&gt;\n&lt;script src=\"\/js\/app.js\"&gt;&lt;\/script&gt;<\/code><\/pre><h2>&#20351;&#29992;Asset Helper<\/h2><p>Symfony&#30340;&#36164;&#20135;&#21161;&#25163;&#25552;&#20379;&#20102;&#19968;&#31181;&#26356;&#28789;&#27963;&#21644;&#29615;&#22659;&#24863;&#30693;&#30340;&#26041;&#24335;&#26469;&#24341;&#29992;&#38745;&#24577;&#25991;&#20214;&#22312;&#27169;&#26495;&#20013;&#12290;&#35201;&#20351;&#29992;&#36164;&#20135;&#21161;&#25163;&#65292;&#21482;&#38656;&#35843;&#29992;&#23427;&#21363;&#21487;&#12290;<code>asset()<\/code>&#22312;&#20320;&#30340;Twig&#27169;&#26495;&#20013;&#23450;&#20041;&#19968;&#20010;&#20989;&#25968;&#12290;<\/p><pre><code>&lt;!-- Using the asset() function in Twig --&gt;\n&lt;img src=\"{{ asset('images\/logo.png') }}\" alt=\"Logo\"&gt;<\/code><\/pre><p>&#36164;&#20135;&#21151;&#33021;&#20250;&#26681;&#25454;&#24744;&#21487;&#33021;&#35774;&#32622;&#30340;&#22522;&#36335;&#24452;&#25110;&#36164;&#20135;&#29256;&#26412;&#31574;&#30053;&#26469;&#35745;&#31639;&#24182;&#29983;&#25104;&#27491;&#30830;&#30340;&#36164;&#20135;&#36335;&#24452;&#12290;<\/p><h2>&#36164;&#20135;&#29256;&#26412;&#31649;&#29702;<\/h2><p>&#20026;&#20102;&#21033;&#29992;&#36164;&#20135;&#29256;&#26412;&#25511;&#21046;&#65292;&#35831;&#22312;&#24744;&#30340;&#37197;&#32622;&#25991;&#20214;&#65288;&#36890;&#24120;&#20301;&#20110;&#26694;&#26550;&#37096;&#20998;&#65289;&#20013;&#36827;&#34892;&#37197;&#32622;&#12290;<code>config\/packages\/framework.yaml<\/code>&#20320;&#21487;&#20197;&#20351;&#29992;&#29256;&#26412;&#26597;&#35810;&#23383;&#31526;&#20018;&#25110;&#20351;&#29992;Webpack Encore&#30340;&#21253;&#31649;&#29702;&#26041;&#24335;&#12290;<\/p><pre><code>framework:\n    assets:\n        version: '1.0'\n<\/code><\/pre><h3>&#20351;&#29992; Webpack Encore &#23454;&#29616;&#29256;&#26412;&#25511;&#21046;<\/h3><p>&#22914;&#26524;&#20320;&#20351;&#29992;&#30340;&#26159;Symfony&#30340;Webpack Encore&#65292;&#21487;&#20197;&#36890;&#36807;Encore&#30340;API&#26469;&#21551;&#29992;&#29256;&#26412;&#25511;&#21046;&#12290;&#36825;&#26679;&#21487;&#20197;&#20511;&#21161;&#25991;&#20214;&#20869;&#23481;&#30340;&#21464;&#21270;&#26469;&#24110;&#21161;&#36827;&#34892;&#32531;&#23384;&#30772;&#38500;&#65292;&#21363;&#22312;&#25991;&#20214;&#20869;&#23481;&#21457;&#29983;&#21464;&#21270;&#26102;&#65292;&#22312;&#20854;&#21517;&#31216;&#21518;&#38468;&#21152;&#25991;&#20214;&#30340;&#20869;&#23481;&#21704;&#24076;&#20540;&#12290;<\/p><pre><code>\/\/ webpack.config.js\nEncore\n    \/\/ ...\n    .enableVersioning(Encore.isProduction())<\/code><\/pre><p>&#36825;&#20250;&#29983;&#25104;&#19968;&#20010; manifest &#25991;&#20214;&#65292;&#20351;&#24471; Symfony &#30340;&#36164;&#20135;&#21161;&#25163;&#21487;&#20197;&#26597;&#25214;&#27491;&#30830;&#30340;&#29256;&#26412;&#12290;<\/p><h2>&#38745;&#24577;&#25991;&#20214;&#30340;&#35775;&#38382;&#25511;&#21046;<\/h2><p>&#24403;&#38656;&#35201;&#25511;&#21046;&#26576;&#20123;&#38745;&#24577;&#25991;&#20214;&#30340;&#35775;&#38382;&#26102;&#65292;&#20320;&#21487;&#20197;&#36873;&#25321;&#20351;&#29992;Symfony&#19982;&#20854;&#20182;&#22810;&#31181;&#25991;&#20214;&#31995;&#32479;&#38598;&#25104;&#30340;&#33021;&#21147;&#65292;&#36825;&#20351;&#24471;&#24320;&#21457;&#32773;&#33021;&#22815;&#36731;&#26494;&#22788;&#29702;&#20855;&#26377;&#35775;&#38382;&#25511;&#21046;&#35201;&#27714;&#30340;&#25991;&#20214;&#12290;<\/p><p>&#19968;&#31181;&#26041;&#27861;&#26159;&#20351;&#29992;Symfony&#30340;BinaryFileResponse&#26469;&#23433;&#20840;&#22320;&#26381;&#21153;&#38656;&#35201;&#35775;&#38382;&#25511;&#21046;&#30340;&#25991;&#20214;&#65306;<\/p><pre><code>use SymfonyComponentHttpFoundationBinaryFileResponse;\n\n\/\/ Your controller action\npublic function downloadSecurelyAction()\n{\n    $path = '\/path\/to\/your\/secure\/file.jpg';\n\n    \/\/ You can perform security checks here\n\n    return new BinaryFileResponse($path);\n}<\/code><\/pre><p>&#36825;&#27573;&#20195;&#30721;&#29255;&#27573;&#29992;&#20110;&#23433;&#20840;&#22320;&#22788;&#29702;&#25991;&#20214;&#65292;&#20551;&#35774;&#20320;&#24050;&#32463;&#23454;&#29616;&#20102;&#24517;&#35201;&#30340;&#23433;&#20840;&#26816;&#26597;&#12290;<\/p><h2>&#39640;&#32423;&#37197;&#32622;<\/h2><p>&#23545;&#20110;&#20855;&#26377;&#22797;&#26434;&#38745;&#24577;&#36164;&#20135;&#26381;&#21153;&#38656;&#27714;&#30340;&#29615;&#22659;&#65292;Symfony &#21487;&#20197;&#19982; CDN&#65288;&#20869;&#23481;&#20998;&#21457;&#32593;&#32476;&#65289;&#38598;&#25104;&#12290;&#20320;&#21487;&#20197;&#37197;&#32622;&#22810;&#20010; CDN &#24182;&#20026;&#27599;&#20010;&#29615;&#22659;&#35774;&#32622;&#19981;&#21516;&#30340;&#22522;&#30784; URL&#12290;<\/p><pre><code>framework:\n    assets:\n        base_urls:\n            http: ['http:\/\/cdn.example.com\/']<\/code><\/pre><p>&#29616;&#22312;&#25152;&#26377;&#36164;&#20135;&#37117;&#23558;&#20174;&#25351;&#23450;&#30340;CDN&#26381;&#21153;&#31471;&#21475;&#25552;&#20379;&#12290;<\/p><h3>&#23450;&#21046;&#30446;&#24405;&#32467;&#26500;<\/h3><p>&#22914;&#26524;&#39033;&#30446;&#38656;&#35201;&#19981;&#21516;&#30340;&#30446;&#24405;&#32467;&#26500;&#65292;&#20320;&#21487;&#20197;&#33258;&#23450;&#20041;Symfony&#26597;&#25214;Web&#36164;&#20135;&#30340;&#20301;&#32622;&#12290;&#20363;&#22914;&#65292;&#35201;&#20174;&#19981;&#21516;&#20301;&#32622;&#26381;&#21153;&#22270;&#20687;&#65306;<\/p><pre><code>\/\/ src\/Twig\/AppExtension.php\n\nuse TwigExtensionAbstractExtension;\nuse TwigTwigfunction;\nuse SymfonyComponentAssetPackages;\n\nclass AppExtension extends AbstractExtension\n{\n    private $packages;\n\n    public function __construct(Packages $packages)\n    {\n        $this-&gt;packages = $packages;\n    }\n\n    public function getFunctions()\n    {\n        return [\n            new TwigFunction('image_asset', [$this, 'getImageAsset']),\n        ];\n    }\n\n    public function getImageAsset($path)\n    {\n        \/\/ Logic for resolving image paths, possibly based on some condition\n        return $this-&gt;packages-&gt;getUrl($path, 'custom_images_dir');\n    }\n}<\/code><\/pre><p>&#20320;&#20250;&#20026;&#26032;&#30340;&ldquo;&#33258;&#23450;&#20041;&#22270;&#29255;&#30446;&#24405;&rdquo;&#36164;&#20135;&#21253;&#21019;&#24314;&#30456;&#24212;&#30340;&#37197;&#32622;&#12290;&#22312;Twig&#20013;&#65292;&#20351;&#29992;&#24744;&#30340;&#33258;&#23450;&#20041;&#20989;&#25968;&#22914;&#19979;&#65306;<\/p><pre><code>{{ image_asset('logo.png') }}<\/code><\/pre><h2>&#32467;&#35770;&#12290;<\/h2><p>&#22312;Symfony&#20013;&#26381;&#21153;&#38745;&#24577;&#25991;&#20214;&#21487;&#20197;&#20174;&#31616;&#21333;&#30340;&#25991;&#20214;&#25918;&#32622;&#22312;public&#30446;&#24405;&#21040;&#22797;&#26434;&#30340;&#37197;&#32622;&#28041;&#21450;CDN&#12289;&#23553;&#35013;&#30446;&#24405;&#21644;&#36164;&#20135;&#29256;&#26412;&#31574;&#30053;&#31561;&#12290;&#37319;&#29992;&#36825;&#20123;&#26041;&#27861;&#21487;&#20197;&#20351;&#24744;&#25913;&#21892;&#29992;&#25143;&#20307;&#39564;&#65292;&#36890;&#36807;&#20248;&#21270;&#21152;&#36733;&#26102;&#38388;&#21644;&#26356;&#22909;&#22320;&#31649;&#29702;&#24744;&#30340;&#36164;&#20135;&#26469;&#25552;&#39640;&#21487;&#31649;&#29702;&#24615;&#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>&#35201;&#22312; Symfony &#20013;&#20026;&#38745;&#24577;&#25991;&#20214;&#25552;&#20379;&#26381;&#21153;&#65292;&#20320;&#38656;&#35201;&#36981;&#24490;&#20197;&#19979;&#27493;&#39588;&#65306;<\/p>\n<h3>1. &#21019;&#24314;&#19968;&#20010;&#26032;&#30340;&#25511;&#21046;&#22120;<\/h3>\n<p>&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#21019;&#24314;&#19968;&#20010;&#26032;&#30340;&#25511;&#21046;&#22120;&#26469;&#22788;&#29702;&#38745;&#24577;&#25991;&#20214;&#30340;&#35831;&#27714;&#12290;&#36825;&#23558;&#20801;&#35768;&#20320;&#22312;&#26381;&#21153;&#22120;&#19978;&#25176;&#31649;&#38745;&#24577;&#25991;&#20214;&#65292;&#24182;&#36890;&#36807; REST API &#35775;&#38382;&#23427;&#20204;&#12290;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppController;\n\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SensioBundleFrameworkExtraBundleConfigurationIsGranted;\nuse SymfonyComponentHttpFoundationResponse;\nuse SymfonyComponentRoutingAnnotationRoute;\n\nclass StaticFileController extends AbstractController\n{\n    \/**\n     * @Route(\"\/static\", name=\"app_static\")\n     *\/\n    public function index(): Response\n    {\n        return $this-&gt;render('static\/index.html.twig', [\n            'controller_name' =&gt; 'StaticFileController',\n        ]);\n    }\n}<\/code><\/pre>\n<h3>2. &#32534;&#35793;&#27169;&#26495;<\/h3>\n<p>&#20026;&#20102;&#30830;&#20445;&#38745;&#24577;&#25991;&#20214;&#33021;&#22815;&#27491;&#30830;&#22320;&#34987;&#27983;&#35272;&#22120;&#28210;&#26579;&#65292;&#20320;&#38656;&#35201;&#32534;&#35793;&#27169;&#26495;&#12290;&#20351;&#29992; <code>twig<\/code> &#27169;&#26495;&#24341;&#25806;&#26102;&#65292;&#20320;&#38656;&#35201;&#30830;&#20445;&#27169;&#26495;&#25991;&#20214;&#19982;&#24212;&#29992;&#31243;&#24207;&#30446;&#24405;&#19979;&#30340; <code>templates\/static<\/code> &#30446;&#24405;&#20445;&#25345;&#19968;&#33268;&#12290;<\/p>\n<pre><code class=\"language-bash\"># &#22312; composer.json &#25991;&#20214;&#20013;&#28155;&#21152;&#20197;&#19979;&#25351;&#20196;\n\"vendor:publish\": {\n    \"app\/templates\/*\": [\"files\"]\n},\n\n# &#20351;&#29992; composer update &#21629;&#20196;&#26356;&#26032; Composer &#30340;&#32531;&#23384;\ncomposer update<\/code><\/pre>\n<h3>3. &#37197;&#32622;&#38745;&#24577;&#25991;&#20214;&#22788;&#29702;&#22120;<\/h3>\n<p>&#22312; <code>config\/services.yaml<\/code> &#25991;&#20214;&#20013;&#37197;&#32622;&#38745;&#24577;&#25991;&#20214;&#22788;&#29702;&#22120;&#65292;&#20197;&#20415;&#23427;&#33021;&#22815;&#22312;&#24212;&#29992;&#21551;&#21160;&#26102;&#33258;&#21160;&#21152;&#36733;&#38745;&#24577;&#25991;&#20214;&#12290;<\/p>\n<pre><code class=\"language-yaml\">services:\n  static_file_handler:\n    class: AppServicesStaticFileHandler\n    arguments:\n      - \/var\/www\/html\/app\/public\/<\/code><\/pre>\n<h3>4. &#23433;&#35013;&#21644;&#37197;&#32622; HTTP Server<\/h3>\n<p>&#35201;&#37096;&#32626;&#21040;&#29983;&#20135;&#29615;&#22659;&#65292;&#20320;&#38656;&#35201;&#23433;&#35013;&#24182;&#37197;&#32622; Apache &#25110; Nginx &#20316;&#20026; Web &#26381;&#21153;&#22120;&#12290;&#36825;&#37324;&#20551;&#35774;&#20320;&#27491;&#22312;&#20351;&#29992; Apache&#12290;<\/p>\n<h4>A. Apache &#37096;&#32626;<\/h4>\n<p>&#22914;&#26524;&#20320;&#20351;&#29992;&#30340;&#26159; Apache&#65292;&#35831;&#25353;&#29031;&#20197;&#19979;&#27493;&#39588;&#36827;&#34892;&#37197;&#32622;&#65306;<\/p>\n<ul>\n<li>&#25171;&#24320; <code>\/etc\/apache2\/sites-available\/000-default.conf<\/code><\/li>\n<li>&#23558;&#20197;&#19979;&#20869;&#23481;&#26367;&#25442;&#20026;&#20320;&#30340;&#20027;&#26426;&#21517;&#21644;&#31471;&#21475;&#65306;\n<pre><code class=\"language-apache\">&lt;VirtualHost *:80&gt;\nServerName your-hostname\nDocumentRoot \"\/path\/to\/static\"\nErrorLog ${APACHE_LOG_DIR}\/error.log\nCustomLog ${APACHE_LOG_DIR}\/access.log combined\n&lt;\/VirtualHost&gt;<\/code><\/pre><\/li>\n<\/ul>\n<h4>B. Nginx &#37096;&#32626;<\/h4>\n<p>&#22914;&#26524;&#20351;&#29992;&#30340;&#26159; Nginx&#65292;&#21482;&#38656;&#37197;&#32622;&#20197;&#19979;&#34394;&#25311;&#20027;&#26426;&#65306;<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80 default_server;\n    server_name your-hostname;\n\n    location \/public {\n        root \/path\/to\/static;\n        try_files $uri $uri\/ =404;\n    }\n}<\/code><\/pre>\n<h3>5. &#27979;&#35797;&#38745;&#24577;&#25991;&#20214;<\/h3>\n<p>&#26368;&#21518;&#19968;&#27493;&#26159;&#27979;&#35797;&#38745;&#24577;&#25991;&#20214;&#26159;&#21542;&#25353;&#39044;&#26399;&#24037;&#20316;&#12290;&#20320;&#21487;&#20197;&#36890;&#36807;&#35775;&#38382; <code>\/static<\/code> &#36335;&#24452;&#26469;&#39564;&#35777;&#25991;&#20214;&#26159;&#21542;&#27491;&#24120;&#26174;&#31034;&#12290;<\/p>\n<p>&#20197;&#19978;&#23601;&#26159;&#22312; Symfony &#20013;&#20026;&#38745;&#24577;&#25991;&#20214;&#25552;&#20379;&#26381;&#21153;&#30340;&#22522;&#26412;&#27493;&#39588;&#12290;&#26681;&#25454;&#20320;&#30340;&#38656;&#27714;&#65292;&#20320;&#21487;&#20197;&#36827;&#19968;&#27493;&#25193;&#23637;&#36825;&#20010;&#26550;&#26500;&#65292;&#27604;&#22914;&#25903;&#25345;&#22810;&#20010;&#30446;&#24405;&#12289;&#20248;&#21270;&#36335;&#30001;&#31561;&#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;&#25552;&#20379;&#38745;&#24577;&#25991;&#20214;&#36890;&#24120;&#28041;&#21450;&#20197;&#19979;&#20960;&#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-1070","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\/1070","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=1070"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1070"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1070"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}