制(skeleton)原理與定制實(shí)戰(zhàn))
代碼模板還能這樣改SensioGeneratorBundle骨架模板覆蓋機(jī)制skeleton原理與定制實(shí)戰(zhàn)【免費(fèi)下載鏈接】SensioGeneratorBundleGenerates Symfony bundles, entities, forms, CRUD, and more...項(xiàng)目地址: https://gitcode.com/gh_mirrors/se/SensioGeneratorBundleSensioGeneratorBundle是 Symfony2.7/3.x的代碼腳手架生成器通過(guò)generate:*系列命令一鍵生成 Bundle、控制器、Doctrine 實(shí)體、表單和 CRUD 控制器。它生成的每一行代碼都來(lái)自Resources/skeleton/目錄下的一組 Twig 模板——即骨架模板skeleton。好消息是這些模板可以被你在項(xiàng)目里悄悄替換不用改動(dòng) Bundle 源碼一行。本文講透覆蓋機(jī)制的原理并給出 3 種定制實(shí)戰(zhàn)方法。1?? 一分鐘原理命令提問(wèn) 模板渲染 落盤(pán)整個(gè)生成流程分工明確命令層Command/目錄負(fù)責(zé)交互式提問(wèn)、收集參數(shù)生成器層Generator/目錄負(fù)責(zé)把模板渲染成文件基類(lèi)Generator.php封裝了render()Twig 渲染注入namespace、bundle、format等變量和renderFile()自動(dòng)建目錄并寫(xiě)盤(pán)控制臺(tái)打印created/updated其中最關(guān)鍵的一處代碼// Generator/Generator.php —— getTwigEnvironment() new Twig_Environment( new Twig_Loader_Filesystem($this-skeletonDirs), // ← 多目錄模板搜索 array(strict_variables true, autoescape false) )Twig 的 Filesystem 加載器支持一次傳入多個(gè)目錄按數(shù)組順序查找、先命中先生效——這正是模板覆蓋的技術(shù)基石。2?? 骨架模板查找順序優(yōu)先級(jí)從高到低每次生成前GeneratorCommand.php 的getSkeletonDirs()會(huì)按以下順序組裝搜索路徑generate:* 運(yùn)行時(shí)模板查找順序先找到先用 ┌───────────────────────────────────────────────────────────┐ │ 1. BUNDLE_PATH/Resources/SensioGeneratorBundle/skeleton │ ★ 最高僅對(duì)該 Bundle 生效 │ 2. app/Resources/SensioGeneratorBundle/skeleton │ ★ 項(xiàng)目級(jí)全局生效主戰(zhàn)場(chǎng) │ 3. 本包 Resources/skeleton │ 內(nèi)置默認(rèn)模板 │ 4. 本包 Resources │ 支撐 skeleton/ 前綴引用 └───────────────────────────────────────────────────────────┘內(nèi)置模板按用途分成 5 類(lèi)目錄對(duì)照查看即可知道能定制什么Resources/skeleton/ ├── bundle/ Bundle 生成模板 ├── command/ Command 生成模板 ├── controller/ 控制器生成模板 ├── crud/ CRUD 全套模板actions/ views/ config/ tests/ └── form/ 表單類(lèi)型模板第 4 級(jí)把整個(gè)Resources目錄也加入了搜索路徑作用只有一個(gè)讓你的自定義模板能通過(guò)skeleton/前綴精確回指默認(rèn)模板見(jiàn)實(shí)戰(zhàn)三。3?? 實(shí)戰(zhàn)一整文件覆蓋最快上手把默認(rèn)模板復(fù)制一份、改到滿(mǎn)意放進(jìn)更高優(yōu)先級(jí)目錄的同名路徑即可。例如想讓generate:doctrine:crud生成的控制器都帶上團(tuán)隊(duì)規(guī)范注釋app/Resources/SensioGeneratorBundle/skeleton/ └── crud/ └── controller.php.twig ← 復(fù)制內(nèi)置同名模板后自由修改從此該命令生成的控制器都用你的版本。適合加許可頭、統(tǒng)一 PHPDoc 風(fēng)格、替換基類(lèi)等大改場(chǎng)景。4?? 實(shí)戰(zhàn)二extends block 局部覆蓋推薦整文件復(fù)制容易在 Bundle 升級(jí)后跟不上。而默認(rèn)模板已經(jīng)預(yù)先切分成多個(gè) Twig block例如 controller.php.twig 中就有use_statements、phpdoc_class_header、class_definition、class_body等塊只繼承并改你關(guān)心的部分{# app/Resources/SensioGeneratorBundle/skeleton/crud/actions/create.php.twig #} {% extends skeleton/crud/actions/create.php.twig %} {% block phpdoc_header %} {{ parent() }} * * 此文件由骨架生成修改前請(qǐng)先補(bǔ)充單元測(cè)試 {% endblock phpdoc_header %}6 行代碼就把團(tuán)隊(duì)規(guī)范注入每個(gè) CRUD 動(dòng)作的 PHPDoc其余原樣保留。5?? 實(shí)戰(zhàn)三用skeleton/前綴精確引用默認(rèn)模板部分模板內(nèi)部還會(huì)include其他模板比如 CRUD 編輯頁(yè)包含操作按鈕片段crud/views/others/record_actions.html.twig.twig。規(guī)則很簡(jiǎn)單不帶前綴命中你自定義的同名模板帶skeleton/前綴鎖定 Bundle 內(nèi)置的默認(rèn)原版{# 在自定義模板里需要保留默認(rèn)按鈕區(qū)時(shí) #} {{ include(skeleton/crud/views/others/record_actions.html.twig.twig) }}兩者自由組合就能實(shí)現(xiàn)九成新、一分改的精細(xì)定制。6?? 常見(jiàn)問(wèn)題與避坑指南癥狀原因與解決改了模板沒(méi)生效文件名不一致——注意雙后綴.twig.twig一個(gè)字母都不能差目錄必須叫SensioGeneratorBundle/skeleton渲染直接報(bào)錯(cuò)Twig 開(kāi)啟了strict_variables只能使用模板實(shí)際傳入的變量如namespace、bundle、format、actions覆蓋只對(duì)某個(gè) Bundle 有效你放在了第 1 級(jí) Bundle 目錄要全局生效請(qǐng)放app/Resources/SensioGeneratorBundle/skeleton/Symfony 4 / Flex 項(xiàng)目用不了README 已明確不支持 Symfony 4 與 Flex 無(wú) Bundle 結(jié)構(gòu)升級(jí)用戶(hù)請(qǐng)轉(zhuǎn)向 MakerBundle總結(jié)骨架模板覆蓋 Twig 多路徑模板目錄 優(yōu)先級(jí)查找順序 block 繼承。把文件放進(jìn)app/Resources/SensioGeneratorBundle/skeleton/你就掌握了整套定制體系。動(dòng)手前建議先讀一遍內(nèi)置Resources/skeleton/下對(duì)應(yīng)模板弄清可用變量和 block 名稱(chēng)一次寫(xiě)對(duì)?!久赓M(fèi)下載鏈接】SensioGeneratorBundleGenerates Symfony bundles, entities, forms, CRUD, and more...項(xiàng)目地址: https://gitcode.com/gh_mirrors/se/SensioGeneratorBundle創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考