From 8c2db5209a3152d4236fd12c41e07aeed30b91ec Mon Sep 17 00:00:00 2001 From: hwbrzzl Date: Sun, 5 Jan 2025 14:35:12 +0000 Subject: [PATCH] deploy: b93b446d8d518d5d9266f39ad3a0c7fe8a4be3bd --- 404.html | 8 ++++---- architecutre-concepts/facades.html | 6 +++--- architecutre-concepts/index.html | 6 +++--- architecutre-concepts/request-lifecycle.html | 6 +++--- architecutre-concepts/service-container.html | 6 +++--- architecutre-concepts/service-providers.html | 6 +++--- ...04.html-Igc773BW.js => 404.html-BWf9DCd4.js} | 2 +- ...arTop-BdrWC7Yv.js => SidebarTop-Cm7exHpJ.js} | 2 +- assets/{app-ELDWQP0J.js => app-Ewo6p9aM.js} | 5 +++-- ...cmwb.js => artisan-console.html-CPLMFSR0.js} | 2 +- ...D0e4.js => artisan-console.html-DAWKwL5O.js} | 2 +- ...2_av1.js => authentication.html-BAJpTW5P.js} | 2 +- ...6WImG.js => authentication.html-cW_F_Plz.js} | 2 +- ...4a-UCq.js => authorization.html-Btcm8c6c.js} | 2 +- ...YtLfr9.js => authorization.html-Dqcqkx8v.js} | 2 +- ....html-BuCzPS6Q.js => cache.html-C_suBmb3.js} | 2 +- ....html-BCYn7pgp.js => cache.html-Hh3FLxMR.js} | 2 +- ....html-DAaPWn-A.js => color.html-BqDJgwTf.js} | 2 +- ....html-C-v_r0O_.js => color.html-H0iHmUWu.js} | 2 +- ...tml-DyeHgsV_.js => compile.html-BM_Gs_kd.js} | 2 +- ...tml-ClJuP_SF.js => compile.html-YqalC-tP.js} | 2 +- ...BG2vKn.js => configuration.html-3dQ1pRig.js} | 2 +- ...uxUGHH.js => configuration.html-D9LN5QiT.js} | 2 +- assets/contributions.html-Bk11CVy5.js | 1 + assets/contributions.html-CWH0LZEJ.js | 1 - assets/contributions.html-CZu5-uUi.js | 1 + assets/contributions.html-D1ANl6-5.js | 1 - ...DLgj0Njf.js => controllers.html-BeLopQ-1.js} | 2 +- ...CEpSC6VO.js => controllers.html-DMCVpm6U.js} | 2 +- ....js => directory-structure.html-D4BzyHY7.js} | 2 +- ....js => directory-structure.html-ExOJOA2Q.js} | 2 +- ...-CVmno7EC.js => encryption.html-BxhPC42u.js} | 2 +- ...-CKbEOEOI.js => encryption.html-DyU19Loz.js} | 2 +- ....html-BjiOyLvs.js => event.html-B7wfEywV.js} | 2 +- ....html-Bqomnab3.js => event.html-D503Eq94.js} | 2 +- ...tml-D9gOoFkn.js => facades.html-CCzNJASt.js} | 2 +- ...tml-sHR6uI9O.js => facades.html-li4DkJq0.js} | 2 +- ...l-BE6xVJDS.js => factories.html-6CEGbUG5.js} | 2 +- ...l-DNgknwi0.js => factories.html-BePWiOvD.js} | 2 +- ...-Buzi17dd.js => filesystem.html-BysE4Gio.js} | 2 +- ...-Dit00pAj.js => filesystem.html-Cu7cAXkV.js} | 2 +- ...iv8j.js => getting-started.html-3-OsHNcC.js} | 2 +- ...cpuW.js => getting-started.html-BDNUdeaa.js} | 2 +- ...PhOr.js => getting-started.html-BZLfsr3n.js} | 2 +- ...IaiF.js => getting-started.html-DXDdKYyS.js} | 2 +- ...c.html-CDEALKGL.js => grpc.html-DQDUY4gB.js} | 2 +- ...c.html-Dyii4ZbH.js => grpc.html-DsELBn-y.js} | 2 +- ...tml-DAjmzRr6.js => hashing.html-BgsHt5-V.js} | 2 +- ...tml-n8kDf70b.js => hashing.html-C0RYCNzD.js} | 2 +- ...tml-DZr1YU_I.js => helpers.html-Cq8AvWcV.js} | 2 +- ...tml-BP2SsPZW.js => helpers.html-DUXpw1q9.js} | 2 +- ...tml-fNToLLSU.js => history.html-B2eZNqyp.js} | 2 +- ...tml-DHMt6lzE.js => history.html-D3fbw5gF.js} | 2 +- ...-B-d0DuGG.js => http-tests.html-Ce3n6X9u.js} | 2 +- ...-DJZPGIdY.js => http-tests.html-QexOHz8g.js} | 2 +- ....html-BVAG0IOP.js => index.html-3b3KoC5i.js} | 2 +- assets/index.html-B-JSxCCx.js | 1 + ....html-BEuBVW2c.js => index.html-B4mmnR5Q.js} | 2 +- assets/index.html-BBFqSAWn.js | 1 - ....html-ByKWtYVD.js => index.html-BSWJWxby.js} | 2 +- ....html-UkIBF4JQ.js => index.html-BcXYMCkI.js} | 2 +- ....html-Deh-LlCG.js => index.html-BkjDAmZb.js} | 2 +- ....html-CzAmH-u1.js => index.html-C0_A7UL3.js} | 2 +- assets/index.html-CT0kaf7E.js | 1 - ....html-VPpLgu3h.js => index.html-Cae7jPN6.js} | 2 +- ....html-IziS7bPz.js => index.html-Cm8gFo-6.js} | 2 +- assets/index.html-Df977mn_.js | 1 + ....html-DG7cQ81A.js => index.html-DgIIss5c.js} | 2 +- ....html-mt-dD_0e.js => index.html-DzLqAZ-M.js} | 2 +- ....html-lmPszigo.js => index.html-RQUretvc.js} | 2 +- ....html-BvGPStsm.js => index.html-Vt8tv1Xv.js} | 2 +- ...lnSZIsI.js => installation.html-V65Je3iJ.js} | 2 +- ...IybxPEG.js => installation.html-wUPfcyRS.js} | 2 +- ...RqEi7DE.js => localization.html-aHKhjEZN.js} | 2 +- ...kLT5oeb.js => localization.html-ioRlV1eG.js} | 2 +- ...tml-Bp8flR3X.js => logging.html-D8i8HGpu.js} | 2 +- ...tml-B154Sv3t.js => logging.html-v2chIVWM.js} | 2 +- assets/logo-CxXS7KxG.js | 1 + ...l.html-8Xog75UY.js => mail.html-B61PCqmJ.js} | 2 +- ...l.html-CNknEOHN.js => mail.html-B8fLiBJF.js} | 2 +- ...-BL7jUq09.js => middleware.html-BS2d13x5.js} | 2 +- ...-wZMDQOd4.js => middleware.html-CXKWpfrh.js} | 2 +- ...-D7dZl_CR.js => migrations.html-CFNqP66E.js} | 2 +- ...-BxQwb3BO.js => migrations.html-WE2FpGDS.js} | 2 +- ...k.html-Cjt9THLr.js => mock.html-DGC_6HL_.js} | 2 +- ...k.html-BJWTScb4.js => mock.html-ZesMHtBg.js} | 2 +- ....js => package-development.html-BZNmOuwR.js} | 2 +- ....js => package-development.html-DHPBH4od.js} | 2 +- ...ml-Dfo0Uatf.js => packages.html-D_mXOzrI.js} | 2 +- ...ml-QsGxcqGQ.js => packages.html-IAGwRamE.js} | 2 +- ...hGl3B.js => privacy-policy.html-B2lf6jGC.js} | 2 +- ...html-C0Cbu1pl.js => queues.html-CWus8EaR.js} | 2 +- ...html-D-b0oVFC.js => queues.html-DwZaProp.js} | 2 +- ...aEkpsM.js => relationships.html-BSq_nKu_.js} | 2 +- ...51a1Hp.js => relationships.html-DP1bUOq_.js} | 2 +- ...ek.js => request-lifecycle.html-DHOcG7yE.js} | 2 +- ...w3.js => request-lifecycle.html-DunQQCpy.js} | 2 +- ...tml-Car_orJ0.js => request.html-BRO6Ir3A.js} | 2 +- ...tml-DFk1Innn.js => request.html-InRYZk6S.js} | 2 +- ...ml-8chm0-dC.js => response.html-B35yVy49.js} | 2 +- ...ml-4zROuYC6.js => response.html-D9zNjqyg.js} | 2 +- ...tml-BLEaQZzR.js => routing.html-CAhxGT-v.js} | 2 +- ...tml-Df_eKiQu.js => routing.html-mXSyj-Cl.js} | 2 +- ...tml-DlQZgxSO.js => seeding.html-DJGTroRp.js} | 2 +- ...tml-UfI7Zcx5.js => seeding.html-DXYzvnxo.js} | 2 +- ...uX.js => service-container.html-BhMudo_s.js} | 2 +- ...Bq.js => service-container.html-DCQmf82Z.js} | 2 +- ...uo.js => service-providers.html-C0Jn-Hxq.js} | 2 +- ...F4.js => service-providers.html-E7CB2W-O.js} | 2 +- ...tml-CRsI3TtN.js => session.html-AG3rrd3w.js} | 2 +- ...tml-CfifO3t5.js => session.html-BO0crizQ.js} | 2 +- ...fq.js => setupDevtools-7MC2TMWH-D878vR7l.js} | 2 +- ...tml-BmWihGVZ.js => strings.html-D2jwoqQA.js} | 2 +- ...tml-nXI4uHZR.js => strings.html-yF0zvrgw.js} | 2 +- assets/t-shirt-DgVZ0NNq.js | 1 + ...9QwO.js => task-scheduling.html-11gBtef7.js} | 2 +- ...oYQs.js => task-scheduling.html-BbpiH0gg.js} | 2 +- ...1.html-B6iPtN3Y.js => v1.1.html-Bjnqtk-K.js} | 2 +- ...1.html-D_yWCxPz.js => v1.1.html-DEdzSCtL.js} | 2 +- ....html-XUJL9iAA.js => v1.10.html-B8rfcGOk.js} | 2 +- ....html-D5RdiF4o.js => v1.10.html-DuxpMOWg.js} | 2 +- ....html-Cb3xxHwa.js => v1.11.html-8qQFbcw6.js} | 2 +- ....html-CC8y2mBf.js => v1.11.html-BrYBsgIm.js} | 2 +- ....html-Cicrako9.js => v1.12.html-Bjnsh028.js} | 2 +- ....html-C-58BhZu.js => v1.12.html-zH8DdV-e.js} | 2 +- ....html-wSZ9KRJY.js => v1.13.html-DKjd5VZ6.js} | 2 +- ....html-CTxZq6lE.js => v1.13.html-TufMrOde.js} | 2 +- ....html-DPlnarKn.js => v1.14.html-BdTzwT9L.js} | 2 +- ....html-bMdPR76k.js => v1.14.html-lTdRYbaU.js} | 2 +- ....html-BMHEbFXP.js => v1.15.html-BI41-PdG.js} | 2 +- ....html-D9dirphE.js => v1.15.html-BrvVMvb6.js} | 2 +- ...2.html-D0LqRqm7.js => v1.2.html-BwNn_ayr.js} | 2 +- ...2.html-DHj4lNME.js => v1.2.html-mXqGWCTf.js} | 2 +- ...3.html-Bi-V8sdS.js => v1.3.html-CbKsK0o_.js} | 2 +- ...3.html-Dy2IeiUA.js => v1.3.html-tHE7sKhD.js} | 2 +- ...4.html-DYbIWcYQ.js => v1.4.html-DgzhLqIa.js} | 2 +- ...4.html-CQ3ogmB9.js => v1.4.html-DrNJQuWM.js} | 2 +- ...5.html-DE69oQdf.js => v1.5.html-Bmq8i0sU.js} | 2 +- ...5.html-BMDUgiIu.js => v1.5.html-DIctImTe.js} | 2 +- ...6.html-DOXqmAiA.js => v1.6.html-BAAJlVdv.js} | 2 +- ...6.html-DVu4nDqR.js => v1.6.html-DSYQNrKC.js} | 2 +- ...7.html-mjf4FAYu.js => v1.7.html-BlUtLZrM.js} | 2 +- ...7.html-CA3uanBR.js => v1.7.html-OCSm9Wzu.js} | 2 +- ...8.html-DVq3pEBb.js => v1.8.html-BZG1T2FE.js} | 2 +- ...8.html-CaCOiXQ8.js => v1.8.html-kjkSDe_F.js} | 2 +- ...9.html-DPjMtyff.js => v1.9.html-BjVeexcL.js} | 2 +- ...9.html-kYWrJkbl.js => v1.9.html-CfwQEdWO.js} | 2 +- ...-C8BhQ8Dc.js => validation.html-CiLImEXn.js} | 2 +- ...-BsamCfrc.js => validation.html-cWEjgQJ2.js} | 2 +- ....html-KoNxbrdS.js => views.html-BMnAtMFZ.js} | 2 +- ....html-CNh0d9Px.js => views.html-DEPOesR0.js} | 2 +- digging-deeper/artisan-console.html | 6 +++--- digging-deeper/cache.html | 6 +++--- digging-deeper/color.html | 6 +++--- digging-deeper/event.html | 6 +++--- digging-deeper/filesystem.html | 6 +++--- digging-deeper/helpers.html | 6 +++--- digging-deeper/index.html | 6 +++--- digging-deeper/localization.html | 6 +++--- digging-deeper/mail.html | 6 +++--- digging-deeper/package-development.html | 6 +++--- digging-deeper/queues.html | 6 +++--- digging-deeper/strings.html | 6 +++--- digging-deeper/task-scheduling.html | 6 +++--- getting-started/compile.html | 6 +++--- getting-started/configuration.html | 6 +++--- getting-started/directory-structure.html | 6 +++--- getting-started/index.html | 6 +++--- getting-started/installation.html | 6 +++--- index.html | 8 ++++---- orm/factories.html | 6 +++--- orm/getting-started.html | 6 +++--- orm/index.html | 6 +++--- orm/migrations.html | 6 +++--- orm/relationships.html | 6 +++--- orm/seeding.html | 6 +++--- prologue/contributions.html | 12 ++++++------ prologue/packages.html | 6 +++--- prologue/privacy-policy.html | 6 +++--- security/authentication.html | 6 +++--- security/authorization.html | 6 +++--- security/encryption.html | 6 +++--- security/hashing.html | 6 +++--- t-shirt.jpg | Bin 0 -> 27701 bytes testing/getting-started.html | 6 +++--- testing/http-tests.html | 6 +++--- testing/index.html | 6 +++--- testing/mock.html | 6 +++--- the-basics/controllers.html | 6 +++--- the-basics/grpc.html | 6 +++--- the-basics/index.html | 6 +++--- the-basics/logging.html | 6 +++--- the-basics/middleware.html | 6 +++--- the-basics/request.html | 6 +++--- the-basics/response.html | 6 +++--- the-basics/routing.html | 6 +++--- the-basics/session.html | 6 +++--- the-basics/validation.html | 6 +++--- the-basics/views.html | 6 +++--- upgrade/history.html | 6 +++--- upgrade/v1.1.html | 6 +++--- upgrade/v1.10.html | 6 +++--- upgrade/v1.11.html | 6 +++--- upgrade/v1.12.html | 6 +++--- upgrade/v1.13.html | 6 +++--- upgrade/v1.14.html | 6 +++--- upgrade/v1.15.html | 6 +++--- upgrade/v1.2.html | 6 +++--- upgrade/v1.3.html | 6 +++--- upgrade/v1.4.html | 6 +++--- upgrade/v1.5.html | 6 +++--- upgrade/v1.6.html | 6 +++--- upgrade/v1.7.html | 6 +++--- upgrade/v1.8.html | 6 +++--- upgrade/v1.9.html | 6 +++--- zh/architecutre-concepts/facades.html | 6 +++--- zh/architecutre-concepts/index.html | 6 +++--- zh/architecutre-concepts/request-lifecycle.html | 6 +++--- zh/architecutre-concepts/service-container.html | 6 +++--- zh/architecutre-concepts/service-providers.html | 6 +++--- zh/digging-deeper/artisan-console.html | 6 +++--- zh/digging-deeper/cache.html | 6 +++--- zh/digging-deeper/color.html | 6 +++--- zh/digging-deeper/event.html | 6 +++--- zh/digging-deeper/filesystem.html | 6 +++--- zh/digging-deeper/helpers.html | 6 +++--- zh/digging-deeper/index.html | 6 +++--- zh/digging-deeper/localization.html | 6 +++--- zh/digging-deeper/mail.html | 6 +++--- zh/digging-deeper/package-development.html | 6 +++--- zh/digging-deeper/queues.html | 6 +++--- zh/digging-deeper/strings.html | 6 +++--- zh/digging-deeper/task-scheduling.html | 6 +++--- zh/getting-started/compile.html | 6 +++--- zh/getting-started/configuration.html | 6 +++--- zh/getting-started/directory-structure.html | 6 +++--- zh/getting-started/index.html | 6 +++--- zh/getting-started/installation.html | 6 +++--- zh/index.html | 8 ++++---- zh/orm/factories.html | 6 +++--- zh/orm/getting-started.html | 6 +++--- zh/orm/index.html | 6 +++--- zh/orm/migrations.html | 6 +++--- zh/orm/relationships.html | 6 +++--- zh/orm/seeding.html | 6 +++--- zh/prologue/contributions.html | 12 ++++++------ zh/prologue/packages.html | 6 +++--- zh/security/authentication.html | 6 +++--- zh/security/authorization.html | 6 +++--- zh/security/encryption.html | 6 +++--- zh/security/hashing.html | 6 +++--- zh/testing/getting-started.html | 6 +++--- zh/testing/http-tests.html | 6 +++--- zh/testing/index.html | 6 +++--- zh/testing/mock.html | 6 +++--- zh/the-basics/controllers.html | 6 +++--- zh/the-basics/grpc.html | 6 +++--- zh/the-basics/index.html | 6 +++--- zh/the-basics/logging.html | 6 +++--- zh/the-basics/middleware.html | 6 +++--- zh/the-basics/request.html | 6 +++--- zh/the-basics/response.html | 6 +++--- zh/the-basics/routing.html | 6 +++--- zh/the-basics/session.html | 6 +++--- zh/the-basics/validation.html | 6 +++--- zh/the-basics/views.html | 6 +++--- zh/upgrade/history.html | 6 +++--- zh/upgrade/v1.1.html | 6 +++--- zh/upgrade/v1.10.html | 6 +++--- zh/upgrade/v1.11.html | 6 +++--- zh/upgrade/v1.12.html | 6 +++--- zh/upgrade/v1.13.html | 6 +++--- zh/upgrade/v1.14.html | 6 +++--- zh/upgrade/v1.15.html | 6 +++--- zh/upgrade/v1.2.html | 6 +++--- zh/upgrade/v1.3.html | 6 +++--- zh/upgrade/v1.4.html | 6 +++--- zh/upgrade/v1.5.html | 6 +++--- zh/upgrade/v1.6.html | 6 +++--- zh/upgrade/v1.7.html | 6 +++--- zh/upgrade/v1.8.html | 6 +++--- zh/upgrade/v1.9.html | 6 +++--- 282 files changed, 560 insertions(+), 557 deletions(-) rename assets/{404.html-Igc773BW.js => 404.html-BWf9DCd4.js} (93%) rename assets/{SidebarTop-BdrWC7Yv.js => SidebarTop-Cm7exHpJ.js} (90%) rename assets/{app-ELDWQP0J.js => app-Ewo6p9aM.js} (93%) rename assets/{artisan-console.html-BCKOcmwb.js => artisan-console.html-CPLMFSR0.js} (99%) rename assets/{artisan-console.html-IU4iD0e4.js => artisan-console.html-DAWKwL5O.js} (99%) rename assets/{authentication.html-BwD2_av1.js => authentication.html-BAJpTW5P.js} (99%) rename assets/{authentication.html-onB6WImG.js => authentication.html-cW_F_Plz.js} (99%) rename assets/{authorization.html-DG4a-UCq.js => authorization.html-Btcm8c6c.js} (99%) rename assets/{authorization.html-BHYtLfr9.js => authorization.html-Dqcqkx8v.js} (99%) rename assets/{cache.html-BuCzPS6Q.js => cache.html-C_suBmb3.js} (99%) rename assets/{cache.html-BCYn7pgp.js => cache.html-Hh3FLxMR.js} (99%) rename assets/{color.html-DAaPWn-A.js => color.html-BqDJgwTf.js} (99%) rename assets/{color.html-C-v_r0O_.js => color.html-H0iHmUWu.js} (99%) rename assets/{compile.html-DyeHgsV_.js => compile.html-BM_Gs_kd.js} (99%) rename assets/{compile.html-ClJuP_SF.js => compile.html-YqalC-tP.js} (99%) rename assets/{configuration.html-COBG2vKn.js => configuration.html-3dQ1pRig.js} (99%) rename assets/{configuration.html-XDuxUGHH.js => configuration.html-D9LN5QiT.js} (99%) create mode 100644 assets/contributions.html-Bk11CVy5.js delete mode 100644 assets/contributions.html-CWH0LZEJ.js create mode 100644 assets/contributions.html-CZu5-uUi.js delete mode 100644 assets/contributions.html-D1ANl6-5.js rename assets/{controllers.html-DLgj0Njf.js => controllers.html-BeLopQ-1.js} (99%) rename assets/{controllers.html-CEpSC6VO.js => controllers.html-DMCVpm6U.js} (99%) rename assets/{directory-structure.html-OmthrrZZ.js => directory-structure.html-D4BzyHY7.js} (99%) rename assets/{directory-structure.html-CwwWhzXK.js => directory-structure.html-ExOJOA2Q.js} (99%) rename assets/{encryption.html-CVmno7EC.js => encryption.html-BxhPC42u.js} (99%) rename assets/{encryption.html-CKbEOEOI.js => encryption.html-DyU19Loz.js} (99%) rename assets/{event.html-BjiOyLvs.js => event.html-B7wfEywV.js} (99%) rename assets/{event.html-Bqomnab3.js => event.html-D503Eq94.js} (99%) rename assets/{facades.html-D9gOoFkn.js => facades.html-CCzNJASt.js} (99%) rename assets/{facades.html-sHR6uI9O.js => facades.html-li4DkJq0.js} (99%) rename assets/{factories.html-BE6xVJDS.js => factories.html-6CEGbUG5.js} (99%) rename assets/{factories.html-DNgknwi0.js => factories.html-BePWiOvD.js} (99%) rename assets/{filesystem.html-Buzi17dd.js => filesystem.html-BysE4Gio.js} (99%) rename assets/{filesystem.html-Dit00pAj.js => filesystem.html-Cu7cAXkV.js} (99%) rename assets/{getting-started.html-BHaViv8j.js => getting-started.html-3-OsHNcC.js} (99%) rename assets/{getting-started.html-CWiAcpuW.js => getting-started.html-BDNUdeaa.js} (99%) rename assets/{getting-started.html-CPD5PhOr.js => getting-started.html-BZLfsr3n.js} (99%) rename assets/{getting-started.html-Dkt4IaiF.js => getting-started.html-DXDdKYyS.js} (99%) rename assets/{grpc.html-CDEALKGL.js => grpc.html-DQDUY4gB.js} (99%) rename assets/{grpc.html-Dyii4ZbH.js => grpc.html-DsELBn-y.js} (99%) rename assets/{hashing.html-DAjmzRr6.js => hashing.html-BgsHt5-V.js} (99%) rename assets/{hashing.html-n8kDf70b.js => hashing.html-C0RYCNzD.js} (99%) rename assets/{helpers.html-DZr1YU_I.js => helpers.html-Cq8AvWcV.js} (99%) rename assets/{helpers.html-BP2SsPZW.js => helpers.html-DUXpw1q9.js} (99%) rename assets/{history.html-fNToLLSU.js => history.html-B2eZNqyp.js} (97%) rename assets/{history.html-DHMt6lzE.js => history.html-D3fbw5gF.js} (97%) rename assets/{http-tests.html-B-d0DuGG.js => http-tests.html-Ce3n6X9u.js} (99%) rename assets/{http-tests.html-DJZPGIdY.js => http-tests.html-QexOHz8g.js} (99%) rename assets/{index.html-BVAG0IOP.js => index.html-3b3KoC5i.js} (95%) create mode 100644 assets/index.html-B-JSxCCx.js rename assets/{index.html-BEuBVW2c.js => index.html-B4mmnR5Q.js} (94%) delete mode 100644 assets/index.html-BBFqSAWn.js rename assets/{index.html-ByKWtYVD.js => index.html-BSWJWxby.js} (95%) rename assets/{index.html-UkIBF4JQ.js => index.html-BcXYMCkI.js} (94%) rename assets/{index.html-Deh-LlCG.js => index.html-BkjDAmZb.js} (95%) rename assets/{index.html-CzAmH-u1.js => index.html-C0_A7UL3.js} (94%) delete mode 100644 assets/index.html-CT0kaf7E.js rename assets/{index.html-VPpLgu3h.js => index.html-Cae7jPN6.js} (94%) rename assets/{index.html-IziS7bPz.js => index.html-Cm8gFo-6.js} (94%) create mode 100644 assets/index.html-Df977mn_.js rename assets/{index.html-DG7cQ81A.js => index.html-DgIIss5c.js} (95%) rename assets/{index.html-mt-dD_0e.js => index.html-DzLqAZ-M.js} (95%) rename assets/{index.html-lmPszigo.js => index.html-RQUretvc.js} (94%) rename assets/{index.html-BvGPStsm.js => index.html-Vt8tv1Xv.js} (94%) rename assets/{installation.html-8lnSZIsI.js => installation.html-V65Je3iJ.js} (99%) rename assets/{installation.html-BIybxPEG.js => installation.html-wUPfcyRS.js} (99%) rename assets/{localization.html-DRqEi7DE.js => localization.html-aHKhjEZN.js} (99%) rename assets/{localization.html-BkLT5oeb.js => localization.html-ioRlV1eG.js} (99%) rename assets/{logging.html-Bp8flR3X.js => logging.html-D8i8HGpu.js} (99%) rename assets/{logging.html-B154Sv3t.js => logging.html-v2chIVWM.js} (99%) create mode 100644 assets/logo-CxXS7KxG.js rename assets/{mail.html-8Xog75UY.js => mail.html-B61PCqmJ.js} (99%) rename assets/{mail.html-CNknEOHN.js => mail.html-B8fLiBJF.js} (99%) rename assets/{middleware.html-BL7jUq09.js => middleware.html-BS2d13x5.js} (99%) rename assets/{middleware.html-wZMDQOd4.js => middleware.html-CXKWpfrh.js} (99%) rename assets/{migrations.html-D7dZl_CR.js => migrations.html-CFNqP66E.js} (99%) rename assets/{migrations.html-BxQwb3BO.js => migrations.html-WE2FpGDS.js} (99%) rename assets/{mock.html-Cjt9THLr.js => mock.html-DGC_6HL_.js} (99%) rename assets/{mock.html-BJWTScb4.js => mock.html-ZesMHtBg.js} (99%) rename assets/{package-development.html-BH8s19OD.js => package-development.html-BZNmOuwR.js} (99%) rename assets/{package-development.html-XO5_ome_.js => package-development.html-DHPBH4od.js} (99%) rename assets/{packages.html-Dfo0Uatf.js => packages.html-D_mXOzrI.js} (98%) rename assets/{packages.html-QsGxcqGQ.js => packages.html-IAGwRamE.js} (98%) rename assets/{privacy-policy.html-B95hGl3B.js => privacy-policy.html-B2lf6jGC.js} (98%) rename assets/{queues.html-C0Cbu1pl.js => queues.html-CWus8EaR.js} (99%) rename assets/{queues.html-D-b0oVFC.js => queues.html-DwZaProp.js} (99%) rename assets/{relationships.html-CqaEkpsM.js => relationships.html-BSq_nKu_.js} (99%) rename assets/{relationships.html-DB51a1Hp.js => relationships.html-DP1bUOq_.js} (99%) rename assets/{request-lifecycle.html-CxhD0_ek.js => request-lifecycle.html-DHOcG7yE.js} (98%) rename assets/{request-lifecycle.html-B95lifw3.js => request-lifecycle.html-DunQQCpy.js} (98%) rename assets/{request.html-Car_orJ0.js => request.html-BRO6Ir3A.js} (99%) rename assets/{request.html-DFk1Innn.js => request.html-InRYZk6S.js} (99%) rename assets/{response.html-8chm0-dC.js => response.html-B35yVy49.js} (99%) rename assets/{response.html-4zROuYC6.js => response.html-D9zNjqyg.js} (99%) rename assets/{routing.html-BLEaQZzR.js => routing.html-CAhxGT-v.js} (99%) rename assets/{routing.html-Df_eKiQu.js => routing.html-mXSyj-Cl.js} (99%) rename assets/{seeding.html-DlQZgxSO.js => seeding.html-DJGTroRp.js} (99%) rename assets/{seeding.html-UfI7Zcx5.js => seeding.html-DXYzvnxo.js} (99%) rename assets/{service-container.html-CpNN7JuX.js => service-container.html-BhMudo_s.js} (99%) rename assets/{service-container.html-DFOd3-Bq.js => service-container.html-DCQmf82Z.js} (99%) rename assets/{service-providers.html-fZyFpzuo.js => service-providers.html-C0Jn-Hxq.js} (98%) rename assets/{service-providers.html-C4FpQXF4.js => service-providers.html-E7CB2W-O.js} (98%) rename assets/{session.html-CRsI3TtN.js => session.html-AG3rrd3w.js} (99%) rename assets/{session.html-CfifO3t5.js => session.html-BO0crizQ.js} (99%) rename assets/{setupDevtools-7MC2TMWH-bpP4unfq.js => setupDevtools-7MC2TMWH-D878vR7l.js} (93%) rename assets/{strings.html-BmWihGVZ.js => strings.html-D2jwoqQA.js} (99%) rename assets/{strings.html-nXI4uHZR.js => strings.html-yF0zvrgw.js} (99%) create mode 100644 assets/t-shirt-DgVZ0NNq.js rename assets/{task-scheduling.html-C99X9QwO.js => task-scheduling.html-11gBtef7.js} (99%) rename assets/{task-scheduling.html-CQ8MoYQs.js => task-scheduling.html-BbpiH0gg.js} (99%) rename assets/{v1.1.html-B6iPtN3Y.js => v1.1.html-Bjnqtk-K.js} (99%) rename assets/{v1.1.html-D_yWCxPz.js => v1.1.html-DEdzSCtL.js} (99%) rename assets/{v1.10.html-XUJL9iAA.js => v1.10.html-B8rfcGOk.js} (99%) rename assets/{v1.10.html-D5RdiF4o.js => v1.10.html-DuxpMOWg.js} (99%) rename assets/{v1.11.html-Cb3xxHwa.js => v1.11.html-8qQFbcw6.js} (99%) rename assets/{v1.11.html-CC8y2mBf.js => v1.11.html-BrYBsgIm.js} (99%) rename assets/{v1.12.html-Cicrako9.js => v1.12.html-Bjnsh028.js} (99%) rename assets/{v1.12.html-C-58BhZu.js => v1.12.html-zH8DdV-e.js} (99%) rename assets/{v1.13.html-wSZ9KRJY.js => v1.13.html-DKjd5VZ6.js} (99%) rename assets/{v1.13.html-CTxZq6lE.js => v1.13.html-TufMrOde.js} (99%) rename assets/{v1.14.html-DPlnarKn.js => v1.14.html-BdTzwT9L.js} (99%) rename assets/{v1.14.html-bMdPR76k.js => v1.14.html-lTdRYbaU.js} (99%) rename assets/{v1.15.html-BMHEbFXP.js => v1.15.html-BI41-PdG.js} (99%) rename assets/{v1.15.html-D9dirphE.js => v1.15.html-BrvVMvb6.js} (99%) rename assets/{v1.2.html-D0LqRqm7.js => v1.2.html-BwNn_ayr.js} (99%) rename assets/{v1.2.html-DHj4lNME.js => v1.2.html-mXqGWCTf.js} (99%) rename assets/{v1.3.html-Bi-V8sdS.js => v1.3.html-CbKsK0o_.js} (98%) rename assets/{v1.3.html-Dy2IeiUA.js => v1.3.html-tHE7sKhD.js} (98%) rename assets/{v1.4.html-DYbIWcYQ.js => v1.4.html-DgzhLqIa.js} (99%) rename assets/{v1.4.html-CQ3ogmB9.js => v1.4.html-DrNJQuWM.js} (99%) rename assets/{v1.5.html-DE69oQdf.js => v1.5.html-Bmq8i0sU.js} (98%) rename assets/{v1.5.html-BMDUgiIu.js => v1.5.html-DIctImTe.js} (98%) rename assets/{v1.6.html-DOXqmAiA.js => v1.6.html-BAAJlVdv.js} (98%) rename assets/{v1.6.html-DVu4nDqR.js => v1.6.html-DSYQNrKC.js} (98%) rename assets/{v1.7.html-mjf4FAYu.js => v1.7.html-BlUtLZrM.js} (99%) rename assets/{v1.7.html-CA3uanBR.js => v1.7.html-OCSm9Wzu.js} (99%) rename assets/{v1.8.html-DVq3pEBb.js => v1.8.html-BZG1T2FE.js} (99%) rename assets/{v1.8.html-CaCOiXQ8.js => v1.8.html-kjkSDe_F.js} (99%) rename assets/{v1.9.html-DPjMtyff.js => v1.9.html-BjVeexcL.js} (99%) rename assets/{v1.9.html-kYWrJkbl.js => v1.9.html-CfwQEdWO.js} (99%) rename assets/{validation.html-C8BhQ8Dc.js => validation.html-CiLImEXn.js} (99%) rename assets/{validation.html-BsamCfrc.js => validation.html-cWEjgQJ2.js} (99%) rename assets/{views.html-KoNxbrdS.js => views.html-BMnAtMFZ.js} (99%) rename assets/{views.html-CNh0d9Px.js => views.html-DEPOesR0.js} (99%) create mode 100644 t-shirt.jpg diff --git a/404.html b/404.html index e2287d42..487d91ea 100644 --- a/404.html +++ b/404.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Goravel - - + + -

404

How did we get here?
Take me home
- +

404

That's a Four-Oh-Four.
Take me home
+ diff --git a/architecutre-concepts/facades.html b/architecutre-concepts/facades.html index c7cdc7e4..dfa81968 100644 --- a/architecutre-concepts/facades.html +++ b/architecutre-concepts/facades.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Facades | Goravel - - + +
- + diff --git a/architecutre-concepts/index.html b/architecutre-concepts/index.html index 3be33bb4..c528a556 100644 --- a/architecutre-concepts/index.html +++ b/architecutre-concepts/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Architecture Concepts | Goravel - - + +
- + diff --git a/architecutre-concepts/request-lifecycle.html b/architecutre-concepts/request-lifecycle.html index a9a0c049..1fc8950f 100644 --- a/architecutre-concepts/request-lifecycle.html +++ b/architecutre-concepts/request-lifecycle.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Request Lifecycle | Goravel - - + +
- + diff --git a/architecutre-concepts/service-container.html b/architecutre-concepts/service-container.html index 2eccd8a8..2d66bd27 100644 --- a/architecutre-concepts/service-container.html +++ b/architecutre-concepts/service-container.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Service Container | Goravel - - + +
- + diff --git a/architecutre-concepts/service-providers.html b/architecutre-concepts/service-providers.html index 6f05ad5d..2fb4d174 100644 --- a/architecutre-concepts/service-providers.html +++ b/architecutre-concepts/service-providers.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Service Providers | Goravel - - + +
- + diff --git a/assets/404.html-Igc773BW.js b/assets/404.html-BWf9DCd4.js similarity index 93% rename from assets/404.html-Igc773BW.js rename to assets/404.html-BWf9DCd4.js index e76b2053..0e3299bb 100644 --- a/assets/404.html-Igc773BW.js +++ b/assets/404.html-BWf9DCd4.js @@ -1 +1 @@ -import{_ as e,c as o,b as n,o as r}from"./app-ELDWQP0J.js";const a={};function p(l,t){return r(),o("div",null,t[0]||(t[0]=[n("p",null,"404 Not Found",-1)]))}const s=e(a,[["render",p],["__file","404.html.vue"]]),i=JSON.parse('{"path":"/404.html","title":"","lang":"en-US","frontmatter":{"layout":"NotFound","description":"404 Not Found","head":[["meta",{"property":"og:url","content":"https://goravel.dev/404.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/404.html"}],["meta",{"property":"og:description","content":"404 Not Found"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\",\\"description\\":\\"404 Not Found\\"}"]]},"headers":[],"git":{},"filePathRelative":null,"autoDesc":true}');export{s as comp,i as data}; +import{_ as e,c as o,b as n,o as r}from"./app-Ewo6p9aM.js";const a={};function p(l,t){return r(),o("div",null,t[0]||(t[0]=[n("p",null,"404 Not Found",-1)]))}const s=e(a,[["render",p],["__file","404.html.vue"]]),i=JSON.parse('{"path":"/404.html","title":"","lang":"en-US","frontmatter":{"layout":"NotFound","description":"404 Not Found","head":[["meta",{"property":"og:url","content":"https://goravel.dev/404.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/404.html"}],["meta",{"property":"og:description","content":"404 Not Found"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\",\\"description\\":\\"404 Not Found\\"}"]]},"headers":[],"git":{},"filePathRelative":null,"autoDesc":true}');export{s as comp,i as data}; diff --git a/assets/SidebarTop-BdrWC7Yv.js b/assets/SidebarTop-Cm7exHpJ.js similarity index 90% rename from assets/SidebarTop-BdrWC7Yv.js rename to assets/SidebarTop-Cm7exHpJ.js index 96e3422a..d5252e7c 100644 --- a/assets/SidebarTop-BdrWC7Yv.js +++ b/assets/SidebarTop-Cm7exHpJ.js @@ -1 +1 @@ -import{_ as a,o,c as s,b as d}from"./app-ELDWQP0J.js";const n={name:"SiderbarTop",mounted(){this.adsenseAddLoad()},methods:{adsenseAddLoad(){let e=document.createElement("script");e.text="(adsbygoogle = window.adsbygoogle || []).push({});",document.getElementsByTagName("body")[0].appendChild(e)}}},i={class:"container",style:{width:"260px",margin:"20px auto 0 auto"}};function l(e,t,c,p,r,m){return o(),s("div",i,t[0]||(t[0]=[d("ins",{class:"adsbygoogle",style:{display:"inline-block",width:"260px",height:"160px"},"data-ad-client":"ca-pub-4978322804450032","data-ad-slot":"9393443865"},null,-1)]))}const _=a(n,[["render",l],["__file","SidebarTop.vue"]]);export{_ as default}; +import{_ as a,o,c as s,b as d}from"./app-Ewo6p9aM.js";const n={name:"SiderbarTop",mounted(){this.adsenseAddLoad()},methods:{adsenseAddLoad(){let e=document.createElement("script");e.text="(adsbygoogle = window.adsbygoogle || []).push({});",document.getElementsByTagName("body")[0].appendChild(e)}}},i={class:"container",style:{width:"260px",margin:"20px auto 0 auto"}};function l(e,t,c,p,r,m){return o(),s("div",i,t[0]||(t[0]=[d("ins",{class:"adsbygoogle",style:{display:"inline-block",width:"260px",height:"160px"},"data-ad-client":"ca-pub-4978322804450032","data-ad-slot":"9393443865"},null,-1)]))}const _=a(n,[["render",l],["__file","SidebarTop.vue"]]);export{_ as default}; diff --git a/assets/app-ELDWQP0J.js b/assets/app-Ewo6p9aM.js similarity index 93% rename from assets/app-ELDWQP0J.js rename to assets/app-Ewo6p9aM.js index e4e7dfb2..c1af25f0 100644 --- a/assets/app-ELDWQP0J.js +++ b/assets/app-Ewo6p9aM.js @@ -1,3 +1,4 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index.html-Df977mn_.js","assets/logo-CxXS7KxG.js","assets/contributions.html-Bk11CVy5.js","assets/t-shirt-DgVZ0NNq.js","assets/index.html-B-JSxCCx.js","assets/contributions.html-CZu5-uUi.js"])))=>i.map(i=>d[i]); const cd="modulepreload",fd=function(e){return"/"+e},Bs={},S=function(t,n,r){let o=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const s=document.querySelector("meta[property=csp-nonce]"),a=(s==null?void 0:s.nonce)||(s==null?void 0:s.getAttribute("nonce"));o=Promise.allSettled(n.map(l=>{if(l=fd(l),l in Bs)return;Bs[l]=!0;const u=l.endsWith(".css"),c=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${c}`))return;const f=document.createElement("link");if(f.rel=u?"stylesheet":cd,u||(f.as="script"),f.crossOrigin="",f.href=l,a&&f.setAttribute("nonce",a),document.head.appendChild(f),u)return new Promise((d,p)=>{f.addEventListener("load",d),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${l}`)))})}))}function i(s){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=s,window.dispatchEvent(a),!a.defaultPrevented)throw s}return o.then(s=>{for(const a of s||[])a.status==="rejected"&&i(a.reason);return t().catch(i)})};/** * @vue/shared v3.5.13 * (c) 2018-present Yuxi (Evan) You and Vue contributors @@ -30,7 +31,7 @@ Server rendered element contains fewer child nodes than client vdom.`),O=!0),fn( * @vue/runtime-dom v3.5.13 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let Ci;const fa=typeof window<"u"&&window.trustedTypes;if(fa)try{Ci=fa.createPolicy("vue",{createHTML:e=>e})}catch{}const kc=Ci?e=>Ci.createHTML(e):e=>e,Rh="http://www.w3.org/2000/svg",Lh="http://www.w3.org/1998/Math/MathML",Ft=typeof document<"u"?document:null,da=Ft&&Ft.createElement("template"),Dh={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?Ft.createElementNS(Rh,e):t==="mathml"?Ft.createElementNS(Lh,e):n?Ft.createElement(e,{is:n}):Ft.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Ft.createTextNode(e),createComment:e=>Ft.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ft.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,i){const s=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{da.innerHTML=kc(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const a=da.content;if(r==="svg"||r==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},qt="transition",lr="animation",Lr=Symbol("_vtc"),xc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Vh=je({},$u,xc),Nh=e=>(e.displayName="Transition",e.props=Vh,e),fs=Nh((e,{slots:t})=>ue(Op,Mh(e),t)),pn=(e,t=[])=>{oe(e)?e.forEach(n=>n(...t)):e&&e(...t)},pa=e=>e?oe(e)?e.some(t=>t.length>1):e.length>1:!1;function Mh(e){const t={};for(const O in e)O in xc||(t[O]=e[O]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=i,appearActiveClass:u=s,appearToClass:c=a,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,g=Fh(o),v=g&&g[0],E=g&&g[1],{onBeforeEnter:b,onEnter:T,onEnterCancelled:m,onLeave:y,onLeaveCancelled:D,onBeforeAppear:G=b,onAppear:H=T,onAppearCancelled:k=m}=t,U=(O,V,J,te)=>{O._enterCancelled=te,hn(O,V?c:a),hn(O,V?u:s),J&&J()},w=(O,V)=>{O._isLeaving=!1,hn(O,f),hn(O,p),hn(O,d),V&&V()},B=O=>(V,J)=>{const te=O?H:T,R=()=>U(V,O,J);pn(te,[V,R]),ha(()=>{hn(V,O?l:i),Dt(V,O?c:a),pa(te)||ma(V,r,v,R)})};return je(t,{onBeforeEnter(O){pn(b,[O]),Dt(O,i),Dt(O,s)},onBeforeAppear(O){pn(G,[O]),Dt(O,l),Dt(O,u)},onEnter:B(!1),onAppear:B(!0),onLeave(O,V){O._isLeaving=!0;const J=()=>w(O,V);Dt(O,f),O._enterCancelled?(Dt(O,d),va()):(va(),Dt(O,d)),ha(()=>{O._isLeaving&&(hn(O,f),Dt(O,p),pa(y)||ma(O,r,E,J))}),pn(y,[O,J])},onEnterCancelled(O){U(O,!1,void 0,!0),pn(m,[O])},onAppearCancelled(O){U(O,!0,void 0,!0),pn(k,[O])},onLeaveCancelled(O){w(O),pn(D,[O])}})}function Fh(e){if(e==null)return null;if(xe(e))return[oi(e.enter),oi(e.leave)];{const t=oi(e);return[t,t]}}function oi(e){return vd(e)}function Dt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Lr]||(e[Lr]=new Set)).add(t)}function hn(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Lr];n&&(n.delete(t),n.size||(e[Lr]=void 0))}function ha(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Hh=0;function ma(e,t,n,r){const o=e._endId=++Hh,i=()=>{o===e._endId&&r()};if(n!=null)return setTimeout(i,n);const{type:s,timeout:a,propCount:l}=zh(e,t);if(!s)return r();const u=s+"end";let c=0;const f=()=>{e.removeEventListener(u,d),i()},d=p=>{p.target===e&&++c>=l&&f()};setTimeout(()=>{c(n[g]||"").split(", "),o=r(`${qt}Delay`),i=r(`${qt}Duration`),s=_a(o,i),a=r(`${lr}Delay`),l=r(`${lr}Duration`),u=_a(a,l);let c=null,f=0,d=0;t===qt?s>0&&(c=qt,f=s,d=i.length):t===lr?u>0&&(c=lr,f=u,d=l.length):(f=Math.max(s,u),c=f>0?s>u?qt:lr:null,d=c?c===qt?i.length:l.length:0);const p=c===qt&&/\b(transform|all)(,|$)/.test(r(`${qt}Property`).toString());return{type:c,timeout:f,propCount:d,hasTransform:p}}function _a(e,t){for(;e.lengthga(n)+ga(e[r])))}function ga(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function va(){return document.body.offsetHeight}function Bh(e,t,n){const r=e[Lr];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ao=Symbol("_vod"),wc=Symbol("_vsh"),So={beforeMount(e,{value:t},{transition:n}){e[Ao]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):ur(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),ur(e,!0),r.enter(e)):r.leave(e,()=>{ur(e,!1)}):ur(e,t))},beforeUnmount(e,{value:t}){ur(e,t)}};function ur(e,t){e.style.display=t?e[Ao]:"none",e[wc]=!t}const $h=Symbol(""),Uh=/(^|;)\s*display\s*:/;function jh(e,t,n){const r=e.style,o=we(n);let i=!1;if(n&&!o){if(t)if(we(t))for(const s of t.split(";")){const a=s.slice(0,s.indexOf(":")).trim();n[a]==null&&uo(r,a,"")}else for(const s in t)n[s]==null&&uo(r,s,"");for(const s in n)s==="display"&&(i=!0),uo(r,s,n[s])}else if(o){if(t!==n){const s=r[$h];s&&(n+=";"+s),r.cssText=n,i=Uh.test(n)}}else t&&e.removeAttribute("style");Ao in e&&(e[Ao]=i?r.display:"",e[wc]&&(r.display="none"))}const Ea=/\s*!important$/;function uo(e,t,n){if(oe(n))n.forEach(r=>uo(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Kh(e,t);Ea.test(n)?e.setProperty(Ut(r),n.replace(Ea,""),"important"):e[r]=n}}const ya=["Webkit","Moz","ms"],ii={};function Kh(e,t){const n=ii[t];if(n)return n;let r=it(t);if(r!=="filter"&&r in e)return ii[t]=r;r=$r(r);for(let o=0;osi||(Xh.then(()=>si=0),si=Date.now());function Jh(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;St(Qh(r,n.value),t,5,[r])};return n.value=e,n.attached=Zh(),n}function Qh(e,t){if(oe(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const ka=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,em=(e,t,n,r,o,i)=>{const s=o==="svg";t==="class"?Bh(e,r,s):t==="style"?jh(e,n,r):Br(t)?Gi(t)||qh(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):tm(e,t,r,s))?(Aa(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Ta(e,t,r,s,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!we(r))?Aa(e,it(t),r,i,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Ta(e,t,r,s))};function tm(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&ka(t)&&ie(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return ka(t)&&we(n)?!1:t in e}const nm={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},rm=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const i=Ut(o.key);if(t.some(s=>s===i||nm[s]===i))return e(o)})},om=je({patchProp:em},Dh);let ai,xa=!1;function im(){return ai=xa?ai:sh(om),xa=!0,ai}const sm=(...e)=>{const t=im().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=lm(r);if(o)return n(o,!0,am(o))},t};function am(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function lm(e){return we(e)?document.querySelector(e):e}var Gr=e=>/^[a-z][a-z0-9+.-]*:/.test(e)||e.startsWith("//"),um=/.md((\?|#).*)?$/,cm=(e,t="/")=>Gr(e)||e.startsWith("/")&&!e.startsWith(t)&&!um.test(e),No=e=>/^(https?:)?\/\//.test(e),wa=e=>{if(!e||e.endsWith("/"))return e;let t=e.replace(/(^|\/)README.md$/i,"$1index.html");return t.endsWith(".md")?t=`${t.substring(0,t.length-3)}.html`:t.endsWith(".html")||(t=`${t}.html`),t.endsWith("/index.html")&&(t=t.substring(0,t.length-10)),t},fm="http://.",dm=(e,t)=>{if(!e.startsWith("/")&&t){const n=t.slice(0,t.lastIndexOf("/"));return wa(new URL(`${n}/${e}`,fm).pathname)}return wa(e)},pm=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const i=o.split("/").length-r.split("/").length;return i!==0?i:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"},hm=(e,t="/")=>{const n=e.replace(/^(?:https?:)?\/\/[^/]*/,"");return n.startsWith(t)?`/${n.slice(t.length)}`:n},mm=/(#|\?)/,Cc=e=>{const[t,...n]=e.split(mm);return{pathname:t,hashAndQueries:n.join("")}},_m=["link","meta","script","style","noscript","template"],gm=["title","base"],vm=([e,t,n])=>gm.includes(e)?e:_m.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([r,o])=>typeof o=="boolean"?o?[r,""]:null:[r,o]).filter(r=>r!=null).sort(([r],[o])=>r.localeCompare(o)),n]):null,Em=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=vm(r);o&&!t.has(o)&&(t.add(o),n.push(r))}),n},ym=e=>e.endsWith("/")||e.endsWith(".html")?e:`${e}/`,Pc=e=>e.endsWith("/")?e.slice(0,-1):e,ds=e=>e.startsWith("/")?e.slice(1):e,ps=e=>Object.prototype.toString.call(e)==="[object Object]",Tt=e=>typeof e=="string";const bm=JSON.parse("{}"),Tm=Object.fromEntries([["/",{loader:()=>S(()=>import("./index.html-CT0kaf7E.js"),[]),meta:{title:""}}],["/architecutre-concepts/",{loader:()=>S(()=>import("./index.html-Deh-LlCG.js"),[]),meta:{title:"Architecture Concepts"}}],["/architecutre-concepts/facades.html",{loader:()=>S(()=>import("./facades.html-D9gOoFkn.js"),[]),meta:{title:"Facades"}}],["/architecutre-concepts/request-lifecycle.html",{loader:()=>S(()=>import("./request-lifecycle.html-B95lifw3.js"),[]),meta:{title:"Request Lifecycle"}}],["/architecutre-concepts/service-container.html",{loader:()=>S(()=>import("./service-container.html-CpNN7JuX.js"),[]),meta:{title:"Service Container"}}],["/architecutre-concepts/service-providers.html",{loader:()=>S(()=>import("./service-providers.html-C4FpQXF4.js"),[]),meta:{title:"Service Providers"}}],["/getting-started/",{loader:()=>S(()=>import("./index.html-DG7cQ81A.js"),[]),meta:{title:"Getting Started"}}],["/getting-started/compile.html",{loader:()=>S(()=>import("./compile.html-ClJuP_SF.js"),[]),meta:{title:"Compile"}}],["/getting-started/configuration.html",{loader:()=>S(()=>import("./configuration.html-XDuxUGHH.js"),[]),meta:{title:"Configuration"}}],["/getting-started/directory-structure.html",{loader:()=>S(()=>import("./directory-structure.html-CwwWhzXK.js"),[]),meta:{title:"Directory Structure"}}],["/getting-started/installation.html",{loader:()=>S(()=>import("./installation.html-BIybxPEG.js"),[]),meta:{title:"Installation"}}],["/digging-deeper/",{loader:()=>S(()=>import("./index.html-CzAmH-u1.js"),[]),meta:{title:""}}],["/digging-deeper/artisan-console.html",{loader:()=>S(()=>import("./artisan-console.html-IU4iD0e4.js"),[]),meta:{title:"Artisan Console"}}],["/digging-deeper/cache.html",{loader:()=>S(()=>import("./cache.html-BCYn7pgp.js"),[]),meta:{title:"Cache"}}],["/digging-deeper/color.html",{loader:()=>S(()=>import("./color.html-DAaPWn-A.js"),[]),meta:{title:"Color"}}],["/digging-deeper/event.html",{loader:()=>S(()=>import("./event.html-Bqomnab3.js"),[]),meta:{title:"Events"}}],["/digging-deeper/filesystem.html",{loader:()=>S(()=>import("./filesystem.html-Buzi17dd.js"),[]),meta:{title:"File Storage"}}],["/digging-deeper/helpers.html",{loader:()=>S(()=>import("./helpers.html-DZr1YU_I.js"),[]),meta:{title:"Helpers"}}],["/digging-deeper/localization.html",{loader:()=>S(()=>import("./localization.html-BkLT5oeb.js"),[]),meta:{title:"Localization"}}],["/digging-deeper/mail.html",{loader:()=>S(()=>import("./mail.html-8Xog75UY.js"),[]),meta:{title:"Mail"}}],["/digging-deeper/package-development.html",{loader:()=>S(()=>import("./package-development.html-XO5_ome_.js"),[]),meta:{title:"Package Development"}}],["/digging-deeper/queues.html",{loader:()=>S(()=>import("./queues.html-C0Cbu1pl.js"),[]),meta:{title:"Queues"}}],["/digging-deeper/strings.html",{loader:()=>S(()=>import("./strings.html-BmWihGVZ.js"),[]),meta:{title:"Strings"}}],["/digging-deeper/task-scheduling.html",{loader:()=>S(()=>import("./task-scheduling.html-C99X9QwO.js"),[]),meta:{title:"Task Scheduling"}}],["/orm/",{loader:()=>S(()=>import("./index.html-UkIBF4JQ.js"),[]),meta:{title:"ORM"}}],["/orm/factories.html",{loader:()=>S(()=>import("./factories.html-DNgknwi0.js"),[]),meta:{title:"Factories"}}],["/orm/getting-started.html",{loader:()=>S(()=>import("./getting-started.html-BHaViv8j.js"),[]),meta:{title:"Getting Started"}}],["/orm/migrations.html",{loader:()=>S(()=>import("./migrations.html-BxQwb3BO.js"),[]),meta:{title:"Migrations"}}],["/orm/relationships.html",{loader:()=>S(()=>import("./relationships.html-CqaEkpsM.js"),[]),meta:{title:"Relationships"}}],["/orm/seeding.html",{loader:()=>S(()=>import("./seeding.html-DlQZgxSO.js"),[]),meta:{title:"Database: Seeding"}}],["/prologue/contributions.html",{loader:()=>S(()=>import("./contributions.html-D1ANl6-5.js"),[]),meta:{title:"Contribution Guide"}}],["/prologue/packages.html",{loader:()=>S(()=>import("./packages.html-QsGxcqGQ.js"),[]),meta:{title:"Excellent Extend Packages"}}],["/prologue/privacy-policy.html",{loader:()=>S(()=>import("./privacy-policy.html-B95hGl3B.js"),[]),meta:{title:"Privacy Policy"}}],["/security/authentication.html",{loader:()=>S(()=>import("./authentication.html-BwD2_av1.js"),[]),meta:{title:"Authentication"}}],["/security/authorization.html",{loader:()=>S(()=>import("./authorization.html-BHYtLfr9.js"),[]),meta:{title:"Authorization"}}],["/security/encryption.html",{loader:()=>S(()=>import("./encryption.html-CVmno7EC.js"),[]),meta:{title:"Encryption"}}],["/security/hashing.html",{loader:()=>S(()=>import("./hashing.html-n8kDf70b.js"),[]),meta:{title:"Hashing"}}],["/testing/",{loader:()=>S(()=>import("./index.html-BEuBVW2c.js"),[]),meta:{title:"Testing"}}],["/testing/getting-started.html",{loader:()=>S(()=>import("./getting-started.html-CWiAcpuW.js"),[]),meta:{title:"Getting Started"}}],["/testing/http-tests.html",{loader:()=>S(()=>import("./http-tests.html-B-d0DuGG.js"),[]),meta:{title:"HTTP Tests"}}],["/testing/mock.html",{loader:()=>S(()=>import("./mock.html-Cjt9THLr.js"),[]),meta:{title:"Mock"}}],["/the-basics/",{loader:()=>S(()=>import("./index.html-lmPszigo.js"),[]),meta:{title:"The Basics"}}],["/the-basics/controllers.html",{loader:()=>S(()=>import("./controllers.html-CEpSC6VO.js"),[]),meta:{title:"Controllers"}}],["/the-basics/grpc.html",{loader:()=>S(()=>import("./grpc.html-CDEALKGL.js"),[]),meta:{title:"Grpc"}}],["/the-basics/logging.html",{loader:()=>S(()=>import("./logging.html-B154Sv3t.js"),[]),meta:{title:"Logging"}}],["/the-basics/middleware.html",{loader:()=>S(()=>import("./middleware.html-BL7jUq09.js"),[]),meta:{title:"Middleware"}}],["/the-basics/request.html",{loader:()=>S(()=>import("./request.html-DFk1Innn.js"),[]),meta:{title:"HTTP Requests"}}],["/the-basics/response.html",{loader:()=>S(()=>import("./response.html-4zROuYC6.js"),[]),meta:{title:"HTTP Response"}}],["/the-basics/routing.html",{loader:()=>S(()=>import("./routing.html-BLEaQZzR.js"),[]),meta:{title:"Routing"}}],["/the-basics/session.html",{loader:()=>S(()=>import("./session.html-CRsI3TtN.js"),[]),meta:{title:"Session"}}],["/the-basics/validation.html",{loader:()=>S(()=>import("./validation.html-BsamCfrc.js"),[]),meta:{title:"Validation"}}],["/the-basics/views.html",{loader:()=>S(()=>import("./views.html-CNh0d9Px.js"),[]),meta:{title:"Views"}}],["/upgrade/history.html",{loader:()=>S(()=>import("./history.html-fNToLLSU.js"),[]),meta:{title:"History Upgrade"}}],["/upgrade/v1.1.html",{loader:()=>S(()=>import("./v1.1.html-D_yWCxPz.js"),[]),meta:{title:"Upgrading To v1.1 From v1.0"}}],["/upgrade/v1.10.html",{loader:()=>S(()=>import("./v1.10.html-D5RdiF4o.js"),[]),meta:{title:"Upgrading To v1.10 From v1.9"}}],["/upgrade/v1.11.html",{loader:()=>S(()=>import("./v1.11.html-Cb3xxHwa.js"),[]),meta:{title:"Upgrading To v1.11 From v1.10"}}],["/upgrade/v1.12.html",{loader:()=>S(()=>import("./v1.12.html-Cicrako9.js"),[]),meta:{title:"Upgrading To v1.12 From v1.11"}}],["/upgrade/v1.13.html",{loader:()=>S(()=>import("./v1.13.html-wSZ9KRJY.js"),[]),meta:{title:"Upgrading To v1.13 From v1.12"}}],["/upgrade/v1.14.html",{loader:()=>S(()=>import("./v1.14.html-bMdPR76k.js"),[]),meta:{title:"Upgrading To v1.14 From v1.13"}}],["/upgrade/v1.15.html",{loader:()=>S(()=>import("./v1.15.html-BMHEbFXP.js"),[]),meta:{title:"Upgrading To v1.15 From v1.14"}}],["/upgrade/v1.2.html",{loader:()=>S(()=>import("./v1.2.html-DHj4lNME.js"),[]),meta:{title:"Upgrading To v1.2 From v1.1"}}],["/upgrade/v1.3.html",{loader:()=>S(()=>import("./v1.3.html-Bi-V8sdS.js"),[]),meta:{title:"Upgrading To v1.3 From v1.2"}}],["/upgrade/v1.4.html",{loader:()=>S(()=>import("./v1.4.html-DYbIWcYQ.js"),[]),meta:{title:"Upgrading To v1.4 From v1.3"}}],["/upgrade/v1.5.html",{loader:()=>S(()=>import("./v1.5.html-BMDUgiIu.js"),[]),meta:{title:"Upgrading To v1.5 From v1.4"}}],["/upgrade/v1.6.html",{loader:()=>S(()=>import("./v1.6.html-DOXqmAiA.js"),[]),meta:{title:"Upgrading To v1.6 From v1.5"}}],["/upgrade/v1.7.html",{loader:()=>S(()=>import("./v1.7.html-CA3uanBR.js"),[]),meta:{title:"Upgrading To v1.7 From v1.6"}}],["/upgrade/v1.8.html",{loader:()=>S(()=>import("./v1.8.html-DVq3pEBb.js"),[]),meta:{title:"Upgrading To v1.8 From v1.7"}}],["/upgrade/v1.9.html",{loader:()=>S(()=>import("./v1.9.html-DPjMtyff.js"),[]),meta:{title:"Upgrading To v1.9 From v1.8"}}],["/zh/",{loader:()=>S(()=>import("./index.html-BBFqSAWn.js"),[]),meta:{title:"关于 Goravel"}}],["/zh/architecutre-concepts/",{loader:()=>S(()=>import("./index.html-ByKWtYVD.js"),[]),meta:{title:"核心架构"}}],["/zh/architecutre-concepts/facades.html",{loader:()=>S(()=>import("./facades.html-sHR6uI9O.js"),[]),meta:{title:"Facades"}}],["/zh/architecutre-concepts/request-lifecycle.html",{loader:()=>S(()=>import("./request-lifecycle.html-CxhD0_ek.js"),[]),meta:{title:"请求周期"}}],["/zh/architecutre-concepts/service-container.html",{loader:()=>S(()=>import("./service-container.html-DFOd3-Bq.js"),[]),meta:{title:"服务容器"}}],["/zh/architecutre-concepts/service-providers.html",{loader:()=>S(()=>import("./service-providers.html-fZyFpzuo.js"),[]),meta:{title:"服务提供者"}}],["/zh/digging-deeper/",{loader:()=>S(()=>import("./index.html-mt-dD_0e.js"),[]),meta:{title:"综合话题"}}],["/zh/digging-deeper/artisan-console.html",{loader:()=>S(()=>import("./artisan-console.html-BCKOcmwb.js"),[]),meta:{title:"Artisan 命令行"}}],["/zh/digging-deeper/cache.html",{loader:()=>S(()=>import("./cache.html-BuCzPS6Q.js"),[]),meta:{title:"缓存系统"}}],["/zh/digging-deeper/color.html",{loader:()=>S(()=>import("./color.html-C-v_r0O_.js"),[]),meta:{title:"Color"}}],["/zh/digging-deeper/event.html",{loader:()=>S(()=>import("./event.html-BjiOyLvs.js"),[]),meta:{title:"事件系统"}}],["/zh/digging-deeper/filesystem.html",{loader:()=>S(()=>import("./filesystem.html-Dit00pAj.js"),[]),meta:{title:"文件存储"}}],["/zh/digging-deeper/helpers.html",{loader:()=>S(()=>import("./helpers.html-BP2SsPZW.js"),[]),meta:{title:"辅助函数"}}],["/zh/digging-deeper/localization.html",{loader:()=>S(()=>import("./localization.html-DRqEi7DE.js"),[]),meta:{title:"本地化"}}],["/zh/digging-deeper/mail.html",{loader:()=>S(()=>import("./mail.html-CNknEOHN.js"),[]),meta:{title:"发送邮件"}}],["/zh/digging-deeper/package-development.html",{loader:()=>S(()=>import("./package-development.html-BH8s19OD.js"),[]),meta:{title:"扩展包开发"}}],["/zh/digging-deeper/queues.html",{loader:()=>S(()=>import("./queues.html-D-b0oVFC.js"),[]),meta:{title:"队列"}}],["/zh/digging-deeper/strings.html",{loader:()=>S(()=>import("./strings.html-nXI4uHZR.js"),[]),meta:{title:"Strings"}}],["/zh/digging-deeper/task-scheduling.html",{loader:()=>S(()=>import("./task-scheduling.html-CQ8MoYQs.js"),[]),meta:{title:"任务调度"}}],["/zh/getting-started/",{loader:()=>S(()=>import("./index.html-BVAG0IOP.js"),[]),meta:{title:"入门指南"}}],["/zh/getting-started/compile.html",{loader:()=>S(()=>import("./compile.html-DyeHgsV_.js"),[]),meta:{title:"编译"}}],["/zh/getting-started/configuration.html",{loader:()=>S(()=>import("./configuration.html-COBG2vKn.js"),[]),meta:{title:"配置信息"}}],["/zh/getting-started/directory-structure.html",{loader:()=>S(()=>import("./directory-structure.html-OmthrrZZ.js"),[]),meta:{title:"文件夹结构"}}],["/zh/getting-started/installation.html",{loader:()=>S(()=>import("./installation.html-8lnSZIsI.js"),[]),meta:{title:"安装"}}],["/zh/orm/",{loader:()=>S(()=>import("./index.html-VPpLgu3h.js"),[]),meta:{title:"ORM"}}],["/zh/orm/factories.html",{loader:()=>S(()=>import("./factories.html-BE6xVJDS.js"),[]),meta:{title:"模型工厂"}}],["/zh/orm/getting-started.html",{loader:()=>S(()=>import("./getting-started.html-Dkt4IaiF.js"),[]),meta:{title:"快速入门"}}],["/zh/orm/migrations.html",{loader:()=>S(()=>import("./migrations.html-D7dZl_CR.js"),[]),meta:{title:"数据库迁移"}}],["/zh/orm/relationships.html",{loader:()=>S(()=>import("./relationships.html-DB51a1Hp.js"),[]),meta:{title:"模型关联"}}],["/zh/orm/seeding.html",{loader:()=>S(()=>import("./seeding.html-UfI7Zcx5.js"),[]),meta:{title:"数据填充"}}],["/zh/prologue/contributions.html",{loader:()=>S(()=>import("./contributions.html-CWH0LZEJ.js"),[]),meta:{title:"贡献指南"}}],["/zh/prologue/packages.html",{loader:()=>S(()=>import("./packages.html-Dfo0Uatf.js"),[]),meta:{title:"优秀扩展包"}}],["/zh/security/authentication.html",{loader:()=>S(()=>import("./authentication.html-onB6WImG.js"),[]),meta:{title:"用户认证"}}],["/zh/security/authorization.html",{loader:()=>S(()=>import("./authorization.html-DG4a-UCq.js"),[]),meta:{title:"用户授权"}}],["/zh/security/encryption.html",{loader:()=>S(()=>import("./encryption.html-CKbEOEOI.js"),[]),meta:{title:"加密解密"}}],["/zh/security/hashing.html",{loader:()=>S(()=>import("./hashing.html-DAjmzRr6.js"),[]),meta:{title:"哈希"}}],["/zh/testing/",{loader:()=>S(()=>import("./index.html-BvGPStsm.js"),[]),meta:{title:"测试相关"}}],["/zh/testing/getting-started.html",{loader:()=>S(()=>import("./getting-started.html-CPD5PhOr.js"),[]),meta:{title:"快速入门"}}],["/zh/testing/http-tests.html",{loader:()=>S(()=>import("./http-tests.html-DJZPGIdY.js"),[]),meta:{title:"HTTP Tests"}}],["/zh/testing/mock.html",{loader:()=>S(()=>import("./mock.html-BJWTScb4.js"),[]),meta:{title:"Mock"}}],["/zh/the-basics/",{loader:()=>S(()=>import("./index.html-IziS7bPz.js"),[]),meta:{title:"基本功能"}}],["/zh/the-basics/controllers.html",{loader:()=>S(()=>import("./controllers.html-DLgj0Njf.js"),[]),meta:{title:"控制器"}}],["/zh/the-basics/grpc.html",{loader:()=>S(()=>import("./grpc.html-Dyii4ZbH.js"),[]),meta:{title:"Grpc"}}],["/zh/the-basics/logging.html",{loader:()=>S(()=>import("./logging.html-Bp8flR3X.js"),[]),meta:{title:"日志"}}],["/zh/the-basics/middleware.html",{loader:()=>S(()=>import("./middleware.html-wZMDQOd4.js"),[]),meta:{title:"HTTP 中间件"}}],["/zh/the-basics/request.html",{loader:()=>S(()=>import("./request.html-Car_orJ0.js"),[]),meta:{title:"请求"}}],["/zh/the-basics/response.html",{loader:()=>S(()=>import("./response.html-8chm0-dC.js"),[]),meta:{title:"响应"}}],["/zh/the-basics/routing.html",{loader:()=>S(()=>import("./routing.html-Df_eKiQu.js"),[]),meta:{title:"路由"}}],["/zh/the-basics/session.html",{loader:()=>S(()=>import("./session.html-CfifO3t5.js"),[]),meta:{title:"Session"}}],["/zh/the-basics/validation.html",{loader:()=>S(()=>import("./validation.html-C8BhQ8Dc.js"),[]),meta:{title:"表单验证"}}],["/zh/the-basics/views.html",{loader:()=>S(()=>import("./views.html-KoNxbrdS.js"),[]),meta:{title:"视图"}}],["/zh/upgrade/history.html",{loader:()=>S(()=>import("./history.html-DHMt6lzE.js"),[]),meta:{title:"历史版本升级"}}],["/zh/upgrade/v1.1.html",{loader:()=>S(()=>import("./v1.1.html-B6iPtN3Y.js"),[]),meta:{title:"从 v1.0 升级到 v1.1"}}],["/zh/upgrade/v1.10.html",{loader:()=>S(()=>import("./v1.10.html-XUJL9iAA.js"),[]),meta:{title:"从 v1.9 升级到 v1.10"}}],["/zh/upgrade/v1.11.html",{loader:()=>S(()=>import("./v1.11.html-CC8y2mBf.js"),[]),meta:{title:"从 v1.10 升级到 v1.11"}}],["/zh/upgrade/v1.12.html",{loader:()=>S(()=>import("./v1.12.html-C-58BhZu.js"),[]),meta:{title:"从 v1.11 升级到 v1.12"}}],["/zh/upgrade/v1.13.html",{loader:()=>S(()=>import("./v1.13.html-CTxZq6lE.js"),[]),meta:{title:"从 v1.12 升级到 v1.13"}}],["/zh/upgrade/v1.14.html",{loader:()=>S(()=>import("./v1.14.html-DPlnarKn.js"),[]),meta:{title:"从 v1.13 升级到 v1.14"}}],["/zh/upgrade/v1.15.html",{loader:()=>S(()=>import("./v1.15.html-D9dirphE.js"),[]),meta:{title:"从 v1.14 升级到 v1.15"}}],["/zh/upgrade/v1.2.html",{loader:()=>S(()=>import("./v1.2.html-D0LqRqm7.js"),[]),meta:{title:"从 v1.1 升级到 v1.2"}}],["/zh/upgrade/v1.3.html",{loader:()=>S(()=>import("./v1.3.html-Dy2IeiUA.js"),[]),meta:{title:"从 v1.2 升级到 v1.3"}}],["/zh/upgrade/v1.4.html",{loader:()=>S(()=>import("./v1.4.html-CQ3ogmB9.js"),[]),meta:{title:"从 v1.3 升级到 v1.4"}}],["/zh/upgrade/v1.5.html",{loader:()=>S(()=>import("./v1.5.html-DE69oQdf.js"),[]),meta:{title:"从 v1.4 升级到 v1.5"}}],["/zh/upgrade/v1.6.html",{loader:()=>S(()=>import("./v1.6.html-DVu4nDqR.js"),[]),meta:{title:"从 v1.5 升级到 v1.6"}}],["/zh/upgrade/v1.7.html",{loader:()=>S(()=>import("./v1.7.html-mjf4FAYu.js"),[]),meta:{title:"从 v1.6 升级到 v1.7"}}],["/zh/upgrade/v1.8.html",{loader:()=>S(()=>import("./v1.8.html-CaCOiXQ8.js"),[]),meta:{title:"从 v1.7 升级到 v1.8"}}],["/zh/upgrade/v1.9.html",{loader:()=>S(()=>import("./v1.9.html-kYWrJkbl.js"),[]),meta:{title:"从 v1.8 升级到 v1.9"}}],["/404.html",{loader:()=>S(()=>import("./404.html-Igc773BW.js"),[]),meta:{title:""}}]]);function Am(){return Ic().__VUE_DEVTOOLS_GLOBAL_HOOK__}function Ic(){return typeof navigator<"u"&&typeof window<"u"?window:typeof globalThis<"u"?globalThis:{}}const Sm=typeof Proxy=="function",Om="devtools-plugin:setup",km="plugin:settings:set";let Rn,Pi;function xm(){var e;return Rn!==void 0||(typeof window<"u"&&window.performance?(Rn=!0,Pi=window.performance):typeof globalThis<"u"&&(!((e=globalThis.perf_hooks)===null||e===void 0)&&e.performance)?(Rn=!0,Pi=globalThis.perf_hooks.performance):Rn=!1),Rn}function wm(){return xm()?Pi.now():Date.now()}class Cm{constructor(t,n){this.target=null,this.targetQueue=[],this.onQueue=[],this.plugin=t,this.hook=n;const r={};if(t.settings)for(const s in t.settings){const a=t.settings[s];r[s]=a.defaultValue}const o=`__vue-devtools-plugin-settings__${t.id}`;let i=Object.assign({},r);try{const s=localStorage.getItem(o),a=JSON.parse(s);Object.assign(i,a)}catch{}this.fallbacks={getSettings(){return i},setSettings(s){try{localStorage.setItem(o,JSON.stringify(s))}catch{}i=s},now(){return wm()}},n&&n.on(km,(s,a)=>{s===this.plugin.id&&this.fallbacks.setSettings(a)}),this.proxiedOn=new Proxy({},{get:(s,a)=>this.target?this.target.on[a]:(...l)=>{this.onQueue.push({method:a,args:l})}}),this.proxiedTarget=new Proxy({},{get:(s,a)=>this.target?this.target[a]:a==="on"?this.proxiedOn:Object.keys(this.fallbacks).includes(a)?(...l)=>(this.targetQueue.push({method:a,args:l,resolve:()=>{}}),this.fallbacks[a](...l)):(...l)=>new Promise(u=>{this.targetQueue.push({method:a,args:l,resolve:u})})})}async setRealTarget(t){this.target=t;for(const n of this.onQueue)this.target.on[n.method](...n.args);for(const n of this.targetQueue)n.resolve(await this.target[n.method](...n.args))}}function Pm(e,t){const n=e,r=Ic(),o=Am(),i=Sm&&n.enableEarlyProxy;if(o&&(r.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__||!i))o.emit(Om,e,t);else{const s=i?new Cm(n,o):null;(r.__VUE_DEVTOOLS_PLUGINS__=r.__VUE_DEVTOOLS_PLUGINS__||[]).push({pluginDescriptor:n,setupFn:t,proxy:s}),s&&t(s.proxiedTarget)}}/*! +**/let Ci;const fa=typeof window<"u"&&window.trustedTypes;if(fa)try{Ci=fa.createPolicy("vue",{createHTML:e=>e})}catch{}const kc=Ci?e=>Ci.createHTML(e):e=>e,Rh="http://www.w3.org/2000/svg",Lh="http://www.w3.org/1998/Math/MathML",Ft=typeof document<"u"?document:null,da=Ft&&Ft.createElement("template"),Dh={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?Ft.createElementNS(Rh,e):t==="mathml"?Ft.createElementNS(Lh,e):n?Ft.createElement(e,{is:n}):Ft.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Ft.createTextNode(e),createComment:e=>Ft.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ft.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,i){const s=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{da.innerHTML=kc(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const a=da.content;if(r==="svg"||r==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},qt="transition",lr="animation",Lr=Symbol("_vtc"),xc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Vh=je({},$u,xc),Nh=e=>(e.displayName="Transition",e.props=Vh,e),fs=Nh((e,{slots:t})=>ue(Op,Mh(e),t)),pn=(e,t=[])=>{oe(e)?e.forEach(n=>n(...t)):e&&e(...t)},pa=e=>e?oe(e)?e.some(t=>t.length>1):e.length>1:!1;function Mh(e){const t={};for(const O in e)O in xc||(t[O]=e[O]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=i,appearActiveClass:u=s,appearToClass:c=a,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,g=Fh(o),v=g&&g[0],E=g&&g[1],{onBeforeEnter:b,onEnter:T,onEnterCancelled:m,onLeave:y,onLeaveCancelled:D,onBeforeAppear:G=b,onAppear:H=T,onAppearCancelled:k=m}=t,U=(O,V,J,te)=>{O._enterCancelled=te,hn(O,V?c:a),hn(O,V?u:s),J&&J()},w=(O,V)=>{O._isLeaving=!1,hn(O,f),hn(O,p),hn(O,d),V&&V()},B=O=>(V,J)=>{const te=O?H:T,R=()=>U(V,O,J);pn(te,[V,R]),ha(()=>{hn(V,O?l:i),Dt(V,O?c:a),pa(te)||ma(V,r,v,R)})};return je(t,{onBeforeEnter(O){pn(b,[O]),Dt(O,i),Dt(O,s)},onBeforeAppear(O){pn(G,[O]),Dt(O,l),Dt(O,u)},onEnter:B(!1),onAppear:B(!0),onLeave(O,V){O._isLeaving=!0;const J=()=>w(O,V);Dt(O,f),O._enterCancelled?(Dt(O,d),va()):(va(),Dt(O,d)),ha(()=>{O._isLeaving&&(hn(O,f),Dt(O,p),pa(y)||ma(O,r,E,J))}),pn(y,[O,J])},onEnterCancelled(O){U(O,!1,void 0,!0),pn(m,[O])},onAppearCancelled(O){U(O,!0,void 0,!0),pn(k,[O])},onLeaveCancelled(O){w(O),pn(D,[O])}})}function Fh(e){if(e==null)return null;if(xe(e))return[oi(e.enter),oi(e.leave)];{const t=oi(e);return[t,t]}}function oi(e){return vd(e)}function Dt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Lr]||(e[Lr]=new Set)).add(t)}function hn(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Lr];n&&(n.delete(t),n.size||(e[Lr]=void 0))}function ha(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Hh=0;function ma(e,t,n,r){const o=e._endId=++Hh,i=()=>{o===e._endId&&r()};if(n!=null)return setTimeout(i,n);const{type:s,timeout:a,propCount:l}=zh(e,t);if(!s)return r();const u=s+"end";let c=0;const f=()=>{e.removeEventListener(u,d),i()},d=p=>{p.target===e&&++c>=l&&f()};setTimeout(()=>{c(n[g]||"").split(", "),o=r(`${qt}Delay`),i=r(`${qt}Duration`),s=_a(o,i),a=r(`${lr}Delay`),l=r(`${lr}Duration`),u=_a(a,l);let c=null,f=0,d=0;t===qt?s>0&&(c=qt,f=s,d=i.length):t===lr?u>0&&(c=lr,f=u,d=l.length):(f=Math.max(s,u),c=f>0?s>u?qt:lr:null,d=c?c===qt?i.length:l.length:0);const p=c===qt&&/\b(transform|all)(,|$)/.test(r(`${qt}Property`).toString());return{type:c,timeout:f,propCount:d,hasTransform:p}}function _a(e,t){for(;e.lengthga(n)+ga(e[r])))}function ga(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function va(){return document.body.offsetHeight}function Bh(e,t,n){const r=e[Lr];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ao=Symbol("_vod"),wc=Symbol("_vsh"),So={beforeMount(e,{value:t},{transition:n}){e[Ao]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):ur(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),ur(e,!0),r.enter(e)):r.leave(e,()=>{ur(e,!1)}):ur(e,t))},beforeUnmount(e,{value:t}){ur(e,t)}};function ur(e,t){e.style.display=t?e[Ao]:"none",e[wc]=!t}const $h=Symbol(""),Uh=/(^|;)\s*display\s*:/;function jh(e,t,n){const r=e.style,o=we(n);let i=!1;if(n&&!o){if(t)if(we(t))for(const s of t.split(";")){const a=s.slice(0,s.indexOf(":")).trim();n[a]==null&&uo(r,a,"")}else for(const s in t)n[s]==null&&uo(r,s,"");for(const s in n)s==="display"&&(i=!0),uo(r,s,n[s])}else if(o){if(t!==n){const s=r[$h];s&&(n+=";"+s),r.cssText=n,i=Uh.test(n)}}else t&&e.removeAttribute("style");Ao in e&&(e[Ao]=i?r.display:"",e[wc]&&(r.display="none"))}const Ea=/\s*!important$/;function uo(e,t,n){if(oe(n))n.forEach(r=>uo(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Kh(e,t);Ea.test(n)?e.setProperty(Ut(r),n.replace(Ea,""),"important"):e[r]=n}}const ya=["Webkit","Moz","ms"],ii={};function Kh(e,t){const n=ii[t];if(n)return n;let r=it(t);if(r!=="filter"&&r in e)return ii[t]=r;r=$r(r);for(let o=0;osi||(Xh.then(()=>si=0),si=Date.now());function Jh(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;St(Qh(r,n.value),t,5,[r])};return n.value=e,n.attached=Zh(),n}function Qh(e,t){if(oe(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const ka=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,em=(e,t,n,r,o,i)=>{const s=o==="svg";t==="class"?Bh(e,r,s):t==="style"?jh(e,n,r):Br(t)?Gi(t)||qh(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):tm(e,t,r,s))?(Aa(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Ta(e,t,r,s,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!we(r))?Aa(e,it(t),r,i,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Ta(e,t,r,s))};function tm(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&ka(t)&&ie(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return ka(t)&&we(n)?!1:t in e}const nm={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},rm=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const i=Ut(o.key);if(t.some(s=>s===i||nm[s]===i))return e(o)})},om=je({patchProp:em},Dh);let ai,xa=!1;function im(){return ai=xa?ai:sh(om),xa=!0,ai}const sm=(...e)=>{const t=im().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=lm(r);if(o)return n(o,!0,am(o))},t};function am(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function lm(e){return we(e)?document.querySelector(e):e}var Gr=e=>/^[a-z][a-z0-9+.-]*:/.test(e)||e.startsWith("//"),um=/.md((\?|#).*)?$/,cm=(e,t="/")=>Gr(e)||e.startsWith("/")&&!e.startsWith(t)&&!um.test(e),No=e=>/^(https?:)?\/\//.test(e),wa=e=>{if(!e||e.endsWith("/"))return e;let t=e.replace(/(^|\/)README.md$/i,"$1index.html");return t.endsWith(".md")?t=`${t.substring(0,t.length-3)}.html`:t.endsWith(".html")||(t=`${t}.html`),t.endsWith("/index.html")&&(t=t.substring(0,t.length-10)),t},fm="http://.",dm=(e,t)=>{if(!e.startsWith("/")&&t){const n=t.slice(0,t.lastIndexOf("/"));return wa(new URL(`${n}/${e}`,fm).pathname)}return wa(e)},pm=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const i=o.split("/").length-r.split("/").length;return i!==0?i:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"},hm=(e,t="/")=>{const n=e.replace(/^(?:https?:)?\/\/[^/]*/,"");return n.startsWith(t)?`/${n.slice(t.length)}`:n},mm=/(#|\?)/,Cc=e=>{const[t,...n]=e.split(mm);return{pathname:t,hashAndQueries:n.join("")}},_m=["link","meta","script","style","noscript","template"],gm=["title","base"],vm=([e,t,n])=>gm.includes(e)?e:_m.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([r,o])=>typeof o=="boolean"?o?[r,""]:null:[r,o]).filter(r=>r!=null).sort(([r],[o])=>r.localeCompare(o)),n]):null,Em=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=vm(r);o&&!t.has(o)&&(t.add(o),n.push(r))}),n},ym=e=>e.endsWith("/")||e.endsWith(".html")?e:`${e}/`,Pc=e=>e.endsWith("/")?e.slice(0,-1):e,ds=e=>e.startsWith("/")?e.slice(1):e,ps=e=>Object.prototype.toString.call(e)==="[object Object]",Tt=e=>typeof e=="string";const bm=JSON.parse("{}"),Tm=Object.fromEntries([["/",{loader:()=>S(()=>import("./index.html-Df977mn_.js"),__vite__mapDeps([0,1])),meta:{title:""}}],["/architecutre-concepts/",{loader:()=>S(()=>import("./index.html-BkjDAmZb.js"),[]),meta:{title:"Architecture Concepts"}}],["/architecutre-concepts/facades.html",{loader:()=>S(()=>import("./facades.html-CCzNJASt.js"),[]),meta:{title:"Facades"}}],["/architecutre-concepts/request-lifecycle.html",{loader:()=>S(()=>import("./request-lifecycle.html-DunQQCpy.js"),[]),meta:{title:"Request Lifecycle"}}],["/architecutre-concepts/service-container.html",{loader:()=>S(()=>import("./service-container.html-BhMudo_s.js"),[]),meta:{title:"Service Container"}}],["/architecutre-concepts/service-providers.html",{loader:()=>S(()=>import("./service-providers.html-E7CB2W-O.js"),[]),meta:{title:"Service Providers"}}],["/getting-started/",{loader:()=>S(()=>import("./index.html-DgIIss5c.js"),[]),meta:{title:"Getting Started"}}],["/getting-started/compile.html",{loader:()=>S(()=>import("./compile.html-YqalC-tP.js"),[]),meta:{title:"Compile"}}],["/getting-started/configuration.html",{loader:()=>S(()=>import("./configuration.html-D9LN5QiT.js"),[]),meta:{title:"Configuration"}}],["/getting-started/directory-structure.html",{loader:()=>S(()=>import("./directory-structure.html-ExOJOA2Q.js"),[]),meta:{title:"Directory Structure"}}],["/getting-started/installation.html",{loader:()=>S(()=>import("./installation.html-wUPfcyRS.js"),[]),meta:{title:"Installation"}}],["/digging-deeper/",{loader:()=>S(()=>import("./index.html-C0_A7UL3.js"),[]),meta:{title:""}}],["/digging-deeper/artisan-console.html",{loader:()=>S(()=>import("./artisan-console.html-DAWKwL5O.js"),[]),meta:{title:"Artisan Console"}}],["/digging-deeper/cache.html",{loader:()=>S(()=>import("./cache.html-Hh3FLxMR.js"),[]),meta:{title:"Cache"}}],["/digging-deeper/color.html",{loader:()=>S(()=>import("./color.html-BqDJgwTf.js"),[]),meta:{title:"Color"}}],["/digging-deeper/event.html",{loader:()=>S(()=>import("./event.html-D503Eq94.js"),[]),meta:{title:"Events"}}],["/digging-deeper/filesystem.html",{loader:()=>S(()=>import("./filesystem.html-BysE4Gio.js"),[]),meta:{title:"File Storage"}}],["/digging-deeper/helpers.html",{loader:()=>S(()=>import("./helpers.html-Cq8AvWcV.js"),[]),meta:{title:"Helpers"}}],["/digging-deeper/localization.html",{loader:()=>S(()=>import("./localization.html-ioRlV1eG.js"),[]),meta:{title:"Localization"}}],["/digging-deeper/mail.html",{loader:()=>S(()=>import("./mail.html-B61PCqmJ.js"),[]),meta:{title:"Mail"}}],["/digging-deeper/package-development.html",{loader:()=>S(()=>import("./package-development.html-DHPBH4od.js"),[]),meta:{title:"Package Development"}}],["/digging-deeper/queues.html",{loader:()=>S(()=>import("./queues.html-CWus8EaR.js"),[]),meta:{title:"Queues"}}],["/digging-deeper/strings.html",{loader:()=>S(()=>import("./strings.html-D2jwoqQA.js"),[]),meta:{title:"Strings"}}],["/digging-deeper/task-scheduling.html",{loader:()=>S(()=>import("./task-scheduling.html-11gBtef7.js"),[]),meta:{title:"Task Scheduling"}}],["/orm/",{loader:()=>S(()=>import("./index.html-BcXYMCkI.js"),[]),meta:{title:"ORM"}}],["/orm/factories.html",{loader:()=>S(()=>import("./factories.html-BePWiOvD.js"),[]),meta:{title:"Factories"}}],["/orm/getting-started.html",{loader:()=>S(()=>import("./getting-started.html-3-OsHNcC.js"),[]),meta:{title:"Getting Started"}}],["/orm/migrations.html",{loader:()=>S(()=>import("./migrations.html-WE2FpGDS.js"),[]),meta:{title:"Migrations"}}],["/orm/relationships.html",{loader:()=>S(()=>import("./relationships.html-BSq_nKu_.js"),[]),meta:{title:"Relationships"}}],["/orm/seeding.html",{loader:()=>S(()=>import("./seeding.html-DJGTroRp.js"),[]),meta:{title:"Database: Seeding"}}],["/prologue/contributions.html",{loader:()=>S(()=>import("./contributions.html-Bk11CVy5.js"),__vite__mapDeps([2,3])),meta:{title:"Contribution Guide"}}],["/prologue/packages.html",{loader:()=>S(()=>import("./packages.html-IAGwRamE.js"),[]),meta:{title:"Excellent Extend Packages"}}],["/prologue/privacy-policy.html",{loader:()=>S(()=>import("./privacy-policy.html-B2lf6jGC.js"),[]),meta:{title:"Privacy Policy"}}],["/security/authentication.html",{loader:()=>S(()=>import("./authentication.html-BAJpTW5P.js"),[]),meta:{title:"Authentication"}}],["/security/authorization.html",{loader:()=>S(()=>import("./authorization.html-Dqcqkx8v.js"),[]),meta:{title:"Authorization"}}],["/security/encryption.html",{loader:()=>S(()=>import("./encryption.html-BxhPC42u.js"),[]),meta:{title:"Encryption"}}],["/security/hashing.html",{loader:()=>S(()=>import("./hashing.html-C0RYCNzD.js"),[]),meta:{title:"Hashing"}}],["/testing/",{loader:()=>S(()=>import("./index.html-B4mmnR5Q.js"),[]),meta:{title:"Testing"}}],["/testing/getting-started.html",{loader:()=>S(()=>import("./getting-started.html-BDNUdeaa.js"),[]),meta:{title:"Getting Started"}}],["/testing/http-tests.html",{loader:()=>S(()=>import("./http-tests.html-Ce3n6X9u.js"),[]),meta:{title:"HTTP Tests"}}],["/testing/mock.html",{loader:()=>S(()=>import("./mock.html-DGC_6HL_.js"),[]),meta:{title:"Mock"}}],["/the-basics/",{loader:()=>S(()=>import("./index.html-RQUretvc.js"),[]),meta:{title:"The Basics"}}],["/the-basics/controllers.html",{loader:()=>S(()=>import("./controllers.html-DMCVpm6U.js"),[]),meta:{title:"Controllers"}}],["/the-basics/grpc.html",{loader:()=>S(()=>import("./grpc.html-DQDUY4gB.js"),[]),meta:{title:"Grpc"}}],["/the-basics/logging.html",{loader:()=>S(()=>import("./logging.html-v2chIVWM.js"),[]),meta:{title:"Logging"}}],["/the-basics/middleware.html",{loader:()=>S(()=>import("./middleware.html-BS2d13x5.js"),[]),meta:{title:"Middleware"}}],["/the-basics/request.html",{loader:()=>S(()=>import("./request.html-InRYZk6S.js"),[]),meta:{title:"HTTP Requests"}}],["/the-basics/response.html",{loader:()=>S(()=>import("./response.html-D9zNjqyg.js"),[]),meta:{title:"HTTP Response"}}],["/the-basics/routing.html",{loader:()=>S(()=>import("./routing.html-CAhxGT-v.js"),[]),meta:{title:"Routing"}}],["/the-basics/session.html",{loader:()=>S(()=>import("./session.html-AG3rrd3w.js"),[]),meta:{title:"Session"}}],["/the-basics/validation.html",{loader:()=>S(()=>import("./validation.html-cWEjgQJ2.js"),[]),meta:{title:"Validation"}}],["/the-basics/views.html",{loader:()=>S(()=>import("./views.html-DEPOesR0.js"),[]),meta:{title:"Views"}}],["/upgrade/history.html",{loader:()=>S(()=>import("./history.html-B2eZNqyp.js"),[]),meta:{title:"History Upgrade"}}],["/upgrade/v1.1.html",{loader:()=>S(()=>import("./v1.1.html-DEdzSCtL.js"),[]),meta:{title:"Upgrading To v1.1 From v1.0"}}],["/upgrade/v1.10.html",{loader:()=>S(()=>import("./v1.10.html-DuxpMOWg.js"),[]),meta:{title:"Upgrading To v1.10 From v1.9"}}],["/upgrade/v1.11.html",{loader:()=>S(()=>import("./v1.11.html-8qQFbcw6.js"),[]),meta:{title:"Upgrading To v1.11 From v1.10"}}],["/upgrade/v1.12.html",{loader:()=>S(()=>import("./v1.12.html-Bjnsh028.js"),[]),meta:{title:"Upgrading To v1.12 From v1.11"}}],["/upgrade/v1.13.html",{loader:()=>S(()=>import("./v1.13.html-DKjd5VZ6.js"),[]),meta:{title:"Upgrading To v1.13 From v1.12"}}],["/upgrade/v1.14.html",{loader:()=>S(()=>import("./v1.14.html-lTdRYbaU.js"),[]),meta:{title:"Upgrading To v1.14 From v1.13"}}],["/upgrade/v1.15.html",{loader:()=>S(()=>import("./v1.15.html-BI41-PdG.js"),[]),meta:{title:"Upgrading To v1.15 From v1.14"}}],["/upgrade/v1.2.html",{loader:()=>S(()=>import("./v1.2.html-mXqGWCTf.js"),[]),meta:{title:"Upgrading To v1.2 From v1.1"}}],["/upgrade/v1.3.html",{loader:()=>S(()=>import("./v1.3.html-CbKsK0o_.js"),[]),meta:{title:"Upgrading To v1.3 From v1.2"}}],["/upgrade/v1.4.html",{loader:()=>S(()=>import("./v1.4.html-DgzhLqIa.js"),[]),meta:{title:"Upgrading To v1.4 From v1.3"}}],["/upgrade/v1.5.html",{loader:()=>S(()=>import("./v1.5.html-DIctImTe.js"),[]),meta:{title:"Upgrading To v1.5 From v1.4"}}],["/upgrade/v1.6.html",{loader:()=>S(()=>import("./v1.6.html-BAAJlVdv.js"),[]),meta:{title:"Upgrading To v1.6 From v1.5"}}],["/upgrade/v1.7.html",{loader:()=>S(()=>import("./v1.7.html-OCSm9Wzu.js"),[]),meta:{title:"Upgrading To v1.7 From v1.6"}}],["/upgrade/v1.8.html",{loader:()=>S(()=>import("./v1.8.html-BZG1T2FE.js"),[]),meta:{title:"Upgrading To v1.8 From v1.7"}}],["/upgrade/v1.9.html",{loader:()=>S(()=>import("./v1.9.html-BjVeexcL.js"),[]),meta:{title:"Upgrading To v1.9 From v1.8"}}],["/zh/",{loader:()=>S(()=>import("./index.html-B-JSxCCx.js"),__vite__mapDeps([4,1])),meta:{title:"关于 Goravel"}}],["/zh/architecutre-concepts/",{loader:()=>S(()=>import("./index.html-BSWJWxby.js"),[]),meta:{title:"核心架构"}}],["/zh/architecutre-concepts/facades.html",{loader:()=>S(()=>import("./facades.html-li4DkJq0.js"),[]),meta:{title:"Facades"}}],["/zh/architecutre-concepts/request-lifecycle.html",{loader:()=>S(()=>import("./request-lifecycle.html-DHOcG7yE.js"),[]),meta:{title:"请求周期"}}],["/zh/architecutre-concepts/service-container.html",{loader:()=>S(()=>import("./service-container.html-DCQmf82Z.js"),[]),meta:{title:"服务容器"}}],["/zh/architecutre-concepts/service-providers.html",{loader:()=>S(()=>import("./service-providers.html-C0Jn-Hxq.js"),[]),meta:{title:"服务提供者"}}],["/zh/digging-deeper/",{loader:()=>S(()=>import("./index.html-DzLqAZ-M.js"),[]),meta:{title:"综合话题"}}],["/zh/digging-deeper/artisan-console.html",{loader:()=>S(()=>import("./artisan-console.html-CPLMFSR0.js"),[]),meta:{title:"Artisan 命令行"}}],["/zh/digging-deeper/cache.html",{loader:()=>S(()=>import("./cache.html-C_suBmb3.js"),[]),meta:{title:"缓存系统"}}],["/zh/digging-deeper/color.html",{loader:()=>S(()=>import("./color.html-H0iHmUWu.js"),[]),meta:{title:"Color"}}],["/zh/digging-deeper/event.html",{loader:()=>S(()=>import("./event.html-B7wfEywV.js"),[]),meta:{title:"事件系统"}}],["/zh/digging-deeper/filesystem.html",{loader:()=>S(()=>import("./filesystem.html-Cu7cAXkV.js"),[]),meta:{title:"文件存储"}}],["/zh/digging-deeper/helpers.html",{loader:()=>S(()=>import("./helpers.html-DUXpw1q9.js"),[]),meta:{title:"辅助函数"}}],["/zh/digging-deeper/localization.html",{loader:()=>S(()=>import("./localization.html-aHKhjEZN.js"),[]),meta:{title:"本地化"}}],["/zh/digging-deeper/mail.html",{loader:()=>S(()=>import("./mail.html-B8fLiBJF.js"),[]),meta:{title:"发送邮件"}}],["/zh/digging-deeper/package-development.html",{loader:()=>S(()=>import("./package-development.html-BZNmOuwR.js"),[]),meta:{title:"扩展包开发"}}],["/zh/digging-deeper/queues.html",{loader:()=>S(()=>import("./queues.html-DwZaProp.js"),[]),meta:{title:"队列"}}],["/zh/digging-deeper/strings.html",{loader:()=>S(()=>import("./strings.html-yF0zvrgw.js"),[]),meta:{title:"Strings"}}],["/zh/digging-deeper/task-scheduling.html",{loader:()=>S(()=>import("./task-scheduling.html-BbpiH0gg.js"),[]),meta:{title:"任务调度"}}],["/zh/getting-started/",{loader:()=>S(()=>import("./index.html-3b3KoC5i.js"),[]),meta:{title:"入门指南"}}],["/zh/getting-started/compile.html",{loader:()=>S(()=>import("./compile.html-BM_Gs_kd.js"),[]),meta:{title:"编译"}}],["/zh/getting-started/configuration.html",{loader:()=>S(()=>import("./configuration.html-3dQ1pRig.js"),[]),meta:{title:"配置信息"}}],["/zh/getting-started/directory-structure.html",{loader:()=>S(()=>import("./directory-structure.html-D4BzyHY7.js"),[]),meta:{title:"文件夹结构"}}],["/zh/getting-started/installation.html",{loader:()=>S(()=>import("./installation.html-V65Je3iJ.js"),[]),meta:{title:"安装"}}],["/zh/orm/",{loader:()=>S(()=>import("./index.html-Cae7jPN6.js"),[]),meta:{title:"ORM"}}],["/zh/orm/factories.html",{loader:()=>S(()=>import("./factories.html-6CEGbUG5.js"),[]),meta:{title:"模型工厂"}}],["/zh/orm/getting-started.html",{loader:()=>S(()=>import("./getting-started.html-DXDdKYyS.js"),[]),meta:{title:"快速入门"}}],["/zh/orm/migrations.html",{loader:()=>S(()=>import("./migrations.html-CFNqP66E.js"),[]),meta:{title:"数据库迁移"}}],["/zh/orm/relationships.html",{loader:()=>S(()=>import("./relationships.html-DP1bUOq_.js"),[]),meta:{title:"模型关联"}}],["/zh/orm/seeding.html",{loader:()=>S(()=>import("./seeding.html-DXYzvnxo.js"),[]),meta:{title:"数据填充"}}],["/zh/prologue/contributions.html",{loader:()=>S(()=>import("./contributions.html-CZu5-uUi.js"),__vite__mapDeps([5,3])),meta:{title:"贡献指南"}}],["/zh/prologue/packages.html",{loader:()=>S(()=>import("./packages.html-D_mXOzrI.js"),[]),meta:{title:"优秀扩展包"}}],["/zh/security/authentication.html",{loader:()=>S(()=>import("./authentication.html-cW_F_Plz.js"),[]),meta:{title:"用户认证"}}],["/zh/security/authorization.html",{loader:()=>S(()=>import("./authorization.html-Btcm8c6c.js"),[]),meta:{title:"用户授权"}}],["/zh/security/encryption.html",{loader:()=>S(()=>import("./encryption.html-DyU19Loz.js"),[]),meta:{title:"加密解密"}}],["/zh/security/hashing.html",{loader:()=>S(()=>import("./hashing.html-BgsHt5-V.js"),[]),meta:{title:"哈希"}}],["/zh/testing/",{loader:()=>S(()=>import("./index.html-Vt8tv1Xv.js"),[]),meta:{title:"测试相关"}}],["/zh/testing/getting-started.html",{loader:()=>S(()=>import("./getting-started.html-BZLfsr3n.js"),[]),meta:{title:"快速入门"}}],["/zh/testing/http-tests.html",{loader:()=>S(()=>import("./http-tests.html-QexOHz8g.js"),[]),meta:{title:"HTTP Tests"}}],["/zh/testing/mock.html",{loader:()=>S(()=>import("./mock.html-ZesMHtBg.js"),[]),meta:{title:"Mock"}}],["/zh/the-basics/",{loader:()=>S(()=>import("./index.html-Cm8gFo-6.js"),[]),meta:{title:"基本功能"}}],["/zh/the-basics/controllers.html",{loader:()=>S(()=>import("./controllers.html-BeLopQ-1.js"),[]),meta:{title:"控制器"}}],["/zh/the-basics/grpc.html",{loader:()=>S(()=>import("./grpc.html-DsELBn-y.js"),[]),meta:{title:"Grpc"}}],["/zh/the-basics/logging.html",{loader:()=>S(()=>import("./logging.html-D8i8HGpu.js"),[]),meta:{title:"日志"}}],["/zh/the-basics/middleware.html",{loader:()=>S(()=>import("./middleware.html-CXKWpfrh.js"),[]),meta:{title:"HTTP 中间件"}}],["/zh/the-basics/request.html",{loader:()=>S(()=>import("./request.html-BRO6Ir3A.js"),[]),meta:{title:"请求"}}],["/zh/the-basics/response.html",{loader:()=>S(()=>import("./response.html-B35yVy49.js"),[]),meta:{title:"响应"}}],["/zh/the-basics/routing.html",{loader:()=>S(()=>import("./routing.html-mXSyj-Cl.js"),[]),meta:{title:"路由"}}],["/zh/the-basics/session.html",{loader:()=>S(()=>import("./session.html-BO0crizQ.js"),[]),meta:{title:"Session"}}],["/zh/the-basics/validation.html",{loader:()=>S(()=>import("./validation.html-CiLImEXn.js"),[]),meta:{title:"表单验证"}}],["/zh/the-basics/views.html",{loader:()=>S(()=>import("./views.html-BMnAtMFZ.js"),[]),meta:{title:"视图"}}],["/zh/upgrade/history.html",{loader:()=>S(()=>import("./history.html-D3fbw5gF.js"),[]),meta:{title:"历史版本升级"}}],["/zh/upgrade/v1.1.html",{loader:()=>S(()=>import("./v1.1.html-Bjnqtk-K.js"),[]),meta:{title:"从 v1.0 升级到 v1.1"}}],["/zh/upgrade/v1.10.html",{loader:()=>S(()=>import("./v1.10.html-B8rfcGOk.js"),[]),meta:{title:"从 v1.9 升级到 v1.10"}}],["/zh/upgrade/v1.11.html",{loader:()=>S(()=>import("./v1.11.html-BrYBsgIm.js"),[]),meta:{title:"从 v1.10 升级到 v1.11"}}],["/zh/upgrade/v1.12.html",{loader:()=>S(()=>import("./v1.12.html-zH8DdV-e.js"),[]),meta:{title:"从 v1.11 升级到 v1.12"}}],["/zh/upgrade/v1.13.html",{loader:()=>S(()=>import("./v1.13.html-TufMrOde.js"),[]),meta:{title:"从 v1.12 升级到 v1.13"}}],["/zh/upgrade/v1.14.html",{loader:()=>S(()=>import("./v1.14.html-BdTzwT9L.js"),[]),meta:{title:"从 v1.13 升级到 v1.14"}}],["/zh/upgrade/v1.15.html",{loader:()=>S(()=>import("./v1.15.html-BrvVMvb6.js"),[]),meta:{title:"从 v1.14 升级到 v1.15"}}],["/zh/upgrade/v1.2.html",{loader:()=>S(()=>import("./v1.2.html-BwNn_ayr.js"),[]),meta:{title:"从 v1.1 升级到 v1.2"}}],["/zh/upgrade/v1.3.html",{loader:()=>S(()=>import("./v1.3.html-tHE7sKhD.js"),[]),meta:{title:"从 v1.2 升级到 v1.3"}}],["/zh/upgrade/v1.4.html",{loader:()=>S(()=>import("./v1.4.html-DrNJQuWM.js"),[]),meta:{title:"从 v1.3 升级到 v1.4"}}],["/zh/upgrade/v1.5.html",{loader:()=>S(()=>import("./v1.5.html-Bmq8i0sU.js"),[]),meta:{title:"从 v1.4 升级到 v1.5"}}],["/zh/upgrade/v1.6.html",{loader:()=>S(()=>import("./v1.6.html-DSYQNrKC.js"),[]),meta:{title:"从 v1.5 升级到 v1.6"}}],["/zh/upgrade/v1.7.html",{loader:()=>S(()=>import("./v1.7.html-BlUtLZrM.js"),[]),meta:{title:"从 v1.6 升级到 v1.7"}}],["/zh/upgrade/v1.8.html",{loader:()=>S(()=>import("./v1.8.html-kjkSDe_F.js"),[]),meta:{title:"从 v1.7 升级到 v1.8"}}],["/zh/upgrade/v1.9.html",{loader:()=>S(()=>import("./v1.9.html-CfwQEdWO.js"),[]),meta:{title:"从 v1.8 升级到 v1.9"}}],["/404.html",{loader:()=>S(()=>import("./404.html-BWf9DCd4.js"),[]),meta:{title:""}}]]);function Am(){return Ic().__VUE_DEVTOOLS_GLOBAL_HOOK__}function Ic(){return typeof navigator<"u"&&typeof window<"u"?window:typeof globalThis<"u"?globalThis:{}}const Sm=typeof Proxy=="function",Om="devtools-plugin:setup",km="plugin:settings:set";let Rn,Pi;function xm(){var e;return Rn!==void 0||(typeof window<"u"&&window.performance?(Rn=!0,Pi=window.performance):typeof globalThis<"u"&&(!((e=globalThis.perf_hooks)===null||e===void 0)&&e.performance)?(Rn=!0,Pi=globalThis.perf_hooks.performance):Rn=!1),Rn}function wm(){return xm()?Pi.now():Date.now()}class Cm{constructor(t,n){this.target=null,this.targetQueue=[],this.onQueue=[],this.plugin=t,this.hook=n;const r={};if(t.settings)for(const s in t.settings){const a=t.settings[s];r[s]=a.defaultValue}const o=`__vue-devtools-plugin-settings__${t.id}`;let i=Object.assign({},r);try{const s=localStorage.getItem(o),a=JSON.parse(s);Object.assign(i,a)}catch{}this.fallbacks={getSettings(){return i},setSettings(s){try{localStorage.setItem(o,JSON.stringify(s))}catch{}i=s},now(){return wm()}},n&&n.on(km,(s,a)=>{s===this.plugin.id&&this.fallbacks.setSettings(a)}),this.proxiedOn=new Proxy({},{get:(s,a)=>this.target?this.target.on[a]:(...l)=>{this.onQueue.push({method:a,args:l})}}),this.proxiedTarget=new Proxy({},{get:(s,a)=>this.target?this.target[a]:a==="on"?this.proxiedOn:Object.keys(this.fallbacks).includes(a)?(...l)=>(this.targetQueue.push({method:a,args:l,resolve:()=>{}}),this.fallbacks[a](...l)):(...l)=>new Promise(u=>{this.targetQueue.push({method:a,args:l,resolve:u})})})}async setRealTarget(t){this.target=t;for(const n of this.onQueue)this.target.on[n.method](...n.args);for(const n of this.targetQueue)n.resolve(await this.target[n.method](...n.args))}}function Pm(e,t){const n=e,r=Ic(),o=Am(),i=Sm&&n.enableEarlyProxy;if(o&&(r.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__||!i))o.emit(Om,e,t);else{const s=i?new Cm(n,o):null;(r.__VUE_DEVTOOLS_PLUGINS__=r.__VUE_DEVTOOLS_PLUGINS__||[]).push({pluginDescriptor:n,setupFn:t,proxy:s}),s&&t(s.proxiedTarget)}}/*! * vue-router v4.5.0 * (c) 2024 Eduardo San Martin Morote * @license MIT @@ -39,4 +40,4 @@ Expects a CSS selector, a Node element, a NodeList or an array. See: https://github.com/francoischalifour/medium-zoom`)}},Zg=function(t){var n=document.createElement("div");return n.classList.add("medium-zoom-overlay"),n.style.background=t,n},Jg=function(t){var n=t.getBoundingClientRect(),r=n.top,o=n.left,i=n.width,s=n.height,a=t.cloneNode(),l=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,u=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;return a.removeAttribute("id"),a.style.position="absolute",a.style.top=r+l+"px",a.style.left=o+u+"px",a.style.width=i+"px",a.style.height=s+"px",a.style.transform="",a},Ln=function(t,n){var r=gn({bubbles:!1,cancelable:!1,detail:void 0},n);if(typeof window.CustomEvent=="function")return new CustomEvent(t,r);var o=document.createEvent("CustomEvent");return o.initCustomEvent(t,r.bubbles,r.cancelable,r.detail),o},Qg=function e(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=window.Promise||function(O){function V(){}O(V,V)},o=function(O){var V=O.target;if(V===U){g();return}m.indexOf(V)!==-1&&v({target:V})},i=function(){if(!(D||!k.original)){var O=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(G-O)>H.scrollOffset&&setTimeout(g,150)}},s=function(O){var V=O.key||O.keyCode;(V==="Escape"||V==="Esc"||V===27)&&g()},a=function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},V=O;if(O.background&&(U.style.background=O.background),O.container&&O.container instanceof Object&&(V.container=gn({},H.container,O.container)),O.template){var J=co(O.template)?O.template:document.querySelector(O.template);V.template=J}return H=gn({},H,V),m.forEach(function(te){te.dispatchEvent(Ln("medium-zoom:update",{detail:{zoom:w}}))}),w},l=function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return e(gn({},H,O))},u=function(){for(var O=arguments.length,V=Array(O),J=0;J0?V.reduce(function(R,M){return[].concat(R,Za(M))},[]):m;return te.forEach(function(R){R.classList.remove("medium-zoom-image"),R.dispatchEvent(Ln("medium-zoom:detach",{detail:{zoom:w}}))}),m=m.filter(function(R){return te.indexOf(R)===-1}),w},f=function(O,V){var J=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return m.forEach(function(te){te.addEventListener("medium-zoom:"+O,V,J)}),y.push({type:"medium-zoom:"+O,listener:V,options:J}),w},d=function(O,V){var J=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return m.forEach(function(te){te.removeEventListener("medium-zoom:"+O,V,J)}),y=y.filter(function(te){return!(te.type==="medium-zoom:"+O&&te.listener.toString()===V.toString())}),w},p=function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},V=O.target,J=function(){var R={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},M=void 0,K=void 0;if(H.container)if(H.container instanceof Object)R=gn({},R,H.container),M=R.width-R.left-R.right-H.margin*2,K=R.height-R.top-R.bottom-H.margin*2;else{var ce=co(H.container)?H.container:document.querySelector(H.container),ye=ce.getBoundingClientRect(),Ce=ye.width,be=ye.height,tt=ye.left,Et=ye.top;R=gn({},R,{width:Ce,height:be,left:tt,top:Et})}M=M||R.width-H.margin*2,K=K||R.height-H.margin*2;var nt=k.zoomedHd||k.original,rt=Xa(nt)?M:nt.naturalWidth||M,C=Xa(nt)?K:nt.naturalHeight||K,q=nt.getBoundingClientRect(),j=q.top,Q=q.left,pe=q.width,Te=q.height,h=Math.min(Math.max(pe,rt),M)/pe,_=Math.min(Math.max(Te,C),K)/Te,A=Math.min(h,_),P=(-Q+(M-pe)/2+H.margin+R.left)/A,x=(-j+(K-Te)/2+H.margin+R.top)/A,L="scale("+A+") translate3d("+P+"px, "+x+"px, 0)";k.zoomed.style.transform=L,k.zoomedHd&&(k.zoomedHd.style.transform=L)};return new r(function(te){if(V&&m.indexOf(V)===-1){te(w);return}var R=function Ce(){D=!1,k.zoomed.removeEventListener("transitionend",Ce),k.original.dispatchEvent(Ln("medium-zoom:opened",{detail:{zoom:w}})),te(w)};if(k.zoomed){te(w);return}if(V)k.original=V;else if(m.length>0){var M=m;k.original=M[0]}else{te(w);return}if(k.original.dispatchEvent(Ln("medium-zoom:open",{detail:{zoom:w}})),G=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,D=!0,k.zoomed=Jg(k.original),document.body.appendChild(U),H.template){var K=co(H.template)?H.template:document.querySelector(H.template);k.template=document.createElement("div"),k.template.appendChild(K.content.cloneNode(!0)),document.body.appendChild(k.template)}if(k.original.parentElement&&k.original.parentElement.tagName==="PICTURE"&&k.original.currentSrc&&(k.zoomed.src=k.original.currentSrc),document.body.appendChild(k.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),k.original.classList.add("medium-zoom-image--hidden"),k.zoomed.classList.add("medium-zoom-image--opened"),k.zoomed.addEventListener("click",g),k.zoomed.addEventListener("transitionend",R),k.original.getAttribute("data-zoom-src")){k.zoomedHd=k.zoomed.cloneNode(),k.zoomedHd.removeAttribute("srcset"),k.zoomedHd.removeAttribute("sizes"),k.zoomedHd.removeAttribute("loading"),k.zoomedHd.src=k.zoomed.getAttribute("data-zoom-src"),k.zoomedHd.onerror=function(){clearInterval(ce),console.warn("Unable to reach the zoom image target "+k.zoomedHd.src),k.zoomedHd=null,J()};var ce=setInterval(function(){k.zoomedHd.complete&&(clearInterval(ce),k.zoomedHd.classList.add("medium-zoom-image--opened"),k.zoomedHd.addEventListener("click",g),document.body.appendChild(k.zoomedHd),J())},10)}else if(k.original.hasAttribute("srcset")){k.zoomedHd=k.zoomed.cloneNode(),k.zoomedHd.removeAttribute("sizes"),k.zoomedHd.removeAttribute("loading");var ye=k.zoomedHd.addEventListener("load",function(){k.zoomedHd.removeEventListener("load",ye),k.zoomedHd.classList.add("medium-zoom-image--opened"),k.zoomedHd.addEventListener("click",g),document.body.appendChild(k.zoomedHd),J()})}else J()})},g=function(){return new r(function(O){if(D||!k.original){O(w);return}var V=function J(){k.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(k.zoomed),k.zoomedHd&&document.body.removeChild(k.zoomedHd),document.body.removeChild(U),k.zoomed.classList.remove("medium-zoom-image--opened"),k.template&&document.body.removeChild(k.template),D=!1,k.zoomed.removeEventListener("transitionend",J),k.original.dispatchEvent(Ln("medium-zoom:closed",{detail:{zoom:w}})),k.original=null,k.zoomed=null,k.zoomedHd=null,k.template=null,O(w)};D=!0,document.body.classList.remove("medium-zoom--opened"),k.zoomed.style.transform="",k.zoomedHd&&(k.zoomedHd.style.transform=""),k.template&&(k.template.style.transition="opacity 150ms",k.template.style.opacity=0),k.original.dispatchEvent(Ln("medium-zoom:close",{detail:{zoom:w}})),k.zoomed.addEventListener("transitionend",V)})},v=function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},V=O.target;return k.original?g():p({target:V})},E=function(){return H},b=function(){return m},T=function(){return k.original},m=[],y=[],D=!1,G=0,H=n,k={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(t)==="[object Object]"?H=t:(t||typeof t=="string")&&u(t),H=gn({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},H);var U=Zg(H.background);document.addEventListener("click",o),document.addEventListener("keyup",s),document.addEventListener("scroll",i),window.addEventListener("resize",g);var w={open:p,close:g,toggle:v,update:a,clone:l,attach:u,detach:c,on:f,off:d,getOptions:E,getImages:b,getZoomedImage:T};return w};function ev(e,t){t===void 0&&(t={});var n=t.insertAt;if(!(typeof document>"u")){var r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var tv=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";ev(tv);const nv=Symbol("mediumZoom");var rv={};const ov="[vp-content] > img, [vp-content] :not(a) > img",iv=rv,sv=300,av=Rt({enhance({app:e,router:t}){const n=Qg(iv);n.refresh=(r=ov)=>{n.detach(),n.attach(r)},e.provide(nv,n),t.afterEach(()=>{lf(sv).then(()=>{n.refresh()})})}}),lv=Object.freeze(Object.defineProperty({__proto__:null,default:av},Symbol.toStringTag,{value:"Module"}));/** * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress * @license MIT - */const Ja=(e,t)=>{e.classList.add(t)},Qa=(e,t)=>{e.classList.remove(t)},uv=e=>{var t;(t=e==null?void 0:e.parentNode)==null||t.removeChild(e)},di=(e,t,n)=>en?n:e,el=e=>(-1+e)*100,cv=(()=>{const e=[],t=()=>{const n=e.shift();n&&n(t)};return n=>{e.push(n),e.length===1&&t()}})(),fv=e=>e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(t,n)=>n.toUpperCase()),oo=(()=>{const e=["Webkit","O","Moz","ms"],t={},n=i=>{const{style:s}=document.body;if(i in s)return i;const a=i.charAt(0).toUpperCase()+i.slice(1);let l=e.length;for(;l--;){const u=`${e[l]}${a}`;if(u in s)return u}return i},r=i=>{const s=fv(i);return t[s]??(t[s]=n(s))},o=(i,s,a)=>{i.style[r(s)]=a};return(i,s)=>{for(const a in s){const l=s[a];Object.hasOwn(s,a)&&Vg(l)&&o(i,a,l)}}})(),Nt={minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
'},Ie={percent:null,isRendered:()=>!!document.getElementById("nprogress"),set:e=>{const{speed:t,easing:n}=Nt,r=Ie.isStarted(),o=di(e,Nt.minimum,1);Ie.percent=o===1?null:o;const i=Ie.render(!r),s=i.querySelector(Nt.barSelector);return i.offsetWidth,cv(a=>{oo(s,{transform:`translate3d(${el(o)}%,0,0)`,transition:`all ${t}ms ${n}`}),o===1?(oo(i,{transition:"none",opacity:"1"}),i.offsetWidth,setTimeout(()=>{oo(i,{transition:`all ${t}ms linear`,opacity:"0"}),setTimeout(()=>{Ie.remove(),a()},t)},t)):setTimeout(()=>{a()},t)}),Ie},isStarted:()=>typeof Ie.percent=="number",start:()=>{Ie.percent||Ie.set(0);const e=()=>{setTimeout(()=>{Ie.percent&&(Ie.trickle(),e())},Nt.trickleSpeed)};return e(),Ie},done:e=>!e&&!Ie.percent?Ie:Ie.increase(.3+.5*Math.random()).set(1),increase:e=>{let{percent:t}=Ie;return t?(t=di(t+(typeof e=="number"?e:(1-t)*di(Math.random()*t,.1,.95)),0,.994),Ie.set(t)):Ie.start()},trickle:()=>Ie.increase(Math.random()*Nt.trickleRate),render:e=>{if(Ie.isRendered())return document.getElementById("nprogress");Ja(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=Nt.template;const n=t.querySelector(Nt.barSelector),r=document.querySelector(Nt.parent),o=e?"-100":el(Ie.percent??0);return oo(n,{transition:"all 0 linear",transform:`translate3d(${o}%,0,0)`}),r&&(r!==document.body&&Ja(r,"nprogress-custom-parent"),r.appendChild(t)),t},remove:()=>{Qa(document.documentElement,"nprogress-busy"),Qa(document.querySelector(Nt.parent),"nprogress-custom-parent"),uv(document.getElementById("nprogress"))}},dv=()=>{We(()=>{const e=cn(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||Ie.start()}),e.afterEach(n=>{t.add(n.path),Ie.done()})})},pv=Rt({setup(){dv()}}),hv=Object.freeze(Object.defineProperty({__proto__:null,default:pv},Symbol.toStringTag,{value:"Module"})),mv=({selector:e='div[class*="language-"].has-collapsed-lines > .collapsed-lines'}={})=>{et("click",t=>{const n=t.target;if(n.matches(e)){const r=n.parentElement;r!=null&&r.classList.toggle("collapsed")&&r.scrollIntoView({block:"center",behavior:"instant"})}})},_v={setup(){mv()}},gv=Object.freeze(Object.defineProperty({__proto__:null,default:_v},Symbol.toStringTag,{value:"Module"})),vv="VUEPRESS_CODE_TAB_STORE",io=Os(vv,{}),Ev=me({name:"CodeTabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},id:{type:String,required:!0},tabId:{type:String,default:""}},slots:Object,setup(e,{slots:t}){const n=de(e.active),r=At([]),o=()=>{e.tabId&&(io.value[e.tabId]=e.data[n.value].id)},i=(u=n.value)=>{n.value=u{n.value=u>0?u-1:r.value.length-1,r.value[n.value].focus()},a=(u,c)=>{u.key===" "||u.key==="Enter"?(u.preventDefault(),n.value=c):u.key==="ArrowRight"?(u.preventDefault(),i()):u.key==="ArrowLeft"&&(u.preventDefault(),s()),e.tabId&&(io.value[e.tabId]=e.data[n.value].id)},l=()=>{if(e.tabId){const u=e.data.findIndex(({id:c})=>io.value[e.tabId]===c);if(u!==-1)return u}return e.active};return We(()=>{n.value=l(),Ue(()=>io.value[e.tabId],(u,c)=>{if(e.tabId&&u!==c){const f=e.data.findIndex(({id:d})=>d===u);f!==-1&&(n.value=f)}})}),()=>e.data.length?ue("div",{class:"vp-code-tabs"},[ue("div",{class:"vp-code-tabs-nav",role:"tablist"},e.data.map(({id:u},c)=>{const f=c===n.value;return ue("button",{type:"button",ref:d=>{d&&(r.value[c]=d)},class:["vp-code-tab-nav",{active:f}],role:"tab","aria-controls":`codetab-${e.id}-${c}`,"aria-selected":f,onClick:()=>{n.value=c,o()},onKeydown:d=>{a(d,c)}},t[`title${c}`]({value:u,isActive:f}))})),e.data.map(({id:u},c)=>{const f=c===n.value;return ue("div",{class:["vp-code-tab",{active:f}],id:`codetab-${e.id}-${c}`,role:"tabpanel","aria-expanded":f},[ue("div",{class:"vp-code-tab-title"},t[`title${c}`]({value:u,isActive:f})),t[`tab${c}`]({value:u,isActive:f})])})]):null}}),yv="VUEPRESS_TAB_STORE",pi=Os(yv,{}),bv=me({name:"Tabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},id:{type:String,required:!0},tabId:{type:String,default:""}},slots:Object,setup(e,{slots:t}){const n=de(e.active),r=At([]),o=()=>{e.tabId&&(pi.value[e.tabId]=e.data[n.value].id)},i=(u=n.value)=>{n.value=u{n.value=u>0?u-1:r.value.length-1,r.value[n.value].focus()},a=(u,c)=>{u.key===" "||u.key==="Enter"?(u.preventDefault(),n.value=c):u.key==="ArrowRight"?(u.preventDefault(),i()):u.key==="ArrowLeft"&&(u.preventDefault(),s()),o()},l=()=>{if(e.tabId){const u=e.data.findIndex(({id:c})=>pi.value[e.tabId]===c);if(u!==-1)return u}return e.active};return We(()=>{n.value=l(),Ue(()=>pi.value[e.tabId],(u,c)=>{if(e.tabId&&u!==c){const f=e.data.findIndex(({id:d})=>d===u);f!==-1&&(n.value=f)}})}),()=>e.data.length?ue("div",{class:"vp-tabs"},[ue("div",{class:"vp-tabs-nav",role:"tablist"},e.data.map(({id:u},c)=>{const f=c===n.value;return ue("button",{type:"button",ref:d=>{d&&(r.value[c]=d)},class:["vp-tab-nav",{active:f}],role:"tab","aria-controls":`tab-${e.id}-${c}`,"aria-selected":f,onClick:()=>{n.value=c,o()},onKeydown:d=>{a(d,c)}},t[`title${c}`]({value:u,isActive:f}))})),e.data.map(({id:u},c)=>{const f=c===n.value;return ue("div",{class:["vp-tab",{active:f}],id:`tab-${e.id}-${c}`,role:"tabpanel","aria-expanded":f},[ue("div",{class:"vp-tab-title"},t[`title${c}`]({value:u,isActive:f})),t[`tab${c}`]({value:u,isActive:f})])})]):null}}),Tv={enhance:({app:e})=>{e.component("CodeTabs",Ev),e.component("Tabs",bv)}},Av=Object.freeze(Object.defineProperty({__proto__:null,default:Tv},Symbol.toStringTag,{value:"Module"}));var Sv=Object.create,df=Object.defineProperty,Ov=Object.getOwnPropertyDescriptor,ks=Object.getOwnPropertyNames,kv=Object.getPrototypeOf,xv=Object.prototype.hasOwnProperty,wv=(e,t)=>function(){return e&&(t=(0,e[ks(e)[0]])(e=0)),t},Cv=(e,t)=>function(){return t||(0,e[ks(e)[0]])((t={exports:{}}).exports,t),t.exports},Pv=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ks(t))!xv.call(e,o)&&o!==n&&df(e,o,{get:()=>t[o],enumerable:!(r=Ov(t,o))||r.enumerable});return e},Iv=(e,t,n)=>(n=e!=null?Sv(kv(e)):{},Pv(df(n,"default",{value:e,enumerable:!0}),e)),qr=wv({"../../node_modules/.pnpm/tsup@8.3.5_@microsoft+api-extractor@7.48.0_@types+node@22.10.1__@swc+core@1.5.29_jiti@2.0.0_p_swvvp2d4pgn6xuiiec4l4x2i7a/node_modules/tsup/assets/esm_shims.js"(){}}),Rv=Cv({"../../node_modules/.pnpm/rfdc@1.4.1/node_modules/rfdc/index.js"(e,t){qr(),t.exports=r;function n(i){return i instanceof Buffer?Buffer.from(i):new i.constructor(i.buffer.slice(),i.byteOffset,i.length)}function r(i){if(i=i||{},i.circles)return o(i);const s=new Map;if(s.set(Date,f=>new Date(f)),s.set(Map,(f,d)=>new Map(l(Array.from(f),d))),s.set(Set,(f,d)=>new Set(l(Array.from(f),d))),i.constructorHandlers)for(const f of i.constructorHandlers)s.set(f[0],f[1]);let a=null;return i.proto?c:u;function l(f,d){const p=Object.keys(f),g=new Array(p.length);for(let v=0;vnew Date(p)),l.set(Map,(p,g)=>new Map(c(Array.from(p),g))),l.set(Set,(p,g)=>new Set(c(Array.from(p),g))),i.constructorHandlers)for(const p of i.constructorHandlers)l.set(p[0],p[1]);let u=null;return i.proto?d:f;function c(p,g){const v=Object.keys(p),E=new Array(v.length);for(let b=0;b(s=Hv(e,u,c),s.finally(()=>{if(s=null,n.trailing&&a&&!o){const f=l(u,a);return a=null,f}}),s);return function(...u){return s?(n.trailing&&(a=u),s):new Promise(c=>{const f=!o&&n.leading;clearTimeout(o),o=setTimeout(()=>{o=null;const d=n.leading?r:l(this,u);for(const p of i)p(d);i=[]},t),f?(r=l(this,u),c(r)):i.push(c)})}}async function Hv(e,t,n){return await e.apply(t,n)}function Mi(e,t={},n){for(const r in e){const o=e[r],i=n?`${n}:${r}`:r;typeof o=="object"&&o!==null?Mi(o,t,i):typeof o=="function"&&(t[i]=o)}return t}const zv={run:e=>e()},Bv=()=>zv,hf=typeof console.createTask<"u"?console.createTask:Bv;function $v(e,t){const n=t.shift(),r=hf(n);return e.reduce((o,i)=>o.then(()=>r.run(()=>i(...t))),Promise.resolve())}function Uv(e,t){const n=t.shift(),r=hf(n);return Promise.all(e.map(o=>r.run(()=>o(...t))))}function hi(e,t){for(const n of[...e])n(t)}class jv{constructor(){this._hooks={},this._before=void 0,this._after=void 0,this._deprecatedMessages=void 0,this._deprecatedHooks={},this.hook=this.hook.bind(this),this.callHook=this.callHook.bind(this),this.callHookWith=this.callHookWith.bind(this)}hook(t,n,r={}){if(!t||typeof n!="function")return()=>{};const o=t;let i;for(;this._deprecatedHooks[t];)i=this._deprecatedHooks[t],t=i.to;if(i&&!r.allowDeprecated){let s=i.message;s||(s=`${o} hook has been deprecated`+(i.to?`, please use ${i.to}`:"")),this._deprecatedMessages||(this._deprecatedMessages=new Set),this._deprecatedMessages.has(s)||(console.warn(s),this._deprecatedMessages.add(s))}if(!n.name)try{Object.defineProperty(n,"name",{get:()=>"_"+t.replace(/\W+/g,"_")+"_hook_cb",configurable:!0})}catch{}return this._hooks[t]=this._hooks[t]||[],this._hooks[t].push(n),()=>{n&&(this.removeHook(t,n),n=void 0)}}hookOnce(t,n){let r,o=(...i)=>(typeof r=="function"&&r(),r=void 0,o=void 0,n(...i));return r=this.hook(t,o),r}removeHook(t,n){if(this._hooks[t]){const r=this._hooks[t].indexOf(n);r!==-1&&this._hooks[t].splice(r,1),this._hooks[t].length===0&&delete this._hooks[t]}}deprecateHook(t,n){this._deprecatedHooks[t]=typeof n=="string"?{to:n}:n;const r=this._hooks[t]||[];delete this._hooks[t];for(const o of r)this.hook(t,o)}deprecateHooks(t){Object.assign(this._deprecatedHooks,t);for(const n in t)this.deprecateHook(n,t[n])}addHooks(t){const n=Mi(t),r=Object.keys(n).map(o=>this.hook(o,n[o]));return()=>{for(const o of r.splice(0,r.length))o()}}removeHooks(t){const n=Mi(t);for(const r in n)this.removeHook(r,n[r])}removeAllHooks(){for(const t in this._hooks)delete this._hooks[t]}callHook(t,...n){return n.unshift(t),this.callHookWith($v,t,...n)}callHookParallel(t,...n){return n.unshift(t),this.callHookWith(Uv,t,...n)}callHookWith(t,n,...r){const o=this._before||this._after?{name:n,args:r,context:{}}:void 0;this._before&&hi(this._before,o);const i=t(n in this._hooks?[...this._hooks[n]]:[],r);return i instanceof Promise?i.finally(()=>{this._after&&o&&hi(this._after,o)}):(this._after&&o&&hi(this._after,o),i)}beforeEach(t){return this._before=this._before||[],this._before.push(t),()=>{if(this._before!==void 0){const n=this._before.indexOf(t);n!==-1&&this._before.splice(n,1)}}}afterEach(t){return this._after=this._after||[],this._after.push(t),()=>{if(this._after!==void 0){const n=this._after.indexOf(t);n!==-1&&this._after.splice(n,1)}}}}function mf(){return new jv}var Kv=Object.create,_f=Object.defineProperty,Wv=Object.getOwnPropertyDescriptor,xs=Object.getOwnPropertyNames,Gv=Object.getPrototypeOf,qv=Object.prototype.hasOwnProperty,Yv=(e,t)=>function(){return e&&(t=(0,e[xs(e)[0]])(e=0)),t},gf=(e,t)=>function(){return t||(0,e[xs(e)[0]])((t={exports:{}}).exports,t),t.exports},Xv=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of xs(t))!qv.call(e,o)&&o!==n&&_f(e,o,{get:()=>t[o],enumerable:!(r=Wv(t,o))||r.enumerable});return e},Zv=(e,t,n)=>(n=e!=null?Kv(Gv(e)):{},Xv(_f(n,"default",{value:e,enumerable:!0}),e)),I=Yv({"../../node_modules/.pnpm/tsup@8.3.5_@microsoft+api-extractor@7.48.0_@types+node@22.10.1__@swc+core@1.5.29_jiti@2.0.0_p_swvvp2d4pgn6xuiiec4l4x2i7a/node_modules/tsup/assets/esm_shims.js"(){}}),Jv=gf({"../../node_modules/.pnpm/speakingurl@14.0.1/node_modules/speakingurl/lib/speakingurl.js"(e,t){I(),function(n){var r={À:"A",Á:"A",Â:"A",Ã:"A",Ä:"Ae",Å:"A",Æ:"AE",Ç:"C",È:"E",É:"E",Ê:"E",Ë:"E",Ì:"I",Í:"I",Î:"I",Ï:"I",Ð:"D",Ñ:"N",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"Oe",Ő:"O",Ø:"O",Ù:"U",Ú:"U",Û:"U",Ü:"Ue",Ű:"U",Ý:"Y",Þ:"TH",ß:"ss",à:"a",á:"a",â:"a",ã:"a",ä:"ae",å:"a",æ:"ae",ç:"c",è:"e",é:"e",ê:"e",ë:"e",ì:"i",í:"i",î:"i",ï:"i",ð:"d",ñ:"n",ò:"o",ó:"o",ô:"o",õ:"o",ö:"oe",ő:"o",ø:"o",ù:"u",ú:"u",û:"u",ü:"ue",ű:"u",ý:"y",þ:"th",ÿ:"y","ẞ":"SS",ا:"a",أ:"a",إ:"i",آ:"aa",ؤ:"u",ئ:"e",ء:"a",ب:"b",ت:"t",ث:"th",ج:"j",ح:"h",خ:"kh",د:"d",ذ:"th",ر:"r",ز:"z",س:"s",ش:"sh",ص:"s",ض:"dh",ط:"t",ظ:"z",ع:"a",غ:"gh",ف:"f",ق:"q",ك:"k",ل:"l",م:"m",ن:"n",ه:"h",و:"w",ي:"y",ى:"a",ة:"h",ﻻ:"la",ﻷ:"laa",ﻹ:"lai",ﻵ:"laa",گ:"g",چ:"ch",پ:"p",ژ:"zh",ک:"k",ی:"y","َ":"a","ً":"an","ِ":"e","ٍ":"en","ُ":"u","ٌ":"on","ْ":"","٠":"0","١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","۰":"0","۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9",က:"k",ခ:"kh",ဂ:"g",ဃ:"ga",င:"ng",စ:"s",ဆ:"sa",ဇ:"z","စျ":"za",ည:"ny",ဋ:"t",ဌ:"ta",ဍ:"d",ဎ:"da",ဏ:"na",တ:"t",ထ:"ta",ဒ:"d",ဓ:"da",န:"n",ပ:"p",ဖ:"pa",ဗ:"b",ဘ:"ba",မ:"m",ယ:"y",ရ:"ya",လ:"l",ဝ:"w",သ:"th",ဟ:"h",ဠ:"la",အ:"a","ြ":"y","ျ":"ya","ွ":"w","ြွ":"yw","ျွ":"ywa","ှ":"h",ဧ:"e","၏":"-e",ဣ:"i",ဤ:"-i",ဉ:"u",ဦ:"-u",ဩ:"aw","သြော":"aw",ဪ:"aw","၀":"0","၁":"1","၂":"2","၃":"3","၄":"4","၅":"5","၆":"6","၇":"7","၈":"8","၉":"9","္":"","့":"","း":"",č:"c",ď:"d",ě:"e",ň:"n",ř:"r",š:"s",ť:"t",ů:"u",ž:"z",Č:"C",Ď:"D",Ě:"E",Ň:"N",Ř:"R",Š:"S",Ť:"T",Ů:"U",Ž:"Z",ހ:"h",ށ:"sh",ނ:"n",ރ:"r",ބ:"b",ޅ:"lh",ކ:"k",އ:"a",ވ:"v",މ:"m",ފ:"f",ދ:"dh",ތ:"th",ލ:"l",ގ:"g",ޏ:"gn",ސ:"s",ޑ:"d",ޒ:"z",ޓ:"t",ޔ:"y",ޕ:"p",ޖ:"j",ޗ:"ch",ޘ:"tt",ޙ:"hh",ޚ:"kh",ޛ:"th",ޜ:"z",ޝ:"sh",ޞ:"s",ޟ:"d",ޠ:"t",ޡ:"z",ޢ:"a",ޣ:"gh",ޤ:"q",ޥ:"w","ަ":"a","ާ":"aa","ި":"i","ީ":"ee","ު":"u","ޫ":"oo","ެ":"e","ޭ":"ey","ޮ":"o","ޯ":"oa","ް":"",ა:"a",ბ:"b",გ:"g",დ:"d",ე:"e",ვ:"v",ზ:"z",თ:"t",ი:"i",კ:"k",ლ:"l",მ:"m",ნ:"n",ო:"o",პ:"p",ჟ:"zh",რ:"r",ს:"s",ტ:"t",უ:"u",ფ:"p",ქ:"k",ღ:"gh",ყ:"q",შ:"sh",ჩ:"ch",ც:"ts",ძ:"dz",წ:"ts",ჭ:"ch",ხ:"kh",ჯ:"j",ჰ:"h",α:"a",β:"v",γ:"g",δ:"d",ε:"e",ζ:"z",η:"i",θ:"th",ι:"i",κ:"k",λ:"l",μ:"m",ν:"n",ξ:"ks",ο:"o",π:"p",ρ:"r",σ:"s",τ:"t",υ:"y",φ:"f",χ:"x",ψ:"ps",ω:"o",ά:"a",έ:"e",ί:"i",ό:"o",ύ:"y",ή:"i",ώ:"o",ς:"s",ϊ:"i",ΰ:"y",ϋ:"y",ΐ:"i",Α:"A",Β:"B",Γ:"G",Δ:"D",Ε:"E",Ζ:"Z",Η:"I",Θ:"TH",Ι:"I",Κ:"K",Λ:"L",Μ:"M",Ν:"N",Ξ:"KS",Ο:"O",Π:"P",Ρ:"R",Σ:"S",Τ:"T",Υ:"Y",Φ:"F",Χ:"X",Ψ:"PS",Ω:"O",Ά:"A",Έ:"E",Ί:"I",Ό:"O",Ύ:"Y",Ή:"I",Ώ:"O",Ϊ:"I",Ϋ:"Y",ā:"a",ē:"e",ģ:"g",ī:"i",ķ:"k",ļ:"l",ņ:"n",ū:"u",Ā:"A",Ē:"E",Ģ:"G",Ī:"I",Ķ:"k",Ļ:"L",Ņ:"N",Ū:"U",Ќ:"Kj",ќ:"kj",Љ:"Lj",љ:"lj",Њ:"Nj",њ:"nj",Тс:"Ts",тс:"ts",ą:"a",ć:"c",ę:"e",ł:"l",ń:"n",ś:"s",ź:"z",ż:"z",Ą:"A",Ć:"C",Ę:"E",Ł:"L",Ń:"N",Ś:"S",Ź:"Z",Ż:"Z",Є:"Ye",І:"I",Ї:"Yi",Ґ:"G",є:"ye",і:"i",ї:"yi",ґ:"g",ă:"a",Ă:"A",ș:"s",Ș:"S",ț:"t",Ț:"T",ţ:"t",Ţ:"T",а:"a",б:"b",в:"v",г:"g",д:"d",е:"e",ё:"yo",ж:"zh",з:"z",и:"i",й:"i",к:"k",л:"l",м:"m",н:"n",о:"o",п:"p",р:"r",с:"s",т:"t",у:"u",ф:"f",х:"kh",ц:"c",ч:"ch",ш:"sh",щ:"sh",ъ:"",ы:"y",ь:"",э:"e",ю:"yu",я:"ya",А:"A",Б:"B",В:"V",Г:"G",Д:"D",Е:"E",Ё:"Yo",Ж:"Zh",З:"Z",И:"I",Й:"I",К:"K",Л:"L",М:"M",Н:"N",О:"O",П:"P",Р:"R",С:"S",Т:"T",У:"U",Ф:"F",Х:"Kh",Ц:"C",Ч:"Ch",Ш:"Sh",Щ:"Sh",Ъ:"",Ы:"Y",Ь:"",Э:"E",Ю:"Yu",Я:"Ya",ђ:"dj",ј:"j",ћ:"c",џ:"dz",Ђ:"Dj",Ј:"j",Ћ:"C",Џ:"Dz",ľ:"l",ĺ:"l",ŕ:"r",Ľ:"L",Ĺ:"L",Ŕ:"R",ş:"s",Ş:"S",ı:"i",İ:"I",ğ:"g",Ğ:"G",ả:"a",Ả:"A",ẳ:"a",Ẳ:"A",ẩ:"a",Ẩ:"A",đ:"d",Đ:"D",ẹ:"e",Ẹ:"E",ẽ:"e",Ẽ:"E",ẻ:"e",Ẻ:"E",ế:"e",Ế:"E",ề:"e",Ề:"E",ệ:"e",Ệ:"E",ễ:"e",Ễ:"E",ể:"e",Ể:"E",ỏ:"o",ọ:"o",Ọ:"o",ố:"o",Ố:"O",ồ:"o",Ồ:"O",ổ:"o",Ổ:"O",ộ:"o",Ộ:"O",ỗ:"o",Ỗ:"O",ơ:"o",Ơ:"O",ớ:"o",Ớ:"O",ờ:"o",Ờ:"O",ợ:"o",Ợ:"O",ỡ:"o",Ỡ:"O",Ở:"o",ở:"o",ị:"i",Ị:"I",ĩ:"i",Ĩ:"I",ỉ:"i",Ỉ:"i",ủ:"u",Ủ:"U",ụ:"u",Ụ:"U",ũ:"u",Ũ:"U",ư:"u",Ư:"U",ứ:"u",Ứ:"U",ừ:"u",Ừ:"U",ự:"u",Ự:"U",ữ:"u",Ữ:"U",ử:"u",Ử:"ư",ỷ:"y",Ỷ:"y",ỳ:"y",Ỳ:"Y",ỵ:"y",Ỵ:"Y",ỹ:"y",Ỹ:"Y",ạ:"a",Ạ:"A",ấ:"a",Ấ:"A",ầ:"a",Ầ:"A",ậ:"a",Ậ:"A",ẫ:"a",Ẫ:"A",ắ:"a",Ắ:"A",ằ:"a",Ằ:"A",ặ:"a",Ặ:"A",ẵ:"a",Ẵ:"A","⓪":"0","①":"1","②":"2","③":"3","④":"4","⑤":"5","⑥":"6","⑦":"7","⑧":"8","⑨":"9","⑩":"10","⑪":"11","⑫":"12","⑬":"13","⑭":"14","⑮":"15","⑯":"16","⑰":"17","⑱":"18","⑲":"18","⑳":"18","⓵":"1","⓶":"2","⓷":"3","⓸":"4","⓹":"5","⓺":"6","⓻":"7","⓼":"8","⓽":"9","⓾":"10","⓿":"0","⓫":"11","⓬":"12","⓭":"13","⓮":"14","⓯":"15","⓰":"16","⓱":"17","⓲":"18","⓳":"19","⓴":"20","Ⓐ":"A","Ⓑ":"B","Ⓒ":"C","Ⓓ":"D","Ⓔ":"E","Ⓕ":"F","Ⓖ":"G","Ⓗ":"H","Ⓘ":"I","Ⓙ":"J","Ⓚ":"K","Ⓛ":"L","Ⓜ":"M","Ⓝ":"N","Ⓞ":"O","Ⓟ":"P","Ⓠ":"Q","Ⓡ":"R","Ⓢ":"S","Ⓣ":"T","Ⓤ":"U","Ⓥ":"V","Ⓦ":"W","Ⓧ":"X","Ⓨ":"Y","Ⓩ":"Z","ⓐ":"a","ⓑ":"b","ⓒ":"c","ⓓ":"d","ⓔ":"e","ⓕ":"f","ⓖ":"g","ⓗ":"h","ⓘ":"i","ⓙ":"j","ⓚ":"k","ⓛ":"l","ⓜ":"m","ⓝ":"n","ⓞ":"o","ⓟ":"p","ⓠ":"q","ⓡ":"r","ⓢ":"s","ⓣ":"t","ⓤ":"u","ⓦ":"v","ⓥ":"w","ⓧ":"x","ⓨ":"y","ⓩ":"z","“":'"',"”":'"',"‘":"'","’":"'","∂":"d",ƒ:"f","™":"(TM)","©":"(C)",œ:"oe",Œ:"OE","®":"(R)","†":"+","℠":"(SM)","…":"...","˚":"o",º:"o",ª:"a","•":"*","၊":",","။":".",$:"USD","€":"EUR","₢":"BRN","₣":"FRF","£":"GBP","₤":"ITL","₦":"NGN","₧":"ESP","₩":"KRW","₪":"ILS","₫":"VND","₭":"LAK","₮":"MNT","₯":"GRD","₱":"ARS","₲":"PYG","₳":"ARA","₴":"UAH","₵":"GHS","¢":"cent","¥":"CNY",元:"CNY",円:"YEN","﷼":"IRR","₠":"EWE","฿":"THB","₨":"INR","₹":"INR","₰":"PF","₺":"TRY","؋":"AFN","₼":"AZN",лв:"BGN","៛":"KHR","₡":"CRC","₸":"KZT",ден:"MKD",zł:"PLN","₽":"RUB","₾":"GEL"},o=["်","ް"],i={"ာ":"a","ါ":"a","ေ":"e","ဲ":"e","ိ":"i","ီ":"i","ို":"o","ု":"u","ူ":"u","ေါင်":"aung","ော":"aw","ော်":"aw","ေါ":"aw","ေါ်":"aw","်":"်","က်":"et","ိုက်":"aik","ောက်":"auk","င်":"in","ိုင်":"aing","ောင်":"aung","စ်":"it","ည်":"i","တ်":"at","ိတ်":"eik","ုတ်":"ok","ွတ်":"ut","ေတ်":"it","ဒ်":"d","ိုဒ်":"ok","ုဒ်":"ait","န်":"an","ာန်":"an","ိန်":"ein","ုန်":"on","ွန်":"un","ပ်":"at","ိပ်":"eik","ုပ်":"ok","ွပ်":"ut","န်ုပ်":"nub","မ်":"an","ိမ်":"ein","ုမ်":"on","ွမ်":"un","ယ်":"e","ိုလ်":"ol","ဉ်":"in","ံ":"an","ိံ":"ein","ုံ":"on","ައް":"ah","ަށް":"ah"},s={en:{},az:{ç:"c",ə:"e",ğ:"g",ı:"i",ö:"o",ş:"s",ü:"u",Ç:"C",Ə:"E",Ğ:"G",İ:"I",Ö:"O",Ş:"S",Ü:"U"},cs:{č:"c",ď:"d",ě:"e",ň:"n",ř:"r",š:"s",ť:"t",ů:"u",ž:"z",Č:"C",Ď:"D",Ě:"E",Ň:"N",Ř:"R",Š:"S",Ť:"T",Ů:"U",Ž:"Z"},fi:{ä:"a",Ä:"A",ö:"o",Ö:"O"},hu:{ä:"a",Ä:"A",ö:"o",Ö:"O",ü:"u",Ü:"U",ű:"u",Ű:"U"},lt:{ą:"a",č:"c",ę:"e",ė:"e",į:"i",š:"s",ų:"u",ū:"u",ž:"z",Ą:"A",Č:"C",Ę:"E",Ė:"E",Į:"I",Š:"S",Ų:"U",Ū:"U"},lv:{ā:"a",č:"c",ē:"e",ģ:"g",ī:"i",ķ:"k",ļ:"l",ņ:"n",š:"s",ū:"u",ž:"z",Ā:"A",Č:"C",Ē:"E",Ģ:"G",Ī:"i",Ķ:"k",Ļ:"L",Ņ:"N",Š:"S",Ū:"u",Ž:"Z"},pl:{ą:"a",ć:"c",ę:"e",ł:"l",ń:"n",ó:"o",ś:"s",ź:"z",ż:"z",Ą:"A",Ć:"C",Ę:"e",Ł:"L",Ń:"N",Ó:"O",Ś:"S",Ź:"Z",Ż:"Z"},sv:{ä:"a",Ä:"A",ö:"o",Ö:"O"},sk:{ä:"a",Ä:"A"},sr:{љ:"lj",њ:"nj",Љ:"Lj",Њ:"Nj",đ:"dj",Đ:"Dj"},tr:{Ü:"U",Ö:"O",ü:"u",ö:"o"}},a={ar:{"∆":"delta","∞":"la-nihaya","♥":"hob","&":"wa","|":"aw","<":"aqal-men",">":"akbar-men","∑":"majmou","¤":"omla"},az:{},ca:{"∆":"delta","∞":"infinit","♥":"amor","&":"i","|":"o","<":"menys que",">":"mes que","∑":"suma dels","¤":"moneda"},cs:{"∆":"delta","∞":"nekonecno","♥":"laska","&":"a","|":"nebo","<":"mensi nez",">":"vetsi nez","∑":"soucet","¤":"mena"},de:{"∆":"delta","∞":"unendlich","♥":"Liebe","&":"und","|":"oder","<":"kleiner als",">":"groesser als","∑":"Summe von","¤":"Waehrung"},dv:{"∆":"delta","∞":"kolunulaa","♥":"loabi","&":"aai","|":"noonee","<":"ah vure kuda",">":"ah vure bodu","∑":"jumula","¤":"faisaa"},en:{"∆":"delta","∞":"infinity","♥":"love","&":"and","|":"or","<":"less than",">":"greater than","∑":"sum","¤":"currency"},es:{"∆":"delta","∞":"infinito","♥":"amor","&":"y","|":"u","<":"menos que",">":"mas que","∑":"suma de los","¤":"moneda"},fa:{"∆":"delta","∞":"bi-nahayat","♥":"eshgh","&":"va","|":"ya","<":"kamtar-az",">":"bishtar-az","∑":"majmooe","¤":"vahed"},fi:{"∆":"delta","∞":"aarettomyys","♥":"rakkaus","&":"ja","|":"tai","<":"pienempi kuin",">":"suurempi kuin","∑":"summa","¤":"valuutta"},fr:{"∆":"delta","∞":"infiniment","♥":"Amour","&":"et","|":"ou","<":"moins que",">":"superieure a","∑":"somme des","¤":"monnaie"},ge:{"∆":"delta","∞":"usasruloba","♥":"siqvaruli","&":"da","|":"an","<":"naklebi",">":"meti","∑":"jami","¤":"valuta"},gr:{},hu:{"∆":"delta","∞":"vegtelen","♥":"szerelem","&":"es","|":"vagy","<":"kisebb mint",">":"nagyobb mint","∑":"szumma","¤":"penznem"},it:{"∆":"delta","∞":"infinito","♥":"amore","&":"e","|":"o","<":"minore di",">":"maggiore di","∑":"somma","¤":"moneta"},lt:{"∆":"delta","∞":"begalybe","♥":"meile","&":"ir","|":"ar","<":"maziau nei",">":"daugiau nei","∑":"suma","¤":"valiuta"},lv:{"∆":"delta","∞":"bezgaliba","♥":"milestiba","&":"un","|":"vai","<":"mazak neka",">":"lielaks neka","∑":"summa","¤":"valuta"},my:{"∆":"kwahkhyaet","∞":"asaonasme","♥":"akhyait","&":"nhin","|":"tho","<":"ngethaw",">":"kyithaw","∑":"paungld","¤":"ngwekye"},mk:{},nl:{"∆":"delta","∞":"oneindig","♥":"liefde","&":"en","|":"of","<":"kleiner dan",">":"groter dan","∑":"som","¤":"valuta"},pl:{"∆":"delta","∞":"nieskonczonosc","♥":"milosc","&":"i","|":"lub","<":"mniejsze niz",">":"wieksze niz","∑":"suma","¤":"waluta"},pt:{"∆":"delta","∞":"infinito","♥":"amor","&":"e","|":"ou","<":"menor que",">":"maior que","∑":"soma","¤":"moeda"},ro:{"∆":"delta","∞":"infinit","♥":"dragoste","&":"si","|":"sau","<":"mai mic ca",">":"mai mare ca","∑":"suma","¤":"valuta"},ru:{"∆":"delta","∞":"beskonechno","♥":"lubov","&":"i","|":"ili","<":"menshe",">":"bolshe","∑":"summa","¤":"valjuta"},sk:{"∆":"delta","∞":"nekonecno","♥":"laska","&":"a","|":"alebo","<":"menej ako",">":"viac ako","∑":"sucet","¤":"mena"},sr:{},tr:{"∆":"delta","∞":"sonsuzluk","♥":"ask","&":"ve","|":"veya","<":"kucuktur",">":"buyuktur","∑":"toplam","¤":"para birimi"},uk:{"∆":"delta","∞":"bezkinechnist","♥":"lubov","&":"i","|":"abo","<":"menshe",">":"bilshe","∑":"suma","¤":"valjuta"},vn:{"∆":"delta","∞":"vo cuc","♥":"yeu","&":"va","|":"hoac","<":"nho hon",">":"lon hon","∑":"tong","¤":"tien te"}},l=[";","?",":","@","&","=","+","$",",","/"].join(""),u=[";","?",":","@","&","=","+","$",","].join(""),c=[".","!","~","*","'","(",")"].join(""),f=function(E,b){var T="-",m="",y="",D=!0,G={},H,k,U,w,B,O,V,J,te,R,M,K,ce,ye,Ce="";if(typeof E!="string")return"";if(typeof b=="string"&&(T=b),V=a.en,J=s.en,typeof b=="object"){H=b.maintainCase||!1,G=b.custom&&typeof b.custom=="object"?b.custom:G,U=+b.truncate>1&&b.truncate||!1,w=b.uric||!1,B=b.uricNoSlash||!1,O=b.mark||!1,D=!(b.symbols===!1||b.lang===!1),T=b.separator||T,w&&(Ce+=l),B&&(Ce+=u),O&&(Ce+=c),V=b.lang&&a[b.lang]&&D?a[b.lang]:D?a.en:{},J=b.lang&&s[b.lang]?s[b.lang]:b.lang===!1||b.lang===!0?{}:s.en,b.titleCase&&typeof b.titleCase.length=="number"&&Array.prototype.toString.call(b.titleCase)?(b.titleCase.forEach(function(be){G[be+""]=be+""}),k=!0):k=!!b.titleCase,b.custom&&typeof b.custom.length=="number"&&Array.prototype.toString.call(b.custom)&&b.custom.forEach(function(be){G[be+""]=be+""}),Object.keys(G).forEach(function(be){var tt;be.length>1?tt=new RegExp("\\b"+p(be)+"\\b","gi"):tt=new RegExp(p(be),"gi"),E=E.replace(tt,G[be])});for(M in G)Ce+=M}for(Ce+=T,Ce=p(Ce),E=E.replace(/(^\s+|\s+$)/g,""),ce=!1,ye=!1,R=0,K=E.length;R=0?(y+=M,M=""):ye===!0?(M=i[y]+r[M],y=""):M=ce&&r[M].match(/[A-Za-z0-9]/)?" "+r[M]:r[M],ce=!1,ye=!1):M in i?(y+=M,M="",R===K-1&&(M=i[y]),ye=!0):V[M]&&!(w&&l.indexOf(M)!==-1)&&!(B&&u.indexOf(M)!==-1)?(M=ce||m.substr(-1).match(/[A-Za-z0-9]/)?T+V[M]:V[M],M+=E[R+1]!==void 0&&E[R+1].match(/[A-Za-z0-9]/)?T:"",ce=!0):(ye===!0?(M=i[y]+M,y="",ye=!1):ce&&(/[A-Za-z0-9]/.test(M)||m.substr(-1).match(/A-Za-z0-9]/))&&(M=" "+M),ce=!1),m+=M.replace(new RegExp("[^\\w\\s"+Ce+"_-]","g"),T);return k&&(m=m.replace(/(\w)(\S*)/g,function(be,tt,Et){var nt=tt.toUpperCase()+(Et!==null?Et:"");return Object.keys(G).indexOf(nt.toLowerCase())<0?nt:nt.toLowerCase()})),m=m.replace(/\s+/g,T).replace(new RegExp("\\"+T+"+","g"),T).replace(new RegExp("(^\\"+T+"+|\\"+T+"+$)","g"),""),U&&m.length>U&&(te=m.charAt(U)===T,m=m.slice(0,U),te||(m=m.slice(0,m.lastIndexOf(T)))),!H&&!k&&(m=m.toLowerCase()),m},d=function(E){return function(T){return f(T,E)}},p=function(E){return E.replace(/[-\\^$*+?.()|[\]{}\/]/g,"\\$&")},g=function(v,E){for(var b in E)if(E[b]===v)return!0};if(typeof t<"u"&&t.exports)t.exports=f,t.exports.createSlug=d;else if(typeof define<"u"&&define.amd)define([],function(){return f});else try{if(n.getSlug||n.createSlug)throw"speakingurl: globals exists /(getSlug|createSlug)/";n.getSlug=f,n.createSlug=d}catch{}}(e)}}),Qv=gf({"../../node_modules/.pnpm/speakingurl@14.0.1/node_modules/speakingurl/index.js"(e,t){I(),t.exports=Jv()}});I();I();I();I();I();I();I();I();function e0(e){var t;const n=e.name||e._componentTag||e.__VUE_DEVTOOLS_COMPONENT_GUSSED_NAME__||e.__name;return n==="index"&&((t=e.__file)!=null&&t.endsWith("index.vue"))?"":n}function t0(e){const t=e.__file;if(t)return Nv(Mv(t,".vue"))}function rl(e,t){return e.type.__VUE_DEVTOOLS_COMPONENT_GUSSED_NAME__=t,t}function $o(e){if(e.__VUE_DEVTOOLS_NEXT_APP_RECORD__)return e.__VUE_DEVTOOLS_NEXT_APP_RECORD__;if(e.root)return e.appContext.app.__VUE_DEVTOOLS_NEXT_APP_RECORD__}async function n0(e){const{app:t,uid:n,instance:r}=e;try{if(r.__VUE_DEVTOOLS_NEXT_UID__)return r.__VUE_DEVTOOLS_NEXT_UID__;const o=await $o(t);if(!o)return null;const i=o.rootInstance===r;return`${o.id}:${i?"root":n}`}catch{}}function vf(e){var t,n;const r=(t=e.subTree)==null?void 0:t.type,o=$o(e);return o?((n=o==null?void 0:o.types)==null?void 0:n.Fragment)===r:!1}function Uo(e){var t,n,r;const o=e0((e==null?void 0:e.type)||{});if(o)return o;if((e==null?void 0:e.root)===e)return"Root";for(const s in(n=(t=e.parent)==null?void 0:t.type)==null?void 0:n.components)if(e.parent.type.components[s]===(e==null?void 0:e.type))return rl(e,s);for(const s in(r=e.appContext)==null?void 0:r.components)if(e.appContext.components[s]===(e==null?void 0:e.type))return rl(e,s);const i=t0((e==null?void 0:e.type)||{});return i||"Anonymous Component"}function Fi(e,t){return t=t||`${e.id}:root`,e.instanceMap.get(t)||e.instanceMap.get(":root")}function r0(){const e={top:0,bottom:0,left:0,right:0,get width(){return e.right-e.left},get height(){return e.bottom-e.top}};return e}var so;function o0(e){return so||(so=document.createRange()),so.selectNode(e),so.getBoundingClientRect()}function i0(e){const t=r0();if(!e.children)return t;for(let n=0,r=e.children.length;ne.bottom)&&(e.bottom=t.bottom),(!e.left||t.lefte.right)&&(e.right=t.right),e}var ol={top:0,left:0,right:0,bottom:0,width:0,height:0};function xn(e){const t=e.subTree.el;return typeof window>"u"?ol:vf(e)?i0(e.subTree):(t==null?void 0:t.nodeType)===1?t==null?void 0:t.getBoundingClientRect():e.subTree.component?xn(e.subTree.component):ol}I();function ws(e){return vf(e)?a0(e.subTree):e.subTree?[e.subTree.el]:[]}function a0(e){if(!e.children)return[];const t=[];return e.children.forEach(n=>{n.component?t.push(...ws(n.component)):n!=null&&n.el&&t.push(n.el)}),t}var Ef="__vue-devtools-component-inspector__",yf="__vue-devtools-component-inspector__card__",bf="__vue-devtools-component-inspector__name__",Tf="__vue-devtools-component-inspector__indicator__",Af={display:"block",zIndex:2147483640,position:"fixed",backgroundColor:"#42b88325",border:"1px solid #42b88350",borderRadius:"5px",transition:"all 0.1s ease-in",pointerEvents:"none"},l0={fontFamily:"Arial, Helvetica, sans-serif",padding:"5px 8px",borderRadius:"4px",textAlign:"left",position:"absolute",left:0,color:"#e9e9e9",fontSize:"14px",fontWeight:600,lineHeight:"24px",backgroundColor:"#42b883",boxShadow:"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)"},u0={display:"inline-block",fontWeight:400,fontStyle:"normal",fontSize:"12px",opacity:.7};function or(){return document.getElementById(Ef)}function c0(){return document.getElementById(yf)}function f0(){return document.getElementById(Tf)}function d0(){return document.getElementById(bf)}function Cs(e){return{left:`${Math.round(e.left*100)/100}px`,top:`${Math.round(e.top*100)/100}px`,width:`${Math.round(e.width*100)/100}px`,height:`${Math.round(e.height*100)/100}px`}}function Ps(e){var t;const n=document.createElement("div");n.id=(t=e.elementId)!=null?t:Ef,Object.assign(n.style,{...Af,...Cs(e.bounds),...e.style});const r=document.createElement("span");r.id=yf,Object.assign(r.style,{...l0,top:e.bounds.top<35?0:"-35px"});const o=document.createElement("span");o.id=bf,o.innerHTML=`<${e.name}>  `;const i=document.createElement("i");return i.id=Tf,i.innerHTML=`${Math.round(e.bounds.width*100)/100} x ${Math.round(e.bounds.height*100)/100}`,Object.assign(i.style,u0),r.appendChild(o),r.appendChild(i),n.appendChild(r),document.body.appendChild(n),n}function Is(e){const t=or(),n=c0(),r=d0(),o=f0();t&&(Object.assign(t.style,{...Af,...Cs(e.bounds)}),Object.assign(n.style,{top:e.bounds.top<35?0:"-35px"}),r.innerHTML=`<${e.name}>  `,o.innerHTML=`${Math.round(e.bounds.width*100)/100} x ${Math.round(e.bounds.height*100)/100}`)}function p0(e){const t=xn(e);if(!t.width&&!t.height)return;const n=Uo(e);or()?Is({bounds:t,name:n}):Ps({bounds:t,name:n})}function Sf(){const e=or();e&&(e.style.display="none")}var Hi=null;function zi(e){const t=e.target;if(t){const n=t.__vueParentComponent;if(n&&(Hi=n,n.vnode.el)){const o=xn(n),i=Uo(n);or()?Is({bounds:o,name:i}):Ps({bounds:o,name:i})}}}function h0(e,t){var n;if(e.preventDefault(),e.stopPropagation(),Hi){const r=(n=Xe.value)==null?void 0:n.app;n0({app:r,uid:r.uid,instance:Hi}).then(o=>{t(o)})}}var Oo=null;function m0(){Sf(),window.removeEventListener("mouseover",zi),window.removeEventListener("click",Oo,!0),Oo=null}function _0(){return window.addEventListener("mouseover",zi),new Promise(e=>{function t(n){n.preventDefault(),n.stopPropagation(),h0(n,r=>{window.removeEventListener("click",t,!0),Oo=null,window.removeEventListener("mouseover",zi);const o=or();o&&(o.style.display="none"),e(JSON.stringify({id:r}))})}Oo=t,window.addEventListener("click",t,!0)})}function g0(e){const t=Fi(Xe.value,e.id);if(t){const[n]=ws(t);if(typeof n.scrollIntoView=="function")n.scrollIntoView({behavior:"smooth"});else{const r=xn(t),o=document.createElement("div"),i={...Cs(r),position:"absolute"};Object.assign(o.style,i),document.body.appendChild(o),o.scrollIntoView({behavior:"smooth"}),setTimeout(()=>{document.body.removeChild(o)},2e3)}setTimeout(()=>{const r=xn(t);if(r.width||r.height){const o=Uo(t),i=or();i?Is({...e,name:o,bounds:r}):Ps({...e,name:o,bounds:r}),setTimeout(()=>{i&&(i.style.display="none")},1500)}},1200)}}I();var il,sl;(sl=(il=Z).__VUE_DEVTOOLS_COMPONENT_INSPECTOR_ENABLED__)!=null||(il.__VUE_DEVTOOLS_COMPONENT_INSPECTOR_ENABLED__=!0);function v0(e){let t=0;const n=setInterval(()=>{Z.__VUE_INSPECTOR__&&(clearInterval(n),t+=30,e()),t>=5e3&&clearInterval(n)},30)}function E0(){const e=Z.__VUE_INSPECTOR__,t=e.openInEditor;e.openInEditor=async(...n)=>{e.disable(),t(...n)}}function y0(){return new Promise(e=>{function t(){E0(),e(Z.__VUE_INSPECTOR__)}Z.__VUE_INSPECTOR__?t():v0(()=>{t()})})}I();I();function b0(e){return!!(e&&e.__v_isReadonly)}function Of(e){return b0(e)?Of(e.__v_raw):!!(e&&e.__v_isReactive)}function mi(e){return!!(e&&e.__v_isRef===!0)}function _r(e){const t=e&&e.__v_raw;return t?_r(t):e}var T0=class{constructor(){this.refEditor=new A0}set(e,t,n,r){const o=Array.isArray(t)?t:t.split(".");for(;o.length>1;){const a=o.shift();e instanceof Map&&(e=e.get(a)),e instanceof Set?e=Array.from(e.values())[a]:e=e[a],this.refEditor.isRef(e)&&(e=this.refEditor.get(e))}const i=o[0],s=this.refEditor.get(e)[i];r?r(e,i,n):this.refEditor.isRef(s)?this.refEditor.set(s,n):e[i]=n}get(e,t){const n=Array.isArray(t)?t:t.split(".");for(let r=0;r"u")return!1;const r=Array.isArray(t)?t.slice():t.split("."),o=n?2:1;for(;e&&r.length>o;){const i=r.shift();e=e[i],this.refEditor.isRef(e)&&(e=this.refEditor.get(e))}return e!=null&&Object.prototype.hasOwnProperty.call(e,r[0])}createDefaultSetCallback(e){return(t,n,r)=>{if((e.remove||e.newKey)&&(Array.isArray(t)?t.splice(n,1):_r(t)instanceof Map?t.delete(n):_r(t)instanceof Set?t.delete(Array.from(t.values())[n]):Reflect.deleteProperty(t,n)),!e.remove){const o=t[e.newKey||n];this.refEditor.isRef(o)?this.refEditor.set(o,r):_r(t)instanceof Map?t.set(e.newKey||n,r):_r(t)instanceof Set?t.add(r):t[e.newKey||n]=r}}}},A0=class{set(e,t){if(mi(e))e.value=t;else{if(e instanceof Set&&Array.isArray(t)){e.clear(),t.forEach(o=>e.add(o));return}const n=Object.keys(t);if(e instanceof Map){const o=new Set(e.keys());n.forEach(i=>{e.set(i,Reflect.get(t,i)),o.delete(i)}),o.forEach(i=>e.delete(i));return}const r=new Set(Object.keys(e));n.forEach(o=>{Reflect.set(e,o,Reflect.get(t,o)),r.delete(o)}),r.forEach(o=>Reflect.deleteProperty(e,o))}}get(e){return mi(e)?e.value:e}isRef(e){return mi(e)||Of(e)}};I();I();I();var S0="__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS_STATE__";function O0(){if(!pf||typeof localStorage>"u"||localStorage===null)return{recordingState:!1,mouseEventEnabled:!1,keyboardEventEnabled:!1,componentEventEnabled:!1,performanceEventEnabled:!1,selected:""};const e=localStorage.getItem(S0);return e?JSON.parse(e):{recordingState:!1,mouseEventEnabled:!1,keyboardEventEnabled:!1,componentEventEnabled:!1,performanceEventEnabled:!1,selected:""}}I();I();I();var al,ll;(ll=(al=Z).__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS)!=null||(al.__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS=[]);var k0=new Proxy(Z.__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS,{get(e,t,n){return Reflect.get(e,t,n)}});function x0(e,t){Fe.timelineLayersState[t.id]=!1,k0.push({...e,descriptorId:t.id,appRecord:$o(t.app)})}var ul,cl;(cl=(ul=Z).__VUE_DEVTOOLS_KIT_INSPECTOR__)!=null||(ul.__VUE_DEVTOOLS_KIT_INSPECTOR__=[]);var Rs=new Proxy(Z.__VUE_DEVTOOLS_KIT_INSPECTOR__,{get(e,t,n){return Reflect.get(e,t,n)}}),kf=qn(()=>{ir.hooks.callHook("sendInspectorToClient",xf())});function w0(e,t){var n,r;Rs.push({options:e,descriptor:t,treeFilterPlaceholder:(n=e.treeFilterPlaceholder)!=null?n:"Search tree...",stateFilterPlaceholder:(r=e.stateFilterPlaceholder)!=null?r:"Search state...",treeFilter:"",selectedNodeId:"",appRecord:$o(t.app)}),kf()}function xf(){return Rs.filter(e=>e.descriptor.app===Xe.value.app).filter(e=>e.descriptor.id!=="components").map(e=>{var t;const n=e.descriptor,r=e.options;return{id:r.id,label:r.label,logo:n.logo,icon:`custom-ic-baseline-${(t=r==null?void 0:r.icon)==null?void 0:t.replace(/_/g,"-")}`,packageName:n.packageName,homepage:n.homepage,pluginId:n.id}})}function fo(e,t){return Rs.find(n=>n.options.id===e&&(t?n.descriptor.app===t:!0))}function C0(){const e=mf();e.hook("addInspector",({inspector:r,plugin:o})=>{w0(r,o.descriptor)});const t=qn(async({inspectorId:r,plugin:o})=>{var i;if(!r||!((i=o==null?void 0:o.descriptor)!=null&&i.app)||Fe.highPerfModeEnabled)return;const s=fo(r,o.descriptor.app),a={app:o.descriptor.app,inspectorId:r,filter:(s==null?void 0:s.treeFilter)||"",rootNodes:[]};await new Promise(l=>{e.callHookWith(async u=>{await Promise.all(u.map(c=>c(a))),l()},"getInspectorTree")}),e.callHookWith(async l=>{await Promise.all(l.map(u=>u({inspectorId:r,rootNodes:a.rootNodes})))},"sendInspectorTreeToClient")},120);e.hook("sendInspectorTree",t);const n=qn(async({inspectorId:r,plugin:o})=>{var i;if(!r||!((i=o==null?void 0:o.descriptor)!=null&&i.app)||Fe.highPerfModeEnabled)return;const s=fo(r,o.descriptor.app),a={app:o.descriptor.app,inspectorId:r,nodeId:(s==null?void 0:s.selectedNodeId)||"",state:null},l={currentTab:`custom-inspector:${r}`};a.nodeId&&await new Promise(u=>{e.callHookWith(async c=>{await Promise.all(c.map(f=>f(a,l))),u()},"getInspectorState")}),e.callHookWith(async u=>{await Promise.all(u.map(c=>c({inspectorId:r,nodeId:a.nodeId,state:a.state})))},"sendInspectorStateToClient")},120);return e.hook("sendInspectorState",n),e.hook("customInspectorSelectNode",({inspectorId:r,nodeId:o,plugin:i})=>{const s=fo(r,i.descriptor.app);s&&(s.selectedNodeId=o)}),e.hook("timelineLayerAdded",({options:r,plugin:o})=>{x0(r,o.descriptor)}),e.hook("timelineEventAdded",({options:r,plugin:o})=>{var i;const s=["performance","component-event","keyboard","mouse"];Fe.highPerfModeEnabled||!((i=Fe.timelineLayersState)!=null&&i[o.descriptor.id])&&!s.includes(r.layerId)||e.callHookWith(async a=>{await Promise.all(a.map(l=>l(r)))},"sendTimelineEventToClient")}),e.hook("getComponentInstances",async({app:r})=>{const o=r.__VUE_DEVTOOLS_NEXT_APP_RECORD__;if(!o)return null;const i=o.id.toString();return[...o.instanceMap].filter(([a])=>a.split(":")[0]===i).map(([,a])=>a)}),e.hook("getComponentBounds",async({instance:r})=>xn(r)),e.hook("getComponentName",({instance:r})=>Uo(r)),e.hook("componentHighlight",({uid:r})=>{const o=Xe.value.instanceMap.get(r);o&&p0(o)}),e.hook("componentUnhighlight",()=>{Sf()}),e}var fl,dl;(dl=(fl=Z).__VUE_DEVTOOLS_KIT_APP_RECORDS__)!=null||(fl.__VUE_DEVTOOLS_KIT_APP_RECORDS__=[]);var pl,hl;(hl=(pl=Z).__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__)!=null||(pl.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__={});var ml,_l;(_l=(ml=Z).__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__)!=null||(ml.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__="");var gl,vl;(vl=(gl=Z).__VUE_DEVTOOLS_KIT_CUSTOM_TABS__)!=null||(gl.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__=[]);var El,yl;(yl=(El=Z).__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__)!=null||(El.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__=[]);var bn="__VUE_DEVTOOLS_KIT_GLOBAL_STATE__";function P0(){return{connected:!1,clientConnected:!1,vitePluginDetected:!0,appRecords:[],activeAppRecordId:"",tabs:[],commands:[],highPerfModeEnabled:!0,devtoolsClientDetected:{},perfUniqueGroupId:0,timelineLayersState:O0()}}var bl,Tl;(Tl=(bl=Z)[bn])!=null||(bl[bn]=P0());var I0=qn(e=>{ir.hooks.callHook("devtoolsStateUpdated",{state:e})});qn((e,t)=>{ir.hooks.callHook("devtoolsConnectedUpdated",{state:e,oldState:t})});var jo=new Proxy(Z.__VUE_DEVTOOLS_KIT_APP_RECORDS__,{get(e,t,n){return t==="value"?Z.__VUE_DEVTOOLS_KIT_APP_RECORDS__:Z.__VUE_DEVTOOLS_KIT_APP_RECORDS__[t]}}),Xe=new Proxy(Z.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__,{get(e,t,n){return t==="value"?Z.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__:t==="id"?Z.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__:Z.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__[t]}});function wf(){I0({...Z[bn],appRecords:jo.value,activeAppRecordId:Xe.id,tabs:Z.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__,commands:Z.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__})}function R0(e){Z.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__=e,wf()}function L0(e){Z.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__=e,wf()}var Fe=new Proxy(Z[bn],{get(e,t){return t==="appRecords"?jo:t==="activeAppRecordId"?Xe.id:t==="tabs"?Z.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__:t==="commands"?Z.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__:Z[bn][t]},deleteProperty(e,t){return delete e[t],!0},set(e,t,n){return{...Z[bn]},e[t]=n,Z[bn][t]=n,!0}});function D0(e={}){var t,n,r;const{file:o,host:i,baseUrl:s=window.location.origin,line:a=0,column:l=0}=e;if(o){if(i==="chrome-extension"){const u=o.replace(/\\/g,"\\\\"),c=(n=(t=window.VUE_DEVTOOLS_CONFIG)==null?void 0:t.openInEditorHost)!=null?n:"/";fetch(`${c}__open-in-editor?file=${encodeURI(o)}`).then(f=>{if(!f.ok){const d=`Opening component ${u} failed`;console.log(`%c${d}`,"color:red")}})}else if(Fe.vitePluginDetected){const u=(r=Z.__VUE_DEVTOOLS_OPEN_IN_EDITOR_BASE_URL__)!=null?r:s;Z.__VUE_INSPECTOR__.openInEditor(u,o,a,l)}}}I();I();I();I();I();var Al,Sl;(Sl=(Al=Z).__VUE_DEVTOOLS_KIT_PLUGIN_BUFFER__)!=null||(Al.__VUE_DEVTOOLS_KIT_PLUGIN_BUFFER__=[]);var Ls=new Proxy(Z.__VUE_DEVTOOLS_KIT_PLUGIN_BUFFER__,{get(e,t,n){return Reflect.get(e,t,n)}});function Bi(e){const t={};return Object.keys(e).forEach(n=>{t[n]=e[n].defaultValue}),t}function Ds(e){return`__VUE_DEVTOOLS_NEXT_PLUGIN_SETTINGS__${e}__`}function V0(e){var t,n,r;const o=(n=(t=Ls.find(i=>{var s;return i[0].id===e&&!!((s=i[0])!=null&&s.settings)}))==null?void 0:t[0])!=null?n:null;return(r=o==null?void 0:o.settings)!=null?r:null}function Cf(e,t){var n,r,o;const i=Ds(e);if(i){const s=localStorage.getItem(i);if(s)return JSON.parse(s)}if(e){const s=(r=(n=Ls.find(a=>a[0].id===e))==null?void 0:n[0])!=null?r:null;return Bi((o=s==null?void 0:s.settings)!=null?o:{})}return Bi(t)}function N0(e,t){const n=Ds(e);localStorage.getItem(n)||localStorage.setItem(n,JSON.stringify(Bi(t)))}function M0(e,t,n){const r=Ds(e),o=localStorage.getItem(r),i=JSON.parse(o||"{}"),s={...i,[t]:n};localStorage.setItem(r,JSON.stringify(s)),ir.hooks.callHookWith(a=>{a.forEach(l=>l({pluginId:e,key:t,oldValue:i[t],newValue:n,settings:s}))},"setPluginSettings")}I();I();I();I();I();I();I();I();I();I();I();var Ol,kl,ct=(kl=(Ol=Z).__VUE_DEVTOOLS_HOOK)!=null?kl:Ol.__VUE_DEVTOOLS_HOOK=mf(),F0={vueAppInit(e){ct.hook("app:init",e)},vueAppUnmount(e){ct.hook("app:unmount",e)},vueAppConnected(e){ct.hook("app:connected",e)},componentAdded(e){return ct.hook("component:added",e)},componentEmit(e){return ct.hook("component:emit",e)},componentUpdated(e){return ct.hook("component:updated",e)},componentRemoved(e){return ct.hook("component:removed",e)},setupDevtoolsPlugin(e){ct.hook("devtools-plugin:setup",e)},perfStart(e){return ct.hook("perf:start",e)},perfEnd(e){return ct.hook("perf:end",e)}},Pf={on:F0,setupDevToolsPlugin(e,t){return ct.callHook("devtools-plugin:setup",e,t)}},H0=class{constructor({plugin:e,ctx:t}){this.hooks=t.hooks,this.plugin=e}get on(){return{visitComponentTree:e=>{this.hooks.hook("visitComponentTree",e)},inspectComponent:e=>{this.hooks.hook("inspectComponent",e)},editComponentState:e=>{this.hooks.hook("editComponentState",e)},getInspectorTree:e=>{this.hooks.hook("getInspectorTree",e)},getInspectorState:e=>{this.hooks.hook("getInspectorState",e)},editInspectorState:e=>{this.hooks.hook("editInspectorState",e)},inspectTimelineEvent:e=>{this.hooks.hook("inspectTimelineEvent",e)},timelineCleared:e=>{this.hooks.hook("timelineCleared",e)},setPluginSettings:e=>{this.hooks.hook("setPluginSettings",e)}}}notifyComponentUpdate(e){var t;if(Fe.highPerfModeEnabled)return;const n=xf().find(r=>r.packageName===this.plugin.descriptor.packageName);if(n!=null&&n.id){if(e){const r=[e.appContext.app,e.uid,(t=e.parent)==null?void 0:t.uid,e];ct.callHook("component:updated",...r)}else ct.callHook("component:updated");this.hooks.callHook("sendInspectorState",{inspectorId:n.id,plugin:this.plugin})}}addInspector(e){this.hooks.callHook("addInspector",{inspector:e,plugin:this.plugin}),this.plugin.descriptor.settings&&N0(e.id,this.plugin.descriptor.settings)}sendInspectorTree(e){Fe.highPerfModeEnabled||this.hooks.callHook("sendInspectorTree",{inspectorId:e,plugin:this.plugin})}sendInspectorState(e){Fe.highPerfModeEnabled||this.hooks.callHook("sendInspectorState",{inspectorId:e,plugin:this.plugin})}selectInspectorNode(e,t){this.hooks.callHook("customInspectorSelectNode",{inspectorId:e,nodeId:t,plugin:this.plugin})}visitComponentTree(e){return this.hooks.callHook("visitComponentTree",e)}now(){return Fe.highPerfModeEnabled?0:Date.now()}addTimelineLayer(e){this.hooks.callHook("timelineLayerAdded",{options:e,plugin:this.plugin})}addTimelineEvent(e){Fe.highPerfModeEnabled||this.hooks.callHook("timelineEventAdded",{options:e,plugin:this.plugin})}getSettings(e){return Cf(e??this.plugin.descriptor.id,this.plugin.descriptor.settings)}getComponentInstances(e){return this.hooks.callHook("getComponentInstances",{app:e})}getComponentBounds(e){return this.hooks.callHook("getComponentBounds",{instance:e})}getComponentName(e){return this.hooks.callHook("getComponentName",{instance:e})}highlightElement(e){const t=e.__VUE_DEVTOOLS_NEXT_UID__;return this.hooks.callHook("componentHighlight",{uid:t})}unhighlightElement(){return this.hooks.callHook("componentUnhighlight")}},z0=H0;I();I();I();I();var B0="__vue_devtool_undefined__",$0="__vue_devtool_infinity__",U0="__vue_devtool_negative_infinity__",j0="__vue_devtool_nan__";I();I();var K0={[B0]:"undefined",[j0]:"NaN",[$0]:"Infinity",[U0]:"-Infinity"};Object.entries(K0).reduce((e,[t,n])=>(e[n]=t,e),{});I();I();I();I();I();var xl,wl;(wl=(xl=Z).__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__)!=null||(xl.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__=new Set);function W0(e,t){return Pf.setupDevToolsPlugin(e,t)}function G0(e,t){const[n,r]=e;if(n.app!==t)return;const o=new z0({plugin:{setupFn:r,descriptor:n},ctx:ir});n.packageName==="vuex"&&o.on.editInspectorState(i=>{o.sendInspectorState(i.inspectorId)}),r(o)}function If(e){Z.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__.has(e)||Fe.highPerfModeEnabled||(Z.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__.add(e),Ls.forEach(t=>{G0(t,e)}))}I();I();var Nr="__VUE_DEVTOOLS_ROUTER__",Yn="__VUE_DEVTOOLS_ROUTER_INFO__",Cl,Pl;(Pl=(Cl=Z)[Yn])!=null||(Cl[Yn]={currentRoute:null,routes:[]});var Il,Rl;(Rl=(Il=Z)[Nr])!=null||(Il[Nr]={});new Proxy(Z[Yn],{get(e,t){return Z[Yn][t]}});new Proxy(Z[Nr],{get(e,t){if(t==="value")return Z[Nr]}});function q0(e){const t=new Map;return((e==null?void 0:e.getRoutes())||[]).filter(n=>!t.has(n.path)&&t.set(n.path,1))}function Vs(e){return e.map(t=>{let{path:n,name:r,children:o,meta:i}=t;return o!=null&&o.length&&(o=Vs(o)),{path:n,name:r,children:o,meta:i}})}function Y0(e){if(e){const{fullPath:t,hash:n,href:r,path:o,name:i,matched:s,params:a,query:l}=e;return{fullPath:t,hash:n,href:r,path:o,name:i,params:a,query:l,matched:Vs(s)}}return e}function X0(e,t){function n(){var r;const o=(r=e.app)==null?void 0:r.config.globalProperties.$router,i=Y0(o==null?void 0:o.currentRoute.value),s=Vs(q0(o)),a=console.warn;console.warn=()=>{},Z[Yn]={currentRoute:i?nl(i):{},routes:nl(s)},Z[Nr]=o,console.warn=a}n(),Pf.on.componentUpdated(qn(()=>{var r;((r=t.value)==null?void 0:r.app)===e.app&&(n(),!Fe.highPerfModeEnabled&&ir.hooks.callHook("routerInfoUpdated",{state:Z[Yn]}))},200))}function Z0(e){return{async getInspectorTree(t){const n={...t,app:Xe.value.app,rootNodes:[]};return await new Promise(r=>{e.callHookWith(async o=>{await Promise.all(o.map(i=>i(n))),r()},"getInspectorTree")}),n.rootNodes},async getInspectorState(t){const n={...t,app:Xe.value.app,state:null},r={currentTab:`custom-inspector:${t.inspectorId}`};return await new Promise(o=>{e.callHookWith(async i=>{await Promise.all(i.map(s=>s(n,r))),o()},"getInspectorState")}),n.state},editInspectorState(t){const n=new T0,r={...t,app:Xe.value.app,set:(o,i=t.path,s=t.state.value,a)=>{n.set(o,i,s,a||n.createDefaultSetCallback(t.state))}};e.callHookWith(o=>{o.forEach(i=>i(r))},"editInspectorState")},sendInspectorState(t){const n=fo(t);e.callHook("sendInspectorState",{inspectorId:t,plugin:{descriptor:n.descriptor,setupFn:()=>({})}})},inspectComponentInspector(){return _0()},cancelInspectComponentInspector(){return m0()},getComponentRenderCode(t){const n=Fi(Xe.value,t);if(n)return(n==null?void 0:n.type)instanceof Function?n.type.toString():n.render.toString()},scrollToComponent(t){return g0({id:t})},openInEditor:D0,getVueInspector:y0,toggleApp(t){const n=jo.value.find(r=>r.id===t);n&&(L0(t),R0(n),X0(n,Xe),kf(),If(n.app))},inspectDOM(t){const n=Fi(Xe.value,t);if(n){const[r]=ws(n);r&&(Z.__VUE_DEVTOOLS_INSPECT_DOM_TARGET__=r)}},updatePluginSettings(t,n,r){M0(t,n,r)},getPluginSettings(t){return{options:V0(t),values:Cf(t)}}}}I();var Ll,Dl;(Dl=(Ll=Z).__VUE_DEVTOOLS_ENV__)!=null||(Ll.__VUE_DEVTOOLS_ENV__={vitePluginDetected:!1});var Vl=C0(),Nl,Ml;(Ml=(Nl=Z).__VUE_DEVTOOLS_KIT_CONTEXT__)!=null||(Nl.__VUE_DEVTOOLS_KIT_CONTEXT__={hooks:Vl,get state(){return{...Fe,activeAppRecordId:Xe.id,activeAppRecord:Xe.value,appRecords:jo.value}},api:Z0(Vl)});var ir=Z.__VUE_DEVTOOLS_KIT_CONTEXT__;I();Zv(Qv());var Fl,Hl;(Hl=(Fl=Z).__VUE_DEVTOOLS_NEXT_APP_RECORD_INFO__)!=null||(Fl.__VUE_DEVTOOLS_NEXT_APP_RECORD_INFO__={id:0,appIds:new Set});I();function J0(e){Fe.highPerfModeEnabled=e??!Fe.highPerfModeEnabled,!e&&Xe.value&&If(Xe.value.app)}I();I();I();function Q0(e){Fe.devtoolsClientDetected={...Fe.devtoolsClientDetected,...e};const t=Object.values(Fe.devtoolsClientDetected).some(Boolean);J0(!t)}var zl,Bl;(Bl=(zl=Z).__VUE_DEVTOOLS_UPDATE_CLIENT_DETECTED__)!=null||(zl.__VUE_DEVTOOLS_UPDATE_CLIENT_DETECTED__=Q0);I();I();I();I();I();I();I();var e1=class{constructor(){this.keyToValue=new Map,this.valueToKey=new Map}set(e,t){this.keyToValue.set(e,t),this.valueToKey.set(t,e)}getByKey(e){return this.keyToValue.get(e)}getByValue(e){return this.valueToKey.get(e)}clear(){this.keyToValue.clear(),this.valueToKey.clear()}},Rf=class{constructor(e){this.generateIdentifier=e,this.kv=new e1}register(e,t){this.kv.getByValue(e)||(t||(t=this.generateIdentifier(e)),this.kv.set(t,e))}clear(){this.kv.clear()}getIdentifier(e){return this.kv.getByValue(e)}getValue(e){return this.kv.getByKey(e)}},t1=class extends Rf{constructor(){super(e=>e.name),this.classToAllowedProps=new Map}register(e,t){typeof t=="object"?(t.allowProps&&this.classToAllowedProps.set(e,t.allowProps),super.register(e,t.identifier)):super.register(e,t)}getAllowedProps(e){return this.classToAllowedProps.get(e)}};I();I();function n1(e){if("values"in Object)return Object.values(e);const t=[];for(const n in e)e.hasOwnProperty(n)&&t.push(e[n]);return t}function r1(e,t){const n=n1(e);if("find"in n)return n.find(t);const r=n;for(let o=0;ot(r,n))}function po(e,t){return e.indexOf(t)!==-1}function $l(e,t){for(let n=0;nt.isApplicable(e))}findByName(e){return this.transfomers[e]}};I();I();var i1=e=>Object.prototype.toString.call(e).slice(8,-1),Lf=e=>typeof e>"u",s1=e=>e===null,Mr=e=>typeof e!="object"||e===null||e===Object.prototype?!1:Object.getPrototypeOf(e)===null?!0:Object.getPrototypeOf(e)===Object.prototype,$i=e=>Mr(e)&&Object.keys(e).length===0,un=e=>Array.isArray(e),a1=e=>typeof e=="string",l1=e=>typeof e=="number"&&!isNaN(e),u1=e=>typeof e=="boolean",c1=e=>e instanceof RegExp,Fr=e=>e instanceof Map,Hr=e=>e instanceof Set,Df=e=>i1(e)==="Symbol",f1=e=>e instanceof Date&&!isNaN(e.valueOf()),d1=e=>e instanceof Error,Ul=e=>typeof e=="number"&&isNaN(e),p1=e=>u1(e)||s1(e)||Lf(e)||l1(e)||a1(e)||Df(e),h1=e=>typeof e=="bigint",m1=e=>e===1/0||e===-1/0,_1=e=>ArrayBuffer.isView(e)&&!(e instanceof DataView),g1=e=>e instanceof URL;I();var Vf=e=>e.replace(/\./g,"\\."),_i=e=>e.map(String).map(Vf).join("."),Or=e=>{const t=[];let n="";for(let o=0;onull,()=>{}),kt(h1,"bigint",e=>e.toString(),e=>typeof BigInt<"u"?BigInt(e):(console.error("Please add a BigInt polyfill."),e)),kt(f1,"Date",e=>e.toISOString(),e=>new Date(e)),kt(d1,"Error",(e,t)=>{const n={name:e.name,message:e.message};return t.allowedErrorProps.forEach(r=>{n[r]=e[r]}),n},(e,t)=>{const n=new Error(e.message);return n.name=e.name,n.stack=e.stack,t.allowedErrorProps.forEach(r=>{n[r]=e[r]}),n}),kt(c1,"regexp",e=>""+e,e=>{const t=e.slice(1,e.lastIndexOf("/")),n=e.slice(e.lastIndexOf("/")+1);return new RegExp(t,n)}),kt(Hr,"set",e=>[...e.values()],e=>new Set(e)),kt(Fr,"map",e=>[...e.entries()],e=>new Map(e)),kt(e=>Ul(e)||m1(e),"number",e=>Ul(e)?"NaN":e>0?"Infinity":"-Infinity",Number),kt(e=>e===0&&1/e===-1/0,"number",()=>"-0",Number),kt(g1,"URL",e=>e.toString(),e=>new URL(e))];function Ko(e,t,n,r){return{isApplicable:e,annotation:t,transform:n,untransform:r}}var Mf=Ko((e,t)=>Df(e)?!!t.symbolRegistry.getIdentifier(e):!1,(e,t)=>["symbol",t.symbolRegistry.getIdentifier(e)],e=>e.description,(e,t,n)=>{const r=n.symbolRegistry.getValue(t[1]);if(!r)throw new Error("Trying to deserialize unknown symbol");return r}),v1=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,Uint8ClampedArray].reduce((e,t)=>(e[t.name]=t,e),{}),Ff=Ko(_1,e=>["typed-array",e.constructor.name],e=>[...e],(e,t)=>{const n=v1[t[1]];if(!n)throw new Error("Trying to deserialize unknown typed array");return new n(e)});function Hf(e,t){return e!=null&&e.constructor?!!t.classRegistry.getIdentifier(e.constructor):!1}var zf=Ko(Hf,(e,t)=>["class",t.classRegistry.getIdentifier(e.constructor)],(e,t)=>{const n=t.classRegistry.getAllowedProps(e.constructor);if(!n)return{...e};const r={};return n.forEach(o=>{r[o]=e[o]}),r},(e,t,n)=>{const r=n.classRegistry.getValue(t[1]);if(!r)throw new Error("Trying to deserialize unknown class - check https://github.com/blitz-js/superjson/issues/116#issuecomment-773996564");return Object.assign(Object.create(r.prototype),e)}),Bf=Ko((e,t)=>!!t.customTransformerRegistry.findApplicable(e),(e,t)=>["custom",t.customTransformerRegistry.findApplicable(e).name],(e,t)=>t.customTransformerRegistry.findApplicable(e).serialize(e),(e,t,n)=>{const r=n.customTransformerRegistry.findByName(t[1]);if(!r)throw new Error("Trying to deserialize unknown custom value");return r.deserialize(e)}),E1=[zf,Mf,Bf,Ff],jl=(e,t)=>{const n=$l(E1,o=>o.isApplicable(e,t));if(n)return{value:n.transform(e,t),type:n.annotation(e,t)};const r=$l(Nf,o=>o.isApplicable(e,t));if(r)return{value:r.transform(e,t),type:r.annotation}},$f={};Nf.forEach(e=>{$f[e.annotation]=e});var y1=(e,t,n)=>{if(un(t))switch(t[0]){case"symbol":return Mf.untransform(e,t,n);case"class":return zf.untransform(e,t,n);case"custom":return Bf.untransform(e,t,n);case"typed-array":return Ff.untransform(e,t,n);default:throw new Error("Unknown transformation: "+t)}else{const r=$f[t];if(!r)throw new Error("Unknown transformation: "+t);return r.untransform(e,n)}};I();var Vn=(e,t)=>{const n=e.keys();for(;t>0;)n.next(),t--;return n.next().value};function Uf(e){if(po(e,"__proto__"))throw new Error("__proto__ is not allowed as a property");if(po(e,"prototype"))throw new Error("prototype is not allowed as a property");if(po(e,"constructor"))throw new Error("constructor is not allowed as a property")}var b1=(e,t)=>{Uf(t);for(let n=0;n{if(Uf(t),t.length===0)return n(e);let r=e;for(let i=0;iji(i,t,[...n,...Or(s)]));return}const[r,o]=e;o&&Xn(o,(i,s)=>{ji(i,t,[...n,...Or(s)])}),t(r,n)}function T1(e,t,n){return ji(t,(r,o)=>{e=Ui(e,o,i=>y1(i,r,n))}),e}function A1(e,t){function n(r,o){const i=b1(e,Or(o));r.map(Or).forEach(s=>{e=Ui(e,s,()=>i)})}if(un(t)){const[r,o]=t;r.forEach(i=>{e=Ui(e,Or(i),()=>e)}),o&&Xn(o,n)}else Xn(t,n);return e}var S1=(e,t)=>Mr(e)||un(e)||Fr(e)||Hr(e)||Hf(e,t);function O1(e,t,n){const r=n.get(e);r?r.push(t):n.set(e,[t])}function k1(e,t){const n={};let r;return e.forEach(o=>{if(o.length<=1)return;t||(o=o.map(a=>a.map(String)).sort((a,l)=>a.length-l.length));const[i,...s]=o;i.length===0?r=s.map(_i):n[_i(i)]=s.map(_i)}),r?$i(n)?[r]:[r,n]:$i(n)?void 0:n}var jf=(e,t,n,r,o=[],i=[],s=new Map)=>{var a;const l=p1(e);if(!l){O1(e,o,t);const g=s.get(e);if(g)return r?{transformedValue:null}:g}if(!S1(e,n)){const g=jl(e,n),v=g?{transformedValue:g.value,annotations:[g.type]}:{transformedValue:e};return l||s.set(e,v),v}if(po(i,e))return{transformedValue:null};const u=jl(e,n),c=(a=u==null?void 0:u.value)!=null?a:e,f=un(c)?[]:{},d={};Xn(c,(g,v)=>{if(v==="__proto__"||v==="constructor"||v==="prototype")throw new Error(`Detected property ${v}. This is a prototype pollution risk, please remove it from your object.`);const E=jf(g,t,n,r,[...o,v],[...i,e],s);f[v]=E.transformedValue,un(E.annotations)?d[v]=E.annotations:Mr(E.annotations)&&Xn(E.annotations,(b,T)=>{d[Vf(v)+"."+T]=b})});const p=$i(d)?{transformedValue:f,annotations:u?[u.type]:void 0}:{transformedValue:f,annotations:u?[u.type,d]:d};return l||s.set(e,p),p};I();I();function Kf(e){return Object.prototype.toString.call(e).slice(8,-1)}function Kl(e){return Kf(e)==="Array"}function x1(e){if(Kf(e)!=="Object")return!1;const t=Object.getPrototypeOf(e);return!!t&&t.constructor===Object&&t===Object.prototype}function w1(e,t,n,r,o){const i={}.propertyIsEnumerable.call(r,t)?"enumerable":"nonenumerable";i==="enumerable"&&(e[t]=n),o&&i==="nonenumerable"&&Object.defineProperty(e,t,{value:n,enumerable:!1,writable:!0,configurable:!0})}function Ki(e,t={}){if(Kl(e))return e.map(o=>Ki(o,t));if(!x1(e))return e;const n=Object.getOwnPropertyNames(e),r=Object.getOwnPropertySymbols(e);return[...n,...r].reduce((o,i)=>{if(Kl(t.props)&&!t.props.includes(i))return o;const s=e[i],a=Ki(s,t);return w1(o,i,a,e,t.nonenumerable),o},{})}var ke=class{constructor({dedupe:e=!1}={}){this.classRegistry=new t1,this.symbolRegistry=new Rf(t=>{var n;return(n=t.description)!=null?n:""}),this.customTransformerRegistry=new o1,this.allowedErrorProps=[],this.dedupe=e}serialize(e){const t=new Map,n=jf(e,t,this,this.dedupe),r={json:n.transformedValue};n.annotations&&(r.meta={...r.meta,values:n.annotations});const o=k1(t,this.dedupe);return o&&(r.meta={...r.meta,referentialEqualities:o}),r}deserialize(e){const{json:t,meta:n}=e;let r=Ki(t);return n!=null&&n.values&&(r=T1(r,n.values,this)),n!=null&&n.referentialEqualities&&(r=A1(r,n.referentialEqualities)),r}stringify(e){return JSON.stringify(this.serialize(e))}parse(e){return this.deserialize(JSON.parse(e))}registerClass(e,t){this.classRegistry.register(e,t)}registerSymbol(e,t){this.symbolRegistry.register(e,t)}registerCustom(e,t){this.customTransformerRegistry.register({name:t,...e})}allowErrorProps(...e){this.allowedErrorProps.push(...e)}};ke.defaultInstance=new ke;ke.serialize=ke.defaultInstance.serialize.bind(ke.defaultInstance);ke.deserialize=ke.defaultInstance.deserialize.bind(ke.defaultInstance);ke.stringify=ke.defaultInstance.stringify.bind(ke.defaultInstance);ke.parse=ke.defaultInstance.parse.bind(ke.defaultInstance);ke.registerClass=ke.defaultInstance.registerClass.bind(ke.defaultInstance);ke.registerSymbol=ke.defaultInstance.registerSymbol.bind(ke.defaultInstance);ke.registerCustom=ke.defaultInstance.registerCustom.bind(ke.defaultInstance);ke.allowErrorProps=ke.defaultInstance.allowErrorProps.bind(ke.defaultInstance);I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();var Wl,Gl;(Gl=(Wl=Z).__VUE_DEVTOOLS_KIT_MESSAGE_CHANNELS__)!=null||(Wl.__VUE_DEVTOOLS_KIT_MESSAGE_CHANNELS__=[]);var ql,Yl;(Yl=(ql=Z).__VUE_DEVTOOLS_KIT_RPC_CLIENT__)!=null||(ql.__VUE_DEVTOOLS_KIT_RPC_CLIENT__=null);var Xl,Zl;(Zl=(Xl=Z).__VUE_DEVTOOLS_KIT_RPC_SERVER__)!=null||(Xl.__VUE_DEVTOOLS_KIT_RPC_SERVER__=null);var Jl,Ql;(Ql=(Jl=Z).__VUE_DEVTOOLS_KIT_VITE_RPC_CLIENT__)!=null||(Jl.__VUE_DEVTOOLS_KIT_VITE_RPC_CLIENT__=null);var eu,tu;(tu=(eu=Z).__VUE_DEVTOOLS_KIT_VITE_RPC_SERVER__)!=null||(eu.__VUE_DEVTOOLS_KIT_VITE_RPC_SERVER__=null);var nu,ru;(ru=(nu=Z).__VUE_DEVTOOLS_KIT_BROADCAST_RPC_SERVER__)!=null||(nu.__VUE_DEVTOOLS_KIT_BROADCAST_RPC_SERVER__=null);I();I();I();I();I();I();I();const C1=JSON.parse(`{"logo":"logo-mini.png","contributors":false,"lastUpdated":false,"repo":"goravel/goravel","docsBranch":"master","locales":{"/":{"selectLanguageName":"English","navbar":[{"text":"Home","link":"/"},{"text":"Video","link":"https://www.youtube.com/playlist?list=PL40Xne4u-oXJ0Z5uFiPWHqIMvzZaG_BDf"}],"sidebar":[{"text":"Prologue","children":[{"text":"Upgrade Guide","children":[{"text":"Upgrading To v1.15 From v1.14","link":"/upgrade/v1.15"},{"text":"Upgrading To v1.14 From v1.13","link":"/upgrade/v1.14"},{"text":"History Upgrade","link":"/upgrade/history"}]},{"text":"Contribution Guide","link":"/prologue/contributions"},{"text":"Excellent Extend Packages","link":"/prologue/packages"}]},{"text":"Getting Started","children":[{"text":"Installation","link":"/getting-started/installation"},{"text":"Configuration","link":"/getting-started/configuration"},{"text":"Directory Structure","link":"/getting-started/directory-structure"},{"text":"Compile","link":"/getting-started/compile"}]},{"text":"Architecutre Concepts","children":[{"text":"Request Lifecycle","link":"/architecutre-concepts/request-lifecycle"},{"text":"Service Container","link":"/architecutre-concepts/service-container"},{"text":"Service Providers","link":"/architecutre-concepts/service-providers"},{"text":"Facades","link":"/architecutre-concepts/facades"}]},{"text":"The Basics","children":[{"text":"Routing","link":"/the-basics/routing"},{"text":"HTTP Middleware","link":"/the-basics/middleware"},{"text":"Controllers","link":"/the-basics/controllers"},{"text":"Requests","link":"/the-basics/request"},{"text":"Responses","link":"/the-basics/response"},{"text":"Views","link":"/the-basics/views"},{"text":"Grpc","link":"/the-basics/grpc"},{"text":"Session","link":"/the-basics/session"},{"text":"Validation","link":"/the-basics/validation"},{"text":"Logging","link":"/the-basics/logging"}]},{"text":"Digging Deeper","children":[{"text":"Artisan Console","link":"/digging-deeper/artisan-console"},{"text":"Cache","link":"/digging-deeper/cache"},{"text":"Events","link":"/digging-deeper/event"},{"text":"File Storage","link":"/digging-deeper/filesystem"},{"text":"Mail","link":"/digging-deeper/mail"},{"text":"Queues","link":"/digging-deeper/queues"},{"text":"Task Scheduling","link":"/digging-deeper/task-scheduling"},{"text":"Localization","link":"/digging-deeper/localization"},{"text":"Package Development","link":"/digging-deeper/package-development"},{"text":"Color","link":"/digging-deeper/color"},{"text":"Strings","link":"/digging-deeper/strings"},{"text":"Helpers","link":"/digging-deeper/helpers"}]},{"text":"Security","children":[{"text":"Authentication","link":"/security/authentication"},{"text":"Authorization","link":"/security/authorization"},{"text":"Encryption","link":"/security/encryption"},{"text":"Hashing","link":"/security/hashing"}]},{"text":"ORM","children":[{"text":"Getting Started","link":"/orm/getting-started"},{"text":"Relationships","link":"/orm/relationships"},{"text":"Migrations","link":"/orm/migrations"},{"text":"Seeding","link":"/orm/seeding"},{"text":"Factories","link":"/orm/factories"}]},{"text":"Testing","children":[{"text":"Getting Started","link":"/testing/getting-started"},{"text":"HTTP Tests","link":"/testing/http-tests"},{"text":"Mock","link":"/testing/mock"}]}]},"/zh/":{"selectLanguageName":"简体中文","navbar":[{"text":"首页","link":"/zh/"},{"text":"视频","link":"https://space.bilibili.com/1886603340/channel/seriesdetail?sid=4302621&ctype=0"}],"sidebar":[{"text":"前言","children":[{"text":"升级指南","children":[{"text":"从 v1.14 升级到 v1.15","link":"/zh/upgrade/v1.15"},{"text":"从 v1.13 升级到 v1.14","link":"/zh/upgrade/v1.14"},{"text":"历史版本升级","link":"/zh/upgrade/history"}]},{"text":"贡献指南","link":"/zh/prologue/contributions"},{"text":"优秀扩展包","link":"/zh/prologue/packages"}]},{"text":"入门指南","children":[{"text":"安装","link":"/zh/getting-started/installation"},{"text":"配置信息","link":"/zh/getting-started/configuration"},{"text":"文件夹结构","link":"/zh/getting-started/directory-structure"},{"text":"编译","link":"/zh/getting-started/compile"}]},{"text":"核心架构","children":[{"text":"请求周期","link":"/zh/architecutre-concepts/request-lifecycle"},{"text":"服务容器","link":"/zh/architecutre-concepts/service-container"},{"text":"服务提供者","link":"/zh/architecutre-concepts/service-providers"},{"text":"Facades","link":"/zh/architecutre-concepts/facades"}]},{"text":"基本功能","children":[{"text":"路由","link":"/zh/the-basics/routing"},{"text":"HTTP 中间件","link":"/zh/the-basics/middleware"},{"text":"控制器","link":"/zh/the-basics/controllers"},{"text":"请求","link":"/zh/the-basics/request"},{"text":"响应","link":"/zh/the-basics/response"},{"text":"视图","link":"/zh/the-basics/views"},{"text":"Grpc","link":"/zh/the-basics/grpc"},{"text":"Session","link":"/zh/the-basics/session"},{"text":"表单验证","link":"/zh/the-basics/validation"},{"text":"日志","link":"/zh/the-basics/logging"}]},{"text":"综合话题","children":[{"text":"Artisan 命令行","link":"/zh/digging-deeper/artisan-console"},{"text":"缓存系统","link":"/zh/digging-deeper/cache"},{"text":"事件系统","link":"/zh/digging-deeper/event"},{"text":"文件储存","link":"/zh/digging-deeper/filesystem"},{"text":"邮件","link":"/zh/digging-deeper/mail"},{"text":"队列","link":"/zh/digging-deeper/queues"},{"text":"任务调度","link":"/zh/digging-deeper/task-scheduling"},{"text":"本地化","link":"/zh/digging-deeper/localization"},{"text":"扩展包开发","link":"/zh/digging-deeper/package-development"},{"text":"颜色","link":"/zh/digging-deeper/color"},{"text":"Strings","link":"/zh/digging-deeper/strings"},{"text":"辅助函数","link":"/zh/digging-deeper/helpers"}]},{"text":"安全相关","children":[{"text":"用户验证","link":"/zh/security/authentication"},{"text":"用户授权","link":"/zh/security/authorization"},{"text":"加密解密","link":"/zh/security/encryption"},{"text":"哈希","link":"/zh/security/hashing"}]},{"text":"ORM","children":[{"text":"快速入门","link":"/zh/orm/getting-started"},{"text":"模型关联","link":"/zh/orm/relationships"},{"text":"数据库迁移","link":"/zh/orm/migrations"},{"text":"数据填充","link":"/zh/orm/seeding"},{"text":"模型工厂","link":"/zh/orm/factories"}]},{"text":"测试相关","children":[{"text":"快速入门","link":"/zh/testing/getting-started"},{"text":"HTTP Tests","link":"/zh/testing/http-tests"},{"text":"Mock","link":"/zh/testing/mock"}]}]}},"colorMode":"auto","colorModeSwitch":true,"navbar":[],"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","sidebar":"heading","sidebarDepth":2,"editLink":true,"editLinkText":"Edit this page","lastUpdatedText":"Last Updated","contributorsText":"Contributors","notFound":["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],"backToHome":"Take me home","openInNewWindow":"open in new window","toggleColorMode":"toggle color mode","toggleSidebar":"toggle sidebar"}`),P1=de(C1),Wf=()=>P1,Gf=Symbol(""),I1=()=>{const e=$e(Gf);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},R1=(e,t)=>{const{locales:n,...r}=e;return{...r,...n==null?void 0:n[t]}},L1=Rt({enhance({app:e}){const t=Wf(),n=e._context.provides[_s],r=N(()=>R1(t.value,n.routeLocale.value));e.provide(Gf,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}}),W0({app:e,id:"org.vuejs.vuepress.plugin-theme-data",label:"VuePress Theme Data Plugin",packageName:"@vuepress/plugin-theme-data",homepage:"https://v2.vuepress.vuejs.org",logo:"https://v2.vuepress.vuejs.org/images/hero.png",componentStateTypes:["VuePress"]},o=>{o.on.inspectComponent(i=>{i.instanceData.state.push({type:"VuePress",key:"themeData",editable:!1,value:t.value},{type:"VuePress",key:"themeLocaleData",editable:!1,value:r.value})})})}}),D1=Object.freeze(Object.defineProperty({__proto__:null,default:L1},Symbol.toStringTag,{value:"Module"})),V1=()=>Wf(),Be=()=>I1(),qf=Symbol(""),N1=e=>{const t=(n=e.value)=>{const r=window.document.documentElement;r.dataset.theme=n?"dark":"light"};We(()=>{rf(e,t)}),Lo(()=>{t()})},Ns=()=>{const e=$e(qf);if(!e)throw new Error("useDarkMode() is called without provider.");return e},M1=()=>{const e=Be(),t=gg(),n=Os("vuepress-color-scheme",e.value.colorMode),r=N({get(){return e.value.colorModeSwitch?n.value==="auto"?t.value:n.value==="dark":e.value.colorMode==="dark"},set(o){o===t.value?n.value="auto":n.value=o?"dark":"light"}});On(qf,r),N1(r)};let gi=null,dr=null;const F1={wait:()=>gi,pending:()=>{gi=new Promise(e=>{dr=e})},resolve:()=>{dr==null||dr(),gi=null,dr=null}},Yf=()=>F1,Zn=(e,t)=>{const{notFound:n,meta:r,path:o}=Vr(e,t);return n?{text:o,link:o}:{text:r.title||o,link:o}},ou=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),H1=(e,t)=>{if(t.hash===e)return!0;const n=ou(t.path),r=ou(e);return n===r},Xf=(e,t)=>e.link&&H1(e.link,t)?!0:"children"in e?e.children.some(n=>Xf(n,t)):!1,Zf=e=>!cm(e)&&!Gr(e),Jf=e=>!No(e)||e.includes("github.com")?"GitHub":e.includes("bitbucket.org")?"Bitbucket":e.includes("gitlab.com")?"GitLab":e.includes("gitee.com")?"Gitee":null,z1={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},B1=({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const n=Jf(e);return n!==null?z1[n]:null},$1=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:r,editLinkPattern:o})=>{if(!r)return null;const i=B1({docsRepo:e,editLinkPattern:o});return i?i.replace(/:repo/,No(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,ds(`${Pc(n)}/${r}`)):null},Un=(e="",t="")=>ff(t)||Gr(t)?t:`${ym(e)}${t}`,ho=de([]),U1=()=>{const e=cn(),t=Be(),n=vt(),r=N(()=>n.value.sidebarDepth??t.value.sidebarDepth??2);e.beforeEach((i,s)=>{i.path!==s.path&&(ho.value=[])});const o=()=>{if(r.value<=0){ho.value=[];return}ho.value=Lg({levels:[2,r.value+1],ignore:[".vp-badge"]})};Ue(r,o),We(o)},j1=()=>ho,K1=e=>({text:e.title,link:e.link,children:Ms(e.children)}),Ms=e=>e?e.map(t=>K1(t)):[],Qf=(e,t)=>[{text:e.title,children:Ms(t)}],ed=(e,t,n,r="")=>{const o=(i,s)=>{var l;const a=Tt(i)?Zn(Un(s,i)):Tt(i.link)?{...i,link:Zf(i.link)?Zn(Un(s,i.link)).link:i.link}:i;if("children"in a)return{...a,children:a.children.map(u=>o(u,Un(s,a.prefix)))};if(a.link===n){const u=((l=t[0])==null?void 0:l.level)===1?t[0].children:t;return{...a,children:Ms(u)}}return a};return e.map(i=>o(i,r))},W1=(e,t,n,r)=>{const o=Ng(e).sort((i,s)=>s.length-i.length);for(const i of o)if(cf(decodeURI(r),i)){const s=e[i];return s?s==="heading"?Qf(t,n):ed(s,n,r,i):[]}return console.warn(`${decodeURI(r)} is missing sidebar config.`),[]},td=Symbol("sidebarItems"),Fs=()=>{const e=$e(td);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},G1=(e,t,n,r,o)=>e===!1?[]:e==="heading"?Qf(t,o):Array.isArray(e)?ed(e,o,n,r):ps(e)?W1(e,t,o,n):[],q1=()=>{const e=Be(),t=vt(),n=Cn(),r=Gt(),o=Pn(),i=j1(),s=N(()=>t.value.home?!1:t.value.sidebar??e.value.sidebar??"heading"),a=N(()=>G1(s.value,n.value,r.path,o.value,i.value));On(td,a)},Y1=me({__name:"Badge",props:{type:{default:"tip"},text:{default:""},vertical:{default:void 0}},setup(e,{expose:t}){t();const n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Pe=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n};function X1(e,t,n,r,o,i){return X(),re("span",{class:ot(["vp-badge",n.type]),style:Qn({verticalAlign:n.vertical})},[Le(e.$slots,"default",{},()=>[sn(Re(n.text),1)])],6)}const Z1=Pe(Y1,[["render",X1],["__file","Badge.vue"]]),J1=me({__name:"VPHomeFeatures",setup(e,{expose:t}){t();const n=vt(),r=N(()=>n.value.features??[]),o={frontmatter:n,features:r};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),Q1={key:0,class:"vp-features"};function eE(e,t,n,r,o,i){return r.features.length?(X(),re("div",Q1,[(X(!0),re(Ee,null,rn(r.features,s=>(X(),re("div",{key:s.title,class:"vp-feature"},[ae("h2",null,Re(s.title),1),ae("p",null,Re(s.details),1)]))),128))])):ze("",!0)}const tE=Pe(J1,[["render",eE],["__file","VPHomeFeatures.vue"]]),nE=me({__name:"VPHomeFooter",setup(e,{expose:t}){t();const n=vt(),r=N(()=>n.value.footer),o=N(()=>n.value.footerHtml),i={frontmatter:n,footer:r,footerHtml:o};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}}),rE=["innerHTML"],oE=["textContent"];function iE(e,t,n,r,o,i){return r.footer?(X(),re(Ee,{key:0},[r.footerHtml?(X(),re("div",{key:0,class:"vp-footer","vp-footer":"",innerHTML:r.footer},null,8,rE)):(X(),re("div",{key:1,class:"vp-footer","vp-footer":"",textContent:Re(r.footer)},null,8,oE))],64)):ze("",!0)}const sE=Pe(nE,[["render",iE],["__file","VPHomeFooter.vue"]]),aE=me({__name:"VPHomeHero",setup(e,{expose:t}){t();const n=vt(),r=vs(),o=Ns(),i=N(()=>n.value.heroText===null?null:n.value.heroText||r.value.title||"Hello"),s=N(()=>n.value.tagline===null?null:n.value.tagline||r.value.description||"Welcome to your VuePress site"),a=N(()=>o.value&&n.value.heroImageDark!==void 0?n.value.heroImageDark:n.value.heroImage),l=N(()=>n.value.heroAlt||i.value||"hero"),u=N(()=>n.value.heroHeight??280),c=N(()=>Array.isArray(n.value.actions)?n.value.actions.map(({text:p,link:g,type:v="primary"})=>({text:p,link:g,type:v})):[]),d={frontmatter:n,siteLocale:r,isDarkMode:o,heroText:i,tagline:s,heroImage:a,heroAlt:l,heroHeight:u,actions:c,HomeHeroImage:()=>{if(!a.value)return null;const p=ue("img",{class:"vp-hero-image",src:bs(a.value),alt:l.value,height:u.value});return n.value.heroImageDark===void 0?p:ue(Es,()=>p)},get AutoLink(){return rr}};return Object.defineProperty(d,"__isScriptSetup",{enumerable:!1,value:!0}),d}}),lE={class:"vp-hero"},uE={key:0,id:"main-title"},cE={key:1,class:"vp-hero-description"},fE={key:2,class:"vp-hero-actions"};function dE(e,t,n,r,o,i){return X(),re("header",lE,[le(r.HomeHeroImage),r.heroText?(X(),re("h1",uE,Re(r.heroText),1)):ze("",!0),r.tagline?(X(),re("p",cE,Re(r.tagline),1)):ze("",!0),r.actions.length?(X(),re("p",fE,[(X(!0),re(Ee,null,rn(r.actions,s=>(X(),De(r.AutoLink,{key:s.text,class:ot(["vp-hero-action-button",[s.type]]),config:s},null,8,["class","config"]))),128))])):ze("",!0)])}const pE=Pe(aE,[["render",dE],["__file","VPHomeHero.vue"]]),hE=me({__name:"VPHome",setup(e,{expose:t}){t();const n={VPHomeFeatures:tE,VPHomeFooter:sE,VPHomeHero:pE,get Content(){return ys}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),mE={class:"vp-home"},_E={"vp-content":""};function gE(e,t,n,r,o,i){return X(),re("main",mE,[le(r.VPHomeHero),le(r.VPHomeFeatures),ae("div",_E,[le(r.Content)]),le(r.VPHomeFooter)])}const vE=Pe(hE,[["render",gE],["__file","VPHome.vue"]]),EE=me({__name:"VPNavbarBrand",setup(e,{expose:t}){t();const n=Pn(),r=vs(),o=Be(),i=Ns(),s=N(()=>o.value.home||n.value),a=N(()=>r.value.title),l=N(()=>i.value&&o.value.logoDark!==void 0?o.value.logoDark:o.value.logo),u=N(()=>o.value.logoAlt??a.value),c=N(()=>a.value.toLocaleUpperCase().trim()===u.value.toLocaleUpperCase().trim()),d={routeLocale:n,siteLocale:r,themeLocale:o,isDarkMode:i,navbarBrandLink:s,navbarBrandTitle:a,navbarBrandLogo:l,navbarBrandLogoAlt:u,navBarLogoAltMatchesTitle:c,NavbarBrandLogo:()=>{if(!l.value)return null;const p=ue("img",{class:"vp-site-logo",src:bs(l.value),alt:u.value});return o.value.logoDark===void 0?p:ue(Es,()=>p)},get RouteLink(){return Ho}};return Object.defineProperty(d,"__isScriptSetup",{enumerable:!1,value:!0}),d}}),yE=["aria-hidden"];function bE(e,t,n,r,o,i){return X(),De(r.RouteLink,{to:r.navbarBrandLink},{default:Ne(()=>[le(r.NavbarBrandLogo),r.navbarBrandTitle?(X(),re("span",{key:0,class:ot(["vp-site-name",{"vp-hide-mobile":r.navbarBrandLogo}]),"aria-hidden":r.navBarLogoAltMatchesTitle},Re(r.navbarBrandTitle),11,yE)):ze("",!0)]),_:1},8,["to"])}const TE=Pe(EE,[["render",bE],["__file","VPNavbarBrand.vue"]]),AE=me({__name:"VPDropdownTransition",setup(e,{expose:t}){t();const o={setHeight:i=>{i.style.height=`${i.scrollHeight}px`},unsetHeight:i=>{i.style.height=""}};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}});function SE(e,t,n,r,o,i){return X(),De(fs,{name:"vp-dropdown",onEnter:r.setHeight,onAfterEnter:r.unsetHeight,onBeforeLeave:r.setHeight},{default:Ne(()=>[Le(e.$slots,"default")]),_:3})}const nd=Pe(AE,[["render",SE],["__file","VPDropdownTransition.vue"]]),OE=me({__name:"VPNavbarDropdown",props:{config:{}},setup(e,{expose:t}){t();const n=e,{config:r}=Ru(n),o=Gt(),[i,s]=nf(!1),a=N(()=>r.value.ariaLabel||r.value.text),l=(f,d)=>d[d.length-1]===f,u=f=>{f.detail===0?s():s(!1)};Ue(()=>o.path,()=>{s(!1)});const c={props:n,config:r,route:o,open:i,toggleOpen:s,dropdownAriaLabel:a,isLastItemOfArray:l,handleDropdown:u,VPDropdownTransition:nd,get AutoLink(){return rr}};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),kE=["aria-label"],xE={class:"title"},wE=["aria-label"],CE={class:"title"},PE={class:"vp-navbar-dropdown"},IE={class:"vp-navbar-dropdown-subtitle"},RE={key:1},LE={class:"vp-navbar-dropdown-subitem-wrapper"};function DE(e,t,n,r,o,i){return X(),re("div",{class:ot(["vp-navbar-dropdown-wrapper",{open:r.open}])},[ae("button",{class:"vp-navbar-dropdown-title",type:"button","aria-label":r.dropdownAriaLabel,onClick:r.handleDropdown},[ae("span",xE,Re(r.config.text),1),t[1]||(t[1]=ae("span",{class:"arrow down"},null,-1))],8,kE),ae("button",{class:"vp-navbar-dropdown-title-mobile",type:"button","aria-label":r.dropdownAriaLabel,onClick:t[0]||(t[0]=()=>r.toggleOpen())},[ae("span",CE,Re(r.config.text),1),ae("span",{class:ot(["arrow",r.open?"down":"right"])},null,2)],8,wE),le(r.VPDropdownTransition,null,{default:Ne(()=>[yo(ae("ul",PE,[(X(!0),re(Ee,null,rn(r.config.children,s=>(X(),re("li",{key:s.text,class:"vp-navbar-dropdown-item"},["children"in s?(X(),re(Ee,{key:0},[ae("h4",IE,[s.link?(X(),De(r.AutoLink,{key:0,config:s,onFocusout:()=>{r.isLastItemOfArray(s,r.config.children)&&s.children.length===0&&(r.open=!1)}},null,8,["config","onFocusout"])):(X(),re("span",RE,Re(s.text),1))]),ae("ul",LE,[(X(!0),re(Ee,null,rn(s.children,a=>(X(),re("li",{key:a.link,class:"vp-navbar-dropdown-subitem"},[le(r.AutoLink,{config:a,onFocusout:()=>{r.isLastItemOfArray(a,s.children)&&r.isLastItemOfArray(s,r.config.children)&&r.toggleOpen(!1)}},null,8,["config","onFocusout"])]))),128))])],64)):(X(),De(r.AutoLink,{key:1,config:s,onFocusout:()=>{r.isLastItemOfArray(s,r.config.children)&&r.toggleOpen(!1)}},null,8,["config","onFocusout"]))]))),128))],512),[[So,r.open]])]),_:1})],2)}const VE=Pe(OE,[["render",DE],["__file","VPNavbarDropdown.vue"]]),rd=(e,t="")=>Tt(e)?Zn(Un(t,e)):"children"in e?{...e,children:e.children.map(n=>rd(n,Un(t,e.prefix)))}:{...e,link:Zf(e.link)?Zn(Un(t,e.link)).link:e.link},NE=()=>{const e=Be();return N(()=>(e.value.navbar||[]).map(t=>rd(t)))},ME=()=>{const e=Be(),t=N(()=>e.value.repo),n=N(()=>t.value?Jf(t.value):null),r=N(()=>t.value&&!No(t.value)?`https://github.com/${t.value}`:t.value),o=N(()=>r.value?e.value.repoLabel?e.value.repoLabel:n.value===null?"Source":n.value:null);return N(()=>!r.value||!o.value?[]:[{text:o.value,link:r.value}])},FE=()=>{const e=Gt(),t=Dg(),n=Pn(),r=Jc(),o=vs(),i=V1(),s=Be();return N(()=>{const a=Object.keys(r.value.locales);if(a.length<2)return[];const l=e.path,u=e.fullPath;return[{text:`${s.value.selectLanguageText}`,ariaLabel:`${s.value.selectLanguageAriaLabel??s.value.selectLanguageText}`,children:a.map(f=>{var b,T;const d=((b=r.value.locales)==null?void 0:b[f])??{},p=((T=i.value.locales)==null?void 0:T[f])??{},g=`${d.lang}`,v=p.selectLanguageName??g;if(g===o.value.lang)return{text:v,activeMatch:".",link:e.fullPath};const E=l.replace(n.value,f);return{text:v,link:t.value.some(m=>m===E)?u.replace(l,E):p.home??f}})}]})},HE="719px",zE={mobile:HE};var zr;(function(e){e.Mobile="mobile"})(zr||(zr={}));const BE={[zr.Mobile]:Number.parseInt(zE.mobile.replace("px",""),10)},od=(e,t)=>{const n=BE[e];Number.isInteger(n)&&(et("orientationchange",()=>{t(n)},!1),et("resize",()=>{t(n)},!1),We(()=>{t(n)}))},$E=me({__name:"VPNavbarItems",setup(e,{expose:t}){t();const n=NE(),r=FE(),o=ME(),i=de(!1),s=N(()=>Be().value.navbarLabel??"site navigation"),a=N(()=>[...n.value,...r.value,...o.value]);od(zr.Mobile,u=>{i.value=window.innerWidth(X(),re("div",{key:s.text,class:"vp-navbar-item"},["children"in s?(X(),De(r.VPNavbarDropdown,{key:0,class:ot({mobile:r.isMobile}),config:s},null,8,["class","config"])):(X(),De(r.AutoLink,{key:1,config:s},null,8,["config"]))]))),128))],8,UE)):ze("",!0)}const id=Pe($E,[["render",jE],["__file","VPNavbarItems.vue"]]),KE={},WE={class:"dark-icon",viewBox:"0 0 32 32"};function GE(e,t){return X(),re("svg",WE,t[0]||(t[0]=[ae("path",{d:"M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z",fill:"currentColor"},null,-1)]))}const qE=Pe(KE,[["render",GE],["__file","VPDarkIcon.vue"]]),YE={},XE={class:"light-icon",viewBox:"0 0 32 32"};function ZE(e,t){return X(),re("svg",XE,t[0]||(t[0]=[yh('',9)]))}const JE=Pe(YE,[["render",ZE],["__file","VPLightIcon.vue"]]),QE=me({__name:"VPToggleColorModeButton",setup(e,{expose:t}){t();const n=Be(),r=Ns(),i={themeLocale:n,isDarkMode:r,toggleColorMode:()=>{r.value=!r.value},VPDarkIcon:qE,VPLightIcon:JE};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}}),ey=["title"];function ty(e,t,n,r,o,i){return X(),re("button",{type:"button",class:"vp-toggle-color-mode-button",title:r.themeLocale.toggleColorMode,onClick:r.toggleColorMode},[yo(le(r.VPLightIcon,null,null,512),[[So,!r.isDarkMode]]),yo(le(r.VPDarkIcon,null,null,512),[[So,r.isDarkMode]])],8,ey)}const ny=Pe(QE,[["render",ty],["__file","VPToggleColorModeButton.vue"]]),ry=me({__name:"VPToggleSidebarButton",emits:["toggle"],setup(e,{expose:t}){t();const r={themeLocale:Be()};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),oy=["title"];function iy(e,t,n,r,o,i){return X(),re("div",{class:"vp-toggle-sidebar-button",title:r.themeLocale.toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:t[0]||(t[0]=s=>e.$emit("toggle"))},t[1]||(t[1]=[ae("div",{class:"icon","aria-hidden":"true"},[ae("span"),ae("span"),ae("span")],-1)]),8,oy)}const sy=Pe(ry,[["render",iy],["__file","VPToggleSidebarButton.vue"]]),ay=me({__name:"VPNavbar",emits:["toggleSidebar"],setup(e,{expose:t}){t();const n=af("SearchBox")?as("SearchBox"):()=>null,r=Be(),o=qs("navbar"),i=qs("navbar-brand"),s=de(0),a=N(()=>s.value?{maxWidth:`${s.value}px`}:{}),l=(c,f)=>{var g;const d=(g=c==null?void 0:c.ownerDocument.defaultView)==null?void 0:g.getComputedStyle(c,null)[f],p=Number.parseInt(d,10);return Number.isNaN(p)?0:p};od(zr.Mobile,c=>{var d;const f=l(o.value,"paddingLeft")+l(o.value,"paddingRight");window.innerWidthe.$emit("toggleSidebar"))}),ae("span",uy,[le(r.VPNavbarBrand)],512),ae("div",{class:"vp-navbar-items-wrapper",style:Qn(r.linksWrapperStyle)},[Le(e.$slots,"before"),le(r.VPNavbarItems,{class:"vp-hide-mobile"}),Le(e.$slots,"after"),r.themeLocale.colorModeSwitch?(X(),De(r.VPToggleColorModeButton,{key:0})):ze("",!0),le(r.SearchBox)],4)],512)}const fy=Pe(ay,[["render",cy],["__file","VPNavbar.vue"]]),dy={},py={class:"edit-icon",viewBox:"0 0 1024 1024"};function hy(e,t){return X(),re("svg",py,t[0]||(t[0]=[ae("g",{fill:"currentColor"},[ae("path",{d:"M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"}),ae("path",{d:"M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"})],-1)]))}const my=Pe(dy,[["render",hy],["__file","VPEditIcon.vue"]]),_y=()=>{const e=Be(),t=Cn(),n=vt();return N(()=>{var o;return n.value.contributors??e.value.contributors??!0?((o=t.value.git)==null?void 0:o.contributors)??null:null})},gy=()=>{const e=Be(),t=Cn(),n=vt();return N(()=>{if(!(n.value.editLink??e.value.editLink??!0))return null;const{repo:o,docsRepo:i=o,docsBranch:s="main",docsDir:a="",editLinkText:l}=e.value;if(!i)return null;const u=$1({docsRepo:i,docsBranch:s,docsDir:a,filePathRelative:t.value.filePathRelative,editLinkPattern:n.value.editLinkPattern??e.value.editLinkPattern});return u?{text:l??"Edit this page",link:u}:null})},vy=()=>{const e=Be(),t=Cn(),n=vt();return N(()=>{var i;return!(n.value.lastUpdated??e.value.lastUpdated??!0)||!((i=t.value.git)!=null&&i.updatedTime)?null:new Date(t.value.git.updatedTime).toLocaleString()})},Ey=me({__name:"VPPageMeta",setup(e,{expose:t}){t();const n=Be(),r=gy(),o=vy(),i=_y(),s={themeLocale:n,editLink:r,lastUpdated:o,contributors:i,VPEditIcon:my,get AutoLink(){return rr}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),yy={class:"vp-page-meta"},by={key:0,class:"vp-meta-item edit-link"},Ty={class:"vp-meta-item git-info"},Ay={key:0,class:"vp-meta-item last-updated"},Sy={class:"meta-item-label"},Oy={class:"meta-item-info"},ky={key:1,class:"vp-meta-item contributors"},xy={class:"meta-item-label"},wy={class:"meta-item-info"},Cy=["title"];function Py(e,t,n,r,o,i){const s=as("ClientOnly");return X(),re("footer",yy,[r.editLink?(X(),re("div",by,[le(r.AutoLink,{class:"label",config:r.editLink},{before:Ne(()=>[le(r.VPEditIcon)]),_:1},8,["config"])])):ze("",!0),ae("div",Ty,[r.lastUpdated?(X(),re("div",Ay,[ae("span",Sy,Re(r.themeLocale.lastUpdatedText)+": ",1),le(s,null,{default:Ne(()=>[ae("span",Oy,Re(r.lastUpdated),1)]),_:1})])):ze("",!0),r.contributors&&r.contributors.length?(X(),re("div",ky,[ae("span",xy,Re(r.themeLocale.contributorsText)+": ",1),ae("span",wy,[(X(!0),re(Ee,null,rn(r.contributors,(a,l)=>(X(),re(Ee,{key:l},[ae("span",{class:"contributor",title:`email: ${a.email}`},Re(a.name),9,Cy),l!==r.contributors.length-1?(X(),re(Ee,{key:0},[sn(", ")],64)):ze("",!0)],64))),128))])])):ze("",!0)])])}const Iy=Pe(Ey,[["render",Py],["__file","VPPageMeta.vue"]]),Ry=()=>{const e=cn(),t=Gt();return n=>{n&&(ff(n)?t.path!==n&&e.push(n):Gr(n)?window.open(n):e.push(encodeURI(n)))}},iu=(e,t)=>e===!1?!1:Tt(e)?Zn(e,t):ps(e)?{...e,link:Zn(e.link,t).link}:null,Wi=(e,t,n)=>{const r=e.findIndex(i=>i.link===t);if(r!==-1){const i=e[r+n];return i?i.link?i:"prefix"in i&&!Vr(i.prefix).notFound?{...i,link:i.prefix}:null:null}for(const i of e)if("children"in i){const s=Wi(i.children,t,n);if(s)return s}const o=e.findIndex(i=>"prefix"in i&&i.prefix===t);if(o!==-1){const i=e[o+n];return i?i.link?i:"prefix"in i&&!Vr(i.prefix).notFound?{...i,link:i.prefix}:null:null}return null},Ly=()=>{const e=vt(),t=Be(),n=Fs(),r=Gt(),o=N(()=>{const s=iu(e.value.prev,r.path);return s===!1?null:s??(t.value.prev===!1?null:Wi(n.value,r.path,-1))}),i=N(()=>{const s=iu(e.value.next,r.path);return s===!1?null:s??(t.value.next===!1?null:Wi(n.value,r.path,1))});return{prevLink:o,nextLink:i}},Dy=me({__name:"VPPageNav",setup(e,{expose:t}){t();const n=Be(),r=Ry(),{prevLink:o,nextLink:i}=Ly(),s=N(()=>n.value.pageNavbarLabel??"page navigation");et("keydown",l=>{l.altKey&&(l.key==="ArrowRight"?i.value&&(r(i.value.link),l.preventDefault()):l.key==="ArrowLeft"&&o.value&&(r(o.value.link),l.preventDefault()))});const a={themeLocale:n,navigate:r,prevLink:o,nextLink:i,navbarLabel:s,get AutoLink(){return rr}};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}}),Vy=["aria-label"],Ny={class:"hint"},My={class:"link"},Fy={class:"hint"},Hy={class:"link"};function zy(e,t,n,r,o,i){return r.prevLink||r.nextLink?(X(),re("nav",{key:0,class:"vp-page-nav","aria-label":r.navbarLabel},[r.prevLink?(X(),De(r.AutoLink,{key:0,class:"prev",config:r.prevLink},{default:Ne(()=>[ae("div",Ny,[t[0]||(t[0]=ae("span",{class:"arrow left"},null,-1)),sn(" "+Re(r.themeLocale.prev??"Prev"),1)]),ae("div",My,[ae("span",null,Re(r.prevLink.text),1)])]),_:1},8,["config"])):ze("",!0),r.nextLink?(X(),De(r.AutoLink,{key:1,class:"next",config:r.nextLink},{default:Ne(()=>[ae("div",Fy,[sn(Re(r.themeLocale.next??"Next")+" ",1),t[1]||(t[1]=ae("span",{class:"arrow right"},null,-1))]),ae("div",Hy,[ae("span",null,Re(r.nextLink.text),1)])]),_:1},8,["config"])):ze("",!0)],8,Vy)):ze("",!0)}const By=Pe(Dy,[["render",zy],["__file","VPPageNav.vue"]]),$y=me({__name:"VPPage",setup(e,{expose:t}){t(),U1();const n={VPPageMeta:Iy,VPPageNav:By,get Content(){return ys}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Uy={class:"vp-page"},jy={"vp-content":""};function Ky(e,t,n,r,o,i){return X(),re("main",Uy,[Le(e.$slots,"top"),ae("div",jy,[Le(e.$slots,"content-top"),le(r.Content),Le(e.$slots,"content-bottom")]),le(r.VPPageMeta),le(r.VPPageNav),Le(e.$slots,"bottom")])}const Wy=Pe($y,[["render",Ky],["__file","VPPage.vue"]]),Gy=me({__name:"VPSidebarItem",props:{item:{},depth:{default:0}},setup(e,{expose:t}){t();const n=e,{item:r,depth:o}=Ru(n),i=Gt(),s=cn(),a=N(()=>"collapsible"in r.value&&r.value.collapsible),l=N(()=>Xf(r.value,i)),u=N(()=>({"vp-sidebar-item":!0,"vp-sidebar-heading":o.value===0,active:l.value,collapsible:a.value})),c=N(()=>a.value?l.value:!0),[f,d]=nf(c.value),p=E=>{a.value&&(E.preventDefault(),d())},g=s.afterEach(()=>{nr(()=>{f.value=c.value})});ss(()=>{g()});const v={props:n,item:r,depth:o,route:i,router:s,collapsible:a,isActive:l,itemClass:u,isOpenDefault:c,isOpen:f,toggleIsOpen:d,onClick:p,unregisterRouterHook:g,VPDropdownTransition:nd,get AutoLink(){return rr}};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}}),qy={class:"vp-sidebar-children"};function Yy(e,t,n,r,o,i){const s=as("VPSidebarItem",!0);return X(),re("li",null,[r.item.link?(X(),De(r.AutoLink,{key:0,class:ot(r.itemClass),config:r.item},null,8,["class","config"])):(X(),re("p",{key:1,tabindex:"0",class:ot(r.itemClass),onClick:r.onClick,onKeydown:rm(r.onClick,["enter"])},[sn(Re(r.item.text)+" ",1),r.collapsible?(X(),re("span",{key:0,class:ot(["arrow",r.isOpen?"down":"right"])},null,2)):ze("",!0)],34)),"children"in r.item&&r.item.children.length?(X(),De(r.VPDropdownTransition,{key:2},{default:Ne(()=>[yo(ae("ul",qy,[(X(!0),re(Ee,null,rn(r.item.children,a=>(X(),De(s,{key:`${r.depth}${a.text}${a.link}`,item:a,depth:r.depth+1},null,8,["item","depth"]))),128))],512),[[So,r.isOpen]])]),_:1})):ze("",!0)])}const Xy=Pe(Gy,[["render",Yy],["__file","VPSidebarItem.vue"]]),Zy=me({__name:"VPSidebarItems",setup(e,{expose:t}){t();const n=Gt(),r=Fs();We(()=>{Ue(()=>n.hash,i=>{const s=document.querySelector(".vp-sidebar");if(!s)return;const a=document.querySelector(`.vp-sidebar a.vp-sidebar-item[href="${n.path}${i}"]`);if(!a)return;const{top:l,height:u}=s.getBoundingClientRect(),{top:c,height:f}=a.getBoundingClientRect();cl+u&&a.scrollIntoView(!1)})});const o={route:n,sidebarItems:r,VPSidebarItem:Xy};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),Jy={key:0,class:"vp-sidebar-items"};function Qy(e,t,n,r,o,i){return r.sidebarItems.length?(X(),re("ul",Jy,[(X(!0),re(Ee,null,rn(r.sidebarItems,s=>(X(),De(r.VPSidebarItem,{key:`${s.text}${s.link}`,item:s},null,8,["item"]))),128))])):ze("",!0)}const eb=Pe(Zy,[["render",Qy],["__file","VPSidebarItems.vue"]]),tb=me({__name:"VPSidebar",setup(e,{expose:t}){t();const n={VPNavbarItems:id,VPSidebarItems:eb};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),nb={class:"vp-sidebar","vp-sidebar":""};function rb(e,t,n,r,o,i){return X(),re("aside",nb,[le(r.VPNavbarItems),Le(e.$slots,"top"),le(r.VPSidebarItems),Le(e.$slots,"bottom")])}const ob=Pe(tb,[["render",rb],["__file","VPSidebar.vue"]]),ib=me({__name:"Layout",setup(e,{expose:t}){t();const n=Cn(),r=vt(),o=Be(),i=N(()=>r.value.navbar!==!1&&o.value.navbar!==!1),s=Fs(),a=de(!1),l=m=>{a.value=typeof m=="boolean"?m:!a.value},u={x:0,y:0},c=m=>{u.x=m.changedTouches[0].clientX,u.y=m.changedTouches[0].clientY},f=m=>{const y=m.changedTouches[0].clientX-u.x,D=m.changedTouches[0].clientY-u.y;Math.abs(y)>Math.abs(D)&&Math.abs(y)>40&&(y>0&&u.x<=80?l(!0):l(!1))},d=N(()=>r.value.externalLinkIcon??o.value.externalLinkIcon??!0),p=N(()=>[{"no-navbar":!i.value,"no-sidebar":!s.value.length,"sidebar-open":a.value,"external-link-icon":d.value},r.value.pageClass]);let g;We(()=>{g=cn().afterEach(()=>{l(!1)})}),Lo(()=>{g()});const v=Yf(),E=v.resolve,b=v.pending,T={page:n,frontmatter:r,themeLocale:o,shouldShowNavbar:i,sidebarItems:s,isSidebarOpen:a,toggleSidebar:l,touchStart:u,onTouchStart:c,onTouchEnd:f,enableExternalLinkIcon:d,containerClass:p,get unregisterRouterHook(){return g},set unregisterRouterHook(m){g=m},scrollPromise:v,onBeforeEnter:E,onBeforeLeave:b,VPHome:vE,VPNavbar:fy,VPPage:Wy,VPSidebar:ob};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}});function sb(e,t,n,r,o,i){return X(),re("div",{class:ot(["vp-theme-container",r.containerClass]),"vp-container":"",onTouchstart:r.onTouchStart,onTouchend:r.onTouchEnd},[Le(e.$slots,"navbar",{},()=>[r.shouldShowNavbar?(X(),De(r.VPNavbar,{key:0,onToggleSidebar:r.toggleSidebar},{before:Ne(()=>[Le(e.$slots,"navbar-before")]),after:Ne(()=>[Le(e.$slots,"navbar-after")]),_:3})):ze("",!0)]),ae("div",{class:"vp-sidebar-mask",onClick:t[0]||(t[0]=s=>r.toggleSidebar(!1))}),Le(e.$slots,"sidebar",{},()=>[le(r.VPSidebar,null,{top:Ne(()=>[Le(e.$slots,"sidebar-top")]),bottom:Ne(()=>[Le(e.$slots,"sidebar-bottom")]),_:3})]),Le(e.$slots,"page",{},()=>[r.frontmatter.home?(X(),De(r.VPHome,{key:0})):(X(),De(fs,{key:1,name:"fade-slide-y",mode:"out-in",onBeforeEnter:r.onBeforeEnter,onBeforeLeave:r.onBeforeLeave},{default:Ne(()=>[(X(),De(r.VPPage,{key:r.page.path},{top:Ne(()=>[Le(e.$slots,"page-top")]),"content-top":Ne(()=>[Le(e.$slots,"page-content-top")]),"content-bottom":Ne(()=>[Le(e.$slots,"page-content-bottom")]),bottom:Ne(()=>[Le(e.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"]))])],34)}const ab=Pe(ib,[["render",sb],["__file","Layout.vue"]]),lb=me({__name:"NotFound",setup(e,{expose:t}){t();const n=Pn(),r=Be(),o=r.value.notFound??["Not Found"],i=()=>o[Math.floor(Math.random()*o.length)],s=r.value.home??n.value,a=r.value.backToHome??"Back to home",l={routeLocale:n,themeLocale:r,messages:o,getMsg:i,homeLink:s,homeText:a,get RouteLink(){return Ho}};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}}),ub={class:"vp-theme-container","vp-container":""},cb={class:"page"},fb={"vp-content":""};function db(e,t,n,r,o,i){return X(),re("div",ub,[ae("main",cb,[ae("div",fb,[t[0]||(t[0]=ae("h1",null,"404",-1)),ae("blockquote",null,Re(r.getMsg()),1),le(r.RouteLink,{to:r.homeLink},{default:Ne(()=>[sn(Re(r.homeText),1)]),_:1},8,["to"])])])])}const pb=Pe(lb,[["render",db],["__scopeId","data-v-d1d25ab8"],["__file","NotFound.vue"]]),hb=Rt({enhance({app:e,router:t}){af("Badge")||e.component("Badge",Z1);const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...r)=>(await Yf().wait(),n(...r))},setup(){M1(),q1()},layouts:{Layout:ab,NotFound:pb}}),mb=Object.freeze(Object.defineProperty({__proto__:null,default:hb},Symbol.toStringTag,{value:"Module"})),_b={enhance:({app:e})=>{e.component("SidebarTop",Yu(()=>S(()=>import("./SidebarTop-BdrWC7Yv.js"),[])))}},gb=Object.freeze(Object.defineProperty({__proto__:null,default:_b},Symbol.toStringTag,{value:"Module"}));function vb(e,t,n){var r,o,i;n===void 0&&(n={});var s=(r=n.isImmediate)!=null&&r,a=(o=n.callback)!=null&&o,l=n.maxWait,u=Date.now(),c=[];function f(){if(l!==void 0){var p=Date.now()-u;if(p+t>=l)return l-p}return t}var d=function(){var p=[].slice.call(arguments),g=this;return new Promise(function(v,E){var b=s&&i===void 0;if(i!==void 0&&clearTimeout(i),i=setTimeout(function(){if(i=void 0,u=Date.now(),!s){var m=e.apply(g,p);a&&a(m),c.forEach(function(y){return(0,y.resolve)(m)}),c=[]}},f()),b){var T=e.apply(g,p);return a&&a(T),v(T)}c.push({resolve:v,reject:E})})};return d.cancel=function(p){i!==void 0&&clearTimeout(i),c.forEach(function(g){return(0,g.reject)(p)}),c=[]},d}var Eb={appId:"4J45WOFT67",apiKey:"2d8317ae404e2cdd64933b6dc5416b6a",indexName:"goravel",locales:{"/":{placeholder:"Search Documentation",translations:{button:{buttonText:"Search"}}},"/zh/":{placeholder:"搜索文档",translations:{button:{buttonText:"搜索文档"}}}}};const yb=e=>{const t=et("keydown",n=>{const r=n.key==="k"&&(n.ctrlKey||n.metaKey);n.key!=="/"&&!r||(n.preventDefault(),e(),t())})},bb=e=>e.button===1||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey,Tb=()=>{const e=cn();return{transformItems:t=>t.map(n=>({...n,url:`/${ds(hm(n.url,"/"))}`})),hitComponent:({hit:t,children:n})=>({type:"a",ref:void 0,constructor:void 0,key:void 0,props:{href:t.url,onClick:r=>{bb(r)||(r.preventDefault(),e.push(t.url.replace("/","/")))},children:n},__v:null}),navigator:{navigate:({itemUrl:t})=>{e.push(t.replace("/","/"))}},transformSearchClient:t=>{const n=vb(t.search,500);return{...t,search:async r=>n(r)}}}},Ab=Eb,Sb=de(Ab),sd=Symbol(""),Ob=()=>{const e=$e(sd),t=Pn();return N(()=>{var n;return{...e.value,...(n=e.value.locales)==null?void 0:n[t.value]}})},kb=e=>{e.provide(sd,er(Sb))},xb=(e,t=[])=>[`lang:${e}`,...Array.isArray(t)?t:[t]],wb=({buttonText:e="Search",buttonAriaLabel:t=e}={})=>``,ad=()=>{if(document.querySelector(".DocSearch-Modal"))return;const e=new Event("keydown");e.key="k",e.metaKey=!0,window.dispatchEvent(e),setTimeout(ad,16)},Cb=e=>{const t="algolia-preconnect";("requestIdleCallback"in window?window.requestIdleCallback:setTimeout)(()=>{if(document.head.querySelector(`#${t}`))return;const n=document.createElement("link");n.id=t,n.rel="preconnect",n.href=`https://${e}-dsn.algolia.net`,n.crossOrigin="",document.head.appendChild(n)})},Pb=me({name:"DocSearch",props:{containerId:{type:String,default:"docsearch-container"},options:{type:Object,default:()=>({})}},setup(e){const t=Ob(),n=Tb(),r=gs(),o=Pn(),i=de(!1),s=de(!1),a=N(()=>{const{locales:c={},...f}=e.options;return{...t.value,...f,...c[o.value]}}),l=async()=>{const{default:c}=await S(async()=>{const{default:d}=await import("./index-DuqNHZ2Z.js");return{default:d}},[]),{searchParameters:f}=a.value;c({...n,...a.value,container:`#${e.containerId}`,searchParameters:{...f,facetFilters:xb(r.value,f==null?void 0:f.facetFilters)}}),i.value=!0},u=()=>{s.value||i.value||(s.value=!0,l(),ad(),Ue(o,l))};return yb(u),We(()=>{Cb(a.value.appId)}),()=>{var c;return[ue("div",{id:e.containerId,style:{display:i.value?"block":"none"}}),i.value?null:ue("div",{onClick:u,innerHTML:wb((c=a.value.translations)==null?void 0:c.button)})]}}}),Ib={enhance({app:e}){kb(e),e.component("SearchBox",Pb)}},Rb=Object.freeze(Object.defineProperty({__proto__:null,default:Ib},Symbol.toStringTag,{value:"Module"}));var Lb={provider:"Giscus",comment:!0,repo:"goravel/goravel",repoId:"R_kgDOGR4SdA",category:"Announcements",categoryId:"DIC_kwDOGR4SdM4CUEsk",mapping:"og:title",strict:!1,reactionsEnabled:!0,lazyLoading:!0,darkTheme:"preferred_color_scheme",lightTheme:"preferred_color_scheme",inputPosition:"top"};const Db=Lb,Vb=de(Db),ld=Symbol(""),ud=()=>$e(ld),Nb=ud,Mb=e=>{e.provide(ld,er(Vb))},su=["ar","ca","da","de","en","eo","es","fa","fr","he","id","it","ja","ko","nl","pl","pt","ro","ru","th","tr","uk","uz","vi","zh-CN","zh-TW"];var Fb=me({name:"GiscusComment",props:{identifier:{type:String,required:!0},darkmode:Boolean},setup(e){const t=Nb(),n=gs(),r=N(()=>!!(t.value.repo&&t.value.repoId&&t.value.category&&t.value.categoryId)),o=de(!1),i=N(()=>{if(su.includes(n.value))return n.value;const a=n.value.split("-")[0];return su.includes(a)?a:"en"}),s=N(()=>({repo:t.value.repo,repoId:t.value.repoId,category:t.value.category,categoryId:t.value.categoryId,lang:i.value,theme:e.darkmode?t.value.darkTheme||"dark":t.value.lightTheme||"light",mapping:t.value.mapping||"pathname",term:e.identifier,inputPosition:t.value.inputPosition||"top",reactionsEnabled:t.value.reactionsEnabled===!1?"0":"1",strict:t.value.strict===!1?"0":"1",loading:t.value.lazyLoading===!1?"eager":"lazy",emitMetadata:"0"}));return We(async()=>{await S(()=>import("./giscus--_FS5kYt.js"),[]),o.value=!0}),()=>r.value?ue("div",{id:"comment",class:["giscus-wrapper",{"input-top":t.value.inputPosition!=="bottom"}]},o.value?ue("giscus-widget",s.value):ue(sf)):null}}),Hb=me({name:"CommentService",props:{darkmode:Boolean},setup(e){const t=ud(),n=Cn(),r=vt(),o=N(()=>r.value.comment??t.value.comment!==!1);return()=>ue(Fb,{class:"vp-comment","vp-comment":"",identifier:r.value.commentID??n.value.path,darkmode:e.darkmode,style:{display:o.value?"block":"none"}})}}),zb=Rt({enhance:({app:e})=>{Mb(e),e.component("CommentService",Hb)}});const Bb=Object.freeze(Object.defineProperty({__proto__:null,default:zb},Symbol.toStringTag,{value:"Module"})),$b=Rt({}),Ub=Object.freeze(Object.defineProperty({__proto__:null,default:$b},Symbol.toStringTag,{value:"Module"})),ao=[Pg,zg,Gg,Yg,lv,hv,gv,Av,D1,mb,gb,Rb,Bb,Ub].map(e=>e.default).filter(Boolean),jb=JSON.parse(`{"base":"/","lang":"en-US","title":"Goravel","description":"A Golang web application framework","head":[["script",{"crossorigin":"anonymous","async":true,"src":"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4978322804450032"}],["script",{"async":true,"src":"https://www.googletagmanager.com/gtag/js?id=G-HJQNEG5H69"}],["script",{},"window.dataLayer = window.dataLayer || [];\\nfunction gtag(){dataLayer.push(arguments);}\\ngtag('js', new Date());\\ngtag('config', 'G-HJQNEG5H69');"]],"locales":{"/":{"lang":"en-US","title":"Goravel","description":"A Golang web application framework"},"/zh/":{"lang":"zh-CN","title":"Goravel","description":"Golang WEB 应用框架"}}}`);var gr=At(jb),Kb=a_,Wb=()=>{const e=$_({history:Kb(Pc("/")),routes:[{name:"vuepress-route",path:"/:catchAll(.*)",components:{}}],scrollBehavior:(t,n,r)=>r||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{if(t.path!==n.path||n===Mt){const r=Vr(t.fullPath);if(r.path!==t.fullPath)return r.path;const o=await r.loader();t.meta={...r.meta,_pageChunk:o}}else t.path===n.path&&(t.meta=n.meta)}),e},Gb=e=>{e.component("ClientOnly",Es),e.component("Content",ys),e.component("RouteLink",Ho)},qb=(e,t,n)=>{const r=N(()=>t.currentRoute.value.path),o=tp((E,b)=>({get(){return E(),t.currentRoute.value.meta._pageChunk},set(T){t.currentRoute.value.meta._pageChunk=T,b()}})),i=N(()=>mn.resolveLayouts(n)),s=N(()=>mn.resolveRouteLocale(gr.value.locales,r.value)),a=N(()=>mn.resolveSiteLocaleData(gr.value,s.value)),l=N(()=>o.value.comp),u=N(()=>o.value.data),c=N(()=>u.value.frontmatter),f=N(()=>mn.resolvePageHeadTitle(u.value,a.value)),d=N(()=>mn.resolvePageHead(f.value,c.value,a.value)),p=N(()=>mn.resolvePageLang(u.value,a.value)),g=N(()=>mn.resolvePageLayout(u.value,i.value)),v={layouts:i,pageData:u,pageComponent:l,pageFrontmatter:c,pageHead:d,pageHeadTitle:f,pageLang:p,pageLayout:g,redirects:Vi,routeLocale:s,routePath:r,routes:$n,siteData:gr,siteLocaleData:a};return e.provide(_s,v),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>c.value},$head:{get:()=>d.value},$headTitle:{get:()=>f.value},$lang:{get:()=>p.value},$page:{get:()=>u.value},$routeLocale:{get:()=>s.value},$site:{get:()=>gr.value},$siteLocale:{get:()=>a.value},$withBase:{get:()=>bs}}),v},Yb=([e,t,n=""])=>{const r=Object.entries(t).map(([a,l])=>Tt(l)?`[${a}=${JSON.stringify(l)}]`:l?`[${a}]`:"").join(""),o=`head > ${e}${r}`;return Array.from(document.querySelectorAll(o)).find(a=>a.innerText===n)??null},Xb=([e,t,n])=>{if(!Tt(e))return null;const r=document.createElement(e);return ps(t)&&Object.entries(t).forEach(([o,i])=>{Tt(i)?r.setAttribute(o,i):i&&r.setAttribute(o,"")}),Tt(n)&&r.appendChild(document.createTextNode(n)),r},Zb=()=>{const e=K_(),t=gs();let n=[];const r=()=>{e.value.forEach(s=>{const a=Yb(s);a&&n.push(a)})},o=()=>{const s=[];return e.value.forEach(a=>{const l=Xb(a);l&&s.push(l)}),s},i=()=>{document.documentElement.lang=t.value;const s=o();n.forEach((a,l)=>{const u=s.findIndex(c=>a.isEqualNode(c));u===-1?(a.remove(),delete n[l]):s.splice(u,1)}),s.forEach(a=>document.head.appendChild(a)),n=[...n.filter(a=>!!a),...s]};On(q_,i),We(()=>{r(),Ue(e,i,{immediate:!1})})},Jb=sm,Qb=async()=>{var r;const e=Jb({name:"Vuepress",setup(){var s;Zb();for(const a of ao)(s=a.setup)==null||s.call(a);const o=ao.flatMap(({rootComponents:a=[]})=>a.map(l=>ue(l))),i=W_();return()=>[ue(i.value),o]}}),t=Wb();Gb(e);const n=qb(e,t,ao);{const{setupDevtools:o}=await S(async()=>{const{setupDevtools:i}=await import("./setupDevtools-7MC2TMWH-bpP4unfq.js");return{setupDevtools:i}},[]);o(e,n)}for(const o of ao)await((r=o.enhance)==null?void 0:r.call(o,{app:e,router:t,siteData:gr}));return e.use(t),{app:e,router:t}};Qb().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{Pe as _,yh as a,ae as b,re as c,Qb as createVueApp,sn as d,le as e,Ne as f,X as o,as as r,W0 as s,Ue as w}; + */const Ja=(e,t)=>{e.classList.add(t)},Qa=(e,t)=>{e.classList.remove(t)},uv=e=>{var t;(t=e==null?void 0:e.parentNode)==null||t.removeChild(e)},di=(e,t,n)=>en?n:e,el=e=>(-1+e)*100,cv=(()=>{const e=[],t=()=>{const n=e.shift();n&&n(t)};return n=>{e.push(n),e.length===1&&t()}})(),fv=e=>e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(t,n)=>n.toUpperCase()),oo=(()=>{const e=["Webkit","O","Moz","ms"],t={},n=i=>{const{style:s}=document.body;if(i in s)return i;const a=i.charAt(0).toUpperCase()+i.slice(1);let l=e.length;for(;l--;){const u=`${e[l]}${a}`;if(u in s)return u}return i},r=i=>{const s=fv(i);return t[s]??(t[s]=n(s))},o=(i,s,a)=>{i.style[r(s)]=a};return(i,s)=>{for(const a in s){const l=s[a];Object.hasOwn(s,a)&&Vg(l)&&o(i,a,l)}}})(),Nt={minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
'},Ie={percent:null,isRendered:()=>!!document.getElementById("nprogress"),set:e=>{const{speed:t,easing:n}=Nt,r=Ie.isStarted(),o=di(e,Nt.minimum,1);Ie.percent=o===1?null:o;const i=Ie.render(!r),s=i.querySelector(Nt.barSelector);return i.offsetWidth,cv(a=>{oo(s,{transform:`translate3d(${el(o)}%,0,0)`,transition:`all ${t}ms ${n}`}),o===1?(oo(i,{transition:"none",opacity:"1"}),i.offsetWidth,setTimeout(()=>{oo(i,{transition:`all ${t}ms linear`,opacity:"0"}),setTimeout(()=>{Ie.remove(),a()},t)},t)):setTimeout(()=>{a()},t)}),Ie},isStarted:()=>typeof Ie.percent=="number",start:()=>{Ie.percent||Ie.set(0);const e=()=>{setTimeout(()=>{Ie.percent&&(Ie.trickle(),e())},Nt.trickleSpeed)};return e(),Ie},done:e=>!e&&!Ie.percent?Ie:Ie.increase(.3+.5*Math.random()).set(1),increase:e=>{let{percent:t}=Ie;return t?(t=di(t+(typeof e=="number"?e:(1-t)*di(Math.random()*t,.1,.95)),0,.994),Ie.set(t)):Ie.start()},trickle:()=>Ie.increase(Math.random()*Nt.trickleRate),render:e=>{if(Ie.isRendered())return document.getElementById("nprogress");Ja(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=Nt.template;const n=t.querySelector(Nt.barSelector),r=document.querySelector(Nt.parent),o=e?"-100":el(Ie.percent??0);return oo(n,{transition:"all 0 linear",transform:`translate3d(${o}%,0,0)`}),r&&(r!==document.body&&Ja(r,"nprogress-custom-parent"),r.appendChild(t)),t},remove:()=>{Qa(document.documentElement,"nprogress-busy"),Qa(document.querySelector(Nt.parent),"nprogress-custom-parent"),uv(document.getElementById("nprogress"))}},dv=()=>{We(()=>{const e=cn(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||Ie.start()}),e.afterEach(n=>{t.add(n.path),Ie.done()})})},pv=Rt({setup(){dv()}}),hv=Object.freeze(Object.defineProperty({__proto__:null,default:pv},Symbol.toStringTag,{value:"Module"})),mv=({selector:e='div[class*="language-"].has-collapsed-lines > .collapsed-lines'}={})=>{et("click",t=>{const n=t.target;if(n.matches(e)){const r=n.parentElement;r!=null&&r.classList.toggle("collapsed")&&r.scrollIntoView({block:"center",behavior:"instant"})}})},_v={setup(){mv()}},gv=Object.freeze(Object.defineProperty({__proto__:null,default:_v},Symbol.toStringTag,{value:"Module"})),vv="VUEPRESS_CODE_TAB_STORE",io=Os(vv,{}),Ev=me({name:"CodeTabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},id:{type:String,required:!0},tabId:{type:String,default:""}},slots:Object,setup(e,{slots:t}){const n=de(e.active),r=At([]),o=()=>{e.tabId&&(io.value[e.tabId]=e.data[n.value].id)},i=(u=n.value)=>{n.value=u{n.value=u>0?u-1:r.value.length-1,r.value[n.value].focus()},a=(u,c)=>{u.key===" "||u.key==="Enter"?(u.preventDefault(),n.value=c):u.key==="ArrowRight"?(u.preventDefault(),i()):u.key==="ArrowLeft"&&(u.preventDefault(),s()),e.tabId&&(io.value[e.tabId]=e.data[n.value].id)},l=()=>{if(e.tabId){const u=e.data.findIndex(({id:c})=>io.value[e.tabId]===c);if(u!==-1)return u}return e.active};return We(()=>{n.value=l(),Ue(()=>io.value[e.tabId],(u,c)=>{if(e.tabId&&u!==c){const f=e.data.findIndex(({id:d})=>d===u);f!==-1&&(n.value=f)}})}),()=>e.data.length?ue("div",{class:"vp-code-tabs"},[ue("div",{class:"vp-code-tabs-nav",role:"tablist"},e.data.map(({id:u},c)=>{const f=c===n.value;return ue("button",{type:"button",ref:d=>{d&&(r.value[c]=d)},class:["vp-code-tab-nav",{active:f}],role:"tab","aria-controls":`codetab-${e.id}-${c}`,"aria-selected":f,onClick:()=>{n.value=c,o()},onKeydown:d=>{a(d,c)}},t[`title${c}`]({value:u,isActive:f}))})),e.data.map(({id:u},c)=>{const f=c===n.value;return ue("div",{class:["vp-code-tab",{active:f}],id:`codetab-${e.id}-${c}`,role:"tabpanel","aria-expanded":f},[ue("div",{class:"vp-code-tab-title"},t[`title${c}`]({value:u,isActive:f})),t[`tab${c}`]({value:u,isActive:f})])})]):null}}),yv="VUEPRESS_TAB_STORE",pi=Os(yv,{}),bv=me({name:"Tabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},id:{type:String,required:!0},tabId:{type:String,default:""}},slots:Object,setup(e,{slots:t}){const n=de(e.active),r=At([]),o=()=>{e.tabId&&(pi.value[e.tabId]=e.data[n.value].id)},i=(u=n.value)=>{n.value=u{n.value=u>0?u-1:r.value.length-1,r.value[n.value].focus()},a=(u,c)=>{u.key===" "||u.key==="Enter"?(u.preventDefault(),n.value=c):u.key==="ArrowRight"?(u.preventDefault(),i()):u.key==="ArrowLeft"&&(u.preventDefault(),s()),o()},l=()=>{if(e.tabId){const u=e.data.findIndex(({id:c})=>pi.value[e.tabId]===c);if(u!==-1)return u}return e.active};return We(()=>{n.value=l(),Ue(()=>pi.value[e.tabId],(u,c)=>{if(e.tabId&&u!==c){const f=e.data.findIndex(({id:d})=>d===u);f!==-1&&(n.value=f)}})}),()=>e.data.length?ue("div",{class:"vp-tabs"},[ue("div",{class:"vp-tabs-nav",role:"tablist"},e.data.map(({id:u},c)=>{const f=c===n.value;return ue("button",{type:"button",ref:d=>{d&&(r.value[c]=d)},class:["vp-tab-nav",{active:f}],role:"tab","aria-controls":`tab-${e.id}-${c}`,"aria-selected":f,onClick:()=>{n.value=c,o()},onKeydown:d=>{a(d,c)}},t[`title${c}`]({value:u,isActive:f}))})),e.data.map(({id:u},c)=>{const f=c===n.value;return ue("div",{class:["vp-tab",{active:f}],id:`tab-${e.id}-${c}`,role:"tabpanel","aria-expanded":f},[ue("div",{class:"vp-tab-title"},t[`title${c}`]({value:u,isActive:f})),t[`tab${c}`]({value:u,isActive:f})])})]):null}}),Tv={enhance:({app:e})=>{e.component("CodeTabs",Ev),e.component("Tabs",bv)}},Av=Object.freeze(Object.defineProperty({__proto__:null,default:Tv},Symbol.toStringTag,{value:"Module"}));var Sv=Object.create,df=Object.defineProperty,Ov=Object.getOwnPropertyDescriptor,ks=Object.getOwnPropertyNames,kv=Object.getPrototypeOf,xv=Object.prototype.hasOwnProperty,wv=(e,t)=>function(){return e&&(t=(0,e[ks(e)[0]])(e=0)),t},Cv=(e,t)=>function(){return t||(0,e[ks(e)[0]])((t={exports:{}}).exports,t),t.exports},Pv=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ks(t))!xv.call(e,o)&&o!==n&&df(e,o,{get:()=>t[o],enumerable:!(r=Ov(t,o))||r.enumerable});return e},Iv=(e,t,n)=>(n=e!=null?Sv(kv(e)):{},Pv(df(n,"default",{value:e,enumerable:!0}),e)),qr=wv({"../../node_modules/.pnpm/tsup@8.3.5_@microsoft+api-extractor@7.48.0_@types+node@22.10.1__@swc+core@1.5.29_jiti@2.0.0_p_swvvp2d4pgn6xuiiec4l4x2i7a/node_modules/tsup/assets/esm_shims.js"(){}}),Rv=Cv({"../../node_modules/.pnpm/rfdc@1.4.1/node_modules/rfdc/index.js"(e,t){qr(),t.exports=r;function n(i){return i instanceof Buffer?Buffer.from(i):new i.constructor(i.buffer.slice(),i.byteOffset,i.length)}function r(i){if(i=i||{},i.circles)return o(i);const s=new Map;if(s.set(Date,f=>new Date(f)),s.set(Map,(f,d)=>new Map(l(Array.from(f),d))),s.set(Set,(f,d)=>new Set(l(Array.from(f),d))),i.constructorHandlers)for(const f of i.constructorHandlers)s.set(f[0],f[1]);let a=null;return i.proto?c:u;function l(f,d){const p=Object.keys(f),g=new Array(p.length);for(let v=0;vnew Date(p)),l.set(Map,(p,g)=>new Map(c(Array.from(p),g))),l.set(Set,(p,g)=>new Set(c(Array.from(p),g))),i.constructorHandlers)for(const p of i.constructorHandlers)l.set(p[0],p[1]);let u=null;return i.proto?d:f;function c(p,g){const v=Object.keys(p),E=new Array(v.length);for(let b=0;b(s=Hv(e,u,c),s.finally(()=>{if(s=null,n.trailing&&a&&!o){const f=l(u,a);return a=null,f}}),s);return function(...u){return s?(n.trailing&&(a=u),s):new Promise(c=>{const f=!o&&n.leading;clearTimeout(o),o=setTimeout(()=>{o=null;const d=n.leading?r:l(this,u);for(const p of i)p(d);i=[]},t),f?(r=l(this,u),c(r)):i.push(c)})}}async function Hv(e,t,n){return await e.apply(t,n)}function Mi(e,t={},n){for(const r in e){const o=e[r],i=n?`${n}:${r}`:r;typeof o=="object"&&o!==null?Mi(o,t,i):typeof o=="function"&&(t[i]=o)}return t}const zv={run:e=>e()},Bv=()=>zv,hf=typeof console.createTask<"u"?console.createTask:Bv;function $v(e,t){const n=t.shift(),r=hf(n);return e.reduce((o,i)=>o.then(()=>r.run(()=>i(...t))),Promise.resolve())}function Uv(e,t){const n=t.shift(),r=hf(n);return Promise.all(e.map(o=>r.run(()=>o(...t))))}function hi(e,t){for(const n of[...e])n(t)}class jv{constructor(){this._hooks={},this._before=void 0,this._after=void 0,this._deprecatedMessages=void 0,this._deprecatedHooks={},this.hook=this.hook.bind(this),this.callHook=this.callHook.bind(this),this.callHookWith=this.callHookWith.bind(this)}hook(t,n,r={}){if(!t||typeof n!="function")return()=>{};const o=t;let i;for(;this._deprecatedHooks[t];)i=this._deprecatedHooks[t],t=i.to;if(i&&!r.allowDeprecated){let s=i.message;s||(s=`${o} hook has been deprecated`+(i.to?`, please use ${i.to}`:"")),this._deprecatedMessages||(this._deprecatedMessages=new Set),this._deprecatedMessages.has(s)||(console.warn(s),this._deprecatedMessages.add(s))}if(!n.name)try{Object.defineProperty(n,"name",{get:()=>"_"+t.replace(/\W+/g,"_")+"_hook_cb",configurable:!0})}catch{}return this._hooks[t]=this._hooks[t]||[],this._hooks[t].push(n),()=>{n&&(this.removeHook(t,n),n=void 0)}}hookOnce(t,n){let r,o=(...i)=>(typeof r=="function"&&r(),r=void 0,o=void 0,n(...i));return r=this.hook(t,o),r}removeHook(t,n){if(this._hooks[t]){const r=this._hooks[t].indexOf(n);r!==-1&&this._hooks[t].splice(r,1),this._hooks[t].length===0&&delete this._hooks[t]}}deprecateHook(t,n){this._deprecatedHooks[t]=typeof n=="string"?{to:n}:n;const r=this._hooks[t]||[];delete this._hooks[t];for(const o of r)this.hook(t,o)}deprecateHooks(t){Object.assign(this._deprecatedHooks,t);for(const n in t)this.deprecateHook(n,t[n])}addHooks(t){const n=Mi(t),r=Object.keys(n).map(o=>this.hook(o,n[o]));return()=>{for(const o of r.splice(0,r.length))o()}}removeHooks(t){const n=Mi(t);for(const r in n)this.removeHook(r,n[r])}removeAllHooks(){for(const t in this._hooks)delete this._hooks[t]}callHook(t,...n){return n.unshift(t),this.callHookWith($v,t,...n)}callHookParallel(t,...n){return n.unshift(t),this.callHookWith(Uv,t,...n)}callHookWith(t,n,...r){const o=this._before||this._after?{name:n,args:r,context:{}}:void 0;this._before&&hi(this._before,o);const i=t(n in this._hooks?[...this._hooks[n]]:[],r);return i instanceof Promise?i.finally(()=>{this._after&&o&&hi(this._after,o)}):(this._after&&o&&hi(this._after,o),i)}beforeEach(t){return this._before=this._before||[],this._before.push(t),()=>{if(this._before!==void 0){const n=this._before.indexOf(t);n!==-1&&this._before.splice(n,1)}}}afterEach(t){return this._after=this._after||[],this._after.push(t),()=>{if(this._after!==void 0){const n=this._after.indexOf(t);n!==-1&&this._after.splice(n,1)}}}}function mf(){return new jv}var Kv=Object.create,_f=Object.defineProperty,Wv=Object.getOwnPropertyDescriptor,xs=Object.getOwnPropertyNames,Gv=Object.getPrototypeOf,qv=Object.prototype.hasOwnProperty,Yv=(e,t)=>function(){return e&&(t=(0,e[xs(e)[0]])(e=0)),t},gf=(e,t)=>function(){return t||(0,e[xs(e)[0]])((t={exports:{}}).exports,t),t.exports},Xv=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of xs(t))!qv.call(e,o)&&o!==n&&_f(e,o,{get:()=>t[o],enumerable:!(r=Wv(t,o))||r.enumerable});return e},Zv=(e,t,n)=>(n=e!=null?Kv(Gv(e)):{},Xv(_f(n,"default",{value:e,enumerable:!0}),e)),I=Yv({"../../node_modules/.pnpm/tsup@8.3.5_@microsoft+api-extractor@7.48.0_@types+node@22.10.1__@swc+core@1.5.29_jiti@2.0.0_p_swvvp2d4pgn6xuiiec4l4x2i7a/node_modules/tsup/assets/esm_shims.js"(){}}),Jv=gf({"../../node_modules/.pnpm/speakingurl@14.0.1/node_modules/speakingurl/lib/speakingurl.js"(e,t){I(),function(n){var r={À:"A",Á:"A",Â:"A",Ã:"A",Ä:"Ae",Å:"A",Æ:"AE",Ç:"C",È:"E",É:"E",Ê:"E",Ë:"E",Ì:"I",Í:"I",Î:"I",Ï:"I",Ð:"D",Ñ:"N",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"Oe",Ő:"O",Ø:"O",Ù:"U",Ú:"U",Û:"U",Ü:"Ue",Ű:"U",Ý:"Y",Þ:"TH",ß:"ss",à:"a",á:"a",â:"a",ã:"a",ä:"ae",å:"a",æ:"ae",ç:"c",è:"e",é:"e",ê:"e",ë:"e",ì:"i",í:"i",î:"i",ï:"i",ð:"d",ñ:"n",ò:"o",ó:"o",ô:"o",õ:"o",ö:"oe",ő:"o",ø:"o",ù:"u",ú:"u",û:"u",ü:"ue",ű:"u",ý:"y",þ:"th",ÿ:"y","ẞ":"SS",ا:"a",أ:"a",إ:"i",آ:"aa",ؤ:"u",ئ:"e",ء:"a",ب:"b",ت:"t",ث:"th",ج:"j",ح:"h",خ:"kh",د:"d",ذ:"th",ر:"r",ز:"z",س:"s",ش:"sh",ص:"s",ض:"dh",ط:"t",ظ:"z",ع:"a",غ:"gh",ف:"f",ق:"q",ك:"k",ل:"l",م:"m",ن:"n",ه:"h",و:"w",ي:"y",ى:"a",ة:"h",ﻻ:"la",ﻷ:"laa",ﻹ:"lai",ﻵ:"laa",گ:"g",چ:"ch",پ:"p",ژ:"zh",ک:"k",ی:"y","َ":"a","ً":"an","ِ":"e","ٍ":"en","ُ":"u","ٌ":"on","ْ":"","٠":"0","١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","۰":"0","۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9",က:"k",ခ:"kh",ဂ:"g",ဃ:"ga",င:"ng",စ:"s",ဆ:"sa",ဇ:"z","စျ":"za",ည:"ny",ဋ:"t",ဌ:"ta",ဍ:"d",ဎ:"da",ဏ:"na",တ:"t",ထ:"ta",ဒ:"d",ဓ:"da",န:"n",ပ:"p",ဖ:"pa",ဗ:"b",ဘ:"ba",မ:"m",ယ:"y",ရ:"ya",လ:"l",ဝ:"w",သ:"th",ဟ:"h",ဠ:"la",အ:"a","ြ":"y","ျ":"ya","ွ":"w","ြွ":"yw","ျွ":"ywa","ှ":"h",ဧ:"e","၏":"-e",ဣ:"i",ဤ:"-i",ဉ:"u",ဦ:"-u",ဩ:"aw","သြော":"aw",ဪ:"aw","၀":"0","၁":"1","၂":"2","၃":"3","၄":"4","၅":"5","၆":"6","၇":"7","၈":"8","၉":"9","္":"","့":"","း":"",č:"c",ď:"d",ě:"e",ň:"n",ř:"r",š:"s",ť:"t",ů:"u",ž:"z",Č:"C",Ď:"D",Ě:"E",Ň:"N",Ř:"R",Š:"S",Ť:"T",Ů:"U",Ž:"Z",ހ:"h",ށ:"sh",ނ:"n",ރ:"r",ބ:"b",ޅ:"lh",ކ:"k",އ:"a",ވ:"v",މ:"m",ފ:"f",ދ:"dh",ތ:"th",ލ:"l",ގ:"g",ޏ:"gn",ސ:"s",ޑ:"d",ޒ:"z",ޓ:"t",ޔ:"y",ޕ:"p",ޖ:"j",ޗ:"ch",ޘ:"tt",ޙ:"hh",ޚ:"kh",ޛ:"th",ޜ:"z",ޝ:"sh",ޞ:"s",ޟ:"d",ޠ:"t",ޡ:"z",ޢ:"a",ޣ:"gh",ޤ:"q",ޥ:"w","ަ":"a","ާ":"aa","ި":"i","ީ":"ee","ު":"u","ޫ":"oo","ެ":"e","ޭ":"ey","ޮ":"o","ޯ":"oa","ް":"",ა:"a",ბ:"b",გ:"g",დ:"d",ე:"e",ვ:"v",ზ:"z",თ:"t",ი:"i",კ:"k",ლ:"l",მ:"m",ნ:"n",ო:"o",პ:"p",ჟ:"zh",რ:"r",ს:"s",ტ:"t",უ:"u",ფ:"p",ქ:"k",ღ:"gh",ყ:"q",შ:"sh",ჩ:"ch",ც:"ts",ძ:"dz",წ:"ts",ჭ:"ch",ხ:"kh",ჯ:"j",ჰ:"h",α:"a",β:"v",γ:"g",δ:"d",ε:"e",ζ:"z",η:"i",θ:"th",ι:"i",κ:"k",λ:"l",μ:"m",ν:"n",ξ:"ks",ο:"o",π:"p",ρ:"r",σ:"s",τ:"t",υ:"y",φ:"f",χ:"x",ψ:"ps",ω:"o",ά:"a",έ:"e",ί:"i",ό:"o",ύ:"y",ή:"i",ώ:"o",ς:"s",ϊ:"i",ΰ:"y",ϋ:"y",ΐ:"i",Α:"A",Β:"B",Γ:"G",Δ:"D",Ε:"E",Ζ:"Z",Η:"I",Θ:"TH",Ι:"I",Κ:"K",Λ:"L",Μ:"M",Ν:"N",Ξ:"KS",Ο:"O",Π:"P",Ρ:"R",Σ:"S",Τ:"T",Υ:"Y",Φ:"F",Χ:"X",Ψ:"PS",Ω:"O",Ά:"A",Έ:"E",Ί:"I",Ό:"O",Ύ:"Y",Ή:"I",Ώ:"O",Ϊ:"I",Ϋ:"Y",ā:"a",ē:"e",ģ:"g",ī:"i",ķ:"k",ļ:"l",ņ:"n",ū:"u",Ā:"A",Ē:"E",Ģ:"G",Ī:"I",Ķ:"k",Ļ:"L",Ņ:"N",Ū:"U",Ќ:"Kj",ќ:"kj",Љ:"Lj",љ:"lj",Њ:"Nj",њ:"nj",Тс:"Ts",тс:"ts",ą:"a",ć:"c",ę:"e",ł:"l",ń:"n",ś:"s",ź:"z",ż:"z",Ą:"A",Ć:"C",Ę:"E",Ł:"L",Ń:"N",Ś:"S",Ź:"Z",Ż:"Z",Є:"Ye",І:"I",Ї:"Yi",Ґ:"G",є:"ye",і:"i",ї:"yi",ґ:"g",ă:"a",Ă:"A",ș:"s",Ș:"S",ț:"t",Ț:"T",ţ:"t",Ţ:"T",а:"a",б:"b",в:"v",г:"g",д:"d",е:"e",ё:"yo",ж:"zh",з:"z",и:"i",й:"i",к:"k",л:"l",м:"m",н:"n",о:"o",п:"p",р:"r",с:"s",т:"t",у:"u",ф:"f",х:"kh",ц:"c",ч:"ch",ш:"sh",щ:"sh",ъ:"",ы:"y",ь:"",э:"e",ю:"yu",я:"ya",А:"A",Б:"B",В:"V",Г:"G",Д:"D",Е:"E",Ё:"Yo",Ж:"Zh",З:"Z",И:"I",Й:"I",К:"K",Л:"L",М:"M",Н:"N",О:"O",П:"P",Р:"R",С:"S",Т:"T",У:"U",Ф:"F",Х:"Kh",Ц:"C",Ч:"Ch",Ш:"Sh",Щ:"Sh",Ъ:"",Ы:"Y",Ь:"",Э:"E",Ю:"Yu",Я:"Ya",ђ:"dj",ј:"j",ћ:"c",џ:"dz",Ђ:"Dj",Ј:"j",Ћ:"C",Џ:"Dz",ľ:"l",ĺ:"l",ŕ:"r",Ľ:"L",Ĺ:"L",Ŕ:"R",ş:"s",Ş:"S",ı:"i",İ:"I",ğ:"g",Ğ:"G",ả:"a",Ả:"A",ẳ:"a",Ẳ:"A",ẩ:"a",Ẩ:"A",đ:"d",Đ:"D",ẹ:"e",Ẹ:"E",ẽ:"e",Ẽ:"E",ẻ:"e",Ẻ:"E",ế:"e",Ế:"E",ề:"e",Ề:"E",ệ:"e",Ệ:"E",ễ:"e",Ễ:"E",ể:"e",Ể:"E",ỏ:"o",ọ:"o",Ọ:"o",ố:"o",Ố:"O",ồ:"o",Ồ:"O",ổ:"o",Ổ:"O",ộ:"o",Ộ:"O",ỗ:"o",Ỗ:"O",ơ:"o",Ơ:"O",ớ:"o",Ớ:"O",ờ:"o",Ờ:"O",ợ:"o",Ợ:"O",ỡ:"o",Ỡ:"O",Ở:"o",ở:"o",ị:"i",Ị:"I",ĩ:"i",Ĩ:"I",ỉ:"i",Ỉ:"i",ủ:"u",Ủ:"U",ụ:"u",Ụ:"U",ũ:"u",Ũ:"U",ư:"u",Ư:"U",ứ:"u",Ứ:"U",ừ:"u",Ừ:"U",ự:"u",Ự:"U",ữ:"u",Ữ:"U",ử:"u",Ử:"ư",ỷ:"y",Ỷ:"y",ỳ:"y",Ỳ:"Y",ỵ:"y",Ỵ:"Y",ỹ:"y",Ỹ:"Y",ạ:"a",Ạ:"A",ấ:"a",Ấ:"A",ầ:"a",Ầ:"A",ậ:"a",Ậ:"A",ẫ:"a",Ẫ:"A",ắ:"a",Ắ:"A",ằ:"a",Ằ:"A",ặ:"a",Ặ:"A",ẵ:"a",Ẵ:"A","⓪":"0","①":"1","②":"2","③":"3","④":"4","⑤":"5","⑥":"6","⑦":"7","⑧":"8","⑨":"9","⑩":"10","⑪":"11","⑫":"12","⑬":"13","⑭":"14","⑮":"15","⑯":"16","⑰":"17","⑱":"18","⑲":"18","⑳":"18","⓵":"1","⓶":"2","⓷":"3","⓸":"4","⓹":"5","⓺":"6","⓻":"7","⓼":"8","⓽":"9","⓾":"10","⓿":"0","⓫":"11","⓬":"12","⓭":"13","⓮":"14","⓯":"15","⓰":"16","⓱":"17","⓲":"18","⓳":"19","⓴":"20","Ⓐ":"A","Ⓑ":"B","Ⓒ":"C","Ⓓ":"D","Ⓔ":"E","Ⓕ":"F","Ⓖ":"G","Ⓗ":"H","Ⓘ":"I","Ⓙ":"J","Ⓚ":"K","Ⓛ":"L","Ⓜ":"M","Ⓝ":"N","Ⓞ":"O","Ⓟ":"P","Ⓠ":"Q","Ⓡ":"R","Ⓢ":"S","Ⓣ":"T","Ⓤ":"U","Ⓥ":"V","Ⓦ":"W","Ⓧ":"X","Ⓨ":"Y","Ⓩ":"Z","ⓐ":"a","ⓑ":"b","ⓒ":"c","ⓓ":"d","ⓔ":"e","ⓕ":"f","ⓖ":"g","ⓗ":"h","ⓘ":"i","ⓙ":"j","ⓚ":"k","ⓛ":"l","ⓜ":"m","ⓝ":"n","ⓞ":"o","ⓟ":"p","ⓠ":"q","ⓡ":"r","ⓢ":"s","ⓣ":"t","ⓤ":"u","ⓦ":"v","ⓥ":"w","ⓧ":"x","ⓨ":"y","ⓩ":"z","“":'"',"”":'"',"‘":"'","’":"'","∂":"d",ƒ:"f","™":"(TM)","©":"(C)",œ:"oe",Œ:"OE","®":"(R)","†":"+","℠":"(SM)","…":"...","˚":"o",º:"o",ª:"a","•":"*","၊":",","။":".",$:"USD","€":"EUR","₢":"BRN","₣":"FRF","£":"GBP","₤":"ITL","₦":"NGN","₧":"ESP","₩":"KRW","₪":"ILS","₫":"VND","₭":"LAK","₮":"MNT","₯":"GRD","₱":"ARS","₲":"PYG","₳":"ARA","₴":"UAH","₵":"GHS","¢":"cent","¥":"CNY",元:"CNY",円:"YEN","﷼":"IRR","₠":"EWE","฿":"THB","₨":"INR","₹":"INR","₰":"PF","₺":"TRY","؋":"AFN","₼":"AZN",лв:"BGN","៛":"KHR","₡":"CRC","₸":"KZT",ден:"MKD",zł:"PLN","₽":"RUB","₾":"GEL"},o=["်","ް"],i={"ာ":"a","ါ":"a","ေ":"e","ဲ":"e","ိ":"i","ီ":"i","ို":"o","ု":"u","ူ":"u","ေါင်":"aung","ော":"aw","ော်":"aw","ေါ":"aw","ေါ်":"aw","်":"်","က်":"et","ိုက်":"aik","ောက်":"auk","င်":"in","ိုင်":"aing","ောင်":"aung","စ်":"it","ည်":"i","တ်":"at","ိတ်":"eik","ုတ်":"ok","ွတ်":"ut","ေတ်":"it","ဒ်":"d","ိုဒ်":"ok","ုဒ်":"ait","န်":"an","ာန်":"an","ိန်":"ein","ုန်":"on","ွန်":"un","ပ်":"at","ိပ်":"eik","ုပ်":"ok","ွပ်":"ut","န်ုပ်":"nub","မ်":"an","ိမ်":"ein","ုမ်":"on","ွမ်":"un","ယ်":"e","ိုလ်":"ol","ဉ်":"in","ံ":"an","ိံ":"ein","ုံ":"on","ައް":"ah","ަށް":"ah"},s={en:{},az:{ç:"c",ə:"e",ğ:"g",ı:"i",ö:"o",ş:"s",ü:"u",Ç:"C",Ə:"E",Ğ:"G",İ:"I",Ö:"O",Ş:"S",Ü:"U"},cs:{č:"c",ď:"d",ě:"e",ň:"n",ř:"r",š:"s",ť:"t",ů:"u",ž:"z",Č:"C",Ď:"D",Ě:"E",Ň:"N",Ř:"R",Š:"S",Ť:"T",Ů:"U",Ž:"Z"},fi:{ä:"a",Ä:"A",ö:"o",Ö:"O"},hu:{ä:"a",Ä:"A",ö:"o",Ö:"O",ü:"u",Ü:"U",ű:"u",Ű:"U"},lt:{ą:"a",č:"c",ę:"e",ė:"e",į:"i",š:"s",ų:"u",ū:"u",ž:"z",Ą:"A",Č:"C",Ę:"E",Ė:"E",Į:"I",Š:"S",Ų:"U",Ū:"U"},lv:{ā:"a",č:"c",ē:"e",ģ:"g",ī:"i",ķ:"k",ļ:"l",ņ:"n",š:"s",ū:"u",ž:"z",Ā:"A",Č:"C",Ē:"E",Ģ:"G",Ī:"i",Ķ:"k",Ļ:"L",Ņ:"N",Š:"S",Ū:"u",Ž:"Z"},pl:{ą:"a",ć:"c",ę:"e",ł:"l",ń:"n",ó:"o",ś:"s",ź:"z",ż:"z",Ą:"A",Ć:"C",Ę:"e",Ł:"L",Ń:"N",Ó:"O",Ś:"S",Ź:"Z",Ż:"Z"},sv:{ä:"a",Ä:"A",ö:"o",Ö:"O"},sk:{ä:"a",Ä:"A"},sr:{љ:"lj",њ:"nj",Љ:"Lj",Њ:"Nj",đ:"dj",Đ:"Dj"},tr:{Ü:"U",Ö:"O",ü:"u",ö:"o"}},a={ar:{"∆":"delta","∞":"la-nihaya","♥":"hob","&":"wa","|":"aw","<":"aqal-men",">":"akbar-men","∑":"majmou","¤":"omla"},az:{},ca:{"∆":"delta","∞":"infinit","♥":"amor","&":"i","|":"o","<":"menys que",">":"mes que","∑":"suma dels","¤":"moneda"},cs:{"∆":"delta","∞":"nekonecno","♥":"laska","&":"a","|":"nebo","<":"mensi nez",">":"vetsi nez","∑":"soucet","¤":"mena"},de:{"∆":"delta","∞":"unendlich","♥":"Liebe","&":"und","|":"oder","<":"kleiner als",">":"groesser als","∑":"Summe von","¤":"Waehrung"},dv:{"∆":"delta","∞":"kolunulaa","♥":"loabi","&":"aai","|":"noonee","<":"ah vure kuda",">":"ah vure bodu","∑":"jumula","¤":"faisaa"},en:{"∆":"delta","∞":"infinity","♥":"love","&":"and","|":"or","<":"less than",">":"greater than","∑":"sum","¤":"currency"},es:{"∆":"delta","∞":"infinito","♥":"amor","&":"y","|":"u","<":"menos que",">":"mas que","∑":"suma de los","¤":"moneda"},fa:{"∆":"delta","∞":"bi-nahayat","♥":"eshgh","&":"va","|":"ya","<":"kamtar-az",">":"bishtar-az","∑":"majmooe","¤":"vahed"},fi:{"∆":"delta","∞":"aarettomyys","♥":"rakkaus","&":"ja","|":"tai","<":"pienempi kuin",">":"suurempi kuin","∑":"summa","¤":"valuutta"},fr:{"∆":"delta","∞":"infiniment","♥":"Amour","&":"et","|":"ou","<":"moins que",">":"superieure a","∑":"somme des","¤":"monnaie"},ge:{"∆":"delta","∞":"usasruloba","♥":"siqvaruli","&":"da","|":"an","<":"naklebi",">":"meti","∑":"jami","¤":"valuta"},gr:{},hu:{"∆":"delta","∞":"vegtelen","♥":"szerelem","&":"es","|":"vagy","<":"kisebb mint",">":"nagyobb mint","∑":"szumma","¤":"penznem"},it:{"∆":"delta","∞":"infinito","♥":"amore","&":"e","|":"o","<":"minore di",">":"maggiore di","∑":"somma","¤":"moneta"},lt:{"∆":"delta","∞":"begalybe","♥":"meile","&":"ir","|":"ar","<":"maziau nei",">":"daugiau nei","∑":"suma","¤":"valiuta"},lv:{"∆":"delta","∞":"bezgaliba","♥":"milestiba","&":"un","|":"vai","<":"mazak neka",">":"lielaks neka","∑":"summa","¤":"valuta"},my:{"∆":"kwahkhyaet","∞":"asaonasme","♥":"akhyait","&":"nhin","|":"tho","<":"ngethaw",">":"kyithaw","∑":"paungld","¤":"ngwekye"},mk:{},nl:{"∆":"delta","∞":"oneindig","♥":"liefde","&":"en","|":"of","<":"kleiner dan",">":"groter dan","∑":"som","¤":"valuta"},pl:{"∆":"delta","∞":"nieskonczonosc","♥":"milosc","&":"i","|":"lub","<":"mniejsze niz",">":"wieksze niz","∑":"suma","¤":"waluta"},pt:{"∆":"delta","∞":"infinito","♥":"amor","&":"e","|":"ou","<":"menor que",">":"maior que","∑":"soma","¤":"moeda"},ro:{"∆":"delta","∞":"infinit","♥":"dragoste","&":"si","|":"sau","<":"mai mic ca",">":"mai mare ca","∑":"suma","¤":"valuta"},ru:{"∆":"delta","∞":"beskonechno","♥":"lubov","&":"i","|":"ili","<":"menshe",">":"bolshe","∑":"summa","¤":"valjuta"},sk:{"∆":"delta","∞":"nekonecno","♥":"laska","&":"a","|":"alebo","<":"menej ako",">":"viac ako","∑":"sucet","¤":"mena"},sr:{},tr:{"∆":"delta","∞":"sonsuzluk","♥":"ask","&":"ve","|":"veya","<":"kucuktur",">":"buyuktur","∑":"toplam","¤":"para birimi"},uk:{"∆":"delta","∞":"bezkinechnist","♥":"lubov","&":"i","|":"abo","<":"menshe",">":"bilshe","∑":"suma","¤":"valjuta"},vn:{"∆":"delta","∞":"vo cuc","♥":"yeu","&":"va","|":"hoac","<":"nho hon",">":"lon hon","∑":"tong","¤":"tien te"}},l=[";","?",":","@","&","=","+","$",",","/"].join(""),u=[";","?",":","@","&","=","+","$",","].join(""),c=[".","!","~","*","'","(",")"].join(""),f=function(E,b){var T="-",m="",y="",D=!0,G={},H,k,U,w,B,O,V,J,te,R,M,K,ce,ye,Ce="";if(typeof E!="string")return"";if(typeof b=="string"&&(T=b),V=a.en,J=s.en,typeof b=="object"){H=b.maintainCase||!1,G=b.custom&&typeof b.custom=="object"?b.custom:G,U=+b.truncate>1&&b.truncate||!1,w=b.uric||!1,B=b.uricNoSlash||!1,O=b.mark||!1,D=!(b.symbols===!1||b.lang===!1),T=b.separator||T,w&&(Ce+=l),B&&(Ce+=u),O&&(Ce+=c),V=b.lang&&a[b.lang]&&D?a[b.lang]:D?a.en:{},J=b.lang&&s[b.lang]?s[b.lang]:b.lang===!1||b.lang===!0?{}:s.en,b.titleCase&&typeof b.titleCase.length=="number"&&Array.prototype.toString.call(b.titleCase)?(b.titleCase.forEach(function(be){G[be+""]=be+""}),k=!0):k=!!b.titleCase,b.custom&&typeof b.custom.length=="number"&&Array.prototype.toString.call(b.custom)&&b.custom.forEach(function(be){G[be+""]=be+""}),Object.keys(G).forEach(function(be){var tt;be.length>1?tt=new RegExp("\\b"+p(be)+"\\b","gi"):tt=new RegExp(p(be),"gi"),E=E.replace(tt,G[be])});for(M in G)Ce+=M}for(Ce+=T,Ce=p(Ce),E=E.replace(/(^\s+|\s+$)/g,""),ce=!1,ye=!1,R=0,K=E.length;R=0?(y+=M,M=""):ye===!0?(M=i[y]+r[M],y=""):M=ce&&r[M].match(/[A-Za-z0-9]/)?" "+r[M]:r[M],ce=!1,ye=!1):M in i?(y+=M,M="",R===K-1&&(M=i[y]),ye=!0):V[M]&&!(w&&l.indexOf(M)!==-1)&&!(B&&u.indexOf(M)!==-1)?(M=ce||m.substr(-1).match(/[A-Za-z0-9]/)?T+V[M]:V[M],M+=E[R+1]!==void 0&&E[R+1].match(/[A-Za-z0-9]/)?T:"",ce=!0):(ye===!0?(M=i[y]+M,y="",ye=!1):ce&&(/[A-Za-z0-9]/.test(M)||m.substr(-1).match(/A-Za-z0-9]/))&&(M=" "+M),ce=!1),m+=M.replace(new RegExp("[^\\w\\s"+Ce+"_-]","g"),T);return k&&(m=m.replace(/(\w)(\S*)/g,function(be,tt,Et){var nt=tt.toUpperCase()+(Et!==null?Et:"");return Object.keys(G).indexOf(nt.toLowerCase())<0?nt:nt.toLowerCase()})),m=m.replace(/\s+/g,T).replace(new RegExp("\\"+T+"+","g"),T).replace(new RegExp("(^\\"+T+"+|\\"+T+"+$)","g"),""),U&&m.length>U&&(te=m.charAt(U)===T,m=m.slice(0,U),te||(m=m.slice(0,m.lastIndexOf(T)))),!H&&!k&&(m=m.toLowerCase()),m},d=function(E){return function(T){return f(T,E)}},p=function(E){return E.replace(/[-\\^$*+?.()|[\]{}\/]/g,"\\$&")},g=function(v,E){for(var b in E)if(E[b]===v)return!0};if(typeof t<"u"&&t.exports)t.exports=f,t.exports.createSlug=d;else if(typeof define<"u"&&define.amd)define([],function(){return f});else try{if(n.getSlug||n.createSlug)throw"speakingurl: globals exists /(getSlug|createSlug)/";n.getSlug=f,n.createSlug=d}catch{}}(e)}}),Qv=gf({"../../node_modules/.pnpm/speakingurl@14.0.1/node_modules/speakingurl/index.js"(e,t){I(),t.exports=Jv()}});I();I();I();I();I();I();I();I();function e0(e){var t;const n=e.name||e._componentTag||e.__VUE_DEVTOOLS_COMPONENT_GUSSED_NAME__||e.__name;return n==="index"&&((t=e.__file)!=null&&t.endsWith("index.vue"))?"":n}function t0(e){const t=e.__file;if(t)return Nv(Mv(t,".vue"))}function rl(e,t){return e.type.__VUE_DEVTOOLS_COMPONENT_GUSSED_NAME__=t,t}function $o(e){if(e.__VUE_DEVTOOLS_NEXT_APP_RECORD__)return e.__VUE_DEVTOOLS_NEXT_APP_RECORD__;if(e.root)return e.appContext.app.__VUE_DEVTOOLS_NEXT_APP_RECORD__}async function n0(e){const{app:t,uid:n,instance:r}=e;try{if(r.__VUE_DEVTOOLS_NEXT_UID__)return r.__VUE_DEVTOOLS_NEXT_UID__;const o=await $o(t);if(!o)return null;const i=o.rootInstance===r;return`${o.id}:${i?"root":n}`}catch{}}function vf(e){var t,n;const r=(t=e.subTree)==null?void 0:t.type,o=$o(e);return o?((n=o==null?void 0:o.types)==null?void 0:n.Fragment)===r:!1}function Uo(e){var t,n,r;const o=e0((e==null?void 0:e.type)||{});if(o)return o;if((e==null?void 0:e.root)===e)return"Root";for(const s in(n=(t=e.parent)==null?void 0:t.type)==null?void 0:n.components)if(e.parent.type.components[s]===(e==null?void 0:e.type))return rl(e,s);for(const s in(r=e.appContext)==null?void 0:r.components)if(e.appContext.components[s]===(e==null?void 0:e.type))return rl(e,s);const i=t0((e==null?void 0:e.type)||{});return i||"Anonymous Component"}function Fi(e,t){return t=t||`${e.id}:root`,e.instanceMap.get(t)||e.instanceMap.get(":root")}function r0(){const e={top:0,bottom:0,left:0,right:0,get width(){return e.right-e.left},get height(){return e.bottom-e.top}};return e}var so;function o0(e){return so||(so=document.createRange()),so.selectNode(e),so.getBoundingClientRect()}function i0(e){const t=r0();if(!e.children)return t;for(let n=0,r=e.children.length;ne.bottom)&&(e.bottom=t.bottom),(!e.left||t.lefte.right)&&(e.right=t.right),e}var ol={top:0,left:0,right:0,bottom:0,width:0,height:0};function xn(e){const t=e.subTree.el;return typeof window>"u"?ol:vf(e)?i0(e.subTree):(t==null?void 0:t.nodeType)===1?t==null?void 0:t.getBoundingClientRect():e.subTree.component?xn(e.subTree.component):ol}I();function ws(e){return vf(e)?a0(e.subTree):e.subTree?[e.subTree.el]:[]}function a0(e){if(!e.children)return[];const t=[];return e.children.forEach(n=>{n.component?t.push(...ws(n.component)):n!=null&&n.el&&t.push(n.el)}),t}var Ef="__vue-devtools-component-inspector__",yf="__vue-devtools-component-inspector__card__",bf="__vue-devtools-component-inspector__name__",Tf="__vue-devtools-component-inspector__indicator__",Af={display:"block",zIndex:2147483640,position:"fixed",backgroundColor:"#42b88325",border:"1px solid #42b88350",borderRadius:"5px",transition:"all 0.1s ease-in",pointerEvents:"none"},l0={fontFamily:"Arial, Helvetica, sans-serif",padding:"5px 8px",borderRadius:"4px",textAlign:"left",position:"absolute",left:0,color:"#e9e9e9",fontSize:"14px",fontWeight:600,lineHeight:"24px",backgroundColor:"#42b883",boxShadow:"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)"},u0={display:"inline-block",fontWeight:400,fontStyle:"normal",fontSize:"12px",opacity:.7};function or(){return document.getElementById(Ef)}function c0(){return document.getElementById(yf)}function f0(){return document.getElementById(Tf)}function d0(){return document.getElementById(bf)}function Cs(e){return{left:`${Math.round(e.left*100)/100}px`,top:`${Math.round(e.top*100)/100}px`,width:`${Math.round(e.width*100)/100}px`,height:`${Math.round(e.height*100)/100}px`}}function Ps(e){var t;const n=document.createElement("div");n.id=(t=e.elementId)!=null?t:Ef,Object.assign(n.style,{...Af,...Cs(e.bounds),...e.style});const r=document.createElement("span");r.id=yf,Object.assign(r.style,{...l0,top:e.bounds.top<35?0:"-35px"});const o=document.createElement("span");o.id=bf,o.innerHTML=`<${e.name}>  `;const i=document.createElement("i");return i.id=Tf,i.innerHTML=`${Math.round(e.bounds.width*100)/100} x ${Math.round(e.bounds.height*100)/100}`,Object.assign(i.style,u0),r.appendChild(o),r.appendChild(i),n.appendChild(r),document.body.appendChild(n),n}function Is(e){const t=or(),n=c0(),r=d0(),o=f0();t&&(Object.assign(t.style,{...Af,...Cs(e.bounds)}),Object.assign(n.style,{top:e.bounds.top<35?0:"-35px"}),r.innerHTML=`<${e.name}>  `,o.innerHTML=`${Math.round(e.bounds.width*100)/100} x ${Math.round(e.bounds.height*100)/100}`)}function p0(e){const t=xn(e);if(!t.width&&!t.height)return;const n=Uo(e);or()?Is({bounds:t,name:n}):Ps({bounds:t,name:n})}function Sf(){const e=or();e&&(e.style.display="none")}var Hi=null;function zi(e){const t=e.target;if(t){const n=t.__vueParentComponent;if(n&&(Hi=n,n.vnode.el)){const o=xn(n),i=Uo(n);or()?Is({bounds:o,name:i}):Ps({bounds:o,name:i})}}}function h0(e,t){var n;if(e.preventDefault(),e.stopPropagation(),Hi){const r=(n=Xe.value)==null?void 0:n.app;n0({app:r,uid:r.uid,instance:Hi}).then(o=>{t(o)})}}var Oo=null;function m0(){Sf(),window.removeEventListener("mouseover",zi),window.removeEventListener("click",Oo,!0),Oo=null}function _0(){return window.addEventListener("mouseover",zi),new Promise(e=>{function t(n){n.preventDefault(),n.stopPropagation(),h0(n,r=>{window.removeEventListener("click",t,!0),Oo=null,window.removeEventListener("mouseover",zi);const o=or();o&&(o.style.display="none"),e(JSON.stringify({id:r}))})}Oo=t,window.addEventListener("click",t,!0)})}function g0(e){const t=Fi(Xe.value,e.id);if(t){const[n]=ws(t);if(typeof n.scrollIntoView=="function")n.scrollIntoView({behavior:"smooth"});else{const r=xn(t),o=document.createElement("div"),i={...Cs(r),position:"absolute"};Object.assign(o.style,i),document.body.appendChild(o),o.scrollIntoView({behavior:"smooth"}),setTimeout(()=>{document.body.removeChild(o)},2e3)}setTimeout(()=>{const r=xn(t);if(r.width||r.height){const o=Uo(t),i=or();i?Is({...e,name:o,bounds:r}):Ps({...e,name:o,bounds:r}),setTimeout(()=>{i&&(i.style.display="none")},1500)}},1200)}}I();var il,sl;(sl=(il=Z).__VUE_DEVTOOLS_COMPONENT_INSPECTOR_ENABLED__)!=null||(il.__VUE_DEVTOOLS_COMPONENT_INSPECTOR_ENABLED__=!0);function v0(e){let t=0;const n=setInterval(()=>{Z.__VUE_INSPECTOR__&&(clearInterval(n),t+=30,e()),t>=5e3&&clearInterval(n)},30)}function E0(){const e=Z.__VUE_INSPECTOR__,t=e.openInEditor;e.openInEditor=async(...n)=>{e.disable(),t(...n)}}function y0(){return new Promise(e=>{function t(){E0(),e(Z.__VUE_INSPECTOR__)}Z.__VUE_INSPECTOR__?t():v0(()=>{t()})})}I();I();function b0(e){return!!(e&&e.__v_isReadonly)}function Of(e){return b0(e)?Of(e.__v_raw):!!(e&&e.__v_isReactive)}function mi(e){return!!(e&&e.__v_isRef===!0)}function _r(e){const t=e&&e.__v_raw;return t?_r(t):e}var T0=class{constructor(){this.refEditor=new A0}set(e,t,n,r){const o=Array.isArray(t)?t:t.split(".");for(;o.length>1;){const a=o.shift();e instanceof Map&&(e=e.get(a)),e instanceof Set?e=Array.from(e.values())[a]:e=e[a],this.refEditor.isRef(e)&&(e=this.refEditor.get(e))}const i=o[0],s=this.refEditor.get(e)[i];r?r(e,i,n):this.refEditor.isRef(s)?this.refEditor.set(s,n):e[i]=n}get(e,t){const n=Array.isArray(t)?t:t.split(".");for(let r=0;r"u")return!1;const r=Array.isArray(t)?t.slice():t.split("."),o=n?2:1;for(;e&&r.length>o;){const i=r.shift();e=e[i],this.refEditor.isRef(e)&&(e=this.refEditor.get(e))}return e!=null&&Object.prototype.hasOwnProperty.call(e,r[0])}createDefaultSetCallback(e){return(t,n,r)=>{if((e.remove||e.newKey)&&(Array.isArray(t)?t.splice(n,1):_r(t)instanceof Map?t.delete(n):_r(t)instanceof Set?t.delete(Array.from(t.values())[n]):Reflect.deleteProperty(t,n)),!e.remove){const o=t[e.newKey||n];this.refEditor.isRef(o)?this.refEditor.set(o,r):_r(t)instanceof Map?t.set(e.newKey||n,r):_r(t)instanceof Set?t.add(r):t[e.newKey||n]=r}}}},A0=class{set(e,t){if(mi(e))e.value=t;else{if(e instanceof Set&&Array.isArray(t)){e.clear(),t.forEach(o=>e.add(o));return}const n=Object.keys(t);if(e instanceof Map){const o=new Set(e.keys());n.forEach(i=>{e.set(i,Reflect.get(t,i)),o.delete(i)}),o.forEach(i=>e.delete(i));return}const r=new Set(Object.keys(e));n.forEach(o=>{Reflect.set(e,o,Reflect.get(t,o)),r.delete(o)}),r.forEach(o=>Reflect.deleteProperty(e,o))}}get(e){return mi(e)?e.value:e}isRef(e){return mi(e)||Of(e)}};I();I();I();var S0="__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS_STATE__";function O0(){if(!pf||typeof localStorage>"u"||localStorage===null)return{recordingState:!1,mouseEventEnabled:!1,keyboardEventEnabled:!1,componentEventEnabled:!1,performanceEventEnabled:!1,selected:""};const e=localStorage.getItem(S0);return e?JSON.parse(e):{recordingState:!1,mouseEventEnabled:!1,keyboardEventEnabled:!1,componentEventEnabled:!1,performanceEventEnabled:!1,selected:""}}I();I();I();var al,ll;(ll=(al=Z).__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS)!=null||(al.__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS=[]);var k0=new Proxy(Z.__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS,{get(e,t,n){return Reflect.get(e,t,n)}});function x0(e,t){Fe.timelineLayersState[t.id]=!1,k0.push({...e,descriptorId:t.id,appRecord:$o(t.app)})}var ul,cl;(cl=(ul=Z).__VUE_DEVTOOLS_KIT_INSPECTOR__)!=null||(ul.__VUE_DEVTOOLS_KIT_INSPECTOR__=[]);var Rs=new Proxy(Z.__VUE_DEVTOOLS_KIT_INSPECTOR__,{get(e,t,n){return Reflect.get(e,t,n)}}),kf=qn(()=>{ir.hooks.callHook("sendInspectorToClient",xf())});function w0(e,t){var n,r;Rs.push({options:e,descriptor:t,treeFilterPlaceholder:(n=e.treeFilterPlaceholder)!=null?n:"Search tree...",stateFilterPlaceholder:(r=e.stateFilterPlaceholder)!=null?r:"Search state...",treeFilter:"",selectedNodeId:"",appRecord:$o(t.app)}),kf()}function xf(){return Rs.filter(e=>e.descriptor.app===Xe.value.app).filter(e=>e.descriptor.id!=="components").map(e=>{var t;const n=e.descriptor,r=e.options;return{id:r.id,label:r.label,logo:n.logo,icon:`custom-ic-baseline-${(t=r==null?void 0:r.icon)==null?void 0:t.replace(/_/g,"-")}`,packageName:n.packageName,homepage:n.homepage,pluginId:n.id}})}function fo(e,t){return Rs.find(n=>n.options.id===e&&(t?n.descriptor.app===t:!0))}function C0(){const e=mf();e.hook("addInspector",({inspector:r,plugin:o})=>{w0(r,o.descriptor)});const t=qn(async({inspectorId:r,plugin:o})=>{var i;if(!r||!((i=o==null?void 0:o.descriptor)!=null&&i.app)||Fe.highPerfModeEnabled)return;const s=fo(r,o.descriptor.app),a={app:o.descriptor.app,inspectorId:r,filter:(s==null?void 0:s.treeFilter)||"",rootNodes:[]};await new Promise(l=>{e.callHookWith(async u=>{await Promise.all(u.map(c=>c(a))),l()},"getInspectorTree")}),e.callHookWith(async l=>{await Promise.all(l.map(u=>u({inspectorId:r,rootNodes:a.rootNodes})))},"sendInspectorTreeToClient")},120);e.hook("sendInspectorTree",t);const n=qn(async({inspectorId:r,plugin:o})=>{var i;if(!r||!((i=o==null?void 0:o.descriptor)!=null&&i.app)||Fe.highPerfModeEnabled)return;const s=fo(r,o.descriptor.app),a={app:o.descriptor.app,inspectorId:r,nodeId:(s==null?void 0:s.selectedNodeId)||"",state:null},l={currentTab:`custom-inspector:${r}`};a.nodeId&&await new Promise(u=>{e.callHookWith(async c=>{await Promise.all(c.map(f=>f(a,l))),u()},"getInspectorState")}),e.callHookWith(async u=>{await Promise.all(u.map(c=>c({inspectorId:r,nodeId:a.nodeId,state:a.state})))},"sendInspectorStateToClient")},120);return e.hook("sendInspectorState",n),e.hook("customInspectorSelectNode",({inspectorId:r,nodeId:o,plugin:i})=>{const s=fo(r,i.descriptor.app);s&&(s.selectedNodeId=o)}),e.hook("timelineLayerAdded",({options:r,plugin:o})=>{x0(r,o.descriptor)}),e.hook("timelineEventAdded",({options:r,plugin:o})=>{var i;const s=["performance","component-event","keyboard","mouse"];Fe.highPerfModeEnabled||!((i=Fe.timelineLayersState)!=null&&i[o.descriptor.id])&&!s.includes(r.layerId)||e.callHookWith(async a=>{await Promise.all(a.map(l=>l(r)))},"sendTimelineEventToClient")}),e.hook("getComponentInstances",async({app:r})=>{const o=r.__VUE_DEVTOOLS_NEXT_APP_RECORD__;if(!o)return null;const i=o.id.toString();return[...o.instanceMap].filter(([a])=>a.split(":")[0]===i).map(([,a])=>a)}),e.hook("getComponentBounds",async({instance:r})=>xn(r)),e.hook("getComponentName",({instance:r})=>Uo(r)),e.hook("componentHighlight",({uid:r})=>{const o=Xe.value.instanceMap.get(r);o&&p0(o)}),e.hook("componentUnhighlight",()=>{Sf()}),e}var fl,dl;(dl=(fl=Z).__VUE_DEVTOOLS_KIT_APP_RECORDS__)!=null||(fl.__VUE_DEVTOOLS_KIT_APP_RECORDS__=[]);var pl,hl;(hl=(pl=Z).__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__)!=null||(pl.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__={});var ml,_l;(_l=(ml=Z).__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__)!=null||(ml.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__="");var gl,vl;(vl=(gl=Z).__VUE_DEVTOOLS_KIT_CUSTOM_TABS__)!=null||(gl.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__=[]);var El,yl;(yl=(El=Z).__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__)!=null||(El.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__=[]);var bn="__VUE_DEVTOOLS_KIT_GLOBAL_STATE__";function P0(){return{connected:!1,clientConnected:!1,vitePluginDetected:!0,appRecords:[],activeAppRecordId:"",tabs:[],commands:[],highPerfModeEnabled:!0,devtoolsClientDetected:{},perfUniqueGroupId:0,timelineLayersState:O0()}}var bl,Tl;(Tl=(bl=Z)[bn])!=null||(bl[bn]=P0());var I0=qn(e=>{ir.hooks.callHook("devtoolsStateUpdated",{state:e})});qn((e,t)=>{ir.hooks.callHook("devtoolsConnectedUpdated",{state:e,oldState:t})});var jo=new Proxy(Z.__VUE_DEVTOOLS_KIT_APP_RECORDS__,{get(e,t,n){return t==="value"?Z.__VUE_DEVTOOLS_KIT_APP_RECORDS__:Z.__VUE_DEVTOOLS_KIT_APP_RECORDS__[t]}}),Xe=new Proxy(Z.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__,{get(e,t,n){return t==="value"?Z.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__:t==="id"?Z.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__:Z.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__[t]}});function wf(){I0({...Z[bn],appRecords:jo.value,activeAppRecordId:Xe.id,tabs:Z.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__,commands:Z.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__})}function R0(e){Z.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__=e,wf()}function L0(e){Z.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__=e,wf()}var Fe=new Proxy(Z[bn],{get(e,t){return t==="appRecords"?jo:t==="activeAppRecordId"?Xe.id:t==="tabs"?Z.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__:t==="commands"?Z.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__:Z[bn][t]},deleteProperty(e,t){return delete e[t],!0},set(e,t,n){return{...Z[bn]},e[t]=n,Z[bn][t]=n,!0}});function D0(e={}){var t,n,r;const{file:o,host:i,baseUrl:s=window.location.origin,line:a=0,column:l=0}=e;if(o){if(i==="chrome-extension"){const u=o.replace(/\\/g,"\\\\"),c=(n=(t=window.VUE_DEVTOOLS_CONFIG)==null?void 0:t.openInEditorHost)!=null?n:"/";fetch(`${c}__open-in-editor?file=${encodeURI(o)}`).then(f=>{if(!f.ok){const d=`Opening component ${u} failed`;console.log(`%c${d}`,"color:red")}})}else if(Fe.vitePluginDetected){const u=(r=Z.__VUE_DEVTOOLS_OPEN_IN_EDITOR_BASE_URL__)!=null?r:s;Z.__VUE_INSPECTOR__.openInEditor(u,o,a,l)}}}I();I();I();I();I();var Al,Sl;(Sl=(Al=Z).__VUE_DEVTOOLS_KIT_PLUGIN_BUFFER__)!=null||(Al.__VUE_DEVTOOLS_KIT_PLUGIN_BUFFER__=[]);var Ls=new Proxy(Z.__VUE_DEVTOOLS_KIT_PLUGIN_BUFFER__,{get(e,t,n){return Reflect.get(e,t,n)}});function Bi(e){const t={};return Object.keys(e).forEach(n=>{t[n]=e[n].defaultValue}),t}function Ds(e){return`__VUE_DEVTOOLS_NEXT_PLUGIN_SETTINGS__${e}__`}function V0(e){var t,n,r;const o=(n=(t=Ls.find(i=>{var s;return i[0].id===e&&!!((s=i[0])!=null&&s.settings)}))==null?void 0:t[0])!=null?n:null;return(r=o==null?void 0:o.settings)!=null?r:null}function Cf(e,t){var n,r,o;const i=Ds(e);if(i){const s=localStorage.getItem(i);if(s)return JSON.parse(s)}if(e){const s=(r=(n=Ls.find(a=>a[0].id===e))==null?void 0:n[0])!=null?r:null;return Bi((o=s==null?void 0:s.settings)!=null?o:{})}return Bi(t)}function N0(e,t){const n=Ds(e);localStorage.getItem(n)||localStorage.setItem(n,JSON.stringify(Bi(t)))}function M0(e,t,n){const r=Ds(e),o=localStorage.getItem(r),i=JSON.parse(o||"{}"),s={...i,[t]:n};localStorage.setItem(r,JSON.stringify(s)),ir.hooks.callHookWith(a=>{a.forEach(l=>l({pluginId:e,key:t,oldValue:i[t],newValue:n,settings:s}))},"setPluginSettings")}I();I();I();I();I();I();I();I();I();I();I();var Ol,kl,ct=(kl=(Ol=Z).__VUE_DEVTOOLS_HOOK)!=null?kl:Ol.__VUE_DEVTOOLS_HOOK=mf(),F0={vueAppInit(e){ct.hook("app:init",e)},vueAppUnmount(e){ct.hook("app:unmount",e)},vueAppConnected(e){ct.hook("app:connected",e)},componentAdded(e){return ct.hook("component:added",e)},componentEmit(e){return ct.hook("component:emit",e)},componentUpdated(e){return ct.hook("component:updated",e)},componentRemoved(e){return ct.hook("component:removed",e)},setupDevtoolsPlugin(e){ct.hook("devtools-plugin:setup",e)},perfStart(e){return ct.hook("perf:start",e)},perfEnd(e){return ct.hook("perf:end",e)}},Pf={on:F0,setupDevToolsPlugin(e,t){return ct.callHook("devtools-plugin:setup",e,t)}},H0=class{constructor({plugin:e,ctx:t}){this.hooks=t.hooks,this.plugin=e}get on(){return{visitComponentTree:e=>{this.hooks.hook("visitComponentTree",e)},inspectComponent:e=>{this.hooks.hook("inspectComponent",e)},editComponentState:e=>{this.hooks.hook("editComponentState",e)},getInspectorTree:e=>{this.hooks.hook("getInspectorTree",e)},getInspectorState:e=>{this.hooks.hook("getInspectorState",e)},editInspectorState:e=>{this.hooks.hook("editInspectorState",e)},inspectTimelineEvent:e=>{this.hooks.hook("inspectTimelineEvent",e)},timelineCleared:e=>{this.hooks.hook("timelineCleared",e)},setPluginSettings:e=>{this.hooks.hook("setPluginSettings",e)}}}notifyComponentUpdate(e){var t;if(Fe.highPerfModeEnabled)return;const n=xf().find(r=>r.packageName===this.plugin.descriptor.packageName);if(n!=null&&n.id){if(e){const r=[e.appContext.app,e.uid,(t=e.parent)==null?void 0:t.uid,e];ct.callHook("component:updated",...r)}else ct.callHook("component:updated");this.hooks.callHook("sendInspectorState",{inspectorId:n.id,plugin:this.plugin})}}addInspector(e){this.hooks.callHook("addInspector",{inspector:e,plugin:this.plugin}),this.plugin.descriptor.settings&&N0(e.id,this.plugin.descriptor.settings)}sendInspectorTree(e){Fe.highPerfModeEnabled||this.hooks.callHook("sendInspectorTree",{inspectorId:e,plugin:this.plugin})}sendInspectorState(e){Fe.highPerfModeEnabled||this.hooks.callHook("sendInspectorState",{inspectorId:e,plugin:this.plugin})}selectInspectorNode(e,t){this.hooks.callHook("customInspectorSelectNode",{inspectorId:e,nodeId:t,plugin:this.plugin})}visitComponentTree(e){return this.hooks.callHook("visitComponentTree",e)}now(){return Fe.highPerfModeEnabled?0:Date.now()}addTimelineLayer(e){this.hooks.callHook("timelineLayerAdded",{options:e,plugin:this.plugin})}addTimelineEvent(e){Fe.highPerfModeEnabled||this.hooks.callHook("timelineEventAdded",{options:e,plugin:this.plugin})}getSettings(e){return Cf(e??this.plugin.descriptor.id,this.plugin.descriptor.settings)}getComponentInstances(e){return this.hooks.callHook("getComponentInstances",{app:e})}getComponentBounds(e){return this.hooks.callHook("getComponentBounds",{instance:e})}getComponentName(e){return this.hooks.callHook("getComponentName",{instance:e})}highlightElement(e){const t=e.__VUE_DEVTOOLS_NEXT_UID__;return this.hooks.callHook("componentHighlight",{uid:t})}unhighlightElement(){return this.hooks.callHook("componentUnhighlight")}},z0=H0;I();I();I();I();var B0="__vue_devtool_undefined__",$0="__vue_devtool_infinity__",U0="__vue_devtool_negative_infinity__",j0="__vue_devtool_nan__";I();I();var K0={[B0]:"undefined",[j0]:"NaN",[$0]:"Infinity",[U0]:"-Infinity"};Object.entries(K0).reduce((e,[t,n])=>(e[n]=t,e),{});I();I();I();I();I();var xl,wl;(wl=(xl=Z).__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__)!=null||(xl.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__=new Set);function W0(e,t){return Pf.setupDevToolsPlugin(e,t)}function G0(e,t){const[n,r]=e;if(n.app!==t)return;const o=new z0({plugin:{setupFn:r,descriptor:n},ctx:ir});n.packageName==="vuex"&&o.on.editInspectorState(i=>{o.sendInspectorState(i.inspectorId)}),r(o)}function If(e){Z.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__.has(e)||Fe.highPerfModeEnabled||(Z.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__.add(e),Ls.forEach(t=>{G0(t,e)}))}I();I();var Nr="__VUE_DEVTOOLS_ROUTER__",Yn="__VUE_DEVTOOLS_ROUTER_INFO__",Cl,Pl;(Pl=(Cl=Z)[Yn])!=null||(Cl[Yn]={currentRoute:null,routes:[]});var Il,Rl;(Rl=(Il=Z)[Nr])!=null||(Il[Nr]={});new Proxy(Z[Yn],{get(e,t){return Z[Yn][t]}});new Proxy(Z[Nr],{get(e,t){if(t==="value")return Z[Nr]}});function q0(e){const t=new Map;return((e==null?void 0:e.getRoutes())||[]).filter(n=>!t.has(n.path)&&t.set(n.path,1))}function Vs(e){return e.map(t=>{let{path:n,name:r,children:o,meta:i}=t;return o!=null&&o.length&&(o=Vs(o)),{path:n,name:r,children:o,meta:i}})}function Y0(e){if(e){const{fullPath:t,hash:n,href:r,path:o,name:i,matched:s,params:a,query:l}=e;return{fullPath:t,hash:n,href:r,path:o,name:i,params:a,query:l,matched:Vs(s)}}return e}function X0(e,t){function n(){var r;const o=(r=e.app)==null?void 0:r.config.globalProperties.$router,i=Y0(o==null?void 0:o.currentRoute.value),s=Vs(q0(o)),a=console.warn;console.warn=()=>{},Z[Yn]={currentRoute:i?nl(i):{},routes:nl(s)},Z[Nr]=o,console.warn=a}n(),Pf.on.componentUpdated(qn(()=>{var r;((r=t.value)==null?void 0:r.app)===e.app&&(n(),!Fe.highPerfModeEnabled&&ir.hooks.callHook("routerInfoUpdated",{state:Z[Yn]}))},200))}function Z0(e){return{async getInspectorTree(t){const n={...t,app:Xe.value.app,rootNodes:[]};return await new Promise(r=>{e.callHookWith(async o=>{await Promise.all(o.map(i=>i(n))),r()},"getInspectorTree")}),n.rootNodes},async getInspectorState(t){const n={...t,app:Xe.value.app,state:null},r={currentTab:`custom-inspector:${t.inspectorId}`};return await new Promise(o=>{e.callHookWith(async i=>{await Promise.all(i.map(s=>s(n,r))),o()},"getInspectorState")}),n.state},editInspectorState(t){const n=new T0,r={...t,app:Xe.value.app,set:(o,i=t.path,s=t.state.value,a)=>{n.set(o,i,s,a||n.createDefaultSetCallback(t.state))}};e.callHookWith(o=>{o.forEach(i=>i(r))},"editInspectorState")},sendInspectorState(t){const n=fo(t);e.callHook("sendInspectorState",{inspectorId:t,plugin:{descriptor:n.descriptor,setupFn:()=>({})}})},inspectComponentInspector(){return _0()},cancelInspectComponentInspector(){return m0()},getComponentRenderCode(t){const n=Fi(Xe.value,t);if(n)return(n==null?void 0:n.type)instanceof Function?n.type.toString():n.render.toString()},scrollToComponent(t){return g0({id:t})},openInEditor:D0,getVueInspector:y0,toggleApp(t){const n=jo.value.find(r=>r.id===t);n&&(L0(t),R0(n),X0(n,Xe),kf(),If(n.app))},inspectDOM(t){const n=Fi(Xe.value,t);if(n){const[r]=ws(n);r&&(Z.__VUE_DEVTOOLS_INSPECT_DOM_TARGET__=r)}},updatePluginSettings(t,n,r){M0(t,n,r)},getPluginSettings(t){return{options:V0(t),values:Cf(t)}}}}I();var Ll,Dl;(Dl=(Ll=Z).__VUE_DEVTOOLS_ENV__)!=null||(Ll.__VUE_DEVTOOLS_ENV__={vitePluginDetected:!1});var Vl=C0(),Nl,Ml;(Ml=(Nl=Z).__VUE_DEVTOOLS_KIT_CONTEXT__)!=null||(Nl.__VUE_DEVTOOLS_KIT_CONTEXT__={hooks:Vl,get state(){return{...Fe,activeAppRecordId:Xe.id,activeAppRecord:Xe.value,appRecords:jo.value}},api:Z0(Vl)});var ir=Z.__VUE_DEVTOOLS_KIT_CONTEXT__;I();Zv(Qv());var Fl,Hl;(Hl=(Fl=Z).__VUE_DEVTOOLS_NEXT_APP_RECORD_INFO__)!=null||(Fl.__VUE_DEVTOOLS_NEXT_APP_RECORD_INFO__={id:0,appIds:new Set});I();function J0(e){Fe.highPerfModeEnabled=e??!Fe.highPerfModeEnabled,!e&&Xe.value&&If(Xe.value.app)}I();I();I();function Q0(e){Fe.devtoolsClientDetected={...Fe.devtoolsClientDetected,...e};const t=Object.values(Fe.devtoolsClientDetected).some(Boolean);J0(!t)}var zl,Bl;(Bl=(zl=Z).__VUE_DEVTOOLS_UPDATE_CLIENT_DETECTED__)!=null||(zl.__VUE_DEVTOOLS_UPDATE_CLIENT_DETECTED__=Q0);I();I();I();I();I();I();I();var e1=class{constructor(){this.keyToValue=new Map,this.valueToKey=new Map}set(e,t){this.keyToValue.set(e,t),this.valueToKey.set(t,e)}getByKey(e){return this.keyToValue.get(e)}getByValue(e){return this.valueToKey.get(e)}clear(){this.keyToValue.clear(),this.valueToKey.clear()}},Rf=class{constructor(e){this.generateIdentifier=e,this.kv=new e1}register(e,t){this.kv.getByValue(e)||(t||(t=this.generateIdentifier(e)),this.kv.set(t,e))}clear(){this.kv.clear()}getIdentifier(e){return this.kv.getByValue(e)}getValue(e){return this.kv.getByKey(e)}},t1=class extends Rf{constructor(){super(e=>e.name),this.classToAllowedProps=new Map}register(e,t){typeof t=="object"?(t.allowProps&&this.classToAllowedProps.set(e,t.allowProps),super.register(e,t.identifier)):super.register(e,t)}getAllowedProps(e){return this.classToAllowedProps.get(e)}};I();I();function n1(e){if("values"in Object)return Object.values(e);const t=[];for(const n in e)e.hasOwnProperty(n)&&t.push(e[n]);return t}function r1(e,t){const n=n1(e);if("find"in n)return n.find(t);const r=n;for(let o=0;ot(r,n))}function po(e,t){return e.indexOf(t)!==-1}function $l(e,t){for(let n=0;nt.isApplicable(e))}findByName(e){return this.transfomers[e]}};I();I();var i1=e=>Object.prototype.toString.call(e).slice(8,-1),Lf=e=>typeof e>"u",s1=e=>e===null,Mr=e=>typeof e!="object"||e===null||e===Object.prototype?!1:Object.getPrototypeOf(e)===null?!0:Object.getPrototypeOf(e)===Object.prototype,$i=e=>Mr(e)&&Object.keys(e).length===0,un=e=>Array.isArray(e),a1=e=>typeof e=="string",l1=e=>typeof e=="number"&&!isNaN(e),u1=e=>typeof e=="boolean",c1=e=>e instanceof RegExp,Fr=e=>e instanceof Map,Hr=e=>e instanceof Set,Df=e=>i1(e)==="Symbol",f1=e=>e instanceof Date&&!isNaN(e.valueOf()),d1=e=>e instanceof Error,Ul=e=>typeof e=="number"&&isNaN(e),p1=e=>u1(e)||s1(e)||Lf(e)||l1(e)||a1(e)||Df(e),h1=e=>typeof e=="bigint",m1=e=>e===1/0||e===-1/0,_1=e=>ArrayBuffer.isView(e)&&!(e instanceof DataView),g1=e=>e instanceof URL;I();var Vf=e=>e.replace(/\./g,"\\."),_i=e=>e.map(String).map(Vf).join("."),Or=e=>{const t=[];let n="";for(let o=0;onull,()=>{}),kt(h1,"bigint",e=>e.toString(),e=>typeof BigInt<"u"?BigInt(e):(console.error("Please add a BigInt polyfill."),e)),kt(f1,"Date",e=>e.toISOString(),e=>new Date(e)),kt(d1,"Error",(e,t)=>{const n={name:e.name,message:e.message};return t.allowedErrorProps.forEach(r=>{n[r]=e[r]}),n},(e,t)=>{const n=new Error(e.message);return n.name=e.name,n.stack=e.stack,t.allowedErrorProps.forEach(r=>{n[r]=e[r]}),n}),kt(c1,"regexp",e=>""+e,e=>{const t=e.slice(1,e.lastIndexOf("/")),n=e.slice(e.lastIndexOf("/")+1);return new RegExp(t,n)}),kt(Hr,"set",e=>[...e.values()],e=>new Set(e)),kt(Fr,"map",e=>[...e.entries()],e=>new Map(e)),kt(e=>Ul(e)||m1(e),"number",e=>Ul(e)?"NaN":e>0?"Infinity":"-Infinity",Number),kt(e=>e===0&&1/e===-1/0,"number",()=>"-0",Number),kt(g1,"URL",e=>e.toString(),e=>new URL(e))];function Ko(e,t,n,r){return{isApplicable:e,annotation:t,transform:n,untransform:r}}var Mf=Ko((e,t)=>Df(e)?!!t.symbolRegistry.getIdentifier(e):!1,(e,t)=>["symbol",t.symbolRegistry.getIdentifier(e)],e=>e.description,(e,t,n)=>{const r=n.symbolRegistry.getValue(t[1]);if(!r)throw new Error("Trying to deserialize unknown symbol");return r}),v1=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,Uint8ClampedArray].reduce((e,t)=>(e[t.name]=t,e),{}),Ff=Ko(_1,e=>["typed-array",e.constructor.name],e=>[...e],(e,t)=>{const n=v1[t[1]];if(!n)throw new Error("Trying to deserialize unknown typed array");return new n(e)});function Hf(e,t){return e!=null&&e.constructor?!!t.classRegistry.getIdentifier(e.constructor):!1}var zf=Ko(Hf,(e,t)=>["class",t.classRegistry.getIdentifier(e.constructor)],(e,t)=>{const n=t.classRegistry.getAllowedProps(e.constructor);if(!n)return{...e};const r={};return n.forEach(o=>{r[o]=e[o]}),r},(e,t,n)=>{const r=n.classRegistry.getValue(t[1]);if(!r)throw new Error("Trying to deserialize unknown class - check https://github.com/blitz-js/superjson/issues/116#issuecomment-773996564");return Object.assign(Object.create(r.prototype),e)}),Bf=Ko((e,t)=>!!t.customTransformerRegistry.findApplicable(e),(e,t)=>["custom",t.customTransformerRegistry.findApplicable(e).name],(e,t)=>t.customTransformerRegistry.findApplicable(e).serialize(e),(e,t,n)=>{const r=n.customTransformerRegistry.findByName(t[1]);if(!r)throw new Error("Trying to deserialize unknown custom value");return r.deserialize(e)}),E1=[zf,Mf,Bf,Ff],jl=(e,t)=>{const n=$l(E1,o=>o.isApplicable(e,t));if(n)return{value:n.transform(e,t),type:n.annotation(e,t)};const r=$l(Nf,o=>o.isApplicable(e,t));if(r)return{value:r.transform(e,t),type:r.annotation}},$f={};Nf.forEach(e=>{$f[e.annotation]=e});var y1=(e,t,n)=>{if(un(t))switch(t[0]){case"symbol":return Mf.untransform(e,t,n);case"class":return zf.untransform(e,t,n);case"custom":return Bf.untransform(e,t,n);case"typed-array":return Ff.untransform(e,t,n);default:throw new Error("Unknown transformation: "+t)}else{const r=$f[t];if(!r)throw new Error("Unknown transformation: "+t);return r.untransform(e,n)}};I();var Vn=(e,t)=>{const n=e.keys();for(;t>0;)n.next(),t--;return n.next().value};function Uf(e){if(po(e,"__proto__"))throw new Error("__proto__ is not allowed as a property");if(po(e,"prototype"))throw new Error("prototype is not allowed as a property");if(po(e,"constructor"))throw new Error("constructor is not allowed as a property")}var b1=(e,t)=>{Uf(t);for(let n=0;n{if(Uf(t),t.length===0)return n(e);let r=e;for(let i=0;iji(i,t,[...n,...Or(s)]));return}const[r,o]=e;o&&Xn(o,(i,s)=>{ji(i,t,[...n,...Or(s)])}),t(r,n)}function T1(e,t,n){return ji(t,(r,o)=>{e=Ui(e,o,i=>y1(i,r,n))}),e}function A1(e,t){function n(r,o){const i=b1(e,Or(o));r.map(Or).forEach(s=>{e=Ui(e,s,()=>i)})}if(un(t)){const[r,o]=t;r.forEach(i=>{e=Ui(e,Or(i),()=>e)}),o&&Xn(o,n)}else Xn(t,n);return e}var S1=(e,t)=>Mr(e)||un(e)||Fr(e)||Hr(e)||Hf(e,t);function O1(e,t,n){const r=n.get(e);r?r.push(t):n.set(e,[t])}function k1(e,t){const n={};let r;return e.forEach(o=>{if(o.length<=1)return;t||(o=o.map(a=>a.map(String)).sort((a,l)=>a.length-l.length));const[i,...s]=o;i.length===0?r=s.map(_i):n[_i(i)]=s.map(_i)}),r?$i(n)?[r]:[r,n]:$i(n)?void 0:n}var jf=(e,t,n,r,o=[],i=[],s=new Map)=>{var a;const l=p1(e);if(!l){O1(e,o,t);const g=s.get(e);if(g)return r?{transformedValue:null}:g}if(!S1(e,n)){const g=jl(e,n),v=g?{transformedValue:g.value,annotations:[g.type]}:{transformedValue:e};return l||s.set(e,v),v}if(po(i,e))return{transformedValue:null};const u=jl(e,n),c=(a=u==null?void 0:u.value)!=null?a:e,f=un(c)?[]:{},d={};Xn(c,(g,v)=>{if(v==="__proto__"||v==="constructor"||v==="prototype")throw new Error(`Detected property ${v}. This is a prototype pollution risk, please remove it from your object.`);const E=jf(g,t,n,r,[...o,v],[...i,e],s);f[v]=E.transformedValue,un(E.annotations)?d[v]=E.annotations:Mr(E.annotations)&&Xn(E.annotations,(b,T)=>{d[Vf(v)+"."+T]=b})});const p=$i(d)?{transformedValue:f,annotations:u?[u.type]:void 0}:{transformedValue:f,annotations:u?[u.type,d]:d};return l||s.set(e,p),p};I();I();function Kf(e){return Object.prototype.toString.call(e).slice(8,-1)}function Kl(e){return Kf(e)==="Array"}function x1(e){if(Kf(e)!=="Object")return!1;const t=Object.getPrototypeOf(e);return!!t&&t.constructor===Object&&t===Object.prototype}function w1(e,t,n,r,o){const i={}.propertyIsEnumerable.call(r,t)?"enumerable":"nonenumerable";i==="enumerable"&&(e[t]=n),o&&i==="nonenumerable"&&Object.defineProperty(e,t,{value:n,enumerable:!1,writable:!0,configurable:!0})}function Ki(e,t={}){if(Kl(e))return e.map(o=>Ki(o,t));if(!x1(e))return e;const n=Object.getOwnPropertyNames(e),r=Object.getOwnPropertySymbols(e);return[...n,...r].reduce((o,i)=>{if(Kl(t.props)&&!t.props.includes(i))return o;const s=e[i],a=Ki(s,t);return w1(o,i,a,e,t.nonenumerable),o},{})}var ke=class{constructor({dedupe:e=!1}={}){this.classRegistry=new t1,this.symbolRegistry=new Rf(t=>{var n;return(n=t.description)!=null?n:""}),this.customTransformerRegistry=new o1,this.allowedErrorProps=[],this.dedupe=e}serialize(e){const t=new Map,n=jf(e,t,this,this.dedupe),r={json:n.transformedValue};n.annotations&&(r.meta={...r.meta,values:n.annotations});const o=k1(t,this.dedupe);return o&&(r.meta={...r.meta,referentialEqualities:o}),r}deserialize(e){const{json:t,meta:n}=e;let r=Ki(t);return n!=null&&n.values&&(r=T1(r,n.values,this)),n!=null&&n.referentialEqualities&&(r=A1(r,n.referentialEqualities)),r}stringify(e){return JSON.stringify(this.serialize(e))}parse(e){return this.deserialize(JSON.parse(e))}registerClass(e,t){this.classRegistry.register(e,t)}registerSymbol(e,t){this.symbolRegistry.register(e,t)}registerCustom(e,t){this.customTransformerRegistry.register({name:t,...e})}allowErrorProps(...e){this.allowedErrorProps.push(...e)}};ke.defaultInstance=new ke;ke.serialize=ke.defaultInstance.serialize.bind(ke.defaultInstance);ke.deserialize=ke.defaultInstance.deserialize.bind(ke.defaultInstance);ke.stringify=ke.defaultInstance.stringify.bind(ke.defaultInstance);ke.parse=ke.defaultInstance.parse.bind(ke.defaultInstance);ke.registerClass=ke.defaultInstance.registerClass.bind(ke.defaultInstance);ke.registerSymbol=ke.defaultInstance.registerSymbol.bind(ke.defaultInstance);ke.registerCustom=ke.defaultInstance.registerCustom.bind(ke.defaultInstance);ke.allowErrorProps=ke.defaultInstance.allowErrorProps.bind(ke.defaultInstance);I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();I();var Wl,Gl;(Gl=(Wl=Z).__VUE_DEVTOOLS_KIT_MESSAGE_CHANNELS__)!=null||(Wl.__VUE_DEVTOOLS_KIT_MESSAGE_CHANNELS__=[]);var ql,Yl;(Yl=(ql=Z).__VUE_DEVTOOLS_KIT_RPC_CLIENT__)!=null||(ql.__VUE_DEVTOOLS_KIT_RPC_CLIENT__=null);var Xl,Zl;(Zl=(Xl=Z).__VUE_DEVTOOLS_KIT_RPC_SERVER__)!=null||(Xl.__VUE_DEVTOOLS_KIT_RPC_SERVER__=null);var Jl,Ql;(Ql=(Jl=Z).__VUE_DEVTOOLS_KIT_VITE_RPC_CLIENT__)!=null||(Jl.__VUE_DEVTOOLS_KIT_VITE_RPC_CLIENT__=null);var eu,tu;(tu=(eu=Z).__VUE_DEVTOOLS_KIT_VITE_RPC_SERVER__)!=null||(eu.__VUE_DEVTOOLS_KIT_VITE_RPC_SERVER__=null);var nu,ru;(ru=(nu=Z).__VUE_DEVTOOLS_KIT_BROADCAST_RPC_SERVER__)!=null||(nu.__VUE_DEVTOOLS_KIT_BROADCAST_RPC_SERVER__=null);I();I();I();I();I();I();I();const C1=JSON.parse(`{"logo":"logo-mini.png","contributors":false,"lastUpdated":false,"repo":"goravel/goravel","docsBranch":"master","locales":{"/":{"selectLanguageName":"English","navbar":[{"text":"Home","link":"/"},{"text":"Video","link":"https://www.youtube.com/playlist?list=PL40Xne4u-oXJ0Z5uFiPWHqIMvzZaG_BDf"}],"sidebar":[{"text":"Prologue","children":[{"text":"Upgrade Guide","children":[{"text":"Upgrading To v1.15 From v1.14","link":"/upgrade/v1.15"},{"text":"Upgrading To v1.14 From v1.13","link":"/upgrade/v1.14"},{"text":"History Upgrade","link":"/upgrade/history"}]},{"text":"Contribution Guide","link":"/prologue/contributions"},{"text":"Excellent Extend Packages","link":"/prologue/packages"}]},{"text":"Getting Started","children":[{"text":"Installation","link":"/getting-started/installation"},{"text":"Configuration","link":"/getting-started/configuration"},{"text":"Directory Structure","link":"/getting-started/directory-structure"},{"text":"Compile","link":"/getting-started/compile"}]},{"text":"Architecutre Concepts","children":[{"text":"Request Lifecycle","link":"/architecutre-concepts/request-lifecycle"},{"text":"Service Container","link":"/architecutre-concepts/service-container"},{"text":"Service Providers","link":"/architecutre-concepts/service-providers"},{"text":"Facades","link":"/architecutre-concepts/facades"}]},{"text":"The Basics","children":[{"text":"Routing","link":"/the-basics/routing"},{"text":"HTTP Middleware","link":"/the-basics/middleware"},{"text":"Controllers","link":"/the-basics/controllers"},{"text":"Requests","link":"/the-basics/request"},{"text":"Responses","link":"/the-basics/response"},{"text":"Views","link":"/the-basics/views"},{"text":"Grpc","link":"/the-basics/grpc"},{"text":"Session","link":"/the-basics/session"},{"text":"Validation","link":"/the-basics/validation"},{"text":"Logging","link":"/the-basics/logging"}]},{"text":"Digging Deeper","children":[{"text":"Artisan Console","link":"/digging-deeper/artisan-console"},{"text":"Cache","link":"/digging-deeper/cache"},{"text":"Events","link":"/digging-deeper/event"},{"text":"File Storage","link":"/digging-deeper/filesystem"},{"text":"Mail","link":"/digging-deeper/mail"},{"text":"Queues","link":"/digging-deeper/queues"},{"text":"Task Scheduling","link":"/digging-deeper/task-scheduling"},{"text":"Localization","link":"/digging-deeper/localization"},{"text":"Package Development","link":"/digging-deeper/package-development"},{"text":"Color","link":"/digging-deeper/color"},{"text":"Strings","link":"/digging-deeper/strings"},{"text":"Helpers","link":"/digging-deeper/helpers"}]},{"text":"Security","children":[{"text":"Authentication","link":"/security/authentication"},{"text":"Authorization","link":"/security/authorization"},{"text":"Encryption","link":"/security/encryption"},{"text":"Hashing","link":"/security/hashing"}]},{"text":"ORM","children":[{"text":"Getting Started","link":"/orm/getting-started"},{"text":"Relationships","link":"/orm/relationships"},{"text":"Migrations","link":"/orm/migrations"},{"text":"Seeding","link":"/orm/seeding"},{"text":"Factories","link":"/orm/factories"}]},{"text":"Testing","children":[{"text":"Getting Started","link":"/testing/getting-started"},{"text":"HTTP Tests","link":"/testing/http-tests"},{"text":"Mock","link":"/testing/mock"}]}]},"/zh/":{"selectLanguageName":"简体中文","navbar":[{"text":"首页","link":"/zh/"},{"text":"视频","link":"https://space.bilibili.com/1886603340/channel/seriesdetail?sid=4302621&ctype=0"}],"sidebar":[{"text":"前言","children":[{"text":"升级指南","children":[{"text":"从 v1.14 升级到 v1.15","link":"/zh/upgrade/v1.15"},{"text":"从 v1.13 升级到 v1.14","link":"/zh/upgrade/v1.14"},{"text":"历史版本升级","link":"/zh/upgrade/history"}]},{"text":"贡献指南","link":"/zh/prologue/contributions"},{"text":"优秀扩展包","link":"/zh/prologue/packages"}]},{"text":"入门指南","children":[{"text":"安装","link":"/zh/getting-started/installation"},{"text":"配置信息","link":"/zh/getting-started/configuration"},{"text":"文件夹结构","link":"/zh/getting-started/directory-structure"},{"text":"编译","link":"/zh/getting-started/compile"}]},{"text":"核心架构","children":[{"text":"请求周期","link":"/zh/architecutre-concepts/request-lifecycle"},{"text":"服务容器","link":"/zh/architecutre-concepts/service-container"},{"text":"服务提供者","link":"/zh/architecutre-concepts/service-providers"},{"text":"Facades","link":"/zh/architecutre-concepts/facades"}]},{"text":"基本功能","children":[{"text":"路由","link":"/zh/the-basics/routing"},{"text":"HTTP 中间件","link":"/zh/the-basics/middleware"},{"text":"控制器","link":"/zh/the-basics/controllers"},{"text":"请求","link":"/zh/the-basics/request"},{"text":"响应","link":"/zh/the-basics/response"},{"text":"视图","link":"/zh/the-basics/views"},{"text":"Grpc","link":"/zh/the-basics/grpc"},{"text":"Session","link":"/zh/the-basics/session"},{"text":"表单验证","link":"/zh/the-basics/validation"},{"text":"日志","link":"/zh/the-basics/logging"}]},{"text":"综合话题","children":[{"text":"Artisan 命令行","link":"/zh/digging-deeper/artisan-console"},{"text":"缓存系统","link":"/zh/digging-deeper/cache"},{"text":"事件系统","link":"/zh/digging-deeper/event"},{"text":"文件储存","link":"/zh/digging-deeper/filesystem"},{"text":"邮件","link":"/zh/digging-deeper/mail"},{"text":"队列","link":"/zh/digging-deeper/queues"},{"text":"任务调度","link":"/zh/digging-deeper/task-scheduling"},{"text":"本地化","link":"/zh/digging-deeper/localization"},{"text":"扩展包开发","link":"/zh/digging-deeper/package-development"},{"text":"颜色","link":"/zh/digging-deeper/color"},{"text":"Strings","link":"/zh/digging-deeper/strings"},{"text":"辅助函数","link":"/zh/digging-deeper/helpers"}]},{"text":"安全相关","children":[{"text":"用户验证","link":"/zh/security/authentication"},{"text":"用户授权","link":"/zh/security/authorization"},{"text":"加密解密","link":"/zh/security/encryption"},{"text":"哈希","link":"/zh/security/hashing"}]},{"text":"ORM","children":[{"text":"快速入门","link":"/zh/orm/getting-started"},{"text":"模型关联","link":"/zh/orm/relationships"},{"text":"数据库迁移","link":"/zh/orm/migrations"},{"text":"数据填充","link":"/zh/orm/seeding"},{"text":"模型工厂","link":"/zh/orm/factories"}]},{"text":"测试相关","children":[{"text":"快速入门","link":"/zh/testing/getting-started"},{"text":"HTTP Tests","link":"/zh/testing/http-tests"},{"text":"Mock","link":"/zh/testing/mock"}]}]}},"colorMode":"auto","colorModeSwitch":true,"navbar":[],"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","sidebar":"heading","sidebarDepth":2,"editLink":true,"editLinkText":"Edit this page","lastUpdatedText":"Last Updated","contributorsText":"Contributors","notFound":["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],"backToHome":"Take me home","openInNewWindow":"open in new window","toggleColorMode":"toggle color mode","toggleSidebar":"toggle sidebar"}`),P1=de(C1),Wf=()=>P1,Gf=Symbol(""),I1=()=>{const e=$e(Gf);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},R1=(e,t)=>{const{locales:n,...r}=e;return{...r,...n==null?void 0:n[t]}},L1=Rt({enhance({app:e}){const t=Wf(),n=e._context.provides[_s],r=N(()=>R1(t.value,n.routeLocale.value));e.provide(Gf,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}}),W0({app:e,id:"org.vuejs.vuepress.plugin-theme-data",label:"VuePress Theme Data Plugin",packageName:"@vuepress/plugin-theme-data",homepage:"https://v2.vuepress.vuejs.org",logo:"https://v2.vuepress.vuejs.org/images/hero.png",componentStateTypes:["VuePress"]},o=>{o.on.inspectComponent(i=>{i.instanceData.state.push({type:"VuePress",key:"themeData",editable:!1,value:t.value},{type:"VuePress",key:"themeLocaleData",editable:!1,value:r.value})})})}}),D1=Object.freeze(Object.defineProperty({__proto__:null,default:L1},Symbol.toStringTag,{value:"Module"})),V1=()=>Wf(),Be=()=>I1(),qf=Symbol(""),N1=e=>{const t=(n=e.value)=>{const r=window.document.documentElement;r.dataset.theme=n?"dark":"light"};We(()=>{rf(e,t)}),Lo(()=>{t()})},Ns=()=>{const e=$e(qf);if(!e)throw new Error("useDarkMode() is called without provider.");return e},M1=()=>{const e=Be(),t=gg(),n=Os("vuepress-color-scheme",e.value.colorMode),r=N({get(){return e.value.colorModeSwitch?n.value==="auto"?t.value:n.value==="dark":e.value.colorMode==="dark"},set(o){o===t.value?n.value="auto":n.value=o?"dark":"light"}});On(qf,r),N1(r)};let gi=null,dr=null;const F1={wait:()=>gi,pending:()=>{gi=new Promise(e=>{dr=e})},resolve:()=>{dr==null||dr(),gi=null,dr=null}},Yf=()=>F1,Zn=(e,t)=>{const{notFound:n,meta:r,path:o}=Vr(e,t);return n?{text:o,link:o}:{text:r.title||o,link:o}},ou=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),H1=(e,t)=>{if(t.hash===e)return!0;const n=ou(t.path),r=ou(e);return n===r},Xf=(e,t)=>e.link&&H1(e.link,t)?!0:"children"in e?e.children.some(n=>Xf(n,t)):!1,Zf=e=>!cm(e)&&!Gr(e),Jf=e=>!No(e)||e.includes("github.com")?"GitHub":e.includes("bitbucket.org")?"Bitbucket":e.includes("gitlab.com")?"GitLab":e.includes("gitee.com")?"Gitee":null,z1={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},B1=({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const n=Jf(e);return n!==null?z1[n]:null},$1=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:r,editLinkPattern:o})=>{if(!r)return null;const i=B1({docsRepo:e,editLinkPattern:o});return i?i.replace(/:repo/,No(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,ds(`${Pc(n)}/${r}`)):null},Un=(e="",t="")=>ff(t)||Gr(t)?t:`${ym(e)}${t}`,ho=de([]),U1=()=>{const e=cn(),t=Be(),n=vt(),r=N(()=>n.value.sidebarDepth??t.value.sidebarDepth??2);e.beforeEach((i,s)=>{i.path!==s.path&&(ho.value=[])});const o=()=>{if(r.value<=0){ho.value=[];return}ho.value=Lg({levels:[2,r.value+1],ignore:[".vp-badge"]})};Ue(r,o),We(o)},j1=()=>ho,K1=e=>({text:e.title,link:e.link,children:Ms(e.children)}),Ms=e=>e?e.map(t=>K1(t)):[],Qf=(e,t)=>[{text:e.title,children:Ms(t)}],ed=(e,t,n,r="")=>{const o=(i,s)=>{var l;const a=Tt(i)?Zn(Un(s,i)):Tt(i.link)?{...i,link:Zf(i.link)?Zn(Un(s,i.link)).link:i.link}:i;if("children"in a)return{...a,children:a.children.map(u=>o(u,Un(s,a.prefix)))};if(a.link===n){const u=((l=t[0])==null?void 0:l.level)===1?t[0].children:t;return{...a,children:Ms(u)}}return a};return e.map(i=>o(i,r))},W1=(e,t,n,r)=>{const o=Ng(e).sort((i,s)=>s.length-i.length);for(const i of o)if(cf(decodeURI(r),i)){const s=e[i];return s?s==="heading"?Qf(t,n):ed(s,n,r,i):[]}return console.warn(`${decodeURI(r)} is missing sidebar config.`),[]},td=Symbol("sidebarItems"),Fs=()=>{const e=$e(td);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},G1=(e,t,n,r,o)=>e===!1?[]:e==="heading"?Qf(t,o):Array.isArray(e)?ed(e,o,n,r):ps(e)?W1(e,t,o,n):[],q1=()=>{const e=Be(),t=vt(),n=Cn(),r=Gt(),o=Pn(),i=j1(),s=N(()=>t.value.home?!1:t.value.sidebar??e.value.sidebar??"heading"),a=N(()=>G1(s.value,n.value,r.path,o.value,i.value));On(td,a)},Y1=me({__name:"Badge",props:{type:{default:"tip"},text:{default:""},vertical:{default:void 0}},setup(e,{expose:t}){t();const n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Pe=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n};function X1(e,t,n,r,o,i){return X(),re("span",{class:ot(["vp-badge",n.type]),style:Qn({verticalAlign:n.vertical})},[Le(e.$slots,"default",{},()=>[sn(Re(n.text),1)])],6)}const Z1=Pe(Y1,[["render",X1],["__file","Badge.vue"]]),J1=me({__name:"VPHomeFeatures",setup(e,{expose:t}){t();const n=vt(),r=N(()=>n.value.features??[]),o={frontmatter:n,features:r};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),Q1={key:0,class:"vp-features"};function eE(e,t,n,r,o,i){return r.features.length?(X(),re("div",Q1,[(X(!0),re(Ee,null,rn(r.features,s=>(X(),re("div",{key:s.title,class:"vp-feature"},[ae("h2",null,Re(s.title),1),ae("p",null,Re(s.details),1)]))),128))])):ze("",!0)}const tE=Pe(J1,[["render",eE],["__file","VPHomeFeatures.vue"]]),nE=me({__name:"VPHomeFooter",setup(e,{expose:t}){t();const n=vt(),r=N(()=>n.value.footer),o=N(()=>n.value.footerHtml),i={frontmatter:n,footer:r,footerHtml:o};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}}),rE=["innerHTML"],oE=["textContent"];function iE(e,t,n,r,o,i){return r.footer?(X(),re(Ee,{key:0},[r.footerHtml?(X(),re("div",{key:0,class:"vp-footer","vp-footer":"",innerHTML:r.footer},null,8,rE)):(X(),re("div",{key:1,class:"vp-footer","vp-footer":"",textContent:Re(r.footer)},null,8,oE))],64)):ze("",!0)}const sE=Pe(nE,[["render",iE],["__file","VPHomeFooter.vue"]]),aE=me({__name:"VPHomeHero",setup(e,{expose:t}){t();const n=vt(),r=vs(),o=Ns(),i=N(()=>n.value.heroText===null?null:n.value.heroText||r.value.title||"Hello"),s=N(()=>n.value.tagline===null?null:n.value.tagline||r.value.description||"Welcome to your VuePress site"),a=N(()=>o.value&&n.value.heroImageDark!==void 0?n.value.heroImageDark:n.value.heroImage),l=N(()=>n.value.heroAlt||i.value||"hero"),u=N(()=>n.value.heroHeight??280),c=N(()=>Array.isArray(n.value.actions)?n.value.actions.map(({text:p,link:g,type:v="primary"})=>({text:p,link:g,type:v})):[]),d={frontmatter:n,siteLocale:r,isDarkMode:o,heroText:i,tagline:s,heroImage:a,heroAlt:l,heroHeight:u,actions:c,HomeHeroImage:()=>{if(!a.value)return null;const p=ue("img",{class:"vp-hero-image",src:bs(a.value),alt:l.value,height:u.value});return n.value.heroImageDark===void 0?p:ue(Es,()=>p)},get AutoLink(){return rr}};return Object.defineProperty(d,"__isScriptSetup",{enumerable:!1,value:!0}),d}}),lE={class:"vp-hero"},uE={key:0,id:"main-title"},cE={key:1,class:"vp-hero-description"},fE={key:2,class:"vp-hero-actions"};function dE(e,t,n,r,o,i){return X(),re("header",lE,[le(r.HomeHeroImage),r.heroText?(X(),re("h1",uE,Re(r.heroText),1)):ze("",!0),r.tagline?(X(),re("p",cE,Re(r.tagline),1)):ze("",!0),r.actions.length?(X(),re("p",fE,[(X(!0),re(Ee,null,rn(r.actions,s=>(X(),De(r.AutoLink,{key:s.text,class:ot(["vp-hero-action-button",[s.type]]),config:s},null,8,["class","config"]))),128))])):ze("",!0)])}const pE=Pe(aE,[["render",dE],["__file","VPHomeHero.vue"]]),hE=me({__name:"VPHome",setup(e,{expose:t}){t();const n={VPHomeFeatures:tE,VPHomeFooter:sE,VPHomeHero:pE,get Content(){return ys}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),mE={class:"vp-home"},_E={"vp-content":""};function gE(e,t,n,r,o,i){return X(),re("main",mE,[le(r.VPHomeHero),le(r.VPHomeFeatures),ae("div",_E,[le(r.Content)]),le(r.VPHomeFooter)])}const vE=Pe(hE,[["render",gE],["__file","VPHome.vue"]]),EE=me({__name:"VPNavbarBrand",setup(e,{expose:t}){t();const n=Pn(),r=vs(),o=Be(),i=Ns(),s=N(()=>o.value.home||n.value),a=N(()=>r.value.title),l=N(()=>i.value&&o.value.logoDark!==void 0?o.value.logoDark:o.value.logo),u=N(()=>o.value.logoAlt??a.value),c=N(()=>a.value.toLocaleUpperCase().trim()===u.value.toLocaleUpperCase().trim()),d={routeLocale:n,siteLocale:r,themeLocale:o,isDarkMode:i,navbarBrandLink:s,navbarBrandTitle:a,navbarBrandLogo:l,navbarBrandLogoAlt:u,navBarLogoAltMatchesTitle:c,NavbarBrandLogo:()=>{if(!l.value)return null;const p=ue("img",{class:"vp-site-logo",src:bs(l.value),alt:u.value});return o.value.logoDark===void 0?p:ue(Es,()=>p)},get RouteLink(){return Ho}};return Object.defineProperty(d,"__isScriptSetup",{enumerable:!1,value:!0}),d}}),yE=["aria-hidden"];function bE(e,t,n,r,o,i){return X(),De(r.RouteLink,{to:r.navbarBrandLink},{default:Ne(()=>[le(r.NavbarBrandLogo),r.navbarBrandTitle?(X(),re("span",{key:0,class:ot(["vp-site-name",{"vp-hide-mobile":r.navbarBrandLogo}]),"aria-hidden":r.navBarLogoAltMatchesTitle},Re(r.navbarBrandTitle),11,yE)):ze("",!0)]),_:1},8,["to"])}const TE=Pe(EE,[["render",bE],["__file","VPNavbarBrand.vue"]]),AE=me({__name:"VPDropdownTransition",setup(e,{expose:t}){t();const o={setHeight:i=>{i.style.height=`${i.scrollHeight}px`},unsetHeight:i=>{i.style.height=""}};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}});function SE(e,t,n,r,o,i){return X(),De(fs,{name:"vp-dropdown",onEnter:r.setHeight,onAfterEnter:r.unsetHeight,onBeforeLeave:r.setHeight},{default:Ne(()=>[Le(e.$slots,"default")]),_:3})}const nd=Pe(AE,[["render",SE],["__file","VPDropdownTransition.vue"]]),OE=me({__name:"VPNavbarDropdown",props:{config:{}},setup(e,{expose:t}){t();const n=e,{config:r}=Ru(n),o=Gt(),[i,s]=nf(!1),a=N(()=>r.value.ariaLabel||r.value.text),l=(f,d)=>d[d.length-1]===f,u=f=>{f.detail===0?s():s(!1)};Ue(()=>o.path,()=>{s(!1)});const c={props:n,config:r,route:o,open:i,toggleOpen:s,dropdownAriaLabel:a,isLastItemOfArray:l,handleDropdown:u,VPDropdownTransition:nd,get AutoLink(){return rr}};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),kE=["aria-label"],xE={class:"title"},wE=["aria-label"],CE={class:"title"},PE={class:"vp-navbar-dropdown"},IE={class:"vp-navbar-dropdown-subtitle"},RE={key:1},LE={class:"vp-navbar-dropdown-subitem-wrapper"};function DE(e,t,n,r,o,i){return X(),re("div",{class:ot(["vp-navbar-dropdown-wrapper",{open:r.open}])},[ae("button",{class:"vp-navbar-dropdown-title",type:"button","aria-label":r.dropdownAriaLabel,onClick:r.handleDropdown},[ae("span",xE,Re(r.config.text),1),t[1]||(t[1]=ae("span",{class:"arrow down"},null,-1))],8,kE),ae("button",{class:"vp-navbar-dropdown-title-mobile",type:"button","aria-label":r.dropdownAriaLabel,onClick:t[0]||(t[0]=()=>r.toggleOpen())},[ae("span",CE,Re(r.config.text),1),ae("span",{class:ot(["arrow",r.open?"down":"right"])},null,2)],8,wE),le(r.VPDropdownTransition,null,{default:Ne(()=>[yo(ae("ul",PE,[(X(!0),re(Ee,null,rn(r.config.children,s=>(X(),re("li",{key:s.text,class:"vp-navbar-dropdown-item"},["children"in s?(X(),re(Ee,{key:0},[ae("h4",IE,[s.link?(X(),De(r.AutoLink,{key:0,config:s,onFocusout:()=>{r.isLastItemOfArray(s,r.config.children)&&s.children.length===0&&(r.open=!1)}},null,8,["config","onFocusout"])):(X(),re("span",RE,Re(s.text),1))]),ae("ul",LE,[(X(!0),re(Ee,null,rn(s.children,a=>(X(),re("li",{key:a.link,class:"vp-navbar-dropdown-subitem"},[le(r.AutoLink,{config:a,onFocusout:()=>{r.isLastItemOfArray(a,s.children)&&r.isLastItemOfArray(s,r.config.children)&&r.toggleOpen(!1)}},null,8,["config","onFocusout"])]))),128))])],64)):(X(),De(r.AutoLink,{key:1,config:s,onFocusout:()=>{r.isLastItemOfArray(s,r.config.children)&&r.toggleOpen(!1)}},null,8,["config","onFocusout"]))]))),128))],512),[[So,r.open]])]),_:1})],2)}const VE=Pe(OE,[["render",DE],["__file","VPNavbarDropdown.vue"]]),rd=(e,t="")=>Tt(e)?Zn(Un(t,e)):"children"in e?{...e,children:e.children.map(n=>rd(n,Un(t,e.prefix)))}:{...e,link:Zf(e.link)?Zn(Un(t,e.link)).link:e.link},NE=()=>{const e=Be();return N(()=>(e.value.navbar||[]).map(t=>rd(t)))},ME=()=>{const e=Be(),t=N(()=>e.value.repo),n=N(()=>t.value?Jf(t.value):null),r=N(()=>t.value&&!No(t.value)?`https://github.com/${t.value}`:t.value),o=N(()=>r.value?e.value.repoLabel?e.value.repoLabel:n.value===null?"Source":n.value:null);return N(()=>!r.value||!o.value?[]:[{text:o.value,link:r.value}])},FE=()=>{const e=Gt(),t=Dg(),n=Pn(),r=Jc(),o=vs(),i=V1(),s=Be();return N(()=>{const a=Object.keys(r.value.locales);if(a.length<2)return[];const l=e.path,u=e.fullPath;return[{text:`${s.value.selectLanguageText}`,ariaLabel:`${s.value.selectLanguageAriaLabel??s.value.selectLanguageText}`,children:a.map(f=>{var b,T;const d=((b=r.value.locales)==null?void 0:b[f])??{},p=((T=i.value.locales)==null?void 0:T[f])??{},g=`${d.lang}`,v=p.selectLanguageName??g;if(g===o.value.lang)return{text:v,activeMatch:".",link:e.fullPath};const E=l.replace(n.value,f);return{text:v,link:t.value.some(m=>m===E)?u.replace(l,E):p.home??f}})}]})},HE="719px",zE={mobile:HE};var zr;(function(e){e.Mobile="mobile"})(zr||(zr={}));const BE={[zr.Mobile]:Number.parseInt(zE.mobile.replace("px",""),10)},od=(e,t)=>{const n=BE[e];Number.isInteger(n)&&(et("orientationchange",()=>{t(n)},!1),et("resize",()=>{t(n)},!1),We(()=>{t(n)}))},$E=me({__name:"VPNavbarItems",setup(e,{expose:t}){t();const n=NE(),r=FE(),o=ME(),i=de(!1),s=N(()=>Be().value.navbarLabel??"site navigation"),a=N(()=>[...n.value,...r.value,...o.value]);od(zr.Mobile,u=>{i.value=window.innerWidth(X(),re("div",{key:s.text,class:"vp-navbar-item"},["children"in s?(X(),De(r.VPNavbarDropdown,{key:0,class:ot({mobile:r.isMobile}),config:s},null,8,["class","config"])):(X(),De(r.AutoLink,{key:1,config:s},null,8,["config"]))]))),128))],8,UE)):ze("",!0)}const id=Pe($E,[["render",jE],["__file","VPNavbarItems.vue"]]),KE={},WE={class:"dark-icon",viewBox:"0 0 32 32"};function GE(e,t){return X(),re("svg",WE,t[0]||(t[0]=[ae("path",{d:"M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z",fill:"currentColor"},null,-1)]))}const qE=Pe(KE,[["render",GE],["__file","VPDarkIcon.vue"]]),YE={},XE={class:"light-icon",viewBox:"0 0 32 32"};function ZE(e,t){return X(),re("svg",XE,t[0]||(t[0]=[yh('',9)]))}const JE=Pe(YE,[["render",ZE],["__file","VPLightIcon.vue"]]),QE=me({__name:"VPToggleColorModeButton",setup(e,{expose:t}){t();const n=Be(),r=Ns(),i={themeLocale:n,isDarkMode:r,toggleColorMode:()=>{r.value=!r.value},VPDarkIcon:qE,VPLightIcon:JE};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}}),ey=["title"];function ty(e,t,n,r,o,i){return X(),re("button",{type:"button",class:"vp-toggle-color-mode-button",title:r.themeLocale.toggleColorMode,onClick:r.toggleColorMode},[yo(le(r.VPLightIcon,null,null,512),[[So,!r.isDarkMode]]),yo(le(r.VPDarkIcon,null,null,512),[[So,r.isDarkMode]])],8,ey)}const ny=Pe(QE,[["render",ty],["__file","VPToggleColorModeButton.vue"]]),ry=me({__name:"VPToggleSidebarButton",emits:["toggle"],setup(e,{expose:t}){t();const r={themeLocale:Be()};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),oy=["title"];function iy(e,t,n,r,o,i){return X(),re("div",{class:"vp-toggle-sidebar-button",title:r.themeLocale.toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:t[0]||(t[0]=s=>e.$emit("toggle"))},t[1]||(t[1]=[ae("div",{class:"icon","aria-hidden":"true"},[ae("span"),ae("span"),ae("span")],-1)]),8,oy)}const sy=Pe(ry,[["render",iy],["__file","VPToggleSidebarButton.vue"]]),ay=me({__name:"VPNavbar",emits:["toggleSidebar"],setup(e,{expose:t}){t();const n=af("SearchBox")?as("SearchBox"):()=>null,r=Be(),o=qs("navbar"),i=qs("navbar-brand"),s=de(0),a=N(()=>s.value?{maxWidth:`${s.value}px`}:{}),l=(c,f)=>{var g;const d=(g=c==null?void 0:c.ownerDocument.defaultView)==null?void 0:g.getComputedStyle(c,null)[f],p=Number.parseInt(d,10);return Number.isNaN(p)?0:p};od(zr.Mobile,c=>{var d;const f=l(o.value,"paddingLeft")+l(o.value,"paddingRight");window.innerWidthe.$emit("toggleSidebar"))}),ae("span",uy,[le(r.VPNavbarBrand)],512),ae("div",{class:"vp-navbar-items-wrapper",style:Qn(r.linksWrapperStyle)},[Le(e.$slots,"before"),le(r.VPNavbarItems,{class:"vp-hide-mobile"}),Le(e.$slots,"after"),r.themeLocale.colorModeSwitch?(X(),De(r.VPToggleColorModeButton,{key:0})):ze("",!0),le(r.SearchBox)],4)],512)}const fy=Pe(ay,[["render",cy],["__file","VPNavbar.vue"]]),dy={},py={class:"edit-icon",viewBox:"0 0 1024 1024"};function hy(e,t){return X(),re("svg",py,t[0]||(t[0]=[ae("g",{fill:"currentColor"},[ae("path",{d:"M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"}),ae("path",{d:"M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"})],-1)]))}const my=Pe(dy,[["render",hy],["__file","VPEditIcon.vue"]]),_y=()=>{const e=Be(),t=Cn(),n=vt();return N(()=>{var o;return n.value.contributors??e.value.contributors??!0?((o=t.value.git)==null?void 0:o.contributors)??null:null})},gy=()=>{const e=Be(),t=Cn(),n=vt();return N(()=>{if(!(n.value.editLink??e.value.editLink??!0))return null;const{repo:o,docsRepo:i=o,docsBranch:s="main",docsDir:a="",editLinkText:l}=e.value;if(!i)return null;const u=$1({docsRepo:i,docsBranch:s,docsDir:a,filePathRelative:t.value.filePathRelative,editLinkPattern:n.value.editLinkPattern??e.value.editLinkPattern});return u?{text:l??"Edit this page",link:u}:null})},vy=()=>{const e=Be(),t=Cn(),n=vt();return N(()=>{var i;return!(n.value.lastUpdated??e.value.lastUpdated??!0)||!((i=t.value.git)!=null&&i.updatedTime)?null:new Date(t.value.git.updatedTime).toLocaleString()})},Ey=me({__name:"VPPageMeta",setup(e,{expose:t}){t();const n=Be(),r=gy(),o=vy(),i=_y(),s={themeLocale:n,editLink:r,lastUpdated:o,contributors:i,VPEditIcon:my,get AutoLink(){return rr}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),yy={class:"vp-page-meta"},by={key:0,class:"vp-meta-item edit-link"},Ty={class:"vp-meta-item git-info"},Ay={key:0,class:"vp-meta-item last-updated"},Sy={class:"meta-item-label"},Oy={class:"meta-item-info"},ky={key:1,class:"vp-meta-item contributors"},xy={class:"meta-item-label"},wy={class:"meta-item-info"},Cy=["title"];function Py(e,t,n,r,o,i){const s=as("ClientOnly");return X(),re("footer",yy,[r.editLink?(X(),re("div",by,[le(r.AutoLink,{class:"label",config:r.editLink},{before:Ne(()=>[le(r.VPEditIcon)]),_:1},8,["config"])])):ze("",!0),ae("div",Ty,[r.lastUpdated?(X(),re("div",Ay,[ae("span",Sy,Re(r.themeLocale.lastUpdatedText)+": ",1),le(s,null,{default:Ne(()=>[ae("span",Oy,Re(r.lastUpdated),1)]),_:1})])):ze("",!0),r.contributors&&r.contributors.length?(X(),re("div",ky,[ae("span",xy,Re(r.themeLocale.contributorsText)+": ",1),ae("span",wy,[(X(!0),re(Ee,null,rn(r.contributors,(a,l)=>(X(),re(Ee,{key:l},[ae("span",{class:"contributor",title:`email: ${a.email}`},Re(a.name),9,Cy),l!==r.contributors.length-1?(X(),re(Ee,{key:0},[sn(", ")],64)):ze("",!0)],64))),128))])])):ze("",!0)])])}const Iy=Pe(Ey,[["render",Py],["__file","VPPageMeta.vue"]]),Ry=()=>{const e=cn(),t=Gt();return n=>{n&&(ff(n)?t.path!==n&&e.push(n):Gr(n)?window.open(n):e.push(encodeURI(n)))}},iu=(e,t)=>e===!1?!1:Tt(e)?Zn(e,t):ps(e)?{...e,link:Zn(e.link,t).link}:null,Wi=(e,t,n)=>{const r=e.findIndex(i=>i.link===t);if(r!==-1){const i=e[r+n];return i?i.link?i:"prefix"in i&&!Vr(i.prefix).notFound?{...i,link:i.prefix}:null:null}for(const i of e)if("children"in i){const s=Wi(i.children,t,n);if(s)return s}const o=e.findIndex(i=>"prefix"in i&&i.prefix===t);if(o!==-1){const i=e[o+n];return i?i.link?i:"prefix"in i&&!Vr(i.prefix).notFound?{...i,link:i.prefix}:null:null}return null},Ly=()=>{const e=vt(),t=Be(),n=Fs(),r=Gt(),o=N(()=>{const s=iu(e.value.prev,r.path);return s===!1?null:s??(t.value.prev===!1?null:Wi(n.value,r.path,-1))}),i=N(()=>{const s=iu(e.value.next,r.path);return s===!1?null:s??(t.value.next===!1?null:Wi(n.value,r.path,1))});return{prevLink:o,nextLink:i}},Dy=me({__name:"VPPageNav",setup(e,{expose:t}){t();const n=Be(),r=Ry(),{prevLink:o,nextLink:i}=Ly(),s=N(()=>n.value.pageNavbarLabel??"page navigation");et("keydown",l=>{l.altKey&&(l.key==="ArrowRight"?i.value&&(r(i.value.link),l.preventDefault()):l.key==="ArrowLeft"&&o.value&&(r(o.value.link),l.preventDefault()))});const a={themeLocale:n,navigate:r,prevLink:o,nextLink:i,navbarLabel:s,get AutoLink(){return rr}};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}}),Vy=["aria-label"],Ny={class:"hint"},My={class:"link"},Fy={class:"hint"},Hy={class:"link"};function zy(e,t,n,r,o,i){return r.prevLink||r.nextLink?(X(),re("nav",{key:0,class:"vp-page-nav","aria-label":r.navbarLabel},[r.prevLink?(X(),De(r.AutoLink,{key:0,class:"prev",config:r.prevLink},{default:Ne(()=>[ae("div",Ny,[t[0]||(t[0]=ae("span",{class:"arrow left"},null,-1)),sn(" "+Re(r.themeLocale.prev??"Prev"),1)]),ae("div",My,[ae("span",null,Re(r.prevLink.text),1)])]),_:1},8,["config"])):ze("",!0),r.nextLink?(X(),De(r.AutoLink,{key:1,class:"next",config:r.nextLink},{default:Ne(()=>[ae("div",Fy,[sn(Re(r.themeLocale.next??"Next")+" ",1),t[1]||(t[1]=ae("span",{class:"arrow right"},null,-1))]),ae("div",Hy,[ae("span",null,Re(r.nextLink.text),1)])]),_:1},8,["config"])):ze("",!0)],8,Vy)):ze("",!0)}const By=Pe(Dy,[["render",zy],["__file","VPPageNav.vue"]]),$y=me({__name:"VPPage",setup(e,{expose:t}){t(),U1();const n={VPPageMeta:Iy,VPPageNav:By,get Content(){return ys}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Uy={class:"vp-page"},jy={"vp-content":""};function Ky(e,t,n,r,o,i){return X(),re("main",Uy,[Le(e.$slots,"top"),ae("div",jy,[Le(e.$slots,"content-top"),le(r.Content),Le(e.$slots,"content-bottom")]),le(r.VPPageMeta),le(r.VPPageNav),Le(e.$slots,"bottom")])}const Wy=Pe($y,[["render",Ky],["__file","VPPage.vue"]]),Gy=me({__name:"VPSidebarItem",props:{item:{},depth:{default:0}},setup(e,{expose:t}){t();const n=e,{item:r,depth:o}=Ru(n),i=Gt(),s=cn(),a=N(()=>"collapsible"in r.value&&r.value.collapsible),l=N(()=>Xf(r.value,i)),u=N(()=>({"vp-sidebar-item":!0,"vp-sidebar-heading":o.value===0,active:l.value,collapsible:a.value})),c=N(()=>a.value?l.value:!0),[f,d]=nf(c.value),p=E=>{a.value&&(E.preventDefault(),d())},g=s.afterEach(()=>{nr(()=>{f.value=c.value})});ss(()=>{g()});const v={props:n,item:r,depth:o,route:i,router:s,collapsible:a,isActive:l,itemClass:u,isOpenDefault:c,isOpen:f,toggleIsOpen:d,onClick:p,unregisterRouterHook:g,VPDropdownTransition:nd,get AutoLink(){return rr}};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}}),qy={class:"vp-sidebar-children"};function Yy(e,t,n,r,o,i){const s=as("VPSidebarItem",!0);return X(),re("li",null,[r.item.link?(X(),De(r.AutoLink,{key:0,class:ot(r.itemClass),config:r.item},null,8,["class","config"])):(X(),re("p",{key:1,tabindex:"0",class:ot(r.itemClass),onClick:r.onClick,onKeydown:rm(r.onClick,["enter"])},[sn(Re(r.item.text)+" ",1),r.collapsible?(X(),re("span",{key:0,class:ot(["arrow",r.isOpen?"down":"right"])},null,2)):ze("",!0)],34)),"children"in r.item&&r.item.children.length?(X(),De(r.VPDropdownTransition,{key:2},{default:Ne(()=>[yo(ae("ul",qy,[(X(!0),re(Ee,null,rn(r.item.children,a=>(X(),De(s,{key:`${r.depth}${a.text}${a.link}`,item:a,depth:r.depth+1},null,8,["item","depth"]))),128))],512),[[So,r.isOpen]])]),_:1})):ze("",!0)])}const Xy=Pe(Gy,[["render",Yy],["__file","VPSidebarItem.vue"]]),Zy=me({__name:"VPSidebarItems",setup(e,{expose:t}){t();const n=Gt(),r=Fs();We(()=>{Ue(()=>n.hash,i=>{const s=document.querySelector(".vp-sidebar");if(!s)return;const a=document.querySelector(`.vp-sidebar a.vp-sidebar-item[href="${n.path}${i}"]`);if(!a)return;const{top:l,height:u}=s.getBoundingClientRect(),{top:c,height:f}=a.getBoundingClientRect();cl+u&&a.scrollIntoView(!1)})});const o={route:n,sidebarItems:r,VPSidebarItem:Xy};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),Jy={key:0,class:"vp-sidebar-items"};function Qy(e,t,n,r,o,i){return r.sidebarItems.length?(X(),re("ul",Jy,[(X(!0),re(Ee,null,rn(r.sidebarItems,s=>(X(),De(r.VPSidebarItem,{key:`${s.text}${s.link}`,item:s},null,8,["item"]))),128))])):ze("",!0)}const eb=Pe(Zy,[["render",Qy],["__file","VPSidebarItems.vue"]]),tb=me({__name:"VPSidebar",setup(e,{expose:t}){t();const n={VPNavbarItems:id,VPSidebarItems:eb};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),nb={class:"vp-sidebar","vp-sidebar":""};function rb(e,t,n,r,o,i){return X(),re("aside",nb,[le(r.VPNavbarItems),Le(e.$slots,"top"),le(r.VPSidebarItems),Le(e.$slots,"bottom")])}const ob=Pe(tb,[["render",rb],["__file","VPSidebar.vue"]]),ib=me({__name:"Layout",setup(e,{expose:t}){t();const n=Cn(),r=vt(),o=Be(),i=N(()=>r.value.navbar!==!1&&o.value.navbar!==!1),s=Fs(),a=de(!1),l=m=>{a.value=typeof m=="boolean"?m:!a.value},u={x:0,y:0},c=m=>{u.x=m.changedTouches[0].clientX,u.y=m.changedTouches[0].clientY},f=m=>{const y=m.changedTouches[0].clientX-u.x,D=m.changedTouches[0].clientY-u.y;Math.abs(y)>Math.abs(D)&&Math.abs(y)>40&&(y>0&&u.x<=80?l(!0):l(!1))},d=N(()=>r.value.externalLinkIcon??o.value.externalLinkIcon??!0),p=N(()=>[{"no-navbar":!i.value,"no-sidebar":!s.value.length,"sidebar-open":a.value,"external-link-icon":d.value},r.value.pageClass]);let g;We(()=>{g=cn().afterEach(()=>{l(!1)})}),Lo(()=>{g()});const v=Yf(),E=v.resolve,b=v.pending,T={page:n,frontmatter:r,themeLocale:o,shouldShowNavbar:i,sidebarItems:s,isSidebarOpen:a,toggleSidebar:l,touchStart:u,onTouchStart:c,onTouchEnd:f,enableExternalLinkIcon:d,containerClass:p,get unregisterRouterHook(){return g},set unregisterRouterHook(m){g=m},scrollPromise:v,onBeforeEnter:E,onBeforeLeave:b,VPHome:vE,VPNavbar:fy,VPPage:Wy,VPSidebar:ob};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}});function sb(e,t,n,r,o,i){return X(),re("div",{class:ot(["vp-theme-container",r.containerClass]),"vp-container":"",onTouchstart:r.onTouchStart,onTouchend:r.onTouchEnd},[Le(e.$slots,"navbar",{},()=>[r.shouldShowNavbar?(X(),De(r.VPNavbar,{key:0,onToggleSidebar:r.toggleSidebar},{before:Ne(()=>[Le(e.$slots,"navbar-before")]),after:Ne(()=>[Le(e.$slots,"navbar-after")]),_:3})):ze("",!0)]),ae("div",{class:"vp-sidebar-mask",onClick:t[0]||(t[0]=s=>r.toggleSidebar(!1))}),Le(e.$slots,"sidebar",{},()=>[le(r.VPSidebar,null,{top:Ne(()=>[Le(e.$slots,"sidebar-top")]),bottom:Ne(()=>[Le(e.$slots,"sidebar-bottom")]),_:3})]),Le(e.$slots,"page",{},()=>[r.frontmatter.home?(X(),De(r.VPHome,{key:0})):(X(),De(fs,{key:1,name:"fade-slide-y",mode:"out-in",onBeforeEnter:r.onBeforeEnter,onBeforeLeave:r.onBeforeLeave},{default:Ne(()=>[(X(),De(r.VPPage,{key:r.page.path},{top:Ne(()=>[Le(e.$slots,"page-top")]),"content-top":Ne(()=>[Le(e.$slots,"page-content-top")]),"content-bottom":Ne(()=>[Le(e.$slots,"page-content-bottom")]),bottom:Ne(()=>[Le(e.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"]))])],34)}const ab=Pe(ib,[["render",sb],["__file","Layout.vue"]]),lb=me({__name:"NotFound",setup(e,{expose:t}){t();const n=Pn(),r=Be(),o=r.value.notFound??["Not Found"],i=()=>o[Math.floor(Math.random()*o.length)],s=r.value.home??n.value,a=r.value.backToHome??"Back to home",l={routeLocale:n,themeLocale:r,messages:o,getMsg:i,homeLink:s,homeText:a,get RouteLink(){return Ho}};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}}),ub={class:"vp-theme-container","vp-container":""},cb={class:"page"},fb={"vp-content":""};function db(e,t,n,r,o,i){return X(),re("div",ub,[ae("main",cb,[ae("div",fb,[t[0]||(t[0]=ae("h1",null,"404",-1)),ae("blockquote",null,Re(r.getMsg()),1),le(r.RouteLink,{to:r.homeLink},{default:Ne(()=>[sn(Re(r.homeText),1)]),_:1},8,["to"])])])])}const pb=Pe(lb,[["render",db],["__scopeId","data-v-d1d25ab8"],["__file","NotFound.vue"]]),hb=Rt({enhance({app:e,router:t}){af("Badge")||e.component("Badge",Z1);const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...r)=>(await Yf().wait(),n(...r))},setup(){M1(),q1()},layouts:{Layout:ab,NotFound:pb}}),mb=Object.freeze(Object.defineProperty({__proto__:null,default:hb},Symbol.toStringTag,{value:"Module"})),_b={enhance:({app:e})=>{e.component("SidebarTop",Yu(()=>S(()=>import("./SidebarTop-Cm7exHpJ.js"),[])))}},gb=Object.freeze(Object.defineProperty({__proto__:null,default:_b},Symbol.toStringTag,{value:"Module"}));function vb(e,t,n){var r,o,i;n===void 0&&(n={});var s=(r=n.isImmediate)!=null&&r,a=(o=n.callback)!=null&&o,l=n.maxWait,u=Date.now(),c=[];function f(){if(l!==void 0){var p=Date.now()-u;if(p+t>=l)return l-p}return t}var d=function(){var p=[].slice.call(arguments),g=this;return new Promise(function(v,E){var b=s&&i===void 0;if(i!==void 0&&clearTimeout(i),i=setTimeout(function(){if(i=void 0,u=Date.now(),!s){var m=e.apply(g,p);a&&a(m),c.forEach(function(y){return(0,y.resolve)(m)}),c=[]}},f()),b){var T=e.apply(g,p);return a&&a(T),v(T)}c.push({resolve:v,reject:E})})};return d.cancel=function(p){i!==void 0&&clearTimeout(i),c.forEach(function(g){return(0,g.reject)(p)}),c=[]},d}var Eb={appId:"4J45WOFT67",apiKey:"2d8317ae404e2cdd64933b6dc5416b6a",indexName:"goravel",locales:{"/":{placeholder:"Search Documentation",translations:{button:{buttonText:"Search"}}},"/zh/":{placeholder:"搜索文档",translations:{button:{buttonText:"搜索文档"}}}}};const yb=e=>{const t=et("keydown",n=>{const r=n.key==="k"&&(n.ctrlKey||n.metaKey);n.key!=="/"&&!r||(n.preventDefault(),e(),t())})},bb=e=>e.button===1||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey,Tb=()=>{const e=cn();return{transformItems:t=>t.map(n=>({...n,url:`/${ds(hm(n.url,"/"))}`})),hitComponent:({hit:t,children:n})=>({type:"a",ref:void 0,constructor:void 0,key:void 0,props:{href:t.url,onClick:r=>{bb(r)||(r.preventDefault(),e.push(t.url.replace("/","/")))},children:n},__v:null}),navigator:{navigate:({itemUrl:t})=>{e.push(t.replace("/","/"))}},transformSearchClient:t=>{const n=vb(t.search,500);return{...t,search:async r=>n(r)}}}},Ab=Eb,Sb=de(Ab),sd=Symbol(""),Ob=()=>{const e=$e(sd),t=Pn();return N(()=>{var n;return{...e.value,...(n=e.value.locales)==null?void 0:n[t.value]}})},kb=e=>{e.provide(sd,er(Sb))},xb=(e,t=[])=>[`lang:${e}`,...Array.isArray(t)?t:[t]],wb=({buttonText:e="Search",buttonAriaLabel:t=e}={})=>``,ad=()=>{if(document.querySelector(".DocSearch-Modal"))return;const e=new Event("keydown");e.key="k",e.metaKey=!0,window.dispatchEvent(e),setTimeout(ad,16)},Cb=e=>{const t="algolia-preconnect";("requestIdleCallback"in window?window.requestIdleCallback:setTimeout)(()=>{if(document.head.querySelector(`#${t}`))return;const n=document.createElement("link");n.id=t,n.rel="preconnect",n.href=`https://${e}-dsn.algolia.net`,n.crossOrigin="",document.head.appendChild(n)})},Pb=me({name:"DocSearch",props:{containerId:{type:String,default:"docsearch-container"},options:{type:Object,default:()=>({})}},setup(e){const t=Ob(),n=Tb(),r=gs(),o=Pn(),i=de(!1),s=de(!1),a=N(()=>{const{locales:c={},...f}=e.options;return{...t.value,...f,...c[o.value]}}),l=async()=>{const{default:c}=await S(async()=>{const{default:d}=await import("./index-DuqNHZ2Z.js");return{default:d}},[]),{searchParameters:f}=a.value;c({...n,...a.value,container:`#${e.containerId}`,searchParameters:{...f,facetFilters:xb(r.value,f==null?void 0:f.facetFilters)}}),i.value=!0},u=()=>{s.value||i.value||(s.value=!0,l(),ad(),Ue(o,l))};return yb(u),We(()=>{Cb(a.value.appId)}),()=>{var c;return[ue("div",{id:e.containerId,style:{display:i.value?"block":"none"}}),i.value?null:ue("div",{onClick:u,innerHTML:wb((c=a.value.translations)==null?void 0:c.button)})]}}}),Ib={enhance({app:e}){kb(e),e.component("SearchBox",Pb)}},Rb=Object.freeze(Object.defineProperty({__proto__:null,default:Ib},Symbol.toStringTag,{value:"Module"}));var Lb={provider:"Giscus",comment:!0,repo:"goravel/goravel",repoId:"R_kgDOGR4SdA",category:"Announcements",categoryId:"DIC_kwDOGR4SdM4CUEsk",mapping:"og:title",strict:!1,reactionsEnabled:!0,lazyLoading:!0,darkTheme:"preferred_color_scheme",lightTheme:"preferred_color_scheme",inputPosition:"top"};const Db=Lb,Vb=de(Db),ld=Symbol(""),ud=()=>$e(ld),Nb=ud,Mb=e=>{e.provide(ld,er(Vb))},su=["ar","ca","da","de","en","eo","es","fa","fr","he","id","it","ja","ko","nl","pl","pt","ro","ru","th","tr","uk","uz","vi","zh-CN","zh-TW"];var Fb=me({name:"GiscusComment",props:{identifier:{type:String,required:!0},darkmode:Boolean},setup(e){const t=Nb(),n=gs(),r=N(()=>!!(t.value.repo&&t.value.repoId&&t.value.category&&t.value.categoryId)),o=de(!1),i=N(()=>{if(su.includes(n.value))return n.value;const a=n.value.split("-")[0];return su.includes(a)?a:"en"}),s=N(()=>({repo:t.value.repo,repoId:t.value.repoId,category:t.value.category,categoryId:t.value.categoryId,lang:i.value,theme:e.darkmode?t.value.darkTheme||"dark":t.value.lightTheme||"light",mapping:t.value.mapping||"pathname",term:e.identifier,inputPosition:t.value.inputPosition||"top",reactionsEnabled:t.value.reactionsEnabled===!1?"0":"1",strict:t.value.strict===!1?"0":"1",loading:t.value.lazyLoading===!1?"eager":"lazy",emitMetadata:"0"}));return We(async()=>{await S(()=>import("./giscus--_FS5kYt.js"),[]),o.value=!0}),()=>r.value?ue("div",{id:"comment",class:["giscus-wrapper",{"input-top":t.value.inputPosition!=="bottom"}]},o.value?ue("giscus-widget",s.value):ue(sf)):null}}),Hb=me({name:"CommentService",props:{darkmode:Boolean},setup(e){const t=ud(),n=Cn(),r=vt(),o=N(()=>r.value.comment??t.value.comment!==!1);return()=>ue(Fb,{class:"vp-comment","vp-comment":"",identifier:r.value.commentID??n.value.path,darkmode:e.darkmode,style:{display:o.value?"block":"none"}})}}),zb=Rt({enhance:({app:e})=>{Mb(e),e.component("CommentService",Hb)}});const Bb=Object.freeze(Object.defineProperty({__proto__:null,default:zb},Symbol.toStringTag,{value:"Module"})),$b=Rt({}),Ub=Object.freeze(Object.defineProperty({__proto__:null,default:$b},Symbol.toStringTag,{value:"Module"})),ao=[Pg,zg,Gg,Yg,lv,hv,gv,Av,D1,mb,gb,Rb,Bb,Ub].map(e=>e.default).filter(Boolean),jb=JSON.parse(`{"base":"/","lang":"en-US","title":"Goravel","description":"A Golang web application framework","head":[["script",{"crossorigin":"anonymous","async":true,"src":"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4978322804450032"}],["script",{"async":true,"src":"https://www.googletagmanager.com/gtag/js?id=G-HJQNEG5H69"}],["script",{},"window.dataLayer = window.dataLayer || [];\\nfunction gtag(){dataLayer.push(arguments);}\\ngtag('js', new Date());\\ngtag('config', 'G-HJQNEG5H69');"]],"locales":{"/":{"lang":"en-US","title":"Goravel","description":"A Golang web application framework"},"/zh/":{"lang":"zh-CN","title":"Goravel","description":"Golang WEB 应用框架"}}}`);var gr=At(jb),Kb=a_,Wb=()=>{const e=$_({history:Kb(Pc("/")),routes:[{name:"vuepress-route",path:"/:catchAll(.*)",components:{}}],scrollBehavior:(t,n,r)=>r||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{if(t.path!==n.path||n===Mt){const r=Vr(t.fullPath);if(r.path!==t.fullPath)return r.path;const o=await r.loader();t.meta={...r.meta,_pageChunk:o}}else t.path===n.path&&(t.meta=n.meta)}),e},Gb=e=>{e.component("ClientOnly",Es),e.component("Content",ys),e.component("RouteLink",Ho)},qb=(e,t,n)=>{const r=N(()=>t.currentRoute.value.path),o=tp((E,b)=>({get(){return E(),t.currentRoute.value.meta._pageChunk},set(T){t.currentRoute.value.meta._pageChunk=T,b()}})),i=N(()=>mn.resolveLayouts(n)),s=N(()=>mn.resolveRouteLocale(gr.value.locales,r.value)),a=N(()=>mn.resolveSiteLocaleData(gr.value,s.value)),l=N(()=>o.value.comp),u=N(()=>o.value.data),c=N(()=>u.value.frontmatter),f=N(()=>mn.resolvePageHeadTitle(u.value,a.value)),d=N(()=>mn.resolvePageHead(f.value,c.value,a.value)),p=N(()=>mn.resolvePageLang(u.value,a.value)),g=N(()=>mn.resolvePageLayout(u.value,i.value)),v={layouts:i,pageData:u,pageComponent:l,pageFrontmatter:c,pageHead:d,pageHeadTitle:f,pageLang:p,pageLayout:g,redirects:Vi,routeLocale:s,routePath:r,routes:$n,siteData:gr,siteLocaleData:a};return e.provide(_s,v),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>c.value},$head:{get:()=>d.value},$headTitle:{get:()=>f.value},$lang:{get:()=>p.value},$page:{get:()=>u.value},$routeLocale:{get:()=>s.value},$site:{get:()=>gr.value},$siteLocale:{get:()=>a.value},$withBase:{get:()=>bs}}),v},Yb=([e,t,n=""])=>{const r=Object.entries(t).map(([a,l])=>Tt(l)?`[${a}=${JSON.stringify(l)}]`:l?`[${a}]`:"").join(""),o=`head > ${e}${r}`;return Array.from(document.querySelectorAll(o)).find(a=>a.innerText===n)??null},Xb=([e,t,n])=>{if(!Tt(e))return null;const r=document.createElement(e);return ps(t)&&Object.entries(t).forEach(([o,i])=>{Tt(i)?r.setAttribute(o,i):i&&r.setAttribute(o,"")}),Tt(n)&&r.appendChild(document.createTextNode(n)),r},Zb=()=>{const e=K_(),t=gs();let n=[];const r=()=>{e.value.forEach(s=>{const a=Yb(s);a&&n.push(a)})},o=()=>{const s=[];return e.value.forEach(a=>{const l=Xb(a);l&&s.push(l)}),s},i=()=>{document.documentElement.lang=t.value;const s=o();n.forEach((a,l)=>{const u=s.findIndex(c=>a.isEqualNode(c));u===-1?(a.remove(),delete n[l]):s.splice(u,1)}),s.forEach(a=>document.head.appendChild(a)),n=[...n.filter(a=>!!a),...s]};On(q_,i),We(()=>{r(),Ue(e,i,{immediate:!1})})},Jb=sm,Qb=async()=>{var r;const e=Jb({name:"Vuepress",setup(){var s;Zb();for(const a of ao)(s=a.setup)==null||s.call(a);const o=ao.flatMap(({rootComponents:a=[]})=>a.map(l=>ue(l))),i=W_();return()=>[ue(i.value),o]}}),t=Wb();Gb(e);const n=qb(e,t,ao);{const{setupDevtools:o}=await S(async()=>{const{setupDevtools:i}=await import("./setupDevtools-7MC2TMWH-D878vR7l.js");return{setupDevtools:i}},[]);o(e,n)}for(const o of ao)await((r=o.enhance)==null?void 0:r.call(o,{app:e,router:t,siteData:gr}));return e.use(t),{app:e,router:t}};Qb().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{Pe as _,yh as a,ae as b,re as c,Qb as createVueApp,sn as d,le as e,Ne as f,X as o,as as r,W0 as s,Ue as w}; diff --git a/assets/artisan-console.html-BCKOcmwb.js b/assets/artisan-console.html-CPLMFSR0.js similarity index 99% rename from assets/artisan-console.html-BCKOcmwb.js rename to assets/artisan-console.html-CPLMFSR0.js index 65a9cfba..aa6d6496 100644 --- a/assets/artisan-console.html-BCKOcmwb.js +++ b/assets/artisan-console.html-CPLMFSR0.js @@ -1,4 +1,4 @@ -import{_ as c,c as o,b as s,e as a,f as p,a as u,r as l,o as r,d as t}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function m(v,n){const e=l("router-link"),i=l("CommentService");return r(),o("div",null,[n[10]||(n[10]=s("h1",{id:"artisan-命令行",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#artisan-命令行"},[s("span",null,"Artisan 命令行")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#简介"},{default:p(()=>n[0]||(n[0]=[t("简介")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#生成命令"},{default:p(()=>n[1]||(n[1]=[t("生成命令")])),_:1})]),s("li",null,[a(e,{to:"#命令结构"},{default:p(()=>n[2]||(n[2]=[t("命令结构")])),_:1})])])]),s("li",null,[a(e,{to:"#命令-i-o"},{default:p(()=>n[3]||(n[3]=[t("命令 I/O")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#检索输入"},{default:p(()=>n[4]||(n[4]=[t("检索输入")])),_:1})]),s("li",null,[a(e,{to:"#交互式输入"},{default:p(()=>n[5]||(n[5]=[t("交互式输入")])),_:1})]),s("li",null,[a(e,{to:"#文字输出"},{default:p(()=>n[6]||(n[6]=[t("文字输出")])),_:1})])])]),s("li",null,[a(e,{to:"#分类"},{default:p(()=>n[7]||(n[7]=[t("分类")])),_:1})]),s("li",null,[a(e,{to:"#注册命令"},{default:p(()=>n[8]||(n[8]=[t("注册命令")])),_:1})]),s("li",null,[a(e,{to:"#以编程方式执行命令"},{default:p(()=>n[9]||(n[9]=[t("以编程方式执行命令")])),_:1})])])]),n[11]||(n[11]=u(`

简介

Artisan 是 Goravel 自带的命令行工具,该模块可以使用 facades.Artisan() 进行操作。它提供了许多有用的命令,这些命令可以在构建应用时为你提供帮助。你可以通过命令查看所有可用的 Artisan 命令:

go run . artisan list
+import{_ as c,c as o,b as s,e as a,f as p,a as u,r as l,o as r,d as t}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function m(v,n){const e=l("router-link"),i=l("CommentService");return r(),o("div",null,[n[10]||(n[10]=s("h1",{id:"artisan-命令行",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#artisan-命令行"},[s("span",null,"Artisan 命令行")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#简介"},{default:p(()=>n[0]||(n[0]=[t("简介")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#生成命令"},{default:p(()=>n[1]||(n[1]=[t("生成命令")])),_:1})]),s("li",null,[a(e,{to:"#命令结构"},{default:p(()=>n[2]||(n[2]=[t("命令结构")])),_:1})])])]),s("li",null,[a(e,{to:"#命令-i-o"},{default:p(()=>n[3]||(n[3]=[t("命令 I/O")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#检索输入"},{default:p(()=>n[4]||(n[4]=[t("检索输入")])),_:1})]),s("li",null,[a(e,{to:"#交互式输入"},{default:p(()=>n[5]||(n[5]=[t("交互式输入")])),_:1})]),s("li",null,[a(e,{to:"#文字输出"},{default:p(()=>n[6]||(n[6]=[t("文字输出")])),_:1})])])]),s("li",null,[a(e,{to:"#分类"},{default:p(()=>n[7]||(n[7]=[t("分类")])),_:1})]),s("li",null,[a(e,{to:"#注册命令"},{default:p(()=>n[8]||(n[8]=[t("注册命令")])),_:1})]),s("li",null,[a(e,{to:"#以编程方式执行命令"},{default:p(()=>n[9]||(n[9]=[t("以编程方式执行命令")])),_:1})])])]),n[11]||(n[11]=u(`

简介

Artisan 是 Goravel 自带的命令行工具,该模块可以使用 facades.Artisan() 进行操作。它提供了许多有用的命令,这些命令可以在构建应用时为你提供帮助。你可以通过命令查看所有可用的 Artisan 命令:

go run . artisan list
 

每个命令都包含了「help」,它会显示和概述命令的可用参数及选项。只需要在命令前加上 help 即可查看命令帮助界面:

go run . artisan help migrate
 

如果您不想重复输入 go run . artisan ... 命令,你可以在终端中为这个命令添加一个别名:

echo -e "\\r\\nalias artisan=\\"go run . artisan\\"" >>~/.zshrc
 

随后您就可以简单的运行以下命令:

artisan make:controller DemoController
diff --git a/assets/artisan-console.html-IU4iD0e4.js b/assets/artisan-console.html-DAWKwL5O.js
similarity index 99%
rename from assets/artisan-console.html-IU4iD0e4.js
rename to assets/artisan-console.html-DAWKwL5O.js
index bb6c76cd..6bef1e4a 100644
--- a/assets/artisan-console.html-IU4iD0e4.js
+++ b/assets/artisan-console.html-DAWKwL5O.js
@@ -1,4 +1,4 @@
-import{_ as l,c,b as s,e as a,f as t,a as u,r as i,o as r,d as p}from"./app-ELDWQP0J.js";const d={},m={class:"table-of-contents"};function k(v,n){const e=i("router-link"),o=i("CommentService");return r(),c("div",null,[n[10]||(n[10]=s("h1",{id:"artisan-console",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#artisan-console"},[s("span",null,"Artisan Console")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[p("Introduction")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#generating-commands"},{default:t(()=>n[1]||(n[1]=[p("Generating Commands")])),_:1})]),s("li",null,[a(e,{to:"#command-structure"},{default:t(()=>n[2]||(n[2]=[p("Command Structure")])),_:1})])])]),s("li",null,[a(e,{to:"#command-i-o"},{default:t(()=>n[3]||(n[3]=[p("Command I/O")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#retrieving-input"},{default:t(()=>n[4]||(n[4]=[p("Retrieving Input")])),_:1})]),s("li",null,[a(e,{to:"#prompting-for-input"},{default:t(()=>n[5]||(n[5]=[p("Prompting For Input")])),_:1})]),s("li",null,[a(e,{to:"#writing-output"},{default:t(()=>n[6]||(n[6]=[p("Writing Output")])),_:1})])])]),s("li",null,[a(e,{to:"#category"},{default:t(()=>n[7]||(n[7]=[p("Category")])),_:1})]),s("li",null,[a(e,{to:"#registering-commands"},{default:t(()=>n[8]||(n[8]=[p("Registering Commands")])),_:1})]),s("li",null,[a(e,{to:"#programmatically-executing-commands"},{default:t(()=>n[9]||(n[9]=[p("Programmatically Executing Commands")])),_:1})])])]),n[11]||(n[11]=u(`

Introduction

Artisan is the CLI tool that comes with Goravel for interacting with the command line. You can access it using facades.Artisan(). This tool has several useful commands that can assist you in the development of your application. Utilize the following command to view all available commands.

go run . artisan list
+import{_ as l,c,b as s,e as a,f as t,a as u,r as i,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},m={class:"table-of-contents"};function k(v,n){const e=i("router-link"),o=i("CommentService");return r(),c("div",null,[n[10]||(n[10]=s("h1",{id:"artisan-console",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#artisan-console"},[s("span",null,"Artisan Console")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[p("Introduction")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#generating-commands"},{default:t(()=>n[1]||(n[1]=[p("Generating Commands")])),_:1})]),s("li",null,[a(e,{to:"#command-structure"},{default:t(()=>n[2]||(n[2]=[p("Command Structure")])),_:1})])])]),s("li",null,[a(e,{to:"#command-i-o"},{default:t(()=>n[3]||(n[3]=[p("Command I/O")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#retrieving-input"},{default:t(()=>n[4]||(n[4]=[p("Retrieving Input")])),_:1})]),s("li",null,[a(e,{to:"#prompting-for-input"},{default:t(()=>n[5]||(n[5]=[p("Prompting For Input")])),_:1})]),s("li",null,[a(e,{to:"#writing-output"},{default:t(()=>n[6]||(n[6]=[p("Writing Output")])),_:1})])])]),s("li",null,[a(e,{to:"#category"},{default:t(()=>n[7]||(n[7]=[p("Category")])),_:1})]),s("li",null,[a(e,{to:"#registering-commands"},{default:t(()=>n[8]||(n[8]=[p("Registering Commands")])),_:1})]),s("li",null,[a(e,{to:"#programmatically-executing-commands"},{default:t(()=>n[9]||(n[9]=[p("Programmatically Executing Commands")])),_:1})])])]),n[11]||(n[11]=u(`

Introduction

Artisan is the CLI tool that comes with Goravel for interacting with the command line. You can access it using facades.Artisan(). This tool has several useful commands that can assist you in the development of your application. Utilize the following command to view all available commands.

go run . artisan list
 

Each command also has a "help" feature that shows and explains the arguments and options associated with the command. To see the help screen, just add "help" before the command name.

go run . artisan help migrate
 

Instead of repeating go run . artisan ... command, you may want to add an alias to your shell configuration with the terminal command below:

echo -e "\\r\\nalias artisan=\\"go run . artisan\\"" >>~/.zshrc
 

Then you can simply run your commands like this:

artisan make:controller DemoController
diff --git a/assets/authentication.html-BwD2_av1.js b/assets/authentication.html-BAJpTW5P.js
similarity index 99%
rename from assets/authentication.html-BwD2_av1.js
rename to assets/authentication.html-BAJpTW5P.js
index e67deb6f..fc4331ff 100644
--- a/assets/authentication.html-BwD2_av1.js
+++ b/assets/authentication.html-BAJpTW5P.js
@@ -1,4 +1,4 @@
-import{_ as l,c,b as s,e as a,f as t,a as u,r as i,o as r,d as o}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function g(h,n){const e=i("router-link"),p=i("CommentService");return r(),c("div",null,[n[11]||(n[11]=s("h1",{id:"authentication",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#authentication"},[s("span",null,"Authentication")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[o("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#configuration"},{default:t(()=>n[1]||(n[1]=[o("Configuration")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#configure-ttl-for-different-guards"},{default:t(()=>n[2]||(n[2]=[o("Configure TTL for different Guards")])),_:1})])])]),s("li",null,[a(e,{to:"#generate-jwt-token"},{default:t(()=>n[3]||(n[3]=[o("Generate JWT Token")])),_:1})]),s("li",null,[a(e,{to:"#generate-token-using-user"},{default:t(()=>n[4]||(n[4]=[o("Generate Token Using User")])),_:1})]),s("li",null,[a(e,{to:"#generate-token-using-id"},{default:t(()=>n[5]||(n[5]=[o("Generate Token Using ID")])),_:1})]),s("li",null,[a(e,{to:"#parse-token"},{default:t(()=>n[6]||(n[6]=[o("Parse Token")])),_:1})]),s("li",null,[a(e,{to:"#get-user"},{default:t(()=>n[7]||(n[7]=[o("Get User")])),_:1})]),s("li",null,[a(e,{to:"#refresh-token"},{default:t(()=>n[8]||(n[8]=[o("Refresh Token")])),_:1})]),s("li",null,[a(e,{to:"#logout"},{default:t(()=>n[9]||(n[9]=[o("Logout")])),_:1})]),s("li",null,[a(e,{to:"#multiple-guards"},{default:t(()=>n[10]||(n[10]=[o("Multiple Guards")])),_:1})])])]),n[12]||(n[12]=u(`

Introduction

Authentication is an indispensable feature in Web Applications, the facades.Auth() module of Goravel provides support for JWT.

Configuration

You can configure defaults guard and multiple guards in the config/auth.go file to switch different user identities in the application.

You can configure the parameters of JWT in the config/jwt.go file, such as secret, ttl, refresh_ttl.

Configure TTL for different Guards

You can set TTL for each Guard separately in the config/auth.go file, if not set, the jwt.ttl configuration is used by default.

// config/auth.go
+import{_ as l,c,b as s,e as a,f as t,a as u,r as i,o as r,d as o}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function g(h,n){const e=i("router-link"),p=i("CommentService");return r(),c("div",null,[n[11]||(n[11]=s("h1",{id:"authentication",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#authentication"},[s("span",null,"Authentication")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[o("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#configuration"},{default:t(()=>n[1]||(n[1]=[o("Configuration")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#configure-ttl-for-different-guards"},{default:t(()=>n[2]||(n[2]=[o("Configure TTL for different Guards")])),_:1})])])]),s("li",null,[a(e,{to:"#generate-jwt-token"},{default:t(()=>n[3]||(n[3]=[o("Generate JWT Token")])),_:1})]),s("li",null,[a(e,{to:"#generate-token-using-user"},{default:t(()=>n[4]||(n[4]=[o("Generate Token Using User")])),_:1})]),s("li",null,[a(e,{to:"#generate-token-using-id"},{default:t(()=>n[5]||(n[5]=[o("Generate Token Using ID")])),_:1})]),s("li",null,[a(e,{to:"#parse-token"},{default:t(()=>n[6]||(n[6]=[o("Parse Token")])),_:1})]),s("li",null,[a(e,{to:"#get-user"},{default:t(()=>n[7]||(n[7]=[o("Get User")])),_:1})]),s("li",null,[a(e,{to:"#refresh-token"},{default:t(()=>n[8]||(n[8]=[o("Refresh Token")])),_:1})]),s("li",null,[a(e,{to:"#logout"},{default:t(()=>n[9]||(n[9]=[o("Logout")])),_:1})]),s("li",null,[a(e,{to:"#multiple-guards"},{default:t(()=>n[10]||(n[10]=[o("Multiple Guards")])),_:1})])])]),n[12]||(n[12]=u(`

Introduction

Authentication is an indispensable feature in Web Applications, the facades.Auth() module of Goravel provides support for JWT.

Configuration

You can configure defaults guard and multiple guards in the config/auth.go file to switch different user identities in the application.

You can configure the parameters of JWT in the config/jwt.go file, such as secret, ttl, refresh_ttl.

Configure TTL for different Guards

You can set TTL for each Guard separately in the config/auth.go file, if not set, the jwt.ttl configuration is used by default.

// config/auth.go
 "guards": map[string]any{
   "user": map[string]any{
     "driver": "jwt",
diff --git a/assets/authentication.html-onB6WImG.js b/assets/authentication.html-cW_F_Plz.js
similarity index 99%
rename from assets/authentication.html-onB6WImG.js
rename to assets/authentication.html-cW_F_Plz.js
index 9048c0d9..e4a49296 100644
--- a/assets/authentication.html-onB6WImG.js
+++ b/assets/authentication.html-cW_F_Plz.js
@@ -1,4 +1,4 @@
-import{_ as i,c,b as s,e as a,f as t,a as u,r as p,o as r,d as o}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function h(g,n){const e=p("router-link"),l=p("CommentService");return r(),c("div",null,[n[11]||(n[11]=s("h1",{id:"用户认证",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#用户认证"},[s("span",null,"用户认证")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#简介"},{default:t(()=>n[0]||(n[0]=[o("简介")])),_:1})]),s("li",null,[a(e,{to:"#配置"},{default:t(()=>n[1]||(n[1]=[o("配置")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#为不同-guard-配置-ttl"},{default:t(()=>n[2]||(n[2]=[o("为不同 Guard 配置 TTL")])),_:1})])])]),s("li",null,[a(e,{to:"#生成-jwt-token"},{default:t(()=>n[3]||(n[3]=[o("生成 JWT Token")])),_:1})]),s("li",null,[a(e,{to:"#根据用户生成-token"},{default:t(()=>n[4]||(n[4]=[o("根据用户生成 Token")])),_:1})]),s("li",null,[a(e,{to:"#根据用户-id-生成-token"},{default:t(()=>n[5]||(n[5]=[o("根据用户 ID 生成 Token")])),_:1})]),s("li",null,[a(e,{to:"#解析-token"},{default:t(()=>n[6]||(n[6]=[o("解析 Token")])),_:1})]),s("li",null,[a(e,{to:"#获取用户"},{default:t(()=>n[7]||(n[7]=[o("获取用户")])),_:1})]),s("li",null,[a(e,{to:"#刷新-token"},{default:t(()=>n[8]||(n[8]=[o("刷新 Token")])),_:1})]),s("li",null,[a(e,{to:"#登出"},{default:t(()=>n[9]||(n[9]=[o("登出")])),_:1})]),s("li",null,[a(e,{to:"#多用户授权"},{default:t(()=>n[10]||(n[10]=[o("多用户授权")])),_:1})])])]),n[12]||(n[12]=u(`

简介

用户认证是 Web 应用中不可或缺的功能,Goravel 的 facades.Auth() 模块提供 JWT 功能的支持。

配置

可以在 config/auth.go 文件中配置默认守卫与多个守卫,以便在应用中进行不同用户身份的切换。

可以在 config/jwt.go 文件中配置 JWT 的相关参数,如秘钥、有效时长、可刷新时长等。

为不同 Guard 配置 TTL

你可以通过在 config/auth.go 文件中为每个 Guard 单独设置 TTL,如果不设置,则默认使用 jwt.ttl 配置。

// config/auth.go
+import{_ as i,c,b as s,e as a,f as t,a as u,r as p,o as r,d as o}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function h(g,n){const e=p("router-link"),l=p("CommentService");return r(),c("div",null,[n[11]||(n[11]=s("h1",{id:"用户认证",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#用户认证"},[s("span",null,"用户认证")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#简介"},{default:t(()=>n[0]||(n[0]=[o("简介")])),_:1})]),s("li",null,[a(e,{to:"#配置"},{default:t(()=>n[1]||(n[1]=[o("配置")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#为不同-guard-配置-ttl"},{default:t(()=>n[2]||(n[2]=[o("为不同 Guard 配置 TTL")])),_:1})])])]),s("li",null,[a(e,{to:"#生成-jwt-token"},{default:t(()=>n[3]||(n[3]=[o("生成 JWT Token")])),_:1})]),s("li",null,[a(e,{to:"#根据用户生成-token"},{default:t(()=>n[4]||(n[4]=[o("根据用户生成 Token")])),_:1})]),s("li",null,[a(e,{to:"#根据用户-id-生成-token"},{default:t(()=>n[5]||(n[5]=[o("根据用户 ID 生成 Token")])),_:1})]),s("li",null,[a(e,{to:"#解析-token"},{default:t(()=>n[6]||(n[6]=[o("解析 Token")])),_:1})]),s("li",null,[a(e,{to:"#获取用户"},{default:t(()=>n[7]||(n[7]=[o("获取用户")])),_:1})]),s("li",null,[a(e,{to:"#刷新-token"},{default:t(()=>n[8]||(n[8]=[o("刷新 Token")])),_:1})]),s("li",null,[a(e,{to:"#登出"},{default:t(()=>n[9]||(n[9]=[o("登出")])),_:1})]),s("li",null,[a(e,{to:"#多用户授权"},{default:t(()=>n[10]||(n[10]=[o("多用户授权")])),_:1})])])]),n[12]||(n[12]=u(`

简介

用户认证是 Web 应用中不可或缺的功能,Goravel 的 facades.Auth() 模块提供 JWT 功能的支持。

配置

可以在 config/auth.go 文件中配置默认守卫与多个守卫,以便在应用中进行不同用户身份的切换。

可以在 config/jwt.go 文件中配置 JWT 的相关参数,如秘钥、有效时长、可刷新时长等。

为不同 Guard 配置 TTL

你可以通过在 config/auth.go 文件中为每个 Guard 单独设置 TTL,如果不设置,则默认使用 jwt.ttl 配置。

// config/auth.go
 "guards": map[string]any{
   "user": map[string]any{
     "driver": "jwt",
diff --git a/assets/authorization.html-DG4a-UCq.js b/assets/authorization.html-Btcm8c6c.js
similarity index 99%
rename from assets/authorization.html-DG4a-UCq.js
rename to assets/authorization.html-Btcm8c6c.js
index 411d0c1c..c06c66f7 100644
--- a/assets/authorization.html-DG4a-UCq.js
+++ b/assets/authorization.html-Btcm8c6c.js
@@ -1,4 +1,4 @@
-import{_ as i,c as u,b as s,e as t,f as e,d as a,a as r,r as o,o as d}from"./app-ELDWQP0J.js";const k={},v={class:"table-of-contents"};function m(g,n){const p=o("router-link"),c=o("RouteLink"),l=o("CommentService");return d(),u("div",null,[n[13]||(n[13]=s("h1",{id:"用户授权",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#用户授权"},[s("span",null,"用户授权")])],-1)),s("nav",v,[s("ul",null,[s("li",null,[t(p,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[a("简介")])),_:1})]),s("li",null,[t(p,{to:"#拦截器-gates"},{default:e(()=>n[1]||(n[1]=[a("拦截器(Gates)")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#编写拦截器-gates"},{default:e(()=>n[2]||(n[2]=[a("编写拦截器(Gates)")])),_:1})]),s("li",null,[t(p,{to:"#行为授权控制"},{default:e(()=>n[3]||(n[3]=[a("行为授权控制")])),_:1})]),s("li",null,[t(p,{to:"#拦截器-gates-返回-responses"},{default:e(()=>n[4]||(n[4]=[a("拦截器(Gates)返回(Responses)")])),_:1})]),s("li",null,[t(p,{to:"#拦截器-gates-优先级"},{default:e(()=>n[5]||(n[5]=[a("拦截器(Gates)优先级")])),_:1})]),s("li",null,[t(p,{to:"#注入-context"},{default:e(()=>n[6]||(n[6]=[a("注入 Context")])),_:1})])])]),s("li",null,[t(p,{to:"#策略-policies"},{default:e(()=>n[7]||(n[7]=[a("策略(Policies)")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#生成策略"},{default:e(()=>n[8]||(n[8]=[a("生成策略")])),_:1})]),s("li",null,[t(p,{to:"#编写策略"},{default:e(()=>n[9]||(n[9]=[a("编写策略")])),_:1})])])])])]),n[14]||(n[14]=s("h2",{id:"简介",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#简介"},[s("span",null,"简介")])],-1)),s("p",null,[n[11]||(n[11]=a("除了提供内置的 ")),t(c,{to:"/zh/security/authentication.html"},{default:e(()=>n[10]||(n[10]=[a("身份验证(authentication)")])),_:1}),n[12]||(n[12]=a(" 服务外,Goravel 还提供了一种可以很简单就进行使用的方法,来对用户与资源的授权关系进行管理。即使用户已经通过了「身份验证(authentication)」, 用户也可能无权对应用程序中的模型或数据库记录进行删除或更改。"))]),n[15]||(n[15]=r(`

Goravel 主要提供了两种授权操作的方法: 拦截器策略。可以把拦截器(gates)和策略(policies)想象成路由和控制器。拦截器(Gates)提供了一种轻便的基于闭包函数的授权方法,像是路由。而策略(policies),就像是一个控制器,对特定模型或资源进行管理。在本文档中,我们将首先探讨拦截器(gates),然后是策略(policies)。

您在构建应用程序时,不用为是使用拦截器(gates)或是使用策略(policies)而担心,并不需要在两者中进行唯一选择。大多数的应用程序都同时包含两种方法,并且同时使用两者。

拦截器(Gates)

编写拦截器(Gates)

拦截器(Gates)是用来确定用户是否有权执行给定操作的闭包函数。默认条件下,拦截器(Gates)的使用,是在 app/providers/auth_service_provider.go 文件中的 Boot 方法里来规定 Gate 规则。

在下面的例子中,我们将定义一个拦截器(Gates),通过比较用户的 id 来判断是否有对 post 数据操作的权限:

package providers
+import{_ as i,c as u,b as s,e as t,f as e,d as a,a as r,r as o,o as d}from"./app-Ewo6p9aM.js";const k={},v={class:"table-of-contents"};function m(g,n){const p=o("router-link"),c=o("RouteLink"),l=o("CommentService");return d(),u("div",null,[n[13]||(n[13]=s("h1",{id:"用户授权",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#用户授权"},[s("span",null,"用户授权")])],-1)),s("nav",v,[s("ul",null,[s("li",null,[t(p,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[a("简介")])),_:1})]),s("li",null,[t(p,{to:"#拦截器-gates"},{default:e(()=>n[1]||(n[1]=[a("拦截器(Gates)")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#编写拦截器-gates"},{default:e(()=>n[2]||(n[2]=[a("编写拦截器(Gates)")])),_:1})]),s("li",null,[t(p,{to:"#行为授权控制"},{default:e(()=>n[3]||(n[3]=[a("行为授权控制")])),_:1})]),s("li",null,[t(p,{to:"#拦截器-gates-返回-responses"},{default:e(()=>n[4]||(n[4]=[a("拦截器(Gates)返回(Responses)")])),_:1})]),s("li",null,[t(p,{to:"#拦截器-gates-优先级"},{default:e(()=>n[5]||(n[5]=[a("拦截器(Gates)优先级")])),_:1})]),s("li",null,[t(p,{to:"#注入-context"},{default:e(()=>n[6]||(n[6]=[a("注入 Context")])),_:1})])])]),s("li",null,[t(p,{to:"#策略-policies"},{default:e(()=>n[7]||(n[7]=[a("策略(Policies)")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#生成策略"},{default:e(()=>n[8]||(n[8]=[a("生成策略")])),_:1})]),s("li",null,[t(p,{to:"#编写策略"},{default:e(()=>n[9]||(n[9]=[a("编写策略")])),_:1})])])])])]),n[14]||(n[14]=s("h2",{id:"简介",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#简介"},[s("span",null,"简介")])],-1)),s("p",null,[n[11]||(n[11]=a("除了提供内置的 ")),t(c,{to:"/zh/security/authentication.html"},{default:e(()=>n[10]||(n[10]=[a("身份验证(authentication)")])),_:1}),n[12]||(n[12]=a(" 服务外,Goravel 还提供了一种可以很简单就进行使用的方法,来对用户与资源的授权关系进行管理。即使用户已经通过了「身份验证(authentication)」, 用户也可能无权对应用程序中的模型或数据库记录进行删除或更改。"))]),n[15]||(n[15]=r(`

Goravel 主要提供了两种授权操作的方法: 拦截器策略。可以把拦截器(gates)和策略(policies)想象成路由和控制器。拦截器(Gates)提供了一种轻便的基于闭包函数的授权方法,像是路由。而策略(policies),就像是一个控制器,对特定模型或资源进行管理。在本文档中,我们将首先探讨拦截器(gates),然后是策略(policies)。

您在构建应用程序时,不用为是使用拦截器(gates)或是使用策略(policies)而担心,并不需要在两者中进行唯一选择。大多数的应用程序都同时包含两种方法,并且同时使用两者。

拦截器(Gates)

编写拦截器(Gates)

拦截器(Gates)是用来确定用户是否有权执行给定操作的闭包函数。默认条件下,拦截器(Gates)的使用,是在 app/providers/auth_service_provider.go 文件中的 Boot 方法里来规定 Gate 规则。

在下面的例子中,我们将定义一个拦截器(Gates),通过比较用户的 id 来判断是否有对 post 数据操作的权限:

package providers
 
 import (
   "context"
diff --git a/assets/authorization.html-BHYtLfr9.js b/assets/authorization.html-Dqcqkx8v.js
similarity index 99%
rename from assets/authorization.html-BHYtLfr9.js
rename to assets/authorization.html-Dqcqkx8v.js
index 977688f3..387a044c 100644
--- a/assets/authorization.html-BHYtLfr9.js
+++ b/assets/authorization.html-Dqcqkx8v.js
@@ -1,4 +1,4 @@
-import{_ as l,c as u,b as s,e as t,f as e,d as a,a as r,r as o,o as d}from"./app-ELDWQP0J.js";const k={},v={class:"table-of-contents"};function m(g,n){const p=o("router-link"),i=o("RouteLink"),c=o("CommentService");return d(),u("div",null,[n[13]||(n[13]=s("h1",{id:"authorization",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#authorization"},[s("span",null,"Authorization")])],-1)),s("nav",v,[s("ul",null,[s("li",null,[t(p,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[t(p,{to:"#gates"},{default:e(()=>n[1]||(n[1]=[a("Gates")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#writing-gates"},{default:e(()=>n[2]||(n[2]=[a("Writing Gates")])),_:1})]),s("li",null,[t(p,{to:"#authorizing-actions"},{default:e(()=>n[3]||(n[3]=[a("Authorizing Actions")])),_:1})]),s("li",null,[t(p,{to:"#gate-responses"},{default:e(()=>n[4]||(n[4]=[a("Gate Responses")])),_:1})]),s("li",null,[t(p,{to:"#intercepting-gate-checks"},{default:e(()=>n[5]||(n[5]=[a("Intercepting Gate Checks")])),_:1})]),s("li",null,[t(p,{to:"#inject-context"},{default:e(()=>n[6]||(n[6]=[a("Inject Context")])),_:1})])])]),s("li",null,[t(p,{to:"#policies"},{default:e(()=>n[7]||(n[7]=[a("Policies")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#generating-policies"},{default:e(()=>n[8]||(n[8]=[a("Generating Policies")])),_:1})]),s("li",null,[t(p,{to:"#writing-policies"},{default:e(()=>n[9]||(n[9]=[a("Writing Policies")])),_:1})])])])])]),n[14]||(n[14]=s("h2",{id:"introduction",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#introduction"},[s("span",null,"Introduction")])],-1)),s("p",null,[n[11]||(n[11]=a("Goravel offers built-in ")),t(i,{to:"/security/authentication.html"},{default:e(()=>n[10]||(n[10]=[a("authentication")])),_:1}),n[12]||(n[12]=a(" services and an easy-to-use authorization feature to manage user actions on resources. Even if a user is authenticated, they may not have the authority to modify or delete certain Eloquent models or database records. Goravel's authorization feature allows for a systematic way of managing these authorization checks."))]),n[15]||(n[15]=r(`

There are two ways to authorize actions in Goravel: gates and policies. Imagine gates and policies as similar to routes and controllers. Gates are based on closures and provide a simple approach to authorization, whereas policies group logic around a specific resource, similar to controllers. This documentation will first cover gates and then delve into policies.

It's not necessary to exclusively use gates or policies when building an application. Most applications will use a combination of both, which is perfectly acceptable!

Gates

Writing Gates

Gates serve as closures that verify whether a user is authorized to perform a specific action. They are commonly set up in the app/providers/auth_service_provider.go file's Boot method using the Gate facade.

In this scenario, we will establish a gate to check if a user can modify a particular Post model by comparing its ID to the user_id of the post's creator.

package providers
+import{_ as l,c as u,b as s,e as t,f as e,d as a,a as r,r as o,o as d}from"./app-Ewo6p9aM.js";const k={},v={class:"table-of-contents"};function m(g,n){const p=o("router-link"),i=o("RouteLink"),c=o("CommentService");return d(),u("div",null,[n[13]||(n[13]=s("h1",{id:"authorization",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#authorization"},[s("span",null,"Authorization")])],-1)),s("nav",v,[s("ul",null,[s("li",null,[t(p,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[t(p,{to:"#gates"},{default:e(()=>n[1]||(n[1]=[a("Gates")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#writing-gates"},{default:e(()=>n[2]||(n[2]=[a("Writing Gates")])),_:1})]),s("li",null,[t(p,{to:"#authorizing-actions"},{default:e(()=>n[3]||(n[3]=[a("Authorizing Actions")])),_:1})]),s("li",null,[t(p,{to:"#gate-responses"},{default:e(()=>n[4]||(n[4]=[a("Gate Responses")])),_:1})]),s("li",null,[t(p,{to:"#intercepting-gate-checks"},{default:e(()=>n[5]||(n[5]=[a("Intercepting Gate Checks")])),_:1})]),s("li",null,[t(p,{to:"#inject-context"},{default:e(()=>n[6]||(n[6]=[a("Inject Context")])),_:1})])])]),s("li",null,[t(p,{to:"#policies"},{default:e(()=>n[7]||(n[7]=[a("Policies")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#generating-policies"},{default:e(()=>n[8]||(n[8]=[a("Generating Policies")])),_:1})]),s("li",null,[t(p,{to:"#writing-policies"},{default:e(()=>n[9]||(n[9]=[a("Writing Policies")])),_:1})])])])])]),n[14]||(n[14]=s("h2",{id:"introduction",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#introduction"},[s("span",null,"Introduction")])],-1)),s("p",null,[n[11]||(n[11]=a("Goravel offers built-in ")),t(i,{to:"/security/authentication.html"},{default:e(()=>n[10]||(n[10]=[a("authentication")])),_:1}),n[12]||(n[12]=a(" services and an easy-to-use authorization feature to manage user actions on resources. Even if a user is authenticated, they may not have the authority to modify or delete certain Eloquent models or database records. Goravel's authorization feature allows for a systematic way of managing these authorization checks."))]),n[15]||(n[15]=r(`

There are two ways to authorize actions in Goravel: gates and policies. Imagine gates and policies as similar to routes and controllers. Gates are based on closures and provide a simple approach to authorization, whereas policies group logic around a specific resource, similar to controllers. This documentation will first cover gates and then delve into policies.

It's not necessary to exclusively use gates or policies when building an application. Most applications will use a combination of both, which is perfectly acceptable!

Gates

Writing Gates

Gates serve as closures that verify whether a user is authorized to perform a specific action. They are commonly set up in the app/providers/auth_service_provider.go file's Boot method using the Gate facade.

In this scenario, we will establish a gate to check if a user can modify a particular Post model by comparing its ID to the user_id of the post's creator.

package providers
 
 import (
   "context"
diff --git a/assets/cache.html-BuCzPS6Q.js b/assets/cache.html-C_suBmb3.js
similarity index 99%
rename from assets/cache.html-BuCzPS6Q.js
rename to assets/cache.html-C_suBmb3.js
index da11154f..4d3ec7fc 100644
--- a/assets/cache.html-BuCzPS6Q.js
+++ b/assets/cache.html-C_suBmb3.js
@@ -1,4 +1,4 @@
-import{_ as l,c as i,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(m,n){const t=o("router-link"),c=o("CommentService");return r(),i("div",null,[n[19]||(n[19]=s("h1",{id:"缓存系统",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#缓存系统"},[s("span",null,"缓存系统")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#配置"},{default:e(()=>n[1]||(n[1]=[p("配置")])),_:1})]),s("li",null,[a(t,{to:"#使用缓存"},{default:e(()=>n[2]||(n[2]=[p("使用缓存")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#注入-context"},{default:e(()=>n[3]||(n[3]=[p("注入 Context")])),_:1})]),s("li",null,[a(t,{to:"#访问多个缓存存储"},{default:e(()=>n[4]||(n[4]=[p("访问多个缓存存储")])),_:1})]),s("li",null,[a(t,{to:"#从缓存中获取数据"},{default:e(()=>n[5]||(n[5]=[p("从缓存中获取数据")])),_:1})]),s("li",null,[a(t,{to:"#检查缓存项是否存在"},{default:e(()=>n[6]||(n[6]=[p("检查缓存项是否存在")])),_:1})]),s("li",null,[a(t,{to:"#递增-递减值"},{default:e(()=>n[7]||(n[7]=[p("递增 / 递减值")])),_:1})]),s("li",null,[a(t,{to:"#获取和存储"},{default:e(()=>n[8]||(n[8]=[p("获取和存储")])),_:1})]),s("li",null,[a(t,{to:"#获取并删除"},{default:e(()=>n[9]||(n[9]=[p("获取并删除")])),_:1})]),s("li",null,[a(t,{to:"#在缓存中存储数据"},{default:e(()=>n[10]||(n[10]=[p("在缓存中存储数据")])),_:1})]),s("li",null,[a(t,{to:"#只存储没有的数据"},{default:e(()=>n[11]||(n[11]=[p("只存储没有的数据")])),_:1})]),s("li",null,[a(t,{to:"#数据永久存储"},{default:e(()=>n[12]||(n[12]=[p("数据永久存储")])),_:1})]),s("li",null,[a(t,{to:"#从缓存中删除数据"},{default:e(()=>n[13]||(n[13]=[p("从缓存中删除数据")])),_:1})])])]),s("li",null,[a(t,{to:"#原子锁"},{default:e(()=>n[14]||(n[14]=[p("原子锁")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#管理锁"},{default:e(()=>n[15]||(n[15]=[p("管理锁")])),_:1})])])]),s("li",null,[a(t,{to:"#自定义缓存驱动"},{default:e(()=>n[16]||(n[16]=[p("自定义缓存驱动")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#配置-1"},{default:e(()=>n[17]||(n[17]=[p("配置")])),_:1})]),s("li",null,[a(t,{to:"#实现驱动"},{default:e(()=>n[18]||(n[18]=[p("实现驱动")])),_:1})])])])])]),n[20]||(n[20]=u(`

简介

Goravel 提供了可拓展的缓存模块,该模块可以使用 facades.Cache() 进行操作。框架默认自带 memory 驱动,如需其他驱动,请查看对应的独立扩展包:

驱动地址
Redishttps://github.com/goravel/redis

配置

config/cache.go 中进行所有自定义配置。

使用缓存

注入 Context

facades.Cache().WithContext(ctx)
+import{_ as l,c as i,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(m,n){const t=o("router-link"),c=o("CommentService");return r(),i("div",null,[n[19]||(n[19]=s("h1",{id:"缓存系统",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#缓存系统"},[s("span",null,"缓存系统")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#配置"},{default:e(()=>n[1]||(n[1]=[p("配置")])),_:1})]),s("li",null,[a(t,{to:"#使用缓存"},{default:e(()=>n[2]||(n[2]=[p("使用缓存")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#注入-context"},{default:e(()=>n[3]||(n[3]=[p("注入 Context")])),_:1})]),s("li",null,[a(t,{to:"#访问多个缓存存储"},{default:e(()=>n[4]||(n[4]=[p("访问多个缓存存储")])),_:1})]),s("li",null,[a(t,{to:"#从缓存中获取数据"},{default:e(()=>n[5]||(n[5]=[p("从缓存中获取数据")])),_:1})]),s("li",null,[a(t,{to:"#检查缓存项是否存在"},{default:e(()=>n[6]||(n[6]=[p("检查缓存项是否存在")])),_:1})]),s("li",null,[a(t,{to:"#递增-递减值"},{default:e(()=>n[7]||(n[7]=[p("递增 / 递减值")])),_:1})]),s("li",null,[a(t,{to:"#获取和存储"},{default:e(()=>n[8]||(n[8]=[p("获取和存储")])),_:1})]),s("li",null,[a(t,{to:"#获取并删除"},{default:e(()=>n[9]||(n[9]=[p("获取并删除")])),_:1})]),s("li",null,[a(t,{to:"#在缓存中存储数据"},{default:e(()=>n[10]||(n[10]=[p("在缓存中存储数据")])),_:1})]),s("li",null,[a(t,{to:"#只存储没有的数据"},{default:e(()=>n[11]||(n[11]=[p("只存储没有的数据")])),_:1})]),s("li",null,[a(t,{to:"#数据永久存储"},{default:e(()=>n[12]||(n[12]=[p("数据永久存储")])),_:1})]),s("li",null,[a(t,{to:"#从缓存中删除数据"},{default:e(()=>n[13]||(n[13]=[p("从缓存中删除数据")])),_:1})])])]),s("li",null,[a(t,{to:"#原子锁"},{default:e(()=>n[14]||(n[14]=[p("原子锁")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#管理锁"},{default:e(()=>n[15]||(n[15]=[p("管理锁")])),_:1})])])]),s("li",null,[a(t,{to:"#自定义缓存驱动"},{default:e(()=>n[16]||(n[16]=[p("自定义缓存驱动")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#配置-1"},{default:e(()=>n[17]||(n[17]=[p("配置")])),_:1})]),s("li",null,[a(t,{to:"#实现驱动"},{default:e(()=>n[18]||(n[18]=[p("实现驱动")])),_:1})])])])])]),n[20]||(n[20]=u(`

简介

Goravel 提供了可拓展的缓存模块,该模块可以使用 facades.Cache() 进行操作。框架默认自带 memory 驱动,如需其他驱动,请查看对应的独立扩展包:

驱动地址
Redishttps://github.com/goravel/redis

配置

config/cache.go 中进行所有自定义配置。

使用缓存

注入 Context

facades.Cache().WithContext(ctx)
 

访问多个缓存存储

您可以通过 Store 方法访问各种缓存存储。传递给 Store 方法的键应该对应于 cache 配置文件中的 stores 配置数组中列出的存储之一:

value := facades.Cache().Store("redis").Get("foo")
 

从缓存中获取数据

value := facades.Cache().Get("goravel", "default")
 value := facades.Cache().GetBool("goravel", true)
diff --git a/assets/cache.html-BCYn7pgp.js b/assets/cache.html-Hh3FLxMR.js
similarity index 99%
rename from assets/cache.html-BCYn7pgp.js
rename to assets/cache.html-Hh3FLxMR.js
index cc3ef2bf..d59a9d72 100644
--- a/assets/cache.html-BCYn7pgp.js
+++ b/assets/cache.html-Hh3FLxMR.js
@@ -1,4 +1,4 @@
-import{_ as i,c as l,b as s,e as a,f as t,a as u,r as p,o as r,d as o}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function m(h,n){const e=p("router-link"),c=p("CommentService");return r(),l("div",null,[n[19]||(n[19]=s("h1",{id:"cache",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#cache"},[s("span",null,"Cache")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[o("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#configuration"},{default:t(()=>n[1]||(n[1]=[o("Configuration")])),_:1})]),s("li",null,[a(e,{to:"#cache-usage"},{default:t(()=>n[2]||(n[2]=[o("Cache Usage")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#inject-context"},{default:t(()=>n[3]||(n[3]=[o("Inject Context")])),_:1})]),s("li",null,[a(e,{to:"#accessing-multiple-cache-stores"},{default:t(()=>n[4]||(n[4]=[o("Accessing Multiple Cache Stores")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-items-from-the-cache"},{default:t(()=>n[5]||(n[5]=[o("Retrieving Items From The Cache")])),_:1})]),s("li",null,[a(e,{to:"#checking-for-item-existence"},{default:t(()=>n[6]||(n[6]=[o("Checking For Item Existence")])),_:1})]),s("li",null,[a(e,{to:"#incrementing-decrementing-values"},{default:t(()=>n[7]||(n[7]=[o("Incrementing / Decrementing Values")])),_:1})]),s("li",null,[a(e,{to:"#retrieve-store"},{default:t(()=>n[8]||(n[8]=[o("Retrieve & Store")])),_:1})]),s("li",null,[a(e,{to:"#retrieve-delete"},{default:t(()=>n[9]||(n[9]=[o("Retrieve & Delete")])),_:1})]),s("li",null,[a(e,{to:"#storing-items-in-the-cache"},{default:t(()=>n[10]||(n[10]=[o("Storing Items In The Cache")])),_:1})]),s("li",null,[a(e,{to:"#store-if-not-present"},{default:t(()=>n[11]||(n[11]=[o("Store If Not Present")])),_:1})]),s("li",null,[a(e,{to:"#storing-items-forever"},{default:t(()=>n[12]||(n[12]=[o("Storing Items Forever")])),_:1})]),s("li",null,[a(e,{to:"#removing-items-from-the-cache"},{default:t(()=>n[13]||(n[13]=[o("Removing Items From The Cache")])),_:1})])])]),s("li",null,[a(e,{to:"#atomic-locks"},{default:t(()=>n[14]||(n[14]=[o("Atomic Locks")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#managing-locks"},{default:t(()=>n[15]||(n[15]=[o("Managing Locks")])),_:1})])])]),s("li",null,[a(e,{to:"#adding-custom-cache-drivers"},{default:t(()=>n[16]||(n[16]=[o("Adding Custom Cache Drivers")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#configuration-1"},{default:t(()=>n[17]||(n[17]=[o("Configuration")])),_:1})]),s("li",null,[a(e,{to:"#implement-custom-driver"},{default:t(()=>n[18]||(n[18]=[o("Implement Custom Driver")])),_:1})])])])])]),n[20]||(n[20]=u(`

Introduction

Goravel provides an expandable cache module that can be operated using facades.Cache(). Goravel comes with a memory driver, for other drivers, please check the corresponding independent extension packages:

DriverLink
Redishttps://github.com/goravel/redis

Configuration

Make all custom configurations in config/cache.go.

Cache Usage

Inject Context

facades.Cache().WithContext(ctx)
+import{_ as i,c as l,b as s,e as a,f as t,a as u,r as p,o as r,d as o}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function m(h,n){const e=p("router-link"),c=p("CommentService");return r(),l("div",null,[n[19]||(n[19]=s("h1",{id:"cache",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#cache"},[s("span",null,"Cache")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[o("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#configuration"},{default:t(()=>n[1]||(n[1]=[o("Configuration")])),_:1})]),s("li",null,[a(e,{to:"#cache-usage"},{default:t(()=>n[2]||(n[2]=[o("Cache Usage")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#inject-context"},{default:t(()=>n[3]||(n[3]=[o("Inject Context")])),_:1})]),s("li",null,[a(e,{to:"#accessing-multiple-cache-stores"},{default:t(()=>n[4]||(n[4]=[o("Accessing Multiple Cache Stores")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-items-from-the-cache"},{default:t(()=>n[5]||(n[5]=[o("Retrieving Items From The Cache")])),_:1})]),s("li",null,[a(e,{to:"#checking-for-item-existence"},{default:t(()=>n[6]||(n[6]=[o("Checking For Item Existence")])),_:1})]),s("li",null,[a(e,{to:"#incrementing-decrementing-values"},{default:t(()=>n[7]||(n[7]=[o("Incrementing / Decrementing Values")])),_:1})]),s("li",null,[a(e,{to:"#retrieve-store"},{default:t(()=>n[8]||(n[8]=[o("Retrieve & Store")])),_:1})]),s("li",null,[a(e,{to:"#retrieve-delete"},{default:t(()=>n[9]||(n[9]=[o("Retrieve & Delete")])),_:1})]),s("li",null,[a(e,{to:"#storing-items-in-the-cache"},{default:t(()=>n[10]||(n[10]=[o("Storing Items In The Cache")])),_:1})]),s("li",null,[a(e,{to:"#store-if-not-present"},{default:t(()=>n[11]||(n[11]=[o("Store If Not Present")])),_:1})]),s("li",null,[a(e,{to:"#storing-items-forever"},{default:t(()=>n[12]||(n[12]=[o("Storing Items Forever")])),_:1})]),s("li",null,[a(e,{to:"#removing-items-from-the-cache"},{default:t(()=>n[13]||(n[13]=[o("Removing Items From The Cache")])),_:1})])])]),s("li",null,[a(e,{to:"#atomic-locks"},{default:t(()=>n[14]||(n[14]=[o("Atomic Locks")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#managing-locks"},{default:t(()=>n[15]||(n[15]=[o("Managing Locks")])),_:1})])])]),s("li",null,[a(e,{to:"#adding-custom-cache-drivers"},{default:t(()=>n[16]||(n[16]=[o("Adding Custom Cache Drivers")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#configuration-1"},{default:t(()=>n[17]||(n[17]=[o("Configuration")])),_:1})]),s("li",null,[a(e,{to:"#implement-custom-driver"},{default:t(()=>n[18]||(n[18]=[o("Implement Custom Driver")])),_:1})])])])])]),n[20]||(n[20]=u(`

Introduction

Goravel provides an expandable cache module that can be operated using facades.Cache(). Goravel comes with a memory driver, for other drivers, please check the corresponding independent extension packages:

DriverLink
Redishttps://github.com/goravel/redis

Configuration

Make all custom configurations in config/cache.go.

Cache Usage

Inject Context

facades.Cache().WithContext(ctx)
 

Accessing Multiple Cache Stores

You may access various cache stores via the Store method. The key passed to the Store method should correspond to one of the stores listed in the "stores" configuration array in your cache configuration file:

value := facades.Cache().Store("redis").Get("foo")
 

Retrieving Items From The Cache

value := facades.Cache().Get("goravel", "default")
 value := facades.Cache().GetBool("goravel", true)
diff --git a/assets/color.html-DAaPWn-A.js b/assets/color.html-BqDJgwTf.js
similarity index 99%
rename from assets/color.html-DAaPWn-A.js
rename to assets/color.html-BqDJgwTf.js
index cc46c9d0..cb09cbcc 100644
--- a/assets/color.html-DAaPWn-A.js
+++ b/assets/color.html-BqDJgwTf.js
@@ -1,4 +1,4 @@
-import{_ as r,c,b as e,e as n,f as l,a as p,r as a,o as d,d as s}from"./app-ELDWQP0J.js";const u={},h={class:"table-of-contents"};function m(g,o){const t=a("router-link"),i=a("CommentService");return d(),c("div",null,[o[5]||(o[5]=e("h1",{id:"color",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#color"},[e("span",null,"Color")])],-1)),e("nav",h,[e("ul",null,[e("li",null,[n(t,{to:"#introduction"},{default:l(()=>o[0]||(o[0]=[s("Introduction")])),_:1})]),e("li",null,[n(t,{to:"#specific-color"},{default:l(()=>o[1]||(o[1]=[s("Specific Color")])),_:1}),e("ul",null,[e("li",null,[n(t,{to:"#printer-methods"},{default:l(()=>o[2]||(o[2]=[s("Printer Methods")])),_:1})])])]),e("li",null,[n(t,{to:"#custom-color"},{default:l(()=>o[3]||(o[3]=[s("Custom Color")])),_:1}),e("ul",null,[e("li",null,[n(t,{to:"#color-new"},{default:l(()=>o[4]||(o[4]=[s("color.New")])),_:1})])])])])]),o[6]||(o[6]=p(`

Introduction

The color package provides a set of functions to colorize the output of the terminal using PTerm library.

Specific Color

The package provides methods to create printers for specific colors. These methods allow you to easily colorize terminal output.

  • color.Red()
  • color.Green()
  • color.Yellow()
  • color.Blue()
  • color.Magenta()
  • color.Cyan()
  • color.White()
  • color.Black()
  • color.Gray()
  • color.Default()

Printer Methods

A contracts/support.Printer provides the following methods to print or format text with color:

  • Print - Print text
  • Println - Print text with a new line
  • Printf - Print formatted text
  • Sprint - Return colored text
  • Sprintln - Return colored text with a new line
  • Sprintf - Return formatted colored text
import "github.com/goravel/framework/support/color"
+import{_ as r,c,b as e,e as n,f as l,a as p,r as a,o as d,d as s}from"./app-Ewo6p9aM.js";const u={},h={class:"table-of-contents"};function m(g,o){const t=a("router-link"),i=a("CommentService");return d(),c("div",null,[o[5]||(o[5]=e("h1",{id:"color",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#color"},[e("span",null,"Color")])],-1)),e("nav",h,[e("ul",null,[e("li",null,[n(t,{to:"#introduction"},{default:l(()=>o[0]||(o[0]=[s("Introduction")])),_:1})]),e("li",null,[n(t,{to:"#specific-color"},{default:l(()=>o[1]||(o[1]=[s("Specific Color")])),_:1}),e("ul",null,[e("li",null,[n(t,{to:"#printer-methods"},{default:l(()=>o[2]||(o[2]=[s("Printer Methods")])),_:1})])])]),e("li",null,[n(t,{to:"#custom-color"},{default:l(()=>o[3]||(o[3]=[s("Custom Color")])),_:1}),e("ul",null,[e("li",null,[n(t,{to:"#color-new"},{default:l(()=>o[4]||(o[4]=[s("color.New")])),_:1})])])])])]),o[6]||(o[6]=p(`

Introduction

The color package provides a set of functions to colorize the output of the terminal using PTerm library.

Specific Color

The package provides methods to create printers for specific colors. These methods allow you to easily colorize terminal output.

  • color.Red()
  • color.Green()
  • color.Yellow()
  • color.Blue()
  • color.Magenta()
  • color.Cyan()
  • color.White()
  • color.Black()
  • color.Gray()
  • color.Default()

Printer Methods

A contracts/support.Printer provides the following methods to print or format text with color:

  • Print - Print text
  • Println - Print text with a new line
  • Printf - Print formatted text
  • Sprint - Return colored text
  • Sprintln - Return colored text with a new line
  • Sprintf - Return formatted colored text
import "github.com/goravel/framework/support/color"
 
 color.Blue().Println("Hello, Goravel!")
 color.Green().Printf("Hello, %s!", "Goravel")
diff --git a/assets/color.html-C-v_r0O_.js b/assets/color.html-H0iHmUWu.js
similarity index 99%
rename from assets/color.html-C-v_r0O_.js
rename to assets/color.html-H0iHmUWu.js
index ffa79011..628841d5 100644
--- a/assets/color.html-C-v_r0O_.js
+++ b/assets/color.html-H0iHmUWu.js
@@ -1,4 +1,4 @@
-import{_ as r,c as i,b as e,e as o,f as a,a as p,r as t,o as d,d as s}from"./app-ELDWQP0J.js";const u={},g={class:"table-of-contents"};function h(m,n){const l=t("router-link"),c=t("CommentService");return d(),i("div",null,[n[5]||(n[5]=e("h1",{id:"color",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#color"},[e("span",null,"Color")])],-1)),e("nav",g,[e("ul",null,[e("li",null,[o(l,{to:"#简介"},{default:a(()=>n[0]||(n[0]=[s("简介")])),_:1})]),e("li",null,[o(l,{to:"#特定颜色"},{default:a(()=>n[1]||(n[1]=[s("特定颜色")])),_:1}),e("ul",null,[e("li",null,[o(l,{to:"#打印方法"},{default:a(()=>n[2]||(n[2]=[s("打印方法")])),_:1})])])]),e("li",null,[o(l,{to:"#指定颜色"},{default:a(()=>n[3]||(n[3]=[s("指定颜色")])),_:1}),e("ul",null,[e("li",null,[o(l,{to:"#color-new"},{default:a(()=>n[4]||(n[4]=[s("color.New")])),_:1})])])])])]),n[6]||(n[6]=p(`

简介

color 包提供一系列的方法以便在控制台上输出带颜色的内容,该功能由 PTerm 提供驱动。

特定颜色

包提供了一些方法来创建特定颜色的打印。这些方法允许您轻松地为终端输出添加颜色。

  • color.Red()
  • color.Green()
  • color.Yellow()
  • color.Blue()
  • color.Magenta()
  • color.Cyan()
  • color.White()
  • color.Black()
  • color.Gray()
  • color.Default()

打印方法

  • Print
  • Println
  • Printf
  • Sprint
  • Sprintln
  • Sprintf
import "github.com/goravel/framework/support/color"
+import{_ as r,c as i,b as e,e as o,f as a,a as p,r as t,o as d,d as s}from"./app-Ewo6p9aM.js";const u={},g={class:"table-of-contents"};function h(m,n){const l=t("router-link"),c=t("CommentService");return d(),i("div",null,[n[5]||(n[5]=e("h1",{id:"color",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#color"},[e("span",null,"Color")])],-1)),e("nav",g,[e("ul",null,[e("li",null,[o(l,{to:"#简介"},{default:a(()=>n[0]||(n[0]=[s("简介")])),_:1})]),e("li",null,[o(l,{to:"#特定颜色"},{default:a(()=>n[1]||(n[1]=[s("特定颜色")])),_:1}),e("ul",null,[e("li",null,[o(l,{to:"#打印方法"},{default:a(()=>n[2]||(n[2]=[s("打印方法")])),_:1})])])]),e("li",null,[o(l,{to:"#指定颜色"},{default:a(()=>n[3]||(n[3]=[s("指定颜色")])),_:1}),e("ul",null,[e("li",null,[o(l,{to:"#color-new"},{default:a(()=>n[4]||(n[4]=[s("color.New")])),_:1})])])])])]),n[6]||(n[6]=p(`

简介

color 包提供一系列的方法以便在控制台上输出带颜色的内容,该功能由 PTerm 提供驱动。

特定颜色

包提供了一些方法来创建特定颜色的打印。这些方法允许您轻松地为终端输出添加颜色。

  • color.Red()
  • color.Green()
  • color.Yellow()
  • color.Blue()
  • color.Magenta()
  • color.Cyan()
  • color.White()
  • color.Black()
  • color.Gray()
  • color.Default()

打印方法

  • Print
  • Println
  • Printf
  • Sprint
  • Sprintln
  • Sprintf
import "github.com/goravel/framework/support/color"
 
 color.Blue().Println("Hello, Goravel!")
 color.Green().Printf("Hello, %s!", "Goravel")
diff --git a/assets/compile.html-DyeHgsV_.js b/assets/compile.html-BM_Gs_kd.js
similarity index 99%
rename from assets/compile.html-DyeHgsV_.js
rename to assets/compile.html-BM_Gs_kd.js
index 3468c515..959e5e56 100644
--- a/assets/compile.html-DyeHgsV_.js
+++ b/assets/compile.html-BM_Gs_kd.js
@@ -1,4 +1,4 @@
-import{_ as r,c as p,b as n,e,f as l,a as c,r as t,o,d as i}from"./app-ELDWQP0J.js";const u={},v={class:"table-of-contents"};function m(b,s){const a=t("router-link"),d=t("CommentService");return o(),p("div",null,[s[8]||(s[8]=n("h1",{id:"编译",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#编译"},[n("span",null,"编译")])],-1)),n("nav",v,[n("ul",null,[n("li",null,[e(a,{to:"#编译命令"},{default:l(()=>s[0]||(s[0]=[i("编译命令")])),_:1})]),n("li",null,[e(a,{to:"#手动编译"},{default:l(()=>s[1]||(s[1]=[i("手动编译")])),_:1}),n("ul",null,[n("li",null,[e(a,{to:"#常规编译"},{default:l(()=>s[2]||(s[2]=[i("常规编译")])),_:1})]),n("li",null,[e(a,{to:"#静态编译"},{default:l(()=>s[3]||(s[3]=[i("静态编译")])),_:1})]),n("li",null,[e(a,{to:"#交叉编译"},{default:l(()=>s[4]||(s[4]=[i("交叉编译")])),_:1})])])]),n("li",null,[e(a,{to:"#docker"},{default:l(()=>s[5]||(s[5]=[i("Docker")])),_:1}),n("ul",null,[n("li",null,[e(a,{to:"#docker-compose"},{default:l(()=>s[6]||(s[6]=[i("Docker Compose")])),_:1})])])]),n("li",null,[e(a,{to:"#减小打包体积"},{default:l(()=>s[7]||(s[7]=[i("减小打包体积")])),_:1})])])]),s[9]||(s[9]=c(`

编译命令

Goravel 项目可以通过以下命令编译:

// 选择系统进行编译
+import{_ as r,c as p,b as n,e,f as l,a as c,r as t,o,d as i}from"./app-Ewo6p9aM.js";const u={},v={class:"table-of-contents"};function m(b,s){const a=t("router-link"),d=t("CommentService");return o(),p("div",null,[s[8]||(s[8]=n("h1",{id:"编译",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#编译"},[n("span",null,"编译")])],-1)),n("nav",v,[n("ul",null,[n("li",null,[e(a,{to:"#编译命令"},{default:l(()=>s[0]||(s[0]=[i("编译命令")])),_:1})]),n("li",null,[e(a,{to:"#手动编译"},{default:l(()=>s[1]||(s[1]=[i("手动编译")])),_:1}),n("ul",null,[n("li",null,[e(a,{to:"#常规编译"},{default:l(()=>s[2]||(s[2]=[i("常规编译")])),_:1})]),n("li",null,[e(a,{to:"#静态编译"},{default:l(()=>s[3]||(s[3]=[i("静态编译")])),_:1})]),n("li",null,[e(a,{to:"#交叉编译"},{default:l(()=>s[4]||(s[4]=[i("交叉编译")])),_:1})])])]),n("li",null,[e(a,{to:"#docker"},{default:l(()=>s[5]||(s[5]=[i("Docker")])),_:1}),n("ul",null,[n("li",null,[e(a,{to:"#docker-compose"},{default:l(()=>s[6]||(s[6]=[i("Docker Compose")])),_:1})])])]),n("li",null,[e(a,{to:"#减小打包体积"},{default:l(()=>s[7]||(s[7]=[i("减小打包体积")])),_:1})])])]),s[9]||(s[9]=c(`

编译命令

Goravel 项目可以通过以下命令编译:

// 选择系统进行编译
 go run . artisan build
 
 // 指定系统进行编译
diff --git a/assets/compile.html-ClJuP_SF.js b/assets/compile.html-YqalC-tP.js
similarity index 99%
rename from assets/compile.html-ClJuP_SF.js
rename to assets/compile.html-YqalC-tP.js
index 3c711793..57d0b493 100644
--- a/assets/compile.html-ClJuP_SF.js
+++ b/assets/compile.html-YqalC-tP.js
@@ -1,4 +1,4 @@
-import{_ as p,c,b as a,e as n,f as l,a as r,r as t,o as d,d as i}from"./app-ELDWQP0J.js";const m={},u={class:"table-of-contents"};function v(h,e){const s=t("router-link"),o=t("CommentService");return d(),c("div",null,[e[8]||(e[8]=a("h1",{id:"compile",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#compile"},[a("span",null,"Compile")])],-1)),a("nav",u,[a("ul",null,[a("li",null,[n(s,{to:"#compile-command"},{default:l(()=>e[0]||(e[0]=[i("Compile command")])),_:1})]),a("li",null,[n(s,{to:"#manual-compilation"},{default:l(()=>e[1]||(e[1]=[i("Manual compilation")])),_:1}),a("ul",null,[a("li",null,[n(s,{to:"#regular-compilation"},{default:l(()=>e[2]||(e[2]=[i("Regular compilation")])),_:1})]),a("li",null,[n(s,{to:"#static-compilation"},{default:l(()=>e[3]||(e[3]=[i("Static compilation")])),_:1})]),a("li",null,[n(s,{to:"#cross-compile"},{default:l(()=>e[4]||(e[4]=[i("Cross compile")])),_:1})])])]),a("li",null,[n(s,{to:"#docker"},{default:l(()=>e[5]||(e[5]=[i("Docker")])),_:1}),a("ul",null,[a("li",null,[n(s,{to:"#docker-compose"},{default:l(()=>e[6]||(e[6]=[i("Docker Compose")])),_:1})])])]),a("li",null,[n(s,{to:"#reduce-package-size"},{default:l(()=>e[7]||(e[7]=[i("Reduce package size")])),_:1})])])]),e[9]||(e[9]=r(`

Compile command

The Goravel project can be compiled with the following command:

// Select the system to compile
+import{_ as p,c,b as a,e as n,f as l,a as r,r as t,o as d,d as i}from"./app-Ewo6p9aM.js";const m={},u={class:"table-of-contents"};function v(h,e){const s=t("router-link"),o=t("CommentService");return d(),c("div",null,[e[8]||(e[8]=a("h1",{id:"compile",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#compile"},[a("span",null,"Compile")])],-1)),a("nav",u,[a("ul",null,[a("li",null,[n(s,{to:"#compile-command"},{default:l(()=>e[0]||(e[0]=[i("Compile command")])),_:1})]),a("li",null,[n(s,{to:"#manual-compilation"},{default:l(()=>e[1]||(e[1]=[i("Manual compilation")])),_:1}),a("ul",null,[a("li",null,[n(s,{to:"#regular-compilation"},{default:l(()=>e[2]||(e[2]=[i("Regular compilation")])),_:1})]),a("li",null,[n(s,{to:"#static-compilation"},{default:l(()=>e[3]||(e[3]=[i("Static compilation")])),_:1})]),a("li",null,[n(s,{to:"#cross-compile"},{default:l(()=>e[4]||(e[4]=[i("Cross compile")])),_:1})])])]),a("li",null,[n(s,{to:"#docker"},{default:l(()=>e[5]||(e[5]=[i("Docker")])),_:1}),a("ul",null,[a("li",null,[n(s,{to:"#docker-compose"},{default:l(()=>e[6]||(e[6]=[i("Docker Compose")])),_:1})])])]),a("li",null,[n(s,{to:"#reduce-package-size"},{default:l(()=>e[7]||(e[7]=[i("Reduce package size")])),_:1})])])]),e[9]||(e[9]=r(`

Compile command

The Goravel project can be compiled with the following command:

// Select the system to compile
 go run . artisan build
 
 // Specify the system to compile
diff --git a/assets/configuration.html-COBG2vKn.js b/assets/configuration.html-3dQ1pRig.js
similarity index 99%
rename from assets/configuration.html-COBG2vKn.js
rename to assets/configuration.html-3dQ1pRig.js
index 2354cfba..8d13a2c9 100644
--- a/assets/configuration.html-COBG2vKn.js
+++ b/assets/configuration.html-3dQ1pRig.js
@@ -1,4 +1,4 @@
-import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function g(m,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[6]||(n[6]=s("h1",{id:"配置信息",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#配置信息"},[s("span",null,"配置信息")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#环境配置"},{default:e(()=>n[1]||(n[1]=[p("环境配置")])),_:1})]),s("li",null,[a(t,{to:"#获取环境配置"},{default:e(()=>n[2]||(n[2]=[p("获取环境配置")])),_:1})]),s("li",null,[a(t,{to:"#获取配置值"},{default:e(()=>n[3]||(n[3]=[p("获取配置值")])),_:1})]),s("li",null,[a(t,{to:"#设置配置值"},{default:e(()=>n[4]||(n[4]=[p("设置配置值")])),_:1})]),s("li",null,[a(t,{to:"#获取项目信息"},{default:e(()=>n[5]||(n[5]=[p("获取项目信息")])),_:1})])])]),n[7]||(n[7]=u(`

简介

Goravel 框架所有配置文件都保存在 config 目录中。你可以进入具体文件查看配置说明,根据项目需要灵活配置。

环境配置

在不同的环境运行应用程序,通常需要不同的配置。例如,你可能希望在本地打开 Debug 模式,但生产环境不需要。

因此,框架在根目录提供了 .env.example 文件,需要你在开发前,复制该文件并重命名为 .env,根据项目需要修改 .env 文件中的配置项。

注意,.env 文件不应该加入版本控制,因为多人协作时,不同的开发人员有可能使用不同的配置,不同的部署环境配置也不相同。

此外,如果有入侵者获得了你的代码仓库访问权限,将会有暴露敏感配置的风险。如果你想新增新的配置项,可以添加到 .env.example 文件中,以此来同步所有开发者的配置。

获取环境配置

使用如下方法,可获取 .env 文件中的配置项:

// 第一个参数为配置键,第二个参数为默认值
+import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function g(m,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[6]||(n[6]=s("h1",{id:"配置信息",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#配置信息"},[s("span",null,"配置信息")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#环境配置"},{default:e(()=>n[1]||(n[1]=[p("环境配置")])),_:1})]),s("li",null,[a(t,{to:"#获取环境配置"},{default:e(()=>n[2]||(n[2]=[p("获取环境配置")])),_:1})]),s("li",null,[a(t,{to:"#获取配置值"},{default:e(()=>n[3]||(n[3]=[p("获取配置值")])),_:1})]),s("li",null,[a(t,{to:"#设置配置值"},{default:e(()=>n[4]||(n[4]=[p("设置配置值")])),_:1})]),s("li",null,[a(t,{to:"#获取项目信息"},{default:e(()=>n[5]||(n[5]=[p("获取项目信息")])),_:1})])])]),n[7]||(n[7]=u(`

简介

Goravel 框架所有配置文件都保存在 config 目录中。你可以进入具体文件查看配置说明,根据项目需要灵活配置。

环境配置

在不同的环境运行应用程序,通常需要不同的配置。例如,你可能希望在本地打开 Debug 模式,但生产环境不需要。

因此,框架在根目录提供了 .env.example 文件,需要你在开发前,复制该文件并重命名为 .env,根据项目需要修改 .env 文件中的配置项。

注意,.env 文件不应该加入版本控制,因为多人协作时,不同的开发人员有可能使用不同的配置,不同的部署环境配置也不相同。

此外,如果有入侵者获得了你的代码仓库访问权限,将会有暴露敏感配置的风险。如果你想新增新的配置项,可以添加到 .env.example 文件中,以此来同步所有开发者的配置。

获取环境配置

使用如下方法,可获取 .env 文件中的配置项:

// 第一个参数为配置键,第二个参数为默认值
 facades.Config().Env("APP_NAME", "goravel")
 

获取配置值

你可以轻松的在应用程序的任何位置使用全局 facades.Config() 函数来访问 config 目录中的配置值。配置值的访问可以使用「点」语法。还可以指定默认值,如果配置选项不存在,则返回默认值:

// 通过断言获取配置
 facades.Config().Get("app.name", "goravel")
diff --git a/assets/configuration.html-XDuxUGHH.js b/assets/configuration.html-D9LN5QiT.js
similarity index 99%
rename from assets/configuration.html-XDuxUGHH.js
rename to assets/configuration.html-D9LN5QiT.js
index 770f54e0..b174e08f 100644
--- a/assets/configuration.html-XDuxUGHH.js
+++ b/assets/configuration.html-D9LN5QiT.js
@@ -1,4 +1,4 @@
-import{_ as p,c as l,b as a,e as t,f as e,a as r,r as i,o as u,d as o}from"./app-ELDWQP0J.js";const d={},f={class:"table-of-contents"};function g(m,n){const s=i("router-link"),c=i("CommentService");return u(),l("div",null,[n[6]||(n[6]=a("h1",{id:"configuration",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#configuration"},[a("span",null,"Configuration")])],-1)),a("nav",f,[a("ul",null,[a("li",null,[t(s,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[o("Introduction")])),_:1})]),a("li",null,[t(s,{to:"#environment-configuration"},{default:e(()=>n[1]||(n[1]=[o("Environment Configuration")])),_:1})]),a("li",null,[t(s,{to:"#retrieve-environment-configuration"},{default:e(()=>n[2]||(n[2]=[o("Retrieve Environment Configuration")])),_:1})]),a("li",null,[t(s,{to:"#access-configuration-values"},{default:e(()=>n[3]||(n[3]=[o("Access Configuration Values")])),_:1})]),a("li",null,[t(s,{to:"#set-configuration"},{default:e(()=>n[4]||(n[4]=[o("Set Configuration")])),_:1})]),a("li",null,[t(s,{to:"#get-project-information"},{default:e(()=>n[5]||(n[5]=[o("Get Project Information")])),_:1})])])]),n[7]||(n[7]=r(`

Introduction

All configuration files of the Goravel framework are stored in the config directory. You can view specific instructions and configure them flexibly according to project needs.

Environment Configuration

Running applications in different environments usually requires different configurations. For example, you may want to turn on the Debug mode locally but don't need it in the production environment.

Therefore, the framework provides the .env.example file in the root directory. You need to copy this file, rename it to .env before you start development, and modify the configuration items in the .env file according to your project needs.

Note that the .env file should not be added to version control, because when multiple people collaborate, different developers may use different configurations, and different deployment environment configurations are different.

In addition, if an intruder gains access to your code repository, there will be a risk of exposing sensitive configuration. If you want to add a new configuration item, you can add it to the .env.example file to synchronize the configuration of all developers.

Retrieve Environment Configuration

Use the following method to obtain the configuration items in the .env file:

// The first parameter is the configuration key, and the second parameter is the default value
+import{_ as p,c as l,b as a,e as t,f as e,a as r,r as i,o as u,d as o}from"./app-Ewo6p9aM.js";const d={},f={class:"table-of-contents"};function g(m,n){const s=i("router-link"),c=i("CommentService");return u(),l("div",null,[n[6]||(n[6]=a("h1",{id:"configuration",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#configuration"},[a("span",null,"Configuration")])],-1)),a("nav",f,[a("ul",null,[a("li",null,[t(s,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[o("Introduction")])),_:1})]),a("li",null,[t(s,{to:"#environment-configuration"},{default:e(()=>n[1]||(n[1]=[o("Environment Configuration")])),_:1})]),a("li",null,[t(s,{to:"#retrieve-environment-configuration"},{default:e(()=>n[2]||(n[2]=[o("Retrieve Environment Configuration")])),_:1})]),a("li",null,[t(s,{to:"#access-configuration-values"},{default:e(()=>n[3]||(n[3]=[o("Access Configuration Values")])),_:1})]),a("li",null,[t(s,{to:"#set-configuration"},{default:e(()=>n[4]||(n[4]=[o("Set Configuration")])),_:1})]),a("li",null,[t(s,{to:"#get-project-information"},{default:e(()=>n[5]||(n[5]=[o("Get Project Information")])),_:1})])])]),n[7]||(n[7]=r(`

Introduction

All configuration files of the Goravel framework are stored in the config directory. You can view specific instructions and configure them flexibly according to project needs.

Environment Configuration

Running applications in different environments usually requires different configurations. For example, you may want to turn on the Debug mode locally but don't need it in the production environment.

Therefore, the framework provides the .env.example file in the root directory. You need to copy this file, rename it to .env before you start development, and modify the configuration items in the .env file according to your project needs.

Note that the .env file should not be added to version control, because when multiple people collaborate, different developers may use different configurations, and different deployment environment configurations are different.

In addition, if an intruder gains access to your code repository, there will be a risk of exposing sensitive configuration. If you want to add a new configuration item, you can add it to the .env.example file to synchronize the configuration of all developers.

Retrieve Environment Configuration

Use the following method to obtain the configuration items in the .env file:

// The first parameter is the configuration key, and the second parameter is the default value
 facades.Config().Env("APP_NAME", "goravel")
 

Access Configuration Values

You can easily use the global facades.Config() function anywhere in the application to access the configuration values in the config directory. The access to the configuration value can use the "." syntax. You can also specify a default value, if the configuration option does not exist, the default value is returned:

// Get the configuration through assertion
 facades.Config().Get("app.name", "goravel")
diff --git a/assets/contributions.html-Bk11CVy5.js b/assets/contributions.html-Bk11CVy5.js
new file mode 100644
index 00000000..c6542dec
--- /dev/null
+++ b/assets/contributions.html-Bk11CVy5.js
@@ -0,0 +1 @@
+import{_ as n}from"./t-shirt-DgVZ0NNq.js";import{_ as s,c as l,b as t,e as o,f as a,a as h,r as u,o as c,d as i}from"./app-Ewo6p9aM.js";const d={},g={class:"table-of-contents"};function p(m,e){const r=u("router-link");return c(),l("div",null,[e[13]||(e[13]=t("h1",{id:"contribution-guide",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#contribution-guide"},[t("span",null,"Contribution Guide")])],-1)),t("nav",g,[t("ul",null,[t("li",null,[o(r,{to:"#reward"},{default:a(()=>e[0]||(e[0]=[i("Reward")])),_:1})]),t("li",null,[o(r,{to:"#core-developers"},{default:a(()=>e[1]||(e[1]=[i("Core Developers")])),_:1})]),t("li",null,[o(r,{to:"#contributors"},{default:a(()=>e[2]||(e[2]=[i("Contributors")])),_:1})]),t("li",null,[o(r,{to:"#bug-feedback"},{default:a(()=>e[3]||(e[3]=[i("Bug Feedback")])),_:1})]),t("li",null,[o(r,{to:"#support-questions"},{default:a(()=>e[4]||(e[4]=[i("Support Questions")])),_:1})]),t("li",null,[o(r,{to:"#development-discussion"},{default:a(()=>e[5]||(e[5]=[i("Development Discussion")])),_:1})]),t("li",null,[o(r,{to:"#contribution"},{default:a(()=>e[6]||(e[6]=[i("Contribution")])),_:1}),t("ul",null,[t("li",null,[o(r,{to:"#find-create-issue"},{default:a(()=>e[7]||(e[7]=[i("Find/Create Issue")])),_:1})]),t("li",null,[o(r,{to:"#create-pr"},{default:a(()=>e[8]||(e[8]=[i("Create PR")])),_:1})])])]),t("li",null,[o(r,{to:"#which-branch"},{default:a(()=>e[9]||(e[9]=[i("Which Branch?")])),_:1})]),t("li",null,[o(r,{to:"#local-environment"},{default:a(()=>e[10]||(e[10]=[i("Local Environment")])),_:1})]),t("li",null,[o(r,{to:"#goravel-repository"},{default:a(()=>e[11]||(e[11]=[i("Goravel Repository")])),_:1})]),t("li",null,[o(r,{to:"#code-of-conduct"},{default:a(()=>e[12]||(e[12]=[i("Code of Conduct")])),_:1})])])]),e[14]||(e[14]=h('

Goravel welcomes rich and diverse contributions from different talents, such as coding, translations, articles, tutorials, etc. After completing two features(5 Good First Issue == 1 Feature), you will be recognized as a core contributor. By completing one feature every three months, you can maintain this status.

Let's make Goravel more efficient together!

Reward

  • Core developers will be eligible for benefits when Goravel benefits in the future.
  • After completing a Feature, you will receive an official Goravel T-Shirt, with a maximum of 1 per major version release cycle. (PS: Because of the difference of country, you may need to help us to find a suitable supplier.)

Core Developers

Contributors

Bug Feedback

You can report Bug Feedback here, please search Issue List for similar questions before submitting. The report should contain a title and a clear description of the problem, as much relevant information as possible, and a code sample that demonstrates the problem. The goal of Bug Feedback is to make it easy for yourself and other persons to reproduce the Bug and develop fixes. Goravel encourages committers to create a PR for the Bug repair at the same time, making the open-source project more actively developed.

Support Questions

Goravel's GitHub issue trackers are not intended to provide Goravel help or support. Instead, use one of the following channels:

Development Discussion

You may propose new features or improvements to existing Goravel behavior in the Goravel framework repository's GitHub discussion board. Informal discussion regarding bugs, new features, and implementation of existing features takes place in Telegram or WeChat. Bowen, the maintainer of Goravel, is typically present in the group on weekdays from 9am-6pm (UTC+08:00), and sporadically present in the group at other times.

Contribution

Find/Create Issue

You can find or create an issue in Issue List, leave a message to express your willingness to deal with the issue, once confirmed by the repository maintainer, the process can be started.

Create PR

  • You can check out this article if you are new to the process;
  • During the development process, if you encounter a problem, you can describe the problem in detail in issue at any time for future communication, but before that, please make sure that you have tried to solve the problem through Google and other methods as much as possible;
  • Before creating a PR, please improve the unit test coverage as much as possible to provide more stable functions;
  • If you modify any file under the contracts folder, please install vektra/mockery locally and run the mockery command in the root directory to generate the mock file;
  • When the PR is developed, please add the Review Ready , the maintainer will review it in a timely manner.
  • After the PR is merged, the issue will be closed automatically if the description in the PR is set correctly;
  • Goravel greatly appreciates your contribution and will add you to the home contribution list at the next release; ❤️

Which Branch?

All bug fixes should be sent to the latest version that supports bug fixes, unless they fix features that exist only in the upcoming release.

New features or features with breaking changes should always be sent to the master branch.

Local Environment

SoftwareAction
Golang v1.20The minimum version
vektra/mockeryProvider mock files for unit tests

Goravel Repository

RepositoryAction
goravel/goravelGoravel artisans
goravel/frameworkGoravel main repository
goravel/exampleGoravel example
goravel/example-clientExample for Grpc client
goravel/example-protoThe proto dependency of example
goravel/example-packageExample for package
goravel/docsDocument
goravel/docs-webGoravel Website
goravel/s3The S3 driver of Storage module
goravel/ossThe OSS driver of Storage module
goravel/cosThe COS driver of Storage module
goravel/minioThe Minio driver of Storage module
goravel/cloudinaryThe Cloudinary driver of Storage module
goravel/redisThe Redis driver of Cache module
goravel/ginThe Gin driver of Route module
goravel/fiberThe Fiber driver of Route module
goravel/file-rotatelogsProviders log splitting functionality for Log module
goravel/.githubCommunity health file

Code of Conduct

The Goravel code of conduct is derived from the Laravel code of conduct. Any violations of the code of conduct may be reported to Bowen.

  • Participants will be tolerant of opposing views.
  • Participants must ensure that their language and actions are free of personal attacks and disparaging personal remarks.
  • When interpreting the words and actions of others, participants should always assume good intentions.
  • Behavior that can be reasonably considered harassment will not be tolerated.
',31))])}const v=s(d,[["render",p],["__file","contributions.html.vue"]]),k=JSON.parse('{"path":"/prologue/contributions.html","title":"Contribution Guide","lang":"en-US","frontmatter":{"description":"Contribution Guide Goravel welcomes rich and diverse contributions from different talents, such as coding, translations, articles, tutorials, etc. After completing two features(...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/prologue/contributions.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/prologue/contributions.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/prologue/contributions.html"}],["meta",{"property":"og:description","content":"Contribution Guide Goravel welcomes rich and diverse contributions from different talents, such as coding, translations, articles, tutorials, etc. After completing two features(..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Contribution Guide\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"Reward","slug":"reward","link":"#reward","children":[]},{"level":2,"title":"Core Developers","slug":"core-developers","link":"#core-developers","children":[]},{"level":2,"title":"Contributors","slug":"contributors","link":"#contributors","children":[]},{"level":2,"title":"Bug Feedback","slug":"bug-feedback","link":"#bug-feedback","children":[]},{"level":2,"title":"Support Questions","slug":"support-questions","link":"#support-questions","children":[]},{"level":2,"title":"Development Discussion","slug":"development-discussion","link":"#development-discussion","children":[]},{"level":2,"title":"Contribution","slug":"contribution","link":"#contribution","children":[{"level":3,"title":"Find/Create Issue","slug":"find-create-issue","link":"#find-create-issue","children":[]},{"level":3,"title":"Create PR","slug":"create-pr","link":"#create-pr","children":[]}]},{"level":2,"title":"Which Branch?","slug":"which-branch","link":"#which-branch","children":[]},{"level":2,"title":"Local Environment","slug":"local-environment","link":"#local-environment","children":[]},{"level":2,"title":"Goravel Repository","slug":"goravel-repository","link":"#goravel-repository","children":[]},{"level":2,"title":"Code of Conduct","slug":"code-of-conduct","link":"#code-of-conduct","children":[]}],"git":{},"filePathRelative":"prologue/contributions.md","autoDesc":true}');export{v as comp,k as data}; diff --git a/assets/contributions.html-CWH0LZEJ.js b/assets/contributions.html-CWH0LZEJ.js deleted file mode 100644 index c209dd55..00000000 --- a/assets/contributions.html-CWH0LZEJ.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n,c as h,b as e,e as a,f as o,a as i,r as s,o as g,d as l}from"./app-ELDWQP0J.js";const u={},d={class:"table-of-contents"};function p(c,t){const r=s("router-link");return g(),h("div",null,[t[12]||(t[12]=e("h1",{id:"贡献指南",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#贡献指南"},[e("span",null,"贡献指南")])],-1)),e("nav",d,[e("ul",null,[e("li",null,[a(r,{to:"#核心开发者"},{default:o(()=>t[0]||(t[0]=[l("核心开发者")])),_:1})]),e("li",null,[a(r,{to:"#贡献者"},{default:o(()=>t[1]||(t[1]=[l("贡献者")])),_:1})]),e("li",null,[a(r,{to:"#bug-报告"},{default:o(()=>t[2]||(t[2]=[l("Bug 报告")])),_:1})]),e("li",null,[a(r,{to:"#帮助支持"},{default:o(()=>t[3]||(t[3]=[l("帮助支持")])),_:1})]),e("li",null,[a(r,{to:"#开发讨论"},{default:o(()=>t[4]||(t[4]=[l("开发讨论")])),_:1})]),e("li",null,[a(r,{to:"#提交贡献"},{default:o(()=>t[5]||(t[5]=[l("提交贡献")])),_:1}),e("ul",null,[e("li",null,[a(r,{to:"#寻找-创建-issue"},{default:o(()=>t[6]||(t[6]=[l("寻找/创建 Issue")])),_:1})]),e("li",null,[a(r,{to:"#创建-pr"},{default:o(()=>t[7]||(t[7]=[l("创建 PR")])),_:1})])])]),e("li",null,[a(r,{to:"#哪个分支"},{default:o(()=>t[8]||(t[8]=[l("哪个分支?")])),_:1})]),e("li",null,[a(r,{to:"#本地环境"},{default:o(()=>t[9]||(t[9]=[l("本地环境")])),_:1})]),e("li",null,[a(r,{to:"#goravel-仓库"},{default:o(()=>t[10]||(t[10]=[l("Goravel 仓库")])),_:1})]),e("li",null,[a(r,{to:"#行为准则"},{default:o(()=>t[11]||(t[11]=[l("行为准则")])),_:1})])])]),t[13]||(t[13]=i('

Goravel 欢迎不同人才提供丰富多样的贡献,例如编码、翻译、文章、教程等。完成两个 Feature(不包含 Good First Issue)后,您将成为核心贡献者。之后每三个月至少完成一个 Feature,可以保持这个头衔。核心贡献者将可以在未来从 Goravel 中获得收益。

让我们一起将 Goravel 变得更高效!

核心开发者

贡献者

Bug 报告

您可以在这里提交一个 Bug 报告,在提交前请搜索 Issue 列表 中是否已存在类似问题。该报告应该包含一个标题和对问题的清晰描述,还应该包含尽可能多的相关信息以及演示该问题的代码示例。错误报告的目标是使您自己(以及其他人)能够轻松地复现错误并开发修复程序。Goravel 鼓励提交者同时创建 PR 进行 Bug 修复,使开源项目得到更积极的发展。

帮助支持

Goravel 的 GitHub issue 不提供 Goravel 的帮助或支持。您可以通过以下途径进行讨论:

开发讨论

您可以在 Goravel 仓库的 GitHub 讨论区 中提出新功能或对现有 Goravel 行为的改进。也可以在 Telegram 或微信群中进行有关错误、新功能和现有功能实现的非正式讨论。Goravel 的维护者 Bowen 通常在工作日的上午 9 点至下午 6 点(UTC+08:00)出现在频道中,并在其他时间偶尔出现在频道中。

提交贡献

寻找/创建 Issue

您可以在 Issue 列表 中寻找或创建一个 Issue,留言表达想要处理该 Issue 的意愿,得到仓库维护者的确认后,即可开始处理。

创建 PR

  • 如果您对该流程不太了解,可以查看这篇文章
  • 在开发过程中,如果遇到问题可以随时在 Issue 中详尽描述该问题,以进一步沟通,但在此之前请确保自己已通过 Google 等方式尽可能的尝试解决问题;
  • 在创建 PR 前,请尽可能的提高单元测试覆盖率,以提供更稳定的功能;
  • 如果修改了 contracts 文件夹下的任意文件,请在本地安装 vektra/mockery,并在根目录运行 mockery 命令生成 mock 文件;
  • 当 PR 开发完毕后,请为其添加 Review Ready 标签,维护者将及时进行评审;
  • PR 合并后,如果描述设置正确,Issue 将被自动关闭;
  • Goravel 非常感谢您的贡献,将在下次发版时将您添加到首页贡献列表中;❤️

哪个分支?

所有错误修复应发送到最新的稳定分支,除非它们修复了仅存在于 master 分支中的功能。

新功能或有破坏性变化的功能应始终合并到 master 分支。

本地环境

软件作用
Golang v1.20最低版本
vektra/mockery为单元测试提供 mock 文件

Goravel 仓库

仓库作用
goravel/goravelGoravel 脚手架
goravel/frameworkGoravel 主仓库
goravel/exampleGoravel 示例
goravel/example-clientGrpc 客户端示例
goravel/example-protoexample 仓库 proto 依赖
goravel/example-package扩展包示例
goravel/docs使用文档
goravel/docs-web官网
goravel/s3Storage 模块 S3 驱动
goravel/ossStorage 模块 OSS 驱动
goravel/cosStorage 模块 COS 驱动
goravel/minioStorage 模块 Minio 驱动
goravel/cloudinaryStorage 模块 Cloudinary 驱动
goravel/redisCache 模块 Redis 驱动
goravel/ginRoute 模块 Gin 驱动
goravel/fiberRoute 模块 Fiber 驱动
goravel/file-rotatelogs为 Log 模块提供日志分割功能
goravel/.github社区健康文件

行为准则

Goravel 行为准则源自 Laravel 行为准则。任何违反行为准则的行为都可以报告给 Bowen:

  • 参与者将容忍反对意见。
  • 参与者必须确保他们的语言和行为没有人身攻击和贬低个人言论。
  • 在解释他人的言行时,参与者应始终保持良好的意图。
  • 不能容忍可合理视为骚扰的行为。
',28))])}const m=n(u,[["render",p],["__file","contributions.html.vue"]]),v=JSON.parse('{"path":"/zh/prologue/contributions.html","title":"贡献指南","lang":"zh-CN","frontmatter":{"description":"贡献指南 Goravel 欢迎不同人才提供丰富多样的贡献,例如编码、翻译、文章、教程等。完成两个 Feature(不包含 Good First Issue)后,您将成为核心贡献者。之后每三个月至少完成一个 Feature,可以保持这个头衔。核心贡献者将可以在未来从 Goravel 中获得收益。 让我们一起将 Goravel 变得更高效! 核心开发者 贡...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/prologue/contributions.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/prologue/contributions.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/prologue/contributions.html"}],["meta",{"property":"og:description","content":"贡献指南 Goravel 欢迎不同人才提供丰富多样的贡献,例如编码、翻译、文章、教程等。完成两个 Feature(不包含 Good First Issue)后,您将成为核心贡献者。之后每三个月至少完成一个 Feature,可以保持这个头衔。核心贡献者将可以在未来从 Goravel 中获得收益。 让我们一起将 Goravel 变得更高效! 核心开发者 贡..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"贡献指南\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"核心开发者","slug":"核心开发者","link":"#核心开发者","children":[]},{"level":2,"title":"贡献者","slug":"贡献者","link":"#贡献者","children":[]},{"level":2,"title":"Bug 报告","slug":"bug-报告","link":"#bug-报告","children":[]},{"level":2,"title":"帮助支持","slug":"帮助支持","link":"#帮助支持","children":[]},{"level":2,"title":"开发讨论","slug":"开发讨论","link":"#开发讨论","children":[]},{"level":2,"title":"提交贡献","slug":"提交贡献","link":"#提交贡献","children":[{"level":3,"title":"寻找/创建 Issue","slug":"寻找-创建-issue","link":"#寻找-创建-issue","children":[]},{"level":3,"title":"创建 PR","slug":"创建-pr","link":"#创建-pr","children":[]}]},{"level":2,"title":"哪个分支?","slug":"哪个分支","link":"#哪个分支","children":[]},{"level":2,"title":"本地环境","slug":"本地环境","link":"#本地环境","children":[]},{"level":2,"title":"Goravel 仓库","slug":"goravel-仓库","link":"#goravel-仓库","children":[]},{"level":2,"title":"行为准则","slug":"行为准则","link":"#行为准则","children":[]}],"git":{},"filePathRelative":"zh/prologue/contributions.md","autoDesc":true}');export{m as comp,v as data}; diff --git a/assets/contributions.html-CZu5-uUi.js b/assets/contributions.html-CZu5-uUi.js new file mode 100644 index 00000000..11f017a0 --- /dev/null +++ b/assets/contributions.html-CZu5-uUi.js @@ -0,0 +1 @@ +import{_ as n}from"./t-shirt-DgVZ0NNq.js";import{_ as h,c as i,b as e,e as a,f as o,a as s,r as g,o as u,d as l}from"./app-Ewo6p9aM.js";const d={},p={class:"table-of-contents"};function c(b,t){const r=g("router-link");return u(),i("div",null,[t[13]||(t[13]=e("h1",{id:"贡献指南",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#贡献指南"},[e("span",null,"贡献指南")])],-1)),e("nav",p,[e("ul",null,[e("li",null,[a(r,{to:"#奖励"},{default:o(()=>t[0]||(t[0]=[l("奖励")])),_:1})]),e("li",null,[a(r,{to:"#核心开发者"},{default:o(()=>t[1]||(t[1]=[l("核心开发者")])),_:1})]),e("li",null,[a(r,{to:"#贡献者"},{default:o(()=>t[2]||(t[2]=[l("贡献者")])),_:1})]),e("li",null,[a(r,{to:"#bug-报告"},{default:o(()=>t[3]||(t[3]=[l("Bug 报告")])),_:1})]),e("li",null,[a(r,{to:"#帮助支持"},{default:o(()=>t[4]||(t[4]=[l("帮助支持")])),_:1})]),e("li",null,[a(r,{to:"#开发讨论"},{default:o(()=>t[5]||(t[5]=[l("开发讨论")])),_:1})]),e("li",null,[a(r,{to:"#提交贡献"},{default:o(()=>t[6]||(t[6]=[l("提交贡献")])),_:1}),e("ul",null,[e("li",null,[a(r,{to:"#寻找-创建-issue"},{default:o(()=>t[7]||(t[7]=[l("寻找/创建 Issue")])),_:1})]),e("li",null,[a(r,{to:"#创建-pr"},{default:o(()=>t[8]||(t[8]=[l("创建 PR")])),_:1})])])]),e("li",null,[a(r,{to:"#哪个分支"},{default:o(()=>t[9]||(t[9]=[l("哪个分支?")])),_:1})]),e("li",null,[a(r,{to:"#本地环境"},{default:o(()=>t[10]||(t[10]=[l("本地环境")])),_:1})]),e("li",null,[a(r,{to:"#goravel-仓库"},{default:o(()=>t[11]||(t[11]=[l("Goravel 仓库")])),_:1})]),e("li",null,[a(r,{to:"#行为准则"},{default:o(()=>t[12]||(t[12]=[l("行为准则")])),_:1})])])]),t[14]||(t[14]=s('

Goravel 欢迎不同人才提供丰富多样的贡献,例如编码、翻译、文章、教程等。完成两个 Feature(5 个 Good First Issue == 1 个 Feature)后,您将成为核心贡献者。之后每三个月至少完成一个 Feature,可以保持这个头衔。

让我们一起将 Goravel 变得更高效!

奖励

  • 核心贡献者将可以在未来从 Goravel 中获得收益;
  • 完成一个 Feature,即可获得 Goravel 官方 T-Shirt 一件,一个大版本发布周期中最多可获得 1 件;

核心开发者

贡献者

Bug 报告

您可以在这里提交一个 Bug 报告,在提交前请搜索 Issue 列表 中是否已存在类似问题。该报告应该包含一个标题和对问题的清晰描述,还应该包含尽可能多的相关信息以及演示该问题的代码示例。错误报告的目标是使您自己(以及其他人)能够轻松地复现错误并开发修复程序。Goravel 鼓励提交者同时创建 PR 进行 Bug 修复,使开源项目得到更积极的发展。

帮助支持

Goravel 的 GitHub issue 不提供 Goravel 的帮助或支持。您可以通过以下途径进行讨论:

开发讨论

您可以在 Goravel 仓库的 GitHub 讨论区 中提出新功能或对现有 Goravel 行为的改进。也可以在 Telegram 或微信群中进行有关错误、新功能和现有功能实现的非正式讨论。Goravel 的维护者 Bowen 通常在工作日的上午 9 点至下午 6 点(UTC+08:00)出现在频道中,并在其他时间偶尔出现在频道中。

提交贡献

寻找/创建 Issue

您可以在 Issue 列表 中寻找或创建一个 Issue,留言表达想要处理该 Issue 的意愿,得到仓库维护者的确认后,即可开始处理。

创建 PR

  • 如果您对该流程不太了解,可以查看这篇文章
  • 在开发过程中,如果遇到问题可以随时在 Issue 中详尽描述该问题,以进一步沟通,但在此之前请确保自己已通过 Google 等方式尽可能的尝试解决问题;
  • 在创建 PR 前,请尽可能的提高单元测试覆盖率,以提供更稳定的功能;
  • 如果修改了 contracts 文件夹下的任意文件,请在本地安装 vektra/mockery,并在根目录运行 mockery 命令生成 mock 文件;
  • 当 PR 开发完毕后,请为其添加 Review Ready 标签,维护者将及时进行评审;
  • PR 合并后,如果描述设置正确,Issue 将被自动关闭;
  • Goravel 非常感谢您的贡献,将在下次发版时将您添加到首页贡献列表中;❤️

哪个分支?

所有错误修复应发送到最新的稳定分支,除非它们修复了仅存在于 master 分支中的功能。

新功能或有破坏性变化的功能应始终合并到 master 分支。

本地环境

软件作用
Golang v1.20最低版本
vektra/mockery为单元测试提供 mock 文件

Goravel 仓库

仓库作用
goravel/goravelGoravel 脚手架
goravel/frameworkGoravel 主仓库
goravel/exampleGoravel 示例
goravel/example-clientGrpc 客户端示例
goravel/example-protoexample 仓库 proto 依赖
goravel/example-package扩展包示例
goravel/docs使用文档
goravel/docs-web官网
goravel/s3Storage 模块 S3 驱动
goravel/ossStorage 模块 OSS 驱动
goravel/cosStorage 模块 COS 驱动
goravel/minioStorage 模块 Minio 驱动
goravel/cloudinaryStorage 模块 Cloudinary 驱动
goravel/redisCache 模块 Redis 驱动
goravel/ginRoute 模块 Gin 驱动
goravel/fiberRoute 模块 Fiber 驱动
goravel/file-rotatelogs为 Log 模块提供日志分割功能
goravel/.github社区健康文件

行为准则

Goravel 行为准则源自 Laravel 行为准则。任何违反行为准则的行为都可以报告给 Bowen:

  • 参与者将容忍反对意见。
  • 参与者必须确保他们的语言和行为没有人身攻击和贬低个人言论。
  • 在解释他人的言行时,参与者应始终保持良好的意图。
  • 不能容忍可合理视为骚扰的行为。
',31))])}const f=h(d,[["render",c],["__file","contributions.html.vue"]]),k=JSON.parse('{"path":"/zh/prologue/contributions.html","title":"贡献指南","lang":"zh-CN","frontmatter":{"description":"贡献指南 Goravel 欢迎不同人才提供丰富多样的贡献,例如编码、翻译、文章、教程等。完成两个 Feature(5 个 Good First Issue == 1 个 Feature)后,您将成为核心贡献者。之后每三个月至少完成一个 Feature,可以保持这个头衔。 让我们一起将 Goravel 变得更高效! 奖励 核心贡献者将可以在未来从 Gor...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/prologue/contributions.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/prologue/contributions.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/prologue/contributions.html"}],["meta",{"property":"og:description","content":"贡献指南 Goravel 欢迎不同人才提供丰富多样的贡献,例如编码、翻译、文章、教程等。完成两个 Feature(5 个 Good First Issue == 1 个 Feature)后,您将成为核心贡献者。之后每三个月至少完成一个 Feature,可以保持这个头衔。 让我们一起将 Goravel 变得更高效! 奖励 核心贡献者将可以在未来从 Gor..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"贡献指南\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"奖励","slug":"奖励","link":"#奖励","children":[]},{"level":2,"title":"核心开发者","slug":"核心开发者","link":"#核心开发者","children":[]},{"level":2,"title":"贡献者","slug":"贡献者","link":"#贡献者","children":[]},{"level":2,"title":"Bug 报告","slug":"bug-报告","link":"#bug-报告","children":[]},{"level":2,"title":"帮助支持","slug":"帮助支持","link":"#帮助支持","children":[]},{"level":2,"title":"开发讨论","slug":"开发讨论","link":"#开发讨论","children":[]},{"level":2,"title":"提交贡献","slug":"提交贡献","link":"#提交贡献","children":[{"level":3,"title":"寻找/创建 Issue","slug":"寻找-创建-issue","link":"#寻找-创建-issue","children":[]},{"level":3,"title":"创建 PR","slug":"创建-pr","link":"#创建-pr","children":[]}]},{"level":2,"title":"哪个分支?","slug":"哪个分支","link":"#哪个分支","children":[]},{"level":2,"title":"本地环境","slug":"本地环境","link":"#本地环境","children":[]},{"level":2,"title":"Goravel 仓库","slug":"goravel-仓库","link":"#goravel-仓库","children":[]},{"level":2,"title":"行为准则","slug":"行为准则","link":"#行为准则","children":[]}],"git":{},"filePathRelative":"zh/prologue/contributions.md","autoDesc":true}');export{f as comp,k as data}; diff --git a/assets/contributions.html-D1ANl6-5.js b/assets/contributions.html-D1ANl6-5.js deleted file mode 100644 index da46e7b4..00000000 --- a/assets/contributions.html-D1ANl6-5.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as s,b as t,e as o,f as a,a as l,r as h,o as u,d as n}from"./app-ELDWQP0J.js";const c={},d={class:"table-of-contents"};function g(p,e){const r=h("router-link");return u(),s("div",null,[e[12]||(e[12]=t("h1",{id:"contribution-guide",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#contribution-guide"},[t("span",null,"Contribution Guide")])],-1)),t("nav",d,[t("ul",null,[t("li",null,[o(r,{to:"#core-developers"},{default:a(()=>e[0]||(e[0]=[n("Core Developers")])),_:1})]),t("li",null,[o(r,{to:"#contributors"},{default:a(()=>e[1]||(e[1]=[n("Contributors")])),_:1})]),t("li",null,[o(r,{to:"#bug-feedback"},{default:a(()=>e[2]||(e[2]=[n("Bug Feedback")])),_:1})]),t("li",null,[o(r,{to:"#support-questions"},{default:a(()=>e[3]||(e[3]=[n("Support Questions")])),_:1})]),t("li",null,[o(r,{to:"#development-discussion"},{default:a(()=>e[4]||(e[4]=[n("Development Discussion")])),_:1})]),t("li",null,[o(r,{to:"#contribution"},{default:a(()=>e[5]||(e[5]=[n("Contribution")])),_:1}),t("ul",null,[t("li",null,[o(r,{to:"#find-create-issue"},{default:a(()=>e[6]||(e[6]=[n("Find/Create Issue")])),_:1})]),t("li",null,[o(r,{to:"#create-pr"},{default:a(()=>e[7]||(e[7]=[n("Create PR")])),_:1})])])]),t("li",null,[o(r,{to:"#which-branch"},{default:a(()=>e[8]||(e[8]=[n("Which Branch?")])),_:1})]),t("li",null,[o(r,{to:"#local-environment"},{default:a(()=>e[9]||(e[9]=[n("Local Environment")])),_:1})]),t("li",null,[o(r,{to:"#goravel-repository"},{default:a(()=>e[10]||(e[10]=[n("Goravel Repository")])),_:1})]),t("li",null,[o(r,{to:"#code-of-conduct"},{default:a(()=>e[11]||(e[11]=[n("Code of Conduct")])),_:1})])])]),e[13]||(e[13]=l('

Goravel welcomes rich and diverse contributions from different talents, such as coding, translations, articles, tutorials, etc. After completing two enhancements(not containing good first issue), you will be recognized as a core contributor. By completing one enhancement every three months, you can maintain this status. Core developers will be eligible for benefits when Goravel benefits in the future.

Let's make Goravel more efficient together!

Core Developers

Contributors

Bug Feedback

You can report Bug Feedback here, please search Issue List for similar questions before submitting. The report should contain a title and a clear description of the problem, as much relevant information as possible, and a code sample that demonstrates the problem. The goal of Bug Feedback is to make it easy for yourself and other persons to reproduce the Bug and develop fixes. Goravel encourages committers to create a PR for the Bug repair at the same time, making the open-source project more actively developed.

Support Questions

Goravel's GitHub issue trackers are not intended to provide Goravel help or support. Instead, use one of the following channels:

Development Discussion

You may propose new features or improvements to existing Goravel behavior in the Goravel framework repository's GitHub discussion board. Informal discussion regarding bugs, new features, and implementation of existing features takes place in Telegram or WeChat. Bowen, the maintainer of Goravel, is typically present in the group on weekdays from 9am-6pm (UTC+08:00), and sporadically present in the group at other times.

Contribution

Find/Create Issue

You can find or create an issue in Issue List, leave a message to express your willingness to deal with the issue, once confirmed by the repository maintainer, the process can be started.

Create PR

  • You can check out this article if you are new to the process;
  • During the development process, if you encounter a problem, you can describe the problem in detail in issue at any time for future communication, but before that, please make sure that you have tried to solve the problem through Google and other methods as much as possible;
  • Before creating a PR, please improve the unit test coverage as much as possible to provide more stable functions;
  • If you modify any file under the contracts folder, please install vektra/mockery locally and run the mockery command in the root directory to generate the mock file;
  • When the PR is developed, please add the Review Ready , the maintainer will review it in a timely manner.
  • After the PR is merged, the issue will be closed automatically if the description in the PR is set correctly;
  • Goravel greatly appreciates your contribution and will add you to the home contribution list at the next release; ❤️

Which Branch?

All bug fixes should be sent to the latest version that supports bug fixes, unless they fix features that exist only in the upcoming release.

New features or features with breaking changes should always be sent to the master branch.

Local Environment

SoftwareAction
Golang v1.20The minimum version
vektra/mockeryProvider mock files for unit tests

Goravel Repository

RepositoryAction
goravel/goravelGoravel artisans
goravel/frameworkGoravel main repository
goravel/exampleGoravel example
goravel/example-clientExample for Grpc client
goravel/example-protoThe proto dependency of example
goravel/example-packageExample for package
goravel/docsDocument
goravel/docs-webGoravel Website
goravel/s3The S3 driver of Storage module
goravel/ossThe OSS driver of Storage module
goravel/cosThe COS driver of Storage module
goravel/minioThe Minio driver of Storage module
goravel/cloudinaryThe Cloudinary driver of Storage module
goravel/redisThe Redis driver of Cache module
goravel/ginThe Gin driver of Route module
goravel/fiberThe Fiber driver of Route module
goravel/file-rotatelogsProviders log splitting functionality for Log module
goravel/.githubCommunity health file

Code of Conduct

The Goravel code of conduct is derived from the Laravel code of conduct. Any violations of the code of conduct may be reported to Bowen.

  • Participants will be tolerant of opposing views.
  • Participants must ensure that their language and actions are free of personal attacks and disparaging personal remarks.
  • When interpreting the words and actions of others, participants should always assume good intentions.
  • Behavior that can be reasonably considered harassment will not be tolerated.
',28))])}const b=i(c,[["render",g],["__file","contributions.html.vue"]]),f=JSON.parse('{"path":"/prologue/contributions.html","title":"Contribution Guide","lang":"en-US","frontmatter":{"description":"Contribution Guide Goravel welcomes rich and diverse contributions from different talents, such as coding, translations, articles, tutorials, etc. After completing two enhanceme...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/prologue/contributions.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/prologue/contributions.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/prologue/contributions.html"}],["meta",{"property":"og:description","content":"Contribution Guide Goravel welcomes rich and diverse contributions from different talents, such as coding, translations, articles, tutorials, etc. After completing two enhanceme..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Contribution Guide\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"Core Developers","slug":"core-developers","link":"#core-developers","children":[]},{"level":2,"title":"Contributors","slug":"contributors","link":"#contributors","children":[]},{"level":2,"title":"Bug Feedback","slug":"bug-feedback","link":"#bug-feedback","children":[]},{"level":2,"title":"Support Questions","slug":"support-questions","link":"#support-questions","children":[]},{"level":2,"title":"Development Discussion","slug":"development-discussion","link":"#development-discussion","children":[]},{"level":2,"title":"Contribution","slug":"contribution","link":"#contribution","children":[{"level":3,"title":"Find/Create Issue","slug":"find-create-issue","link":"#find-create-issue","children":[]},{"level":3,"title":"Create PR","slug":"create-pr","link":"#create-pr","children":[]}]},{"level":2,"title":"Which Branch?","slug":"which-branch","link":"#which-branch","children":[]},{"level":2,"title":"Local Environment","slug":"local-environment","link":"#local-environment","children":[]},{"level":2,"title":"Goravel Repository","slug":"goravel-repository","link":"#goravel-repository","children":[]},{"level":2,"title":"Code of Conduct","slug":"code-of-conduct","link":"#code-of-conduct","children":[]}],"git":{},"filePathRelative":"prologue/contributions.md","autoDesc":true}');export{b as comp,f as data}; diff --git a/assets/controllers.html-DLgj0Njf.js b/assets/controllers.html-BeLopQ-1.js similarity index 99% rename from assets/controllers.html-DLgj0Njf.js rename to assets/controllers.html-BeLopQ-1.js index 8c01c947..1430c2a0 100644 --- a/assets/controllers.html-DLgj0Njf.js +++ b/assets/controllers.html-BeLopQ-1.js @@ -1,4 +1,4 @@ -import{_ as c,c as i,b as s,e as a,f as t,a as r,r as o,o as u,d as l}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(m,n){const e=o("router-link"),p=o("CommentService");return u(),i("div",null,[n[4]||(n[4]=s("h1",{id:"控制器",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#控制器"},[s("span",null,"控制器")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#简介"},{default:t(()=>n[0]||(n[0]=[l("简介")])),_:1})]),s("li",null,[a(e,{to:"#定义控制器"},{default:t(()=>n[1]||(n[1]=[l("定义控制器")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#创建控制器"},{default:t(()=>n[2]||(n[2]=[l("创建控制器")])),_:1})])])]),s("li",null,[a(e,{to:"#资源型控制器"},{default:t(()=>n[3]||(n[3]=[l("资源型控制器")])),_:1})])])]),n[5]||(n[5]=r(`

简介

为了代替在单独路由中以闭包形式定义所有的请求处理逻辑,可以使用控制器来进行整合。控制器被存放在 app/http/controllers 目录中。

定义控制器

下面是一个基础控制器类的例子:

package controllers
+import{_ as c,c as i,b as s,e as a,f as t,a as r,r as o,o as u,d as l}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(m,n){const e=o("router-link"),p=o("CommentService");return u(),i("div",null,[n[4]||(n[4]=s("h1",{id:"控制器",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#控制器"},[s("span",null,"控制器")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#简介"},{default:t(()=>n[0]||(n[0]=[l("简介")])),_:1})]),s("li",null,[a(e,{to:"#定义控制器"},{default:t(()=>n[1]||(n[1]=[l("定义控制器")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#创建控制器"},{default:t(()=>n[2]||(n[2]=[l("创建控制器")])),_:1})])])]),s("li",null,[a(e,{to:"#资源型控制器"},{default:t(()=>n[3]||(n[3]=[l("资源型控制器")])),_:1})])])]),n[5]||(n[5]=r(`

简介

为了代替在单独路由中以闭包形式定义所有的请求处理逻辑,可以使用控制器来进行整合。控制器被存放在 app/http/controllers 目录中。

定义控制器

下面是一个基础控制器类的例子:

package controllers
 
 import (
   "github.com/goravel/framework/contracts/http"
diff --git a/assets/controllers.html-CEpSC6VO.js b/assets/controllers.html-DMCVpm6U.js
similarity index 99%
rename from assets/controllers.html-CEpSC6VO.js
rename to assets/controllers.html-DMCVpm6U.js
index c9d2ddd8..14b51cff 100644
--- a/assets/controllers.html-CEpSC6VO.js
+++ b/assets/controllers.html-DMCVpm6U.js
@@ -1,4 +1,4 @@
-import{_ as c,c as p,b as s,e as a,f as t,a as i,r as l,o as u,d as o}from"./app-ELDWQP0J.js";const d={},h={class:"table-of-contents"};function m(k,n){const e=l("router-link"),r=l("CommentService");return u(),p("div",null,[n[4]||(n[4]=s("h1",{id:"controllers",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#controllers"},[s("span",null,"Controllers")])],-1)),s("nav",h,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[o("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#define-controllers"},{default:t(()=>n[1]||(n[1]=[o("Define Controllers")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#create-controller"},{default:t(()=>n[2]||(n[2]=[o("Create Controller")])),_:1})])])]),s("li",null,[a(e,{to:"#resource-controllers"},{default:t(()=>n[3]||(n[3]=[o("Resource Controllers")])),_:1})])])]),n[5]||(n[5]=i(`

Introduction

Instead of defining all request processing logic in the form of a closure in a separate route, a controller can be used for integration. The controllers are stored in the app/http/controllers directory.

Define Controllers

The following is an example of a basic controller:

package controllers
+import{_ as c,c as p,b as s,e as a,f as t,a as i,r as l,o as u,d as o}from"./app-Ewo6p9aM.js";const d={},h={class:"table-of-contents"};function m(k,n){const e=l("router-link"),r=l("CommentService");return u(),p("div",null,[n[4]||(n[4]=s("h1",{id:"controllers",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#controllers"},[s("span",null,"Controllers")])],-1)),s("nav",h,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[o("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#define-controllers"},{default:t(()=>n[1]||(n[1]=[o("Define Controllers")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#create-controller"},{default:t(()=>n[2]||(n[2]=[o("Create Controller")])),_:1})])])]),s("li",null,[a(e,{to:"#resource-controllers"},{default:t(()=>n[3]||(n[3]=[o("Resource Controllers")])),_:1})])])]),n[5]||(n[5]=i(`

Introduction

Instead of defining all request processing logic in the form of a closure in a separate route, a controller can be used for integration. The controllers are stored in the app/http/controllers directory.

Define Controllers

The following is an example of a basic controller:

package controllers
 
 import (
   "github.com/goravel/framework/contracts/http"
diff --git a/assets/directory-structure.html-OmthrrZZ.js b/assets/directory-structure.html-D4BzyHY7.js
similarity index 99%
rename from assets/directory-structure.html-OmthrrZZ.js
rename to assets/directory-structure.html-D4BzyHY7.js
index 015c8ce4..70ceade2 100644
--- a/assets/directory-structure.html-OmthrrZZ.js
+++ b/assets/directory-structure.html-D4BzyHY7.js
@@ -1 +1 @@
-import{_ as d,c as u,b as t,e as o,f as s,a as n,d as l,r as p,o as g}from"./app-ELDWQP0J.js";const h={},f={class:"table-of-contents"};function c(b,e){const r=p("router-link"),a=p("RouteLink"),i=p("CommentService");return g(),u("div",null,[e[32]||(e[32]=t("h1",{id:"文件夹结构",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#文件夹结构"},[t("span",null,"文件夹结构")])],-1)),t("nav",f,[t("ul",null,[t("li",null,[o(r,{to:"#简介"},{default:s(()=>e[0]||(e[0]=[l("简介")])),_:1})]),t("li",null,[o(r,{to:"#根目录"},{default:s(()=>e[1]||(e[1]=[l("根目录")])),_:1}),t("ul",null,[t("li",null,[o(r,{to:"#app-目录"},{default:s(()=>e[2]||(e[2]=[l("app 目录")])),_:1})]),t("li",null,[o(r,{to:"#bootstrap-目录"},{default:s(()=>e[3]||(e[3]=[l("bootstrap 目录")])),_:1})]),t("li",null,[o(r,{to:"#config-目录"},{default:s(()=>e[4]||(e[4]=[l("config 目录")])),_:1})]),t("li",null,[o(r,{to:"#database-目录"},{default:s(()=>e[5]||(e[5]=[l("database 目录")])),_:1})]),t("li",null,[o(r,{to:"#public-目录"},{default:s(()=>e[6]||(e[6]=[l("public 目录")])),_:1})]),t("li",null,[o(r,{to:"#resources-目录"},{default:s(()=>e[7]||(e[7]=[l("resources 目录")])),_:1})]),t("li",null,[o(r,{to:"#routes-目录"},{default:s(()=>e[8]||(e[8]=[l("routes 目录")])),_:1})]),t("li",null,[o(r,{to:"#storage-目录"},{default:s(()=>e[9]||(e[9]=[l("storage 目录")])),_:1})]),t("li",null,[o(r,{to:"#tests-目录"},{default:s(()=>e[10]||(e[10]=[l("tests 目录")])),_:1})])])]),t("li",null,[o(r,{to:"#app-目录-1"},{default:s(()=>e[11]||(e[11]=[l("app 目录")])),_:1}),t("ul",null,[t("li",null,[o(r,{to:"#console-目录"},{default:s(()=>e[12]||(e[12]=[l("console 目录")])),_:1})]),t("li",null,[o(r,{to:"#http-目录"},{default:s(()=>e[13]||(e[13]=[l("http 目录")])),_:1})]),t("li",null,[o(r,{to:"#grpc-目录"},{default:s(()=>e[14]||(e[14]=[l("grpc 目录")])),_:1})]),t("li",null,[o(r,{to:"#models-目录"},{default:s(()=>e[15]||(e[15]=[l("models 目录")])),_:1})]),t("li",null,[o(r,{to:"#providers-目录"},{default:s(()=>e[16]||(e[16]=[l("providers 目录")])),_:1})])])])])]),e[33]||(e[33]=n('

简介

默认的文件结构可以使你更好的开始项目推进,你也可以自由的新增文件夹,但默认文件夹不要修改。

根目录

app 目录

app 包含了程序的核心代码,程序中几乎所有的逻辑都将在这个文件夹中。

bootstrap 目录

bootstrap 目录包含了框架的启动文件 app.go

config 目录

config 目录包含了应用程序的所有配置文件。最好把这些文件都浏览一遍,并熟悉所有可用的配置。

database 目录

database 目录包含了数据库迁移文件。

public 目录

public 目录包含一些静态资源,如图像、证书等。

resources 目录

',14)),t("p",null,[e[18]||(e[18]=t("code",null,"resources",-1)),e[19]||(e[19]=l(" 目录包含您的")),o(a,{to:"/zh/the-basics/views.html"},{default:s(()=>e[17]||(e[17]=[l("视图")])),_:1}),e[20]||(e[20]=l(",以及原始的、未编译的资源文件,例如 CSS 或 JavaScript。"))]),e[34]||(e[34]=n('

routes 目录

routes 目录包含应用程序的所有路由定义。

storage 目录

storage 目录包含 logs 等目录,logs 目录包含应用程序的日志文件。

tests 目录

tests 目录包含你的自动化测试。

app 目录

console 目录

',8)),t("p",null,[e[22]||(e[22]=t("code",null,"console",-1)),e[23]||(e[23]=l(" 目录包含应用程序所有自定义的 ")),e[24]||(e[24]=t("code",null,"Artisan",-1)),e[25]||(e[25]=l(" 命令,与控制台引导文件 ")),e[26]||(e[26]=t("code",null,"kernel.go",-1)),e[27]||(e[27]=l(",可以在这个文件中注册")),o(a,{to:"/zh/digging-deeper/task-scheduling.html"},{default:s(()=>e[21]||(e[21]=[l("任务")])),_:1})]),e[35]||(e[35]=n('

http 目录

http 目录包含了控制器、中间件等,几乎所有通过 Web 进入应用的请求处理都在这里进行。

grpc 目录

grpc 目录包含了控制器、中间件等,几乎所有通过 Grpc 进入应用的请求处理都在这里进行。

models 目录

models 目录包含所有数据模型。

providers 目录

',7)),t("p",null,[e[29]||(e[29]=t("code",null,"providers",-1)),e[30]||(e[30]=l(" 目录包含程序中所有的 ")),o(a,{to:"/zh/architecutre-concepts/service-providers.html"},{default:s(()=>e[28]||(e[28]=[l("服务提供者")])),_:1}),e[31]||(e[31]=l("。服务提供者通过绑定服务、注册事件或执行任何其他任务来引导应用程序以应对传入的请求。"))]),o(i)])}const v=d(h,[["render",c],["__file","directory-structure.html.vue"]]),k=JSON.parse('{"path":"/zh/getting-started/directory-structure.html","title":"文件夹结构","lang":"zh-CN","frontmatter":{"description":"文件夹结构 简介 默认的文件结构可以使你更好的开始项目推进,你也可以自由的新增文件夹,但默认文件夹不要修改。 根目录 app 目录 app 包含了程序的核心代码,程序中几乎所有的逻辑都将在这个文件夹中。 bootstrap 目录 bootstrap 目录包含了框架的启动文件 app.go。 config 目录 config 目录包含了应用程序的所有配置...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/getting-started/directory-structure.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/getting-started/directory-structure.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/getting-started/directory-structure.html"}],["meta",{"property":"og:description","content":"文件夹结构 简介 默认的文件结构可以使你更好的开始项目推进,你也可以自由的新增文件夹,但默认文件夹不要修改。 根目录 app 目录 app 包含了程序的核心代码,程序中几乎所有的逻辑都将在这个文件夹中。 bootstrap 目录 bootstrap 目录包含了框架的启动文件 app.go。 config 目录 config 目录包含了应用程序的所有配置..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"文件夹结构\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"简介","slug":"简介","link":"#简介","children":[]},{"level":2,"title":"根目录","slug":"根目录","link":"#根目录","children":[{"level":3,"title":"app 目录","slug":"app-目录","link":"#app-目录","children":[]},{"level":3,"title":"bootstrap 目录","slug":"bootstrap-目录","link":"#bootstrap-目录","children":[]},{"level":3,"title":"config 目录","slug":"config-目录","link":"#config-目录","children":[]},{"level":3,"title":"database 目录","slug":"database-目录","link":"#database-目录","children":[]},{"level":3,"title":"public 目录","slug":"public-目录","link":"#public-目录","children":[]},{"level":3,"title":"resources 目录","slug":"resources-目录","link":"#resources-目录","children":[]},{"level":3,"title":"routes 目录","slug":"routes-目录","link":"#routes-目录","children":[]},{"level":3,"title":"storage 目录","slug":"storage-目录","link":"#storage-目录","children":[]},{"level":3,"title":"tests 目录","slug":"tests-目录","link":"#tests-目录","children":[]}]},{"level":2,"title":"app 目录","slug":"app-目录-1","link":"#app-目录-1","children":[{"level":3,"title":"console 目录","slug":"console-目录","link":"#console-目录","children":[]},{"level":3,"title":"http 目录","slug":"http-目录","link":"#http-目录","children":[]},{"level":3,"title":"grpc 目录","slug":"grpc-目录","link":"#grpc-目录","children":[]},{"level":3,"title":"models 目录","slug":"models-目录","link":"#models-目录","children":[]},{"level":3,"title":"providers 目录","slug":"providers-目录","link":"#providers-目录","children":[]}]}],"git":{},"filePathRelative":"zh/getting-started/directory-structure.md","autoDesc":true}');export{v as comp,k as data}; +import{_ as d,c as u,b as t,e as o,f as s,a as n,d as l,r as p,o as g}from"./app-Ewo6p9aM.js";const h={},f={class:"table-of-contents"};function c(b,e){const r=p("router-link"),a=p("RouteLink"),i=p("CommentService");return g(),u("div",null,[e[32]||(e[32]=t("h1",{id:"文件夹结构",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#文件夹结构"},[t("span",null,"文件夹结构")])],-1)),t("nav",f,[t("ul",null,[t("li",null,[o(r,{to:"#简介"},{default:s(()=>e[0]||(e[0]=[l("简介")])),_:1})]),t("li",null,[o(r,{to:"#根目录"},{default:s(()=>e[1]||(e[1]=[l("根目录")])),_:1}),t("ul",null,[t("li",null,[o(r,{to:"#app-目录"},{default:s(()=>e[2]||(e[2]=[l("app 目录")])),_:1})]),t("li",null,[o(r,{to:"#bootstrap-目录"},{default:s(()=>e[3]||(e[3]=[l("bootstrap 目录")])),_:1})]),t("li",null,[o(r,{to:"#config-目录"},{default:s(()=>e[4]||(e[4]=[l("config 目录")])),_:1})]),t("li",null,[o(r,{to:"#database-目录"},{default:s(()=>e[5]||(e[5]=[l("database 目录")])),_:1})]),t("li",null,[o(r,{to:"#public-目录"},{default:s(()=>e[6]||(e[6]=[l("public 目录")])),_:1})]),t("li",null,[o(r,{to:"#resources-目录"},{default:s(()=>e[7]||(e[7]=[l("resources 目录")])),_:1})]),t("li",null,[o(r,{to:"#routes-目录"},{default:s(()=>e[8]||(e[8]=[l("routes 目录")])),_:1})]),t("li",null,[o(r,{to:"#storage-目录"},{default:s(()=>e[9]||(e[9]=[l("storage 目录")])),_:1})]),t("li",null,[o(r,{to:"#tests-目录"},{default:s(()=>e[10]||(e[10]=[l("tests 目录")])),_:1})])])]),t("li",null,[o(r,{to:"#app-目录-1"},{default:s(()=>e[11]||(e[11]=[l("app 目录")])),_:1}),t("ul",null,[t("li",null,[o(r,{to:"#console-目录"},{default:s(()=>e[12]||(e[12]=[l("console 目录")])),_:1})]),t("li",null,[o(r,{to:"#http-目录"},{default:s(()=>e[13]||(e[13]=[l("http 目录")])),_:1})]),t("li",null,[o(r,{to:"#grpc-目录"},{default:s(()=>e[14]||(e[14]=[l("grpc 目录")])),_:1})]),t("li",null,[o(r,{to:"#models-目录"},{default:s(()=>e[15]||(e[15]=[l("models 目录")])),_:1})]),t("li",null,[o(r,{to:"#providers-目录"},{default:s(()=>e[16]||(e[16]=[l("providers 目录")])),_:1})])])])])]),e[33]||(e[33]=n('

简介

默认的文件结构可以使你更好的开始项目推进,你也可以自由的新增文件夹,但默认文件夹不要修改。

根目录

app 目录

app 包含了程序的核心代码,程序中几乎所有的逻辑都将在这个文件夹中。

bootstrap 目录

bootstrap 目录包含了框架的启动文件 app.go

config 目录

config 目录包含了应用程序的所有配置文件。最好把这些文件都浏览一遍,并熟悉所有可用的配置。

database 目录

database 目录包含了数据库迁移文件。

public 目录

public 目录包含一些静态资源,如图像、证书等。

resources 目录

',14)),t("p",null,[e[18]||(e[18]=t("code",null,"resources",-1)),e[19]||(e[19]=l(" 目录包含您的")),o(a,{to:"/zh/the-basics/views.html"},{default:s(()=>e[17]||(e[17]=[l("视图")])),_:1}),e[20]||(e[20]=l(",以及原始的、未编译的资源文件,例如 CSS 或 JavaScript。"))]),e[34]||(e[34]=n('

routes 目录

routes 目录包含应用程序的所有路由定义。

storage 目录

storage 目录包含 logs 等目录,logs 目录包含应用程序的日志文件。

tests 目录

tests 目录包含你的自动化测试。

app 目录

console 目录

',8)),t("p",null,[e[22]||(e[22]=t("code",null,"console",-1)),e[23]||(e[23]=l(" 目录包含应用程序所有自定义的 ")),e[24]||(e[24]=t("code",null,"Artisan",-1)),e[25]||(e[25]=l(" 命令,与控制台引导文件 ")),e[26]||(e[26]=t("code",null,"kernel.go",-1)),e[27]||(e[27]=l(",可以在这个文件中注册")),o(a,{to:"/zh/digging-deeper/task-scheduling.html"},{default:s(()=>e[21]||(e[21]=[l("任务")])),_:1})]),e[35]||(e[35]=n('

http 目录

http 目录包含了控制器、中间件等,几乎所有通过 Web 进入应用的请求处理都在这里进行。

grpc 目录

grpc 目录包含了控制器、中间件等,几乎所有通过 Grpc 进入应用的请求处理都在这里进行。

models 目录

models 目录包含所有数据模型。

providers 目录

',7)),t("p",null,[e[29]||(e[29]=t("code",null,"providers",-1)),e[30]||(e[30]=l(" 目录包含程序中所有的 ")),o(a,{to:"/zh/architecutre-concepts/service-providers.html"},{default:s(()=>e[28]||(e[28]=[l("服务提供者")])),_:1}),e[31]||(e[31]=l("。服务提供者通过绑定服务、注册事件或执行任何其他任务来引导应用程序以应对传入的请求。"))]),o(i)])}const v=d(h,[["render",c],["__file","directory-structure.html.vue"]]),k=JSON.parse('{"path":"/zh/getting-started/directory-structure.html","title":"文件夹结构","lang":"zh-CN","frontmatter":{"description":"文件夹结构 简介 默认的文件结构可以使你更好的开始项目推进,你也可以自由的新增文件夹,但默认文件夹不要修改。 根目录 app 目录 app 包含了程序的核心代码,程序中几乎所有的逻辑都将在这个文件夹中。 bootstrap 目录 bootstrap 目录包含了框架的启动文件 app.go。 config 目录 config 目录包含了应用程序的所有配置...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/getting-started/directory-structure.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/getting-started/directory-structure.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/getting-started/directory-structure.html"}],["meta",{"property":"og:description","content":"文件夹结构 简介 默认的文件结构可以使你更好的开始项目推进,你也可以自由的新增文件夹,但默认文件夹不要修改。 根目录 app 目录 app 包含了程序的核心代码,程序中几乎所有的逻辑都将在这个文件夹中。 bootstrap 目录 bootstrap 目录包含了框架的启动文件 app.go。 config 目录 config 目录包含了应用程序的所有配置..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"文件夹结构\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"简介","slug":"简介","link":"#简介","children":[]},{"level":2,"title":"根目录","slug":"根目录","link":"#根目录","children":[{"level":3,"title":"app 目录","slug":"app-目录","link":"#app-目录","children":[]},{"level":3,"title":"bootstrap 目录","slug":"bootstrap-目录","link":"#bootstrap-目录","children":[]},{"level":3,"title":"config 目录","slug":"config-目录","link":"#config-目录","children":[]},{"level":3,"title":"database 目录","slug":"database-目录","link":"#database-目录","children":[]},{"level":3,"title":"public 目录","slug":"public-目录","link":"#public-目录","children":[]},{"level":3,"title":"resources 目录","slug":"resources-目录","link":"#resources-目录","children":[]},{"level":3,"title":"routes 目录","slug":"routes-目录","link":"#routes-目录","children":[]},{"level":3,"title":"storage 目录","slug":"storage-目录","link":"#storage-目录","children":[]},{"level":3,"title":"tests 目录","slug":"tests-目录","link":"#tests-目录","children":[]}]},{"level":2,"title":"app 目录","slug":"app-目录-1","link":"#app-目录-1","children":[{"level":3,"title":"console 目录","slug":"console-目录","link":"#console-目录","children":[]},{"level":3,"title":"http 目录","slug":"http-目录","link":"#http-目录","children":[]},{"level":3,"title":"grpc 目录","slug":"grpc-目录","link":"#grpc-目录","children":[]},{"level":3,"title":"models 目录","slug":"models-目录","link":"#models-目录","children":[]},{"level":3,"title":"providers 目录","slug":"providers-目录","link":"#providers-目录","children":[]}]}],"git":{},"filePathRelative":"zh/getting-started/directory-structure.md","autoDesc":true}');export{v as comp,k as data}; diff --git a/assets/directory-structure.html-CwwWhzXK.js b/assets/directory-structure.html-ExOJOA2Q.js similarity index 99% rename from assets/directory-structure.html-CwwWhzXK.js rename to assets/directory-structure.html-ExOJOA2Q.js index 3805d083..ec31171e 100644 --- a/assets/directory-structure.html-CwwWhzXK.js +++ b/assets/directory-structure.html-ExOJOA2Q.js @@ -1 +1 @@ -import{_ as c,c as p,b as t,e as o,f as i,a as s,d as r,r as a,o as u}from"./app-ELDWQP0J.js";const y={},h={class:"table-of-contents"};function f(g,e){const d=a("router-link"),l=a("RouteLink"),n=a("CommentService");return u(),p("div",null,[e[35]||(e[35]=t("h1",{id:"directory-structure",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#directory-structure"},[t("span",null,"Directory Structure")])],-1)),t("nav",h,[t("ul",null,[t("li",null,[o(d,{to:"#introduction"},{default:i(()=>e[0]||(e[0]=[r("Introduction")])),_:1})]),t("li",null,[o(d,{to:"#root-directory"},{default:i(()=>e[1]||(e[1]=[r("Root Directory")])),_:1}),t("ul",null,[t("li",null,[o(d,{to:"#app-directory"},{default:i(()=>e[2]||(e[2]=[r("app Directory")])),_:1})]),t("li",null,[o(d,{to:"#bootstrap-directory"},{default:i(()=>e[3]||(e[3]=[r("bootstrap Directory")])),_:1})]),t("li",null,[o(d,{to:"#config-directory"},{default:i(()=>e[4]||(e[4]=[r("config Directory")])),_:1})]),t("li",null,[o(d,{to:"#database-directory"},{default:i(()=>e[5]||(e[5]=[r("database Directory")])),_:1})]),t("li",null,[o(d,{to:"#public-directory"},{default:i(()=>e[6]||(e[6]=[r("public Directory")])),_:1})]),t("li",null,[o(d,{to:"#resources-directory"},{default:i(()=>e[7]||(e[7]=[r("resources Directory")])),_:1})]),t("li",null,[o(d,{to:"#routes-directory"},{default:i(()=>e[8]||(e[8]=[r("routes Directory")])),_:1})]),t("li",null,[o(d,{to:"#storage-directory"},{default:i(()=>e[9]||(e[9]=[r("storage Directory")])),_:1})]),t("li",null,[o(d,{to:"#tests-directory"},{default:i(()=>e[10]||(e[10]=[r("tests Directory")])),_:1})])])]),t("li",null,[o(d,{to:"#app-directory-1"},{default:i(()=>e[11]||(e[11]=[r("app Directory")])),_:1}),t("ul",null,[t("li",null,[o(d,{to:"#console-directory"},{default:i(()=>e[12]||(e[12]=[r("console Directory")])),_:1})]),t("li",null,[o(d,{to:"#http-directory"},{default:i(()=>e[13]||(e[13]=[r("http Directory")])),_:1})]),t("li",null,[o(d,{to:"#grpc-directory"},{default:i(()=>e[14]||(e[14]=[r("grpc Directory")])),_:1})]),t("li",null,[o(d,{to:"#models-directory"},{default:i(()=>e[15]||(e[15]=[r("models Directory")])),_:1})]),t("li",null,[o(d,{to:"#providers-directory"},{default:i(()=>e[16]||(e[16]=[r("providers Directory")])),_:1})])])])])]),e[36]||(e[36]=s('

Introduction

The default file structure can make you better start project advancement, and you can also add new folders freely, but do not modify the default folders.

Root Directory

app Directory

app contains the core code of the program. Almost all the logic in the program will be in this folder.

bootstrap Directory

The bootstrap directory contains the framework startup file app.go.

config Directory

The config directory contains all configuration files of the application. It is best to browse through these files and familiarize yourself with all the available options.

database Directory

The database directory contains database migration files.

public Directory

The public directory contains some static resources, such as images, certificates, etc.

resources Directory

',14)),t("p",null,[e[18]||(e[18]=r("The ")),e[19]||(e[19]=t("code",null,"resources",-1)),e[20]||(e[20]=r(" directory contains your ")),o(l,{to:"/the-basics/views.html"},{default:i(()=>e[17]||(e[17]=[r("views")])),_:1}),e[21]||(e[21]=r(" as well as your raw, un-compiled assets such as CSS or JavaScript."))]),e[37]||(e[37]=s('

routes Directory

The routes directory contains all the route definitions of the application.

storage Directory

The storage directory contains the logs directory, and the logs directory contains the application log files.

tests Directory

The tests directory contains your automated tests.

app Directory

console Directory

',8)),t("p",null,[e[23]||(e[23]=r("The ")),e[24]||(e[24]=t("code",null,"console",-1)),e[25]||(e[25]=r(" directory contains all the custom ")),e[26]||(e[26]=t("code",null,"Artisan",-1)),e[27]||(e[27]=r(" commands of the application, and the console boot file ")),e[28]||(e[28]=t("code",null,"kernel.go",-1)),e[29]||(e[29]=r(", which can be registered in this file ")),o(l,{to:"/digging-deeper/task-scheduling.html"},{default:i(()=>e[22]||(e[22]=[r("Task Scheduling")])),_:1})]),e[38]||(e[38]=s('

http Directory

The http directory contains controllers, middleware, etc., and almost all requests that enter the application via the Web are processed here.

grpc Directory

The grpc directory contains controllers, middleware, etc., and almost all requests that enter the application via the Grpc are processed here.

models Directory

The models directory contains all data models.

providers Directory

',7)),t("p",null,[e[31]||(e[31]=r("The ")),e[32]||(e[32]=t("code",null,"providers",-1)),e[33]||(e[33]=r(" directory contains all ")),o(l,{to:"/architecutre-concepts/service-providers.html"},{default:i(()=>e[30]||(e[30]=[r("Service Providers")])),_:1}),e[34]||(e[34]=r(" in the program. The service provider guides the application to respond to incoming requests by binding services, registering for events, or performing any other tasks."))]),o(n)])}const b=c(y,[["render",f],["__file","directory-structure.html.vue"]]),v=JSON.parse('{"path":"/getting-started/directory-structure.html","title":"Directory Structure","lang":"en-US","frontmatter":{"description":"Directory Structure Introduction The default file structure can make you better start project advancement, and you can also add new folders freely, but do not modify the default...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/getting-started/directory-structure.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/getting-started/directory-structure.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/getting-started/directory-structure.html"}],["meta",{"property":"og:description","content":"Directory Structure Introduction The default file structure can make you better start project advancement, and you can also add new folders freely, but do not modify the default..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Directory Structure\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"Introduction","slug":"introduction","link":"#introduction","children":[]},{"level":2,"title":"Root Directory","slug":"root-directory","link":"#root-directory","children":[{"level":3,"title":"app Directory","slug":"app-directory","link":"#app-directory","children":[]},{"level":3,"title":"bootstrap Directory","slug":"bootstrap-directory","link":"#bootstrap-directory","children":[]},{"level":3,"title":"config Directory","slug":"config-directory","link":"#config-directory","children":[]},{"level":3,"title":"database Directory","slug":"database-directory","link":"#database-directory","children":[]},{"level":3,"title":"public Directory","slug":"public-directory","link":"#public-directory","children":[]},{"level":3,"title":"resources Directory","slug":"resources-directory","link":"#resources-directory","children":[]},{"level":3,"title":"routes Directory","slug":"routes-directory","link":"#routes-directory","children":[]},{"level":3,"title":"storage Directory","slug":"storage-directory","link":"#storage-directory","children":[]},{"level":3,"title":"tests Directory","slug":"tests-directory","link":"#tests-directory","children":[]}]},{"level":2,"title":"app Directory","slug":"app-directory-1","link":"#app-directory-1","children":[{"level":3,"title":"console Directory","slug":"console-directory","link":"#console-directory","children":[]},{"level":3,"title":"http Directory","slug":"http-directory","link":"#http-directory","children":[]},{"level":3,"title":"grpc Directory","slug":"grpc-directory","link":"#grpc-directory","children":[]},{"level":3,"title":"models Directory","slug":"models-directory","link":"#models-directory","children":[]},{"level":3,"title":"providers Directory","slug":"providers-directory","link":"#providers-directory","children":[]}]}],"git":{},"filePathRelative":"getting-started/directory-structure.md","autoDesc":true}');export{b as comp,v as data}; +import{_ as c,c as p,b as t,e as o,f as i,a as s,d as r,r as a,o as u}from"./app-Ewo6p9aM.js";const y={},h={class:"table-of-contents"};function f(g,e){const d=a("router-link"),l=a("RouteLink"),n=a("CommentService");return u(),p("div",null,[e[35]||(e[35]=t("h1",{id:"directory-structure",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#directory-structure"},[t("span",null,"Directory Structure")])],-1)),t("nav",h,[t("ul",null,[t("li",null,[o(d,{to:"#introduction"},{default:i(()=>e[0]||(e[0]=[r("Introduction")])),_:1})]),t("li",null,[o(d,{to:"#root-directory"},{default:i(()=>e[1]||(e[1]=[r("Root Directory")])),_:1}),t("ul",null,[t("li",null,[o(d,{to:"#app-directory"},{default:i(()=>e[2]||(e[2]=[r("app Directory")])),_:1})]),t("li",null,[o(d,{to:"#bootstrap-directory"},{default:i(()=>e[3]||(e[3]=[r("bootstrap Directory")])),_:1})]),t("li",null,[o(d,{to:"#config-directory"},{default:i(()=>e[4]||(e[4]=[r("config Directory")])),_:1})]),t("li",null,[o(d,{to:"#database-directory"},{default:i(()=>e[5]||(e[5]=[r("database Directory")])),_:1})]),t("li",null,[o(d,{to:"#public-directory"},{default:i(()=>e[6]||(e[6]=[r("public Directory")])),_:1})]),t("li",null,[o(d,{to:"#resources-directory"},{default:i(()=>e[7]||(e[7]=[r("resources Directory")])),_:1})]),t("li",null,[o(d,{to:"#routes-directory"},{default:i(()=>e[8]||(e[8]=[r("routes Directory")])),_:1})]),t("li",null,[o(d,{to:"#storage-directory"},{default:i(()=>e[9]||(e[9]=[r("storage Directory")])),_:1})]),t("li",null,[o(d,{to:"#tests-directory"},{default:i(()=>e[10]||(e[10]=[r("tests Directory")])),_:1})])])]),t("li",null,[o(d,{to:"#app-directory-1"},{default:i(()=>e[11]||(e[11]=[r("app Directory")])),_:1}),t("ul",null,[t("li",null,[o(d,{to:"#console-directory"},{default:i(()=>e[12]||(e[12]=[r("console Directory")])),_:1})]),t("li",null,[o(d,{to:"#http-directory"},{default:i(()=>e[13]||(e[13]=[r("http Directory")])),_:1})]),t("li",null,[o(d,{to:"#grpc-directory"},{default:i(()=>e[14]||(e[14]=[r("grpc Directory")])),_:1})]),t("li",null,[o(d,{to:"#models-directory"},{default:i(()=>e[15]||(e[15]=[r("models Directory")])),_:1})]),t("li",null,[o(d,{to:"#providers-directory"},{default:i(()=>e[16]||(e[16]=[r("providers Directory")])),_:1})])])])])]),e[36]||(e[36]=s('

Introduction

The default file structure can make you better start project advancement, and you can also add new folders freely, but do not modify the default folders.

Root Directory

app Directory

app contains the core code of the program. Almost all the logic in the program will be in this folder.

bootstrap Directory

The bootstrap directory contains the framework startup file app.go.

config Directory

The config directory contains all configuration files of the application. It is best to browse through these files and familiarize yourself with all the available options.

database Directory

The database directory contains database migration files.

public Directory

The public directory contains some static resources, such as images, certificates, etc.

resources Directory

',14)),t("p",null,[e[18]||(e[18]=r("The ")),e[19]||(e[19]=t("code",null,"resources",-1)),e[20]||(e[20]=r(" directory contains your ")),o(l,{to:"/the-basics/views.html"},{default:i(()=>e[17]||(e[17]=[r("views")])),_:1}),e[21]||(e[21]=r(" as well as your raw, un-compiled assets such as CSS or JavaScript."))]),e[37]||(e[37]=s('

routes Directory

The routes directory contains all the route definitions of the application.

storage Directory

The storage directory contains the logs directory, and the logs directory contains the application log files.

tests Directory

The tests directory contains your automated tests.

app Directory

console Directory

',8)),t("p",null,[e[23]||(e[23]=r("The ")),e[24]||(e[24]=t("code",null,"console",-1)),e[25]||(e[25]=r(" directory contains all the custom ")),e[26]||(e[26]=t("code",null,"Artisan",-1)),e[27]||(e[27]=r(" commands of the application, and the console boot file ")),e[28]||(e[28]=t("code",null,"kernel.go",-1)),e[29]||(e[29]=r(", which can be registered in this file ")),o(l,{to:"/digging-deeper/task-scheduling.html"},{default:i(()=>e[22]||(e[22]=[r("Task Scheduling")])),_:1})]),e[38]||(e[38]=s('

http Directory

The http directory contains controllers, middleware, etc., and almost all requests that enter the application via the Web are processed here.

grpc Directory

The grpc directory contains controllers, middleware, etc., and almost all requests that enter the application via the Grpc are processed here.

models Directory

The models directory contains all data models.

providers Directory

',7)),t("p",null,[e[31]||(e[31]=r("The ")),e[32]||(e[32]=t("code",null,"providers",-1)),e[33]||(e[33]=r(" directory contains all ")),o(l,{to:"/architecutre-concepts/service-providers.html"},{default:i(()=>e[30]||(e[30]=[r("Service Providers")])),_:1}),e[34]||(e[34]=r(" in the program. The service provider guides the application to respond to incoming requests by binding services, registering for events, or performing any other tasks."))]),o(n)])}const b=c(y,[["render",f],["__file","directory-structure.html.vue"]]),v=JSON.parse('{"path":"/getting-started/directory-structure.html","title":"Directory Structure","lang":"en-US","frontmatter":{"description":"Directory Structure Introduction The default file structure can make you better start project advancement, and you can also add new folders freely, but do not modify the default...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/getting-started/directory-structure.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/getting-started/directory-structure.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/getting-started/directory-structure.html"}],["meta",{"property":"og:description","content":"Directory Structure Introduction The default file structure can make you better start project advancement, and you can also add new folders freely, but do not modify the default..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Directory Structure\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"Introduction","slug":"introduction","link":"#introduction","children":[]},{"level":2,"title":"Root Directory","slug":"root-directory","link":"#root-directory","children":[{"level":3,"title":"app Directory","slug":"app-directory","link":"#app-directory","children":[]},{"level":3,"title":"bootstrap Directory","slug":"bootstrap-directory","link":"#bootstrap-directory","children":[]},{"level":3,"title":"config Directory","slug":"config-directory","link":"#config-directory","children":[]},{"level":3,"title":"database Directory","slug":"database-directory","link":"#database-directory","children":[]},{"level":3,"title":"public Directory","slug":"public-directory","link":"#public-directory","children":[]},{"level":3,"title":"resources Directory","slug":"resources-directory","link":"#resources-directory","children":[]},{"level":3,"title":"routes Directory","slug":"routes-directory","link":"#routes-directory","children":[]},{"level":3,"title":"storage Directory","slug":"storage-directory","link":"#storage-directory","children":[]},{"level":3,"title":"tests Directory","slug":"tests-directory","link":"#tests-directory","children":[]}]},{"level":2,"title":"app Directory","slug":"app-directory-1","link":"#app-directory-1","children":[{"level":3,"title":"console Directory","slug":"console-directory","link":"#console-directory","children":[]},{"level":3,"title":"http Directory","slug":"http-directory","link":"#http-directory","children":[]},{"level":3,"title":"grpc Directory","slug":"grpc-directory","link":"#grpc-directory","children":[]},{"level":3,"title":"models Directory","slug":"models-directory","link":"#models-directory","children":[]},{"level":3,"title":"providers Directory","slug":"providers-directory","link":"#providers-directory","children":[]}]}],"git":{},"filePathRelative":"getting-started/directory-structure.md","autoDesc":true}');export{b as comp,v as data}; diff --git a/assets/encryption.html-CVmno7EC.js b/assets/encryption.html-BxhPC42u.js similarity index 99% rename from assets/encryption.html-CVmno7EC.js rename to assets/encryption.html-BxhPC42u.js index 04c752fb..bbef233e 100644 --- a/assets/encryption.html-CVmno7EC.js +++ b/assets/encryption.html-BxhPC42u.js @@ -1,3 +1,3 @@ -import{_ as c,c as p,b as n,e as t,f as o,a as l,r,o as u,d as i}from"./app-ELDWQP0J.js";const d={},g={class:"table-of-contents"};function y(h,e){const a=r("router-link"),s=r("CommentService");return u(),p("div",null,[e[5]||(e[5]=n("h1",{id:"encryption",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#encryption"},[n("span",null,"Encryption")])],-1)),n("nav",g,[n("ul",null,[n("li",null,[t(a,{to:"#introduction"},{default:o(()=>e[0]||(e[0]=[i("Introduction")])),_:1})]),n("li",null,[t(a,{to:"#configuration"},{default:o(()=>e[1]||(e[1]=[i("Configuration")])),_:1})]),n("li",null,[t(a,{to:"#using-the-encrypter"},{default:o(()=>e[2]||(e[2]=[i("Using The Encrypter")])),_:1}),n("ul",null,[n("li",null,[t(a,{to:"#encrypting-a-value"},{default:o(()=>e[3]||(e[3]=[i("Encrypting A Value")])),_:1})]),n("li",null,[t(a,{to:"#decrypting-a-value"},{default:o(()=>e[4]||(e[4]=[i("Decrypting A Value")])),_:1})])])])])]),e[6]||(e[6]=l(`

Introduction

Goravel's encryption services provide a simple, convenient interface for encrypting and decrypting text via OpenSSL using AES-256 encryption. All of Goravel's encrypted values are signed using a message authentication code (GMAC) so that their underlying value can not be modified or tampered with once encrypted.

Configuration

Before using Goravel's encrypter, you must set the key configuration option in your config/app.go configuration file. This option is driven by the APP_KEY environment variable. Use the go run . artisan key:generate command to generate this variable's value since the key:generate command will utilize Golang's secure random bytes generator to create a secure cryptographic key for your application.

Using The Encrypter

Encrypting A Value

To encrypt a value, you can use the EncryptString method in facades.Crypt(). This method encrypts values using the OpenSSL and AES-256-GCM cipher. Additionally, all encrypted values are signed with a message authentication code (GMAC) to prevent decryption by malicious users who try to tamper with the data.

secret, err := facades.Crypt().EncryptString("goravel")
+import{_ as c,c as p,b as n,e as t,f as o,a as l,r,o as u,d as i}from"./app-Ewo6p9aM.js";const d={},g={class:"table-of-contents"};function y(h,e){const a=r("router-link"),s=r("CommentService");return u(),p("div",null,[e[5]||(e[5]=n("h1",{id:"encryption",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#encryption"},[n("span",null,"Encryption")])],-1)),n("nav",g,[n("ul",null,[n("li",null,[t(a,{to:"#introduction"},{default:o(()=>e[0]||(e[0]=[i("Introduction")])),_:1})]),n("li",null,[t(a,{to:"#configuration"},{default:o(()=>e[1]||(e[1]=[i("Configuration")])),_:1})]),n("li",null,[t(a,{to:"#using-the-encrypter"},{default:o(()=>e[2]||(e[2]=[i("Using The Encrypter")])),_:1}),n("ul",null,[n("li",null,[t(a,{to:"#encrypting-a-value"},{default:o(()=>e[3]||(e[3]=[i("Encrypting A Value")])),_:1})]),n("li",null,[t(a,{to:"#decrypting-a-value"},{default:o(()=>e[4]||(e[4]=[i("Decrypting A Value")])),_:1})])])])])]),e[6]||(e[6]=l(`

Introduction

Goravel's encryption services provide a simple, convenient interface for encrypting and decrypting text via OpenSSL using AES-256 encryption. All of Goravel's encrypted values are signed using a message authentication code (GMAC) so that their underlying value can not be modified or tampered with once encrypted.

Configuration

Before using Goravel's encrypter, you must set the key configuration option in your config/app.go configuration file. This option is driven by the APP_KEY environment variable. Use the go run . artisan key:generate command to generate this variable's value since the key:generate command will utilize Golang's secure random bytes generator to create a secure cryptographic key for your application.

Using The Encrypter

Encrypting A Value

To encrypt a value, you can use the EncryptString method in facades.Crypt(). This method encrypts values using the OpenSSL and AES-256-GCM cipher. Additionally, all encrypted values are signed with a message authentication code (GMAC) to prevent decryption by malicious users who try to tamper with the data.

secret, err := facades.Crypt().EncryptString("goravel")
 

Decrypting A Value

You can use the DecryptString method from facades.Crypt() to decrypt values. If the value can not be properly decrypted, such as when the message authentication code is invalid, an error will be returned.

str, err := facades.Crypt().DecryptString(secret)
 
`,11)),t(s)])}const m=c(d,[["render",y],["__file","encryption.html.vue"]]),f=JSON.parse(`{"path":"/security/encryption.html","title":"Encryption","lang":"en-US","frontmatter":{"description":"Encryption Introduction Goravel's encryption services provide a simple, convenient interface for encrypting and decrypting text via OpenSSL using AES-256 encryption. All of Gora...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/security/encryption.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/security/encryption.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/security/encryption.html"}],["meta",{"property":"og:description","content":"Encryption Introduction Goravel's encryption services provide a simple, convenient interface for encrypting and decrypting text via OpenSSL using AES-256 encryption. All of Gora..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Encryption\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"Introduction","slug":"introduction","link":"#introduction","children":[]},{"level":2,"title":"Configuration","slug":"configuration","link":"#configuration","children":[]},{"level":2,"title":"Using The Encrypter","slug":"using-the-encrypter","link":"#using-the-encrypter","children":[{"level":3,"title":"Encrypting A Value","slug":"encrypting-a-value","link":"#encrypting-a-value","children":[]},{"level":3,"title":"Decrypting A Value","slug":"decrypting-a-value","link":"#decrypting-a-value","children":[]}]}],"git":{},"filePathRelative":"security/encryption.md","autoDesc":true}`);export{m as comp,f as data}; diff --git a/assets/encryption.html-CKbEOEOI.js b/assets/encryption.html-DyU19Loz.js similarity index 99% rename from assets/encryption.html-CKbEOEOI.js rename to assets/encryption.html-DyU19Loz.js index c321a546..10d80143 100644 --- a/assets/encryption.html-CKbEOEOI.js +++ b/assets/encryption.html-DyU19Loz.js @@ -1,3 +1,3 @@ -import{_ as p,c as i,b as n,e as t,f as s,a as c,r as l,o as d,d as o}from"./app-ELDWQP0J.js";const u={},h={class:"table-of-contents"};function g(m,e){const a=l("router-link"),r=l("CommentService");return d(),i("div",null,[e[5]||(e[5]=n("h1",{id:"加密解密",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#加密解密"},[n("span",null,"加密解密")])],-1)),n("nav",h,[n("ul",null,[n("li",null,[t(a,{to:"#简介"},{default:s(()=>e[0]||(e[0]=[o("简介")])),_:1})]),n("li",null,[t(a,{to:"#配置"},{default:s(()=>e[1]||(e[1]=[o("配置")])),_:1})]),n("li",null,[t(a,{to:"#基本用法"},{default:s(()=>e[2]||(e[2]=[o("基本用法")])),_:1}),n("ul",null,[n("li",null,[t(a,{to:"#加密一个值"},{default:s(()=>e[3]||(e[3]=[o("加密一个值")])),_:1})]),n("li",null,[t(a,{to:"#解密一个值"},{default:s(()=>e[4]||(e[4]=[o("解密一个值")])),_:1})])])])])]),e[6]||(e[6]=c(`

简介

Goravel 的加密机制使用的是 OpenSSL 所提供的 AES-256 加密。强烈建议你使用 Goravel 内建的加密工具,而不是用其它的加密算法。所有 Goravel 加密之后的结果都会使用消息认证码 (GMAC) 签名,使其底层值不能在加密后再次修改。

配置

在使用 Goravel 的加密工具之前,你必须先设置 config/app.go 配置文件中的 key 配置项。该配置项由环境变量 APP_KEY 设定。你应当使用 go run . artisan key:generate 命令来生成该变量的值,key:generate 命令将使用 Golang 的安全随机字节生成器为你的应用程序构建加密安全密钥。

基本用法

加密一个值

你可以使用 facades.Crypt() 提供的 EncryptString 来加密一个值。所有加密的值都使用 OpenSSL 的 AES-256-GCM 来进行加密。此外,所有加密过的值都会使用消息认证码 (GMAC) 来签名,以检测加密字符串是否被篡改过:

secret, err := facades.Crypt().EncryptString("goravel")
+import{_ as p,c as i,b as n,e as t,f as s,a as c,r as l,o as d,d as o}from"./app-Ewo6p9aM.js";const u={},h={class:"table-of-contents"};function g(m,e){const a=l("router-link"),r=l("CommentService");return d(),i("div",null,[e[5]||(e[5]=n("h1",{id:"加密解密",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#加密解密"},[n("span",null,"加密解密")])],-1)),n("nav",h,[n("ul",null,[n("li",null,[t(a,{to:"#简介"},{default:s(()=>e[0]||(e[0]=[o("简介")])),_:1})]),n("li",null,[t(a,{to:"#配置"},{default:s(()=>e[1]||(e[1]=[o("配置")])),_:1})]),n("li",null,[t(a,{to:"#基本用法"},{default:s(()=>e[2]||(e[2]=[o("基本用法")])),_:1}),n("ul",null,[n("li",null,[t(a,{to:"#加密一个值"},{default:s(()=>e[3]||(e[3]=[o("加密一个值")])),_:1})]),n("li",null,[t(a,{to:"#解密一个值"},{default:s(()=>e[4]||(e[4]=[o("解密一个值")])),_:1})])])])])]),e[6]||(e[6]=c(`

简介

Goravel 的加密机制使用的是 OpenSSL 所提供的 AES-256 加密。强烈建议你使用 Goravel 内建的加密工具,而不是用其它的加密算法。所有 Goravel 加密之后的结果都会使用消息认证码 (GMAC) 签名,使其底层值不能在加密后再次修改。

配置

在使用 Goravel 的加密工具之前,你必须先设置 config/app.go 配置文件中的 key 配置项。该配置项由环境变量 APP_KEY 设定。你应当使用 go run . artisan key:generate 命令来生成该变量的值,key:generate 命令将使用 Golang 的安全随机字节生成器为你的应用程序构建加密安全密钥。

基本用法

加密一个值

你可以使用 facades.Crypt() 提供的 EncryptString 来加密一个值。所有加密的值都使用 OpenSSL 的 AES-256-GCM 来进行加密。此外,所有加密过的值都会使用消息认证码 (GMAC) 来签名,以检测加密字符串是否被篡改过:

secret, err := facades.Crypt().EncryptString("goravel")
 

解密一个值

您可以使用 facades.Crypt() 提供的 DecryptString 来进行解密。如果该值不能被正确解密,例如消息认证码 (MAC) 无效,会返回错误:

str, err := facades.Crypt().DecryptString(secret)
 
`,11)),t(r)])}const f=p(u,[["render",g],["__file","encryption.html.vue"]]),y=JSON.parse('{"path":"/zh/security/encryption.html","title":"加密解密","lang":"zh-CN","frontmatter":{"description":"加密解密 简介 Goravel 的加密机制使用的是 OpenSSL 所提供的 AES-256 加密。强烈建议你使用 Goravel 内建的加密工具,而不是用其它的加密算法。所有 Goravel 加密之后的结果都会使用消息认证码 (GMAC) 签名,使其底层值不能在加密后再次修改。 配置 在使用 Goravel 的加密工具之前,你必须先设置 config...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/security/encryption.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/security/encryption.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/security/encryption.html"}],["meta",{"property":"og:description","content":"加密解密 简介 Goravel 的加密机制使用的是 OpenSSL 所提供的 AES-256 加密。强烈建议你使用 Goravel 内建的加密工具,而不是用其它的加密算法。所有 Goravel 加密之后的结果都会使用消息认证码 (GMAC) 签名,使其底层值不能在加密后再次修改。 配置 在使用 Goravel 的加密工具之前,你必须先设置 config..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"加密解密\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"简介","slug":"简介","link":"#简介","children":[]},{"level":2,"title":"配置","slug":"配置","link":"#配置","children":[]},{"level":2,"title":"基本用法","slug":"基本用法","link":"#基本用法","children":[{"level":3,"title":"加密一个值","slug":"加密一个值","link":"#加密一个值","children":[]},{"level":3,"title":"解密一个值","slug":"解密一个值","link":"#解密一个值","children":[]}]}],"git":{},"filePathRelative":"zh/security/encryption.md","autoDesc":true}');export{f as comp,y as data}; diff --git a/assets/event.html-BjiOyLvs.js b/assets/event.html-B7wfEywV.js similarity index 99% rename from assets/event.html-BjiOyLvs.js rename to assets/event.html-B7wfEywV.js index 1674f354..9de4a507 100644 --- a/assets/event.html-BjiOyLvs.js +++ b/assets/event.html-B7wfEywV.js @@ -1,4 +1,4 @@ -import{_ as u,c as r,b as s,e,f as p,a as i,d as a,r as l,o as d}from"./app-ELDWQP0J.js";const v={},k={class:"table-of-contents"};function m(b,n){const t=l("router-link"),c=l("RouteLink"),o=l("CommentService");return d(),r("div",null,[n[17]||(n[17]=s("h1",{id:"事件系统",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#事件系统"},[s("span",null,"事件系统")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[e(t,{to:"#简介"},{default:p(()=>n[0]||(n[0]=[a("简介")])),_:1}),s("ul",null,[s("li",null,[e(t,{to:"#生成事件和监听器"},{default:p(()=>n[1]||(n[1]=[a("生成事件和监听器")])),_:1})])])]),s("li",null,[e(t,{to:"#注册事件和监听器"},{default:p(()=>n[2]||(n[2]=[a("注册事件和监听器")])),_:1})]),s("li",null,[e(t,{to:"#定义事件"},{default:p(()=>n[3]||(n[3]=[a("定义事件")])),_:1})]),s("li",null,[e(t,{to:"#定义监听器"},{default:p(()=>n[4]||(n[4]=[a("定义监听器")])),_:1}),s("ul",null,[s("li",null,[e(t,{to:"#停止事件传播"},{default:p(()=>n[5]||(n[5]=[a("停止事件传播")])),_:1})])])]),s("li",null,[e(t,{to:"#事件监听器队列"},{default:p(()=>n[6]||(n[6]=[a("事件监听器队列")])),_:1}),s("ul",null,[s("li",null,[e(t,{to:"#排队事件监听器和数据库事务"},{default:p(()=>n[7]||(n[7]=[a("排队事件监听器和数据库事务")])),_:1})])])]),s("li",null,[e(t,{to:"#调度事件"},{default:p(()=>n[8]||(n[8]=[a("调度事件")])),_:1})]),s("li",null,[e(t,{to:"#event-arg-type-支持的类型"},{default:p(()=>n[9]||(n[9]=[a("event.Arg.Type 支持的类型")])),_:1})])])]),n[18]||(n[18]=i(`

简介

Goravel 的事件系统提供了一个简单的观察者模式的实现,允许你能够订阅和监听在你的应用中的发生的各种事件。事件类一般来说存储在 app/events 目录,监听者的类存储在 app/listeners 目录。不要担心在你的应用中没有看到这两个目录,因为通过 Artisan 命令行来创建事件和监听者的时候目录会同时被创建。

事件系统可以作为一个非常棒的方式来解耦你的系统的方方面面,因为一个事件可以有多个完全不相关的监听者。例如,你希望每当有订单发出的时候都给你发送一个 Slack 通知。你大可不必将你的处理订单的代码和发送 slack 消息的代码放在一起,你只需要触发一个 app\\events\\OrderShipped 事件,然后事件监听者可以收到这个事件然后发送 slack 通知。

生成事件和监听器

你可以使用 make:event 以及 make:listener 用于生成单个事件和监听器的 Artisan 命令:

go run . artisan make:event OrderShipped
+import{_ as u,c as r,b as s,e,f as p,a as i,d as a,r as l,o as d}from"./app-Ewo6p9aM.js";const v={},k={class:"table-of-contents"};function m(b,n){const t=l("router-link"),c=l("RouteLink"),o=l("CommentService");return d(),r("div",null,[n[17]||(n[17]=s("h1",{id:"事件系统",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#事件系统"},[s("span",null,"事件系统")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[e(t,{to:"#简介"},{default:p(()=>n[0]||(n[0]=[a("简介")])),_:1}),s("ul",null,[s("li",null,[e(t,{to:"#生成事件和监听器"},{default:p(()=>n[1]||(n[1]=[a("生成事件和监听器")])),_:1})])])]),s("li",null,[e(t,{to:"#注册事件和监听器"},{default:p(()=>n[2]||(n[2]=[a("注册事件和监听器")])),_:1})]),s("li",null,[e(t,{to:"#定义事件"},{default:p(()=>n[3]||(n[3]=[a("定义事件")])),_:1})]),s("li",null,[e(t,{to:"#定义监听器"},{default:p(()=>n[4]||(n[4]=[a("定义监听器")])),_:1}),s("ul",null,[s("li",null,[e(t,{to:"#停止事件传播"},{default:p(()=>n[5]||(n[5]=[a("停止事件传播")])),_:1})])])]),s("li",null,[e(t,{to:"#事件监听器队列"},{default:p(()=>n[6]||(n[6]=[a("事件监听器队列")])),_:1}),s("ul",null,[s("li",null,[e(t,{to:"#排队事件监听器和数据库事务"},{default:p(()=>n[7]||(n[7]=[a("排队事件监听器和数据库事务")])),_:1})])])]),s("li",null,[e(t,{to:"#调度事件"},{default:p(()=>n[8]||(n[8]=[a("调度事件")])),_:1})]),s("li",null,[e(t,{to:"#event-arg-type-支持的类型"},{default:p(()=>n[9]||(n[9]=[a("event.Arg.Type 支持的类型")])),_:1})])])]),n[18]||(n[18]=i(`

简介

Goravel 的事件系统提供了一个简单的观察者模式的实现,允许你能够订阅和监听在你的应用中的发生的各种事件。事件类一般来说存储在 app/events 目录,监听者的类存储在 app/listeners 目录。不要担心在你的应用中没有看到这两个目录,因为通过 Artisan 命令行来创建事件和监听者的时候目录会同时被创建。

事件系统可以作为一个非常棒的方式来解耦你的系统的方方面面,因为一个事件可以有多个完全不相关的监听者。例如,你希望每当有订单发出的时候都给你发送一个 Slack 通知。你大可不必将你的处理订单的代码和发送 slack 消息的代码放在一起,你只需要触发一个 app\\events\\OrderShipped 事件,然后事件监听者可以收到这个事件然后发送 slack 通知。

生成事件和监听器

你可以使用 make:event 以及 make:listener 用于生成单个事件和监听器的 Artisan 命令:

go run . artisan make:event OrderShipped
 go run . artisan make:event user/OrderShipped
 
 go run . artisan make:listener SendShipmentNotification
diff --git a/assets/event.html-Bqomnab3.js b/assets/event.html-D503Eq94.js
similarity index 99%
rename from assets/event.html-Bqomnab3.js
rename to assets/event.html-D503Eq94.js
index f8785f35..31adc7c5 100644
--- a/assets/event.html-Bqomnab3.js
+++ b/assets/event.html-D503Eq94.js
@@ -1,4 +1,4 @@
-import{_ as u,c as r,b as s,e,f as t,a as l,d as a,r as p,o as d}from"./app-ELDWQP0J.js";const v={},k={class:"table-of-contents"};function m(b,n){const i=p("router-link"),o=p("RouteLink"),c=p("CommentService");return d(),r("div",null,[n[13]||(n[13]=s("h1",{id:"events",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#events"},[s("span",null,"Events")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[e(i,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[e(i,{to:"#registering-events-listeners"},{default:t(()=>n[1]||(n[1]=[a("Registering Events & Listeners")])),_:1}),s("ul",null,[s("li",null,[e(i,{to:"#generating-events-listeners"},{default:t(()=>n[2]||(n[2]=[a("Generating Events & Listeners")])),_:1})])])]),s("li",null,[e(i,{to:"#defining-events"},{default:t(()=>n[3]||(n[3]=[a("Defining Events")])),_:1})]),s("li",null,[e(i,{to:"#defining-listeners"},{default:t(()=>n[4]||(n[4]=[a("Defining Listeners")])),_:1}),s("ul",null,[s("li",null,[e(i,{to:"#stopping-the-propagation-of-an-event"},{default:t(()=>n[5]||(n[5]=[a("Stopping The Propagation Of An Event")])),_:1})])])]),s("li",null,[e(i,{to:"#queued-event-listeners"},{default:t(()=>n[6]||(n[6]=[a("Queued Event Listeners")])),_:1}),s("ul",null,[s("li",null,[e(i,{to:"#queued-event-listeners-database-transactions"},{default:t(()=>n[7]||(n[7]=[a("Queued Event Listeners & Database Transactions")])),_:1})])])]),s("li",null,[e(i,{to:"#dispatching-events"},{default:t(()=>n[8]||(n[8]=[a("Dispatching Events")])),_:1})]),s("li",null,[e(i,{to:"#event-arg-type-supported-types"},{default:t(()=>n[9]||(n[9]=[a("event.Arg.Type Supported Types")])),_:1})])])]),n[14]||(n[14]=l(`

Introduction

Goravel's events provide a simple observer pattern implementation, allowing you to subscribe and listen to various events that occur within your application. Event classes are typically stored in the app/events directory, while their listeners are stored in app/listeners. Don't worry if you don't see these directories in your application as they will be created for you as you generate events and listeners using Artisan console commands.

Events serve as a great way to decouple various aspects of your application, as a single event can have multiple listeners that do not depend on each other. For example, you may wish to send a Slack notification to your user each time an order is shipped. Instead of coupling your order processing code to your Slack notification code, you can raise an app\\events\\OrderShipped event which a listener can receive and use to dispatch a Slack notification.

Registering Events & Listeners

The app\\providers\\EventServiceProvider included with your Goravel application provides a convenient place to register all of your application's event listeners. The listen method contains an array of all events (keys) and their listeners (values). You may add as many events to this array as your application requires. For example, let's add an OrderShipped event:

package providers
+import{_ as u,c as r,b as s,e,f as t,a as l,d as a,r as p,o as d}from"./app-Ewo6p9aM.js";const v={},k={class:"table-of-contents"};function m(b,n){const i=p("router-link"),o=p("RouteLink"),c=p("CommentService");return d(),r("div",null,[n[13]||(n[13]=s("h1",{id:"events",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#events"},[s("span",null,"Events")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[e(i,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[e(i,{to:"#registering-events-listeners"},{default:t(()=>n[1]||(n[1]=[a("Registering Events & Listeners")])),_:1}),s("ul",null,[s("li",null,[e(i,{to:"#generating-events-listeners"},{default:t(()=>n[2]||(n[2]=[a("Generating Events & Listeners")])),_:1})])])]),s("li",null,[e(i,{to:"#defining-events"},{default:t(()=>n[3]||(n[3]=[a("Defining Events")])),_:1})]),s("li",null,[e(i,{to:"#defining-listeners"},{default:t(()=>n[4]||(n[4]=[a("Defining Listeners")])),_:1}),s("ul",null,[s("li",null,[e(i,{to:"#stopping-the-propagation-of-an-event"},{default:t(()=>n[5]||(n[5]=[a("Stopping The Propagation Of An Event")])),_:1})])])]),s("li",null,[e(i,{to:"#queued-event-listeners"},{default:t(()=>n[6]||(n[6]=[a("Queued Event Listeners")])),_:1}),s("ul",null,[s("li",null,[e(i,{to:"#queued-event-listeners-database-transactions"},{default:t(()=>n[7]||(n[7]=[a("Queued Event Listeners & Database Transactions")])),_:1})])])]),s("li",null,[e(i,{to:"#dispatching-events"},{default:t(()=>n[8]||(n[8]=[a("Dispatching Events")])),_:1})]),s("li",null,[e(i,{to:"#event-arg-type-supported-types"},{default:t(()=>n[9]||(n[9]=[a("event.Arg.Type Supported Types")])),_:1})])])]),n[14]||(n[14]=l(`

Introduction

Goravel's events provide a simple observer pattern implementation, allowing you to subscribe and listen to various events that occur within your application. Event classes are typically stored in the app/events directory, while their listeners are stored in app/listeners. Don't worry if you don't see these directories in your application as they will be created for you as you generate events and listeners using Artisan console commands.

Events serve as a great way to decouple various aspects of your application, as a single event can have multiple listeners that do not depend on each other. For example, you may wish to send a Slack notification to your user each time an order is shipped. Instead of coupling your order processing code to your Slack notification code, you can raise an app\\events\\OrderShipped event which a listener can receive and use to dispatch a Slack notification.

Registering Events & Listeners

The app\\providers\\EventServiceProvider included with your Goravel application provides a convenient place to register all of your application's event listeners. The listen method contains an array of all events (keys) and their listeners (values). You may add as many events to this array as your application requires. For example, let's add an OrderShipped event:

package providers
 
 import (
   "github.com/goravel/framework/contracts/event"
diff --git a/assets/facades.html-D9gOoFkn.js b/assets/facades.html-CCzNJASt.js
similarity index 99%
rename from assets/facades.html-D9gOoFkn.js
rename to assets/facades.html-CCzNJASt.js
index 9aedb66b..72756b9e 100644
--- a/assets/facades.html-D9gOoFkn.js
+++ b/assets/facades.html-CCzNJASt.js
@@ -1,4 +1,4 @@
-import{_ as r,c as p,b as t,e,f as a,a as u,r as i,o as c,d as s}from"./app-ELDWQP0J.js";const f={},g={class:"table-of-contents"};function m(k,n){const o=i("router-link"),l=i("RouteLink"),d=i("CommentService");return c(),p("div",null,[n[46]||(n[46]=t("h1",{id:"facades",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#facades"},[t("span",null,"Facades")])],-1)),t("nav",g,[t("ul",null,[t("li",null,[e(o,{to:"#introduction"},{default:a(()=>n[0]||(n[0]=[s("Introduction")])),_:1})]),t("li",null,[e(o,{to:"#how-facades-work"},{default:a(()=>n[1]||(n[1]=[s("How Facades Work")])),_:1})]),t("li",null,[e(o,{to:"#facade-class-reference"},{default:a(()=>n[2]||(n[2]=[s("Facade Class Reference")])),_:1})])])]),n[47]||(n[47]=u(`

Introduction

facades provide a "static" interface for the core functionality of the application and provide a more flexible, more elegant, and easy-to-test syntax.

All facades of Goravel are defined under github.com/goravel/framework/facades. We can easily use facades:

import "github.com/goravel/framework/facades"
+import{_ as r,c as p,b as t,e,f as a,a as u,r as i,o as c,d as s}from"./app-Ewo6p9aM.js";const f={},g={class:"table-of-contents"};function m(k,n){const o=i("router-link"),l=i("RouteLink"),d=i("CommentService");return c(),p("div",null,[n[46]||(n[46]=t("h1",{id:"facades",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#facades"},[t("span",null,"Facades")])],-1)),t("nav",g,[t("ul",null,[t("li",null,[e(o,{to:"#introduction"},{default:a(()=>n[0]||(n[0]=[s("Introduction")])),_:1})]),t("li",null,[e(o,{to:"#how-facades-work"},{default:a(()=>n[1]||(n[1]=[s("How Facades Work")])),_:1})]),t("li",null,[e(o,{to:"#facade-class-reference"},{default:a(()=>n[2]||(n[2]=[s("Facade Class Reference")])),_:1})])])]),n[47]||(n[47]=u(`

Introduction

facades provide a "static" interface for the core functionality of the application and provide a more flexible, more elegant, and easy-to-test syntax.

All facades of Goravel are defined under github.com/goravel/framework/facades. We can easily use facades:

import "github.com/goravel/framework/facades"
 
 facades.Route().Run(facades.Config().GetString("app.host"))
 

How Facades Work

facades are generally instantiated in the Register or Boot stage of each module ServerProvider.

func (config *ServiceProvider) Register() {
diff --git a/assets/facades.html-sHR6uI9O.js b/assets/facades.html-li4DkJq0.js
similarity index 99%
rename from assets/facades.html-sHR6uI9O.js
rename to assets/facades.html-li4DkJq0.js
index dc933875..f9b95cf1 100644
--- a/assets/facades.html-sHR6uI9O.js
+++ b/assets/facades.html-li4DkJq0.js
@@ -1,4 +1,4 @@
-import{_ as i,c as u,b as t,e as a,f as s,a as r,r as p,o as c,d as e}from"./app-ELDWQP0J.js";const f={},g={class:"table-of-contents"};function m(k,n){const o=p("router-link"),l=p("RouteLink"),d=p("CommentService");return c(),u("div",null,[n[46]||(n[46]=t("h1",{id:"facades",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#facades"},[t("span",null,"Facades")])],-1)),t("nav",g,[t("ul",null,[t("li",null,[a(o,{to:"#简介"},{default:s(()=>n[0]||(n[0]=[e("简介")])),_:1})]),t("li",null,[a(o,{to:"#facades-工作原理"},{default:s(()=>n[1]||(n[1]=[e("facades 工作原理")])),_:1})]),t("li",null,[a(o,{to:"#facade-类参考"},{default:s(()=>n[2]||(n[2]=[e("facade 类参考")])),_:1})])])]),n[47]||(n[47]=r(`

简介

facades 为应用的核心功能提供一个「静态」接口,能够提供更加灵活、更加优雅、易于测试的语法。

Goravel 所有的 facades 都定义在 github.com/goravel/framework/facades 下。我们可以很轻松的使用 facades

import "github.com/goravel/framework/facades"
+import{_ as i,c as u,b as t,e as a,f as s,a as r,r as p,o as c,d as e}from"./app-Ewo6p9aM.js";const f={},g={class:"table-of-contents"};function m(k,n){const o=p("router-link"),l=p("RouteLink"),d=p("CommentService");return c(),u("div",null,[n[46]||(n[46]=t("h1",{id:"facades",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#facades"},[t("span",null,"Facades")])],-1)),t("nav",g,[t("ul",null,[t("li",null,[a(o,{to:"#简介"},{default:s(()=>n[0]||(n[0]=[e("简介")])),_:1})]),t("li",null,[a(o,{to:"#facades-工作原理"},{default:s(()=>n[1]||(n[1]=[e("facades 工作原理")])),_:1})]),t("li",null,[a(o,{to:"#facade-类参考"},{default:s(()=>n[2]||(n[2]=[e("facade 类参考")])),_:1})])])]),n[47]||(n[47]=r(`

简介

facades 为应用的核心功能提供一个「静态」接口,能够提供更加灵活、更加优雅、易于测试的语法。

Goravel 所有的 facades 都定义在 github.com/goravel/framework/facades 下。我们可以很轻松的使用 facades

import "github.com/goravel/framework/facades"
 
 facades.Route().Run(facades.Config().GetString("app.host"))
 

facades 工作原理

facades 一般会在各模块 ServerProviderRegisterBoot 阶段进行实例化。

func (config *ServiceProvider) Register() {
diff --git a/assets/factories.html-BE6xVJDS.js b/assets/factories.html-6CEGbUG5.js
similarity index 99%
rename from assets/factories.html-BE6xVJDS.js
rename to assets/factories.html-6CEGbUG5.js
index 28fac67a..bae0a6e9 100644
--- a/assets/factories.html-BE6xVJDS.js
+++ b/assets/factories.html-6CEGbUG5.js
@@ -1,4 +1,4 @@
-import{_ as c,c as u,b as s,e,f as t,a as o,d as a,r as l,o as r}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function m(v,n){const p=l("router-link"),i=l("RouteLink");return r(),u("div",null,[n[12]||(n[12]=s("h1",{id:"模型工厂",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#模型工厂"},[s("span",null,"模型工厂")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[e(p,{to:"#介绍"},{default:t(()=>n[0]||(n[0]=[a("介绍")])),_:1})]),s("li",null,[e(p,{to:"#创建工厂"},{default:t(()=>n[1]||(n[1]=[a("创建工厂")])),_:1}),s("ul",null,[s("li",null,[e(p,{to:"#模型和工厂的关联约定"},{default:t(()=>n[2]||(n[2]=[a("模型和工厂的关联约定")])),_:1})])])]),s("li",null,[e(p,{to:"#使用工厂创建模型"},{default:t(()=>n[3]||(n[3]=[a("使用工厂创建模型")])),_:1}),s("ul",null,[s("li",null,[e(p,{to:"#实例化模型"},{default:t(()=>n[4]||(n[4]=[a("实例化模型")])),_:1})]),s("li",null,[e(p,{to:"#持久化模型"},{default:t(()=>n[5]||(n[5]=[a("持久化模型")])),_:1})]),s("li",null,[e(p,{to:"#忽略模型事件"},{default:t(()=>n[6]||(n[6]=[a("忽略模型事件")])),_:1})])])])])]),n[13]||(n[13]=o(`

介绍

测试时您可能需要在执行测试之前向数据库中插入一些记录。Goravel 允许你使用模型工厂为每个模型定义一组默认属性,而不是在创建测试数据时手动指定每一列的值。

要了解如何编写工厂,请查看应用程序中的 database/factories/user_factory.go 文件:

package factories
+import{_ as c,c as u,b as s,e,f as t,a as o,d as a,r as l,o as r}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function m(v,n){const p=l("router-link"),i=l("RouteLink");return r(),u("div",null,[n[12]||(n[12]=s("h1",{id:"模型工厂",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#模型工厂"},[s("span",null,"模型工厂")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[e(p,{to:"#介绍"},{default:t(()=>n[0]||(n[0]=[a("介绍")])),_:1})]),s("li",null,[e(p,{to:"#创建工厂"},{default:t(()=>n[1]||(n[1]=[a("创建工厂")])),_:1}),s("ul",null,[s("li",null,[e(p,{to:"#模型和工厂的关联约定"},{default:t(()=>n[2]||(n[2]=[a("模型和工厂的关联约定")])),_:1})])])]),s("li",null,[e(p,{to:"#使用工厂创建模型"},{default:t(()=>n[3]||(n[3]=[a("使用工厂创建模型")])),_:1}),s("ul",null,[s("li",null,[e(p,{to:"#实例化模型"},{default:t(()=>n[4]||(n[4]=[a("实例化模型")])),_:1})]),s("li",null,[e(p,{to:"#持久化模型"},{default:t(()=>n[5]||(n[5]=[a("持久化模型")])),_:1})]),s("li",null,[e(p,{to:"#忽略模型事件"},{default:t(()=>n[6]||(n[6]=[a("忽略模型事件")])),_:1})])])])])]),n[13]||(n[13]=o(`

介绍

测试时您可能需要在执行测试之前向数据库中插入一些记录。Goravel 允许你使用模型工厂为每个模型定义一组默认属性,而不是在创建测试数据时手动指定每一列的值。

要了解如何编写工厂,请查看应用程序中的 database/factories/user_factory.go 文件:

package factories
 
 type UserFactory struct {
 }
diff --git a/assets/factories.html-DNgknwi0.js b/assets/factories.html-BePWiOvD.js
similarity index 99%
rename from assets/factories.html-DNgknwi0.js
rename to assets/factories.html-BePWiOvD.js
index fee3673c..621314bf 100644
--- a/assets/factories.html-DNgknwi0.js
+++ b/assets/factories.html-BePWiOvD.js
@@ -1,4 +1,4 @@
-import{_ as c,c as r,b as s,e,f as t,a as p,d as a,r as i,o as u}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function m(v,n){const o=i("router-link"),l=i("RouteLink");return u(),r("div",null,[n[12]||(n[12]=s("h1",{id:"factories",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#factories"},[s("span",null,"Factories")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[e(o,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[e(o,{to:"#generating-factories"},{default:t(()=>n[1]||(n[1]=[a("Generating Factories")])),_:1}),s("ul",null,[s("li",null,[e(o,{to:"#model-factory-discovery-conventions"},{default:t(()=>n[2]||(n[2]=[a("Model & Factory Discovery Conventions")])),_:1})])])]),s("li",null,[e(o,{to:"#creating-models-using-factories"},{default:t(()=>n[3]||(n[3]=[a("Creating Models Using Factories")])),_:1}),s("ul",null,[s("li",null,[e(o,{to:"#instantiating-models"},{default:t(()=>n[4]||(n[4]=[a("Instantiating Models")])),_:1})]),s("li",null,[e(o,{to:"#persisting-models"},{default:t(()=>n[5]||(n[5]=[a("Persisting Models")])),_:1})]),s("li",null,[e(o,{to:"#ignore-model-event"},{default:t(()=>n[6]||(n[6]=[a("Ignore Model Event")])),_:1})])])])])]),n[13]||(n[13]=p(`

Introduction

When testing your application or seeding your database, it might be necessary to insert a few records into your database beforehand. Instead of manually inputting values for each column, Goravel allows you to define a set of default attributes for each of your models by creating model factories.

To see an example of how to write a factory, you can check out the user_factory.go file located in your application's database/factories directory.

package factories
+import{_ as c,c as r,b as s,e,f as t,a as p,d as a,r as i,o as u}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function m(v,n){const o=i("router-link"),l=i("RouteLink");return u(),r("div",null,[n[12]||(n[12]=s("h1",{id:"factories",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#factories"},[s("span",null,"Factories")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[e(o,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[e(o,{to:"#generating-factories"},{default:t(()=>n[1]||(n[1]=[a("Generating Factories")])),_:1}),s("ul",null,[s("li",null,[e(o,{to:"#model-factory-discovery-conventions"},{default:t(()=>n[2]||(n[2]=[a("Model & Factory Discovery Conventions")])),_:1})])])]),s("li",null,[e(o,{to:"#creating-models-using-factories"},{default:t(()=>n[3]||(n[3]=[a("Creating Models Using Factories")])),_:1}),s("ul",null,[s("li",null,[e(o,{to:"#instantiating-models"},{default:t(()=>n[4]||(n[4]=[a("Instantiating Models")])),_:1})]),s("li",null,[e(o,{to:"#persisting-models"},{default:t(()=>n[5]||(n[5]=[a("Persisting Models")])),_:1})]),s("li",null,[e(o,{to:"#ignore-model-event"},{default:t(()=>n[6]||(n[6]=[a("Ignore Model Event")])),_:1})])])])])]),n[13]||(n[13]=p(`

Introduction

When testing your application or seeding your database, it might be necessary to insert a few records into your database beforehand. Instead of manually inputting values for each column, Goravel allows you to define a set of default attributes for each of your models by creating model factories.

To see an example of how to write a factory, you can check out the user_factory.go file located in your application's database/factories directory.

package factories
 
 type UserFactory struct {
 }
diff --git a/assets/filesystem.html-Buzi17dd.js b/assets/filesystem.html-BysE4Gio.js
similarity index 99%
rename from assets/filesystem.html-Buzi17dd.js
rename to assets/filesystem.html-BysE4Gio.js
index 47379aad..68881de7 100644
--- a/assets/filesystem.html-Buzi17dd.js
+++ b/assets/filesystem.html-BysE4Gio.js
@@ -1,4 +1,4 @@
-import{_ as l,c,b as s,e as a,f as t,a as u,r as o,o as r,d as i}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function g(h,n){const e=o("router-link"),p=o("CommentService");return r(),c("div",null,[n[23]||(n[23]=s("h1",{id:"file-storage",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#file-storage"},[s("span",null,"File Storage")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[i("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#configuration"},{default:t(()=>n[1]||(n[1]=[i("Configuration")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#the-local-driver"},{default:t(()=>n[2]||(n[2]=[i("The Local Driver")])),_:1})]),s("li",null,[a(e,{to:"#the-public-disk"},{default:t(()=>n[3]||(n[3]=[i("The Public Disk")])),_:1})])])]),s("li",null,[a(e,{to:"#obtaining-disk-instances"},{default:t(()=>n[4]||(n[4]=[i("Obtaining Disk Instances")])),_:1})]),s("li",null,[a(e,{to:"#inject-context"},{default:t(()=>n[5]||(n[5]=[i("Inject Context")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-files"},{default:t(()=>n[6]||(n[6]=[i("Retrieving Files")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#file-urls"},{default:t(()=>n[7]||(n[7]=[i("File URLs")])),_:1})]),s("li",null,[a(e,{to:"#file-metadata"},{default:t(()=>n[8]||(n[8]=[i("File Metadata")])),_:1})]),s("li",null,[a(e,{to:"#file-paths"},{default:t(()=>n[9]||(n[9]=[i("File Paths")])),_:1})])])]),s("li",null,[a(e,{to:"#storing-files"},{default:t(()=>n[10]||(n[10]=[i("Storing Files")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#copying-moving-files"},{default:t(()=>n[11]||(n[11]=[i("Copying & Moving Files")])),_:1})]),s("li",null,[a(e,{to:"#file-uploads"},{default:t(()=>n[12]||(n[12]=[i("File Uploads")])),_:1})]),s("li",null,[a(e,{to:"#specifying-a-file-name"},{default:t(()=>n[13]||(n[13]=[i("Specifying A File Name")])),_:1})]),s("li",null,[a(e,{to:"#specifying-a-disk"},{default:t(()=>n[14]||(n[14]=[i("Specifying A Disk")])),_:1})]),s("li",null,[a(e,{to:"#other-uploaded-file-information"},{default:t(()=>n[15]||(n[15]=[i("Other Uploaded File Information")])),_:1})])])]),s("li",null,[a(e,{to:"#deleting-files"},{default:t(()=>n[16]||(n[16]=[i("Deleting Files")])),_:1})]),s("li",null,[a(e,{to:"#directories"},{default:t(()=>n[17]||(n[17]=[i("Directories")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#get-all-files-within-a-directory"},{default:t(()=>n[18]||(n[18]=[i("Get All Files Within A Directory")])),_:1})]),s("li",null,[a(e,{to:"#get-all-directories-within-a-directory"},{default:t(()=>n[19]||(n[19]=[i("Get All Directories Within A Directory")])),_:1})]),s("li",null,[a(e,{to:"#create-a-directory"},{default:t(()=>n[20]||(n[20]=[i("Create A Directory")])),_:1})]),s("li",null,[a(e,{to:"#delete-a-directory"},{default:t(()=>n[21]||(n[21]=[i("Delete A Directory")])),_:1})])])]),s("li",null,[a(e,{to:"#custom-filesystems"},{default:t(()=>n[22]||(n[22]=[i("Custom Filesystems")])),_:1})])])]),n[24]||(n[24]=u(`

Introduction

The Goravel provides simple drivers for working with local filesystems, Amazon S3, Aliyun OSS, Tencent COS, Minio and Cloudinary. Even better, switching between these storage options between your local development machine and production server is amazingly simple as the API remains the same for each system. Goravel comes with a local driver, for other drivers, please check the corresponding independent extension package:

DriverLink
S3https://github.com/goravel/s3
OSShttps://github.com/goravel/oss
COShttps://github.com/goravel/cos
Miniohttps://github.com/goravel/minio
Cloudinaryhttps://github.com/goravel/cloudinary

Configuration

Goravel's filesystem configuration file is located at config/filesystems.go. Within this file, you may configure all of your filesystem "disks", each disk represents a particular storage driver and storage location.

You may configure as many disks as you like and may even have multiple disks that use the same driver.

The Local Driver

When using the local driver, all file operations are relative to the root directory defined in your filesystems configuration file. By default, this value is set to the storage/app directory. Therefore, the following method would write to storage/app/example.txt:

facades.Storage().Put("example.txt", "Contents")
+import{_ as l,c,b as s,e as a,f as t,a as u,r as o,o as r,d as i}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function g(h,n){const e=o("router-link"),p=o("CommentService");return r(),c("div",null,[n[23]||(n[23]=s("h1",{id:"file-storage",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#file-storage"},[s("span",null,"File Storage")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[i("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#configuration"},{default:t(()=>n[1]||(n[1]=[i("Configuration")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#the-local-driver"},{default:t(()=>n[2]||(n[2]=[i("The Local Driver")])),_:1})]),s("li",null,[a(e,{to:"#the-public-disk"},{default:t(()=>n[3]||(n[3]=[i("The Public Disk")])),_:1})])])]),s("li",null,[a(e,{to:"#obtaining-disk-instances"},{default:t(()=>n[4]||(n[4]=[i("Obtaining Disk Instances")])),_:1})]),s("li",null,[a(e,{to:"#inject-context"},{default:t(()=>n[5]||(n[5]=[i("Inject Context")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-files"},{default:t(()=>n[6]||(n[6]=[i("Retrieving Files")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#file-urls"},{default:t(()=>n[7]||(n[7]=[i("File URLs")])),_:1})]),s("li",null,[a(e,{to:"#file-metadata"},{default:t(()=>n[8]||(n[8]=[i("File Metadata")])),_:1})]),s("li",null,[a(e,{to:"#file-paths"},{default:t(()=>n[9]||(n[9]=[i("File Paths")])),_:1})])])]),s("li",null,[a(e,{to:"#storing-files"},{default:t(()=>n[10]||(n[10]=[i("Storing Files")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#copying-moving-files"},{default:t(()=>n[11]||(n[11]=[i("Copying & Moving Files")])),_:1})]),s("li",null,[a(e,{to:"#file-uploads"},{default:t(()=>n[12]||(n[12]=[i("File Uploads")])),_:1})]),s("li",null,[a(e,{to:"#specifying-a-file-name"},{default:t(()=>n[13]||(n[13]=[i("Specifying A File Name")])),_:1})]),s("li",null,[a(e,{to:"#specifying-a-disk"},{default:t(()=>n[14]||(n[14]=[i("Specifying A Disk")])),_:1})]),s("li",null,[a(e,{to:"#other-uploaded-file-information"},{default:t(()=>n[15]||(n[15]=[i("Other Uploaded File Information")])),_:1})])])]),s("li",null,[a(e,{to:"#deleting-files"},{default:t(()=>n[16]||(n[16]=[i("Deleting Files")])),_:1})]),s("li",null,[a(e,{to:"#directories"},{default:t(()=>n[17]||(n[17]=[i("Directories")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#get-all-files-within-a-directory"},{default:t(()=>n[18]||(n[18]=[i("Get All Files Within A Directory")])),_:1})]),s("li",null,[a(e,{to:"#get-all-directories-within-a-directory"},{default:t(()=>n[19]||(n[19]=[i("Get All Directories Within A Directory")])),_:1})]),s("li",null,[a(e,{to:"#create-a-directory"},{default:t(()=>n[20]||(n[20]=[i("Create A Directory")])),_:1})]),s("li",null,[a(e,{to:"#delete-a-directory"},{default:t(()=>n[21]||(n[21]=[i("Delete A Directory")])),_:1})])])]),s("li",null,[a(e,{to:"#custom-filesystems"},{default:t(()=>n[22]||(n[22]=[i("Custom Filesystems")])),_:1})])])]),n[24]||(n[24]=u(`

Introduction

The Goravel provides simple drivers for working with local filesystems, Amazon S3, Aliyun OSS, Tencent COS, Minio and Cloudinary. Even better, switching between these storage options between your local development machine and production server is amazingly simple as the API remains the same for each system. Goravel comes with a local driver, for other drivers, please check the corresponding independent extension package:

DriverLink
S3https://github.com/goravel/s3
OSShttps://github.com/goravel/oss
COShttps://github.com/goravel/cos
Miniohttps://github.com/goravel/minio
Cloudinaryhttps://github.com/goravel/cloudinary

Configuration

Goravel's filesystem configuration file is located at config/filesystems.go. Within this file, you may configure all of your filesystem "disks", each disk represents a particular storage driver and storage location.

You may configure as many disks as you like and may even have multiple disks that use the same driver.

The Local Driver

When using the local driver, all file operations are relative to the root directory defined in your filesystems configuration file. By default, this value is set to the storage/app directory. Therefore, the following method would write to storage/app/example.txt:

facades.Storage().Put("example.txt", "Contents")
 

The Public Disk

The public\`\` disk included in your application's filesystemsconfiguration file is intended for files that are going to be publicly accessible. By default, thepublicdisk uses thelocaldriver and stores its files instorage/app/public\`. If you want to visit these file from web, you can create a file routing:

facades.Route().Static("storage", "./storage/app/public")
 

Obtaining Disk Instances

The Storage facade may be used to interact with any of your configured disks. For example, you may use the Put method on the facade to store an avatar on the default disk. If you call methods on the Storage facade without first calling the Disk method, the method will automatically be passed to the default disk:

facades.Storage().Put("avatars/1.png", "Contents")
 

If your application interacts with multiple disks, you may use the Disk method on the Storage facade to work with files on a particular disk:

facades.Storage().Disk("s3").Put("avatars/1.png", "Contents")
diff --git a/assets/filesystem.html-Dit00pAj.js b/assets/filesystem.html-Cu7cAXkV.js
similarity index 99%
rename from assets/filesystem.html-Dit00pAj.js
rename to assets/filesystem.html-Cu7cAXkV.js
index 5cf1caca..3e01ba05 100644
--- a/assets/filesystem.html-Dit00pAj.js
+++ b/assets/filesystem.html-Cu7cAXkV.js
@@ -1,4 +1,4 @@
-import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function g(v,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[23]||(n[23]=s("h1",{id:"文件存储",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#文件存储"},[s("span",null,"文件存储")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#配置"},{default:e(()=>n[1]||(n[1]=[p("配置")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#本地驱动"},{default:e(()=>n[2]||(n[2]=[p("本地驱动")])),_:1})]),s("li",null,[a(t,{to:"#公共磁盘"},{default:e(()=>n[3]||(n[3]=[p("公共磁盘")])),_:1})])])]),s("li",null,[a(t,{to:"#获取磁盘实例"},{default:e(()=>n[4]||(n[4]=[p("获取磁盘实例")])),_:1})]),s("li",null,[a(t,{to:"#注入-context"},{default:e(()=>n[5]||(n[5]=[p("注入 Context")])),_:1})]),s("li",null,[a(t,{to:"#检索文件"},{default:e(()=>n[6]||(n[6]=[p("检索文件")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#文件地址"},{default:e(()=>n[7]||(n[7]=[p("文件地址")])),_:1})]),s("li",null,[a(t,{to:"#文件-metadata-信息"},{default:e(()=>n[8]||(n[8]=[p("文件 Metadata 信息")])),_:1})]),s("li",null,[a(t,{to:"#文件路径"},{default:e(()=>n[9]||(n[9]=[p("文件路径")])),_:1})])])]),s("li",null,[a(t,{to:"#储存文件"},{default:e(()=>n[10]||(n[10]=[p("储存文件")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#复制-移动文件"},{default:e(()=>n[11]||(n[11]=[p("复制 / 移动文件")])),_:1})]),s("li",null,[a(t,{to:"#文件上传"},{default:e(()=>n[12]||(n[12]=[p("文件上传")])),_:1})]),s("li",null,[a(t,{to:"#指定一个文件名"},{default:e(()=>n[13]||(n[13]=[p("指定一个文件名")])),_:1})]),s("li",null,[a(t,{to:"#指定一个磁盘"},{default:e(()=>n[14]||(n[14]=[p("指定一个磁盘")])),_:1})]),s("li",null,[a(t,{to:"#其他上传文件信息"},{default:e(()=>n[15]||(n[15]=[p("其他上传文件信息")])),_:1})])])]),s("li",null,[a(t,{to:"#删除文件"},{default:e(()=>n[16]||(n[16]=[p("删除文件")])),_:1})]),s("li",null,[a(t,{to:"#目录"},{default:e(()=>n[17]||(n[17]=[p("目录")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#获取目录下所有的文件"},{default:e(()=>n[18]||(n[18]=[p("获取目录下所有的文件")])),_:1})]),s("li",null,[a(t,{to:"#获取特定目录下的子目录"},{default:e(()=>n[19]||(n[19]=[p("获取特定目录下的子目录")])),_:1})]),s("li",null,[a(t,{to:"#创建一个目录"},{default:e(()=>n[20]||(n[20]=[p("创建一个目录")])),_:1})]),s("li",null,[a(t,{to:"#删除一个目录"},{default:e(()=>n[21]||(n[21]=[p("删除一个目录")])),_:1})])])]),s("li",null,[a(t,{to:"#自定义文件系统"},{default:e(()=>n[22]||(n[22]=[p("自定义文件系统")])),_:1})])])]),n[24]||(n[24]=u(`

简介

Goravel 为使用本地文件系统、Amazon S3、Aliyun OSS、Tencent COS、Minio 和 Cloudinary 提供了简单易用的驱动程序。 更棒的是,由于每个系统的 API 保持不变,所以在这些存储选项之间切换是非常简单的。框架自带 local 驱动,如需其他驱动,请查看对应的独立扩展包:

驱动地址
S3https://github.com/goravel/s3
OSShttps://github.com/goravel/oss
COShttps://github.com/goravel/cos
Miniohttps://github.com/goravel/minio
Cloudinaryhttps://github.com/goravel/cloudinary

配置

配置文件位于 config/filesystems.go。在这个文件中你可以配置所有的「磁盘」,每个磁盘代表特定的存储驱动及存储位置。

技巧:你可以配置任意数量的磁盘,甚至可以添加多个使用相同驱动的磁盘。

本地驱动

使用 local 驱动时,所有文件操作都与 filesystems 配置文件中定义的 root 目录相关。 默认情况下,此值设置为 storage/app 目录。因此,以下方法会把文件存储在 storage/app/example.txt 中:

facades.Storage().Put("example.txt", "Contents")
+import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function g(v,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[23]||(n[23]=s("h1",{id:"文件存储",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#文件存储"},[s("span",null,"文件存储")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#配置"},{default:e(()=>n[1]||(n[1]=[p("配置")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#本地驱动"},{default:e(()=>n[2]||(n[2]=[p("本地驱动")])),_:1})]),s("li",null,[a(t,{to:"#公共磁盘"},{default:e(()=>n[3]||(n[3]=[p("公共磁盘")])),_:1})])])]),s("li",null,[a(t,{to:"#获取磁盘实例"},{default:e(()=>n[4]||(n[4]=[p("获取磁盘实例")])),_:1})]),s("li",null,[a(t,{to:"#注入-context"},{default:e(()=>n[5]||(n[5]=[p("注入 Context")])),_:1})]),s("li",null,[a(t,{to:"#检索文件"},{default:e(()=>n[6]||(n[6]=[p("检索文件")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#文件地址"},{default:e(()=>n[7]||(n[7]=[p("文件地址")])),_:1})]),s("li",null,[a(t,{to:"#文件-metadata-信息"},{default:e(()=>n[8]||(n[8]=[p("文件 Metadata 信息")])),_:1})]),s("li",null,[a(t,{to:"#文件路径"},{default:e(()=>n[9]||(n[9]=[p("文件路径")])),_:1})])])]),s("li",null,[a(t,{to:"#储存文件"},{default:e(()=>n[10]||(n[10]=[p("储存文件")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#复制-移动文件"},{default:e(()=>n[11]||(n[11]=[p("复制 / 移动文件")])),_:1})]),s("li",null,[a(t,{to:"#文件上传"},{default:e(()=>n[12]||(n[12]=[p("文件上传")])),_:1})]),s("li",null,[a(t,{to:"#指定一个文件名"},{default:e(()=>n[13]||(n[13]=[p("指定一个文件名")])),_:1})]),s("li",null,[a(t,{to:"#指定一个磁盘"},{default:e(()=>n[14]||(n[14]=[p("指定一个磁盘")])),_:1})]),s("li",null,[a(t,{to:"#其他上传文件信息"},{default:e(()=>n[15]||(n[15]=[p("其他上传文件信息")])),_:1})])])]),s("li",null,[a(t,{to:"#删除文件"},{default:e(()=>n[16]||(n[16]=[p("删除文件")])),_:1})]),s("li",null,[a(t,{to:"#目录"},{default:e(()=>n[17]||(n[17]=[p("目录")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#获取目录下所有的文件"},{default:e(()=>n[18]||(n[18]=[p("获取目录下所有的文件")])),_:1})]),s("li",null,[a(t,{to:"#获取特定目录下的子目录"},{default:e(()=>n[19]||(n[19]=[p("获取特定目录下的子目录")])),_:1})]),s("li",null,[a(t,{to:"#创建一个目录"},{default:e(()=>n[20]||(n[20]=[p("创建一个目录")])),_:1})]),s("li",null,[a(t,{to:"#删除一个目录"},{default:e(()=>n[21]||(n[21]=[p("删除一个目录")])),_:1})])])]),s("li",null,[a(t,{to:"#自定义文件系统"},{default:e(()=>n[22]||(n[22]=[p("自定义文件系统")])),_:1})])])]),n[24]||(n[24]=u(`

简介

Goravel 为使用本地文件系统、Amazon S3、Aliyun OSS、Tencent COS、Minio 和 Cloudinary 提供了简单易用的驱动程序。 更棒的是,由于每个系统的 API 保持不变,所以在这些存储选项之间切换是非常简单的。框架自带 local 驱动,如需其他驱动,请查看对应的独立扩展包:

驱动地址
S3https://github.com/goravel/s3
OSShttps://github.com/goravel/oss
COShttps://github.com/goravel/cos
Miniohttps://github.com/goravel/minio
Cloudinaryhttps://github.com/goravel/cloudinary

配置

配置文件位于 config/filesystems.go。在这个文件中你可以配置所有的「磁盘」,每个磁盘代表特定的存储驱动及存储位置。

技巧:你可以配置任意数量的磁盘,甚至可以添加多个使用相同驱动的磁盘。

本地驱动

使用 local 驱动时,所有文件操作都与 filesystems 配置文件中定义的 root 目录相关。 默认情况下,此值设置为 storage/app 目录。因此,以下方法会把文件存储在 storage/app/example.txt 中:

facades.Storage().Put("example.txt", "Contents")
 

公共磁盘

filesystems 配置文件中定义的 public 磁盘适用于要公开访问的文件。默认情况下,public 磁盘使用 local 驱动,并且将这些文件存储在 storage/app/public 目录下。要使这些文件可从 web 访问,可以创建一个文件路由:

facades.Route().Static("storage", "./storage/app/public")
 

获取磁盘实例

Storage Facade 可用于与所有已配置的磁盘进行交互。例如,你可以使用 Facade 中的 Put 方法将头像存储到默认磁盘。如果你使用 Storage Facade 时并没有使用 Disk 方法,那么所有的方法调用将会自动传递给默认的磁盘:

facades.Storage().Put("avatars/1.png", "Contents")
 

如果应用要与多个磁盘进行交互,可使用 Storage Facade 中的 Disk 方法对特定磁盘上的文件进行操作:

facades.Storage().Disk("s3").Put("avatars/1.png", "Contents")
diff --git a/assets/getting-started.html-BHaViv8j.js b/assets/getting-started.html-3-OsHNcC.js
similarity index 99%
rename from assets/getting-started.html-BHaViv8j.js
rename to assets/getting-started.html-3-OsHNcC.js
index 5cc6cd68..6f9dbbeb 100644
--- a/assets/getting-started.html-BHaViv8j.js
+++ b/assets/getting-started.html-3-OsHNcC.js
@@ -1,4 +1,4 @@
-import{_ as u,c as r,b as s,e as t,f as e,a as c,d as a,r as o,o as d}from"./app-ELDWQP0J.js";const k={},m={class:"table-of-contents"};function v(b,n){const p=o("router-link"),l=o("RouteLink"),i=o("CommentService");return d(),r("div",null,[n[60]||(n[60]=s("h1",{id:"getting-started",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#getting-started"},[s("span",null,"Getting Started")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[t(p,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[a("Introduction")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#dsn"},{default:e(()=>n[1]||(n[1]=[a("DSN")])),_:1})]),s("li",null,[t(p,{to:"#read-write-connections"},{default:e(()=>n[2]||(n[2]=[a("Read & Write Connections")])),_:1})]),s("li",null,[t(p,{to:"#connection-pool"},{default:e(()=>n[3]||(n[3]=[a("Connection Pool")])),_:1})]),s("li",null,[t(p,{to:"#schema"},{default:e(()=>n[4]||(n[4]=[a("Schema")])),_:1})]),s("li",null,[t(p,{to:"#get-database-information"},{default:e(()=>n[5]||(n[5]=[a("Get Database Information")])),_:1})])])]),s("li",null,[t(p,{to:"#model-definition"},{default:e(()=>n[6]||(n[6]=[a("Model Definition")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#model-convention"},{default:e(()=>n[7]||(n[7]=[a("Model Convention")])),_:1})]),s("li",null,[t(p,{to:"#create-model"},{default:e(()=>n[8]||(n[8]=[a("Create Model")])),_:1})]),s("li",null,[t(p,{to:"#specify-table-name"},{default:e(()=>n[9]||(n[9]=[a("Specify Table Name")])),_:1})]),s("li",null,[t(p,{to:"#database-connections"},{default:e(()=>n[10]||(n[10]=[a("Database Connections")])),_:1})])])]),s("li",null,[t(p,{to:"#facades-orm-available-functions"},{default:e(()=>n[11]||(n[11]=[a("facades.Orm() available functions")])),_:1})]),s("li",null,[t(p,{to:"#facades-orm-query-available-functions"},{default:e(()=>n[12]||(n[12]=[a("facades.Orm().Query() available functions")])),_:1})]),s("li",null,[t(p,{to:"#query-builder"},{default:e(()=>n[13]||(n[13]=[a("Query Builder")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#inject-context"},{default:e(()=>n[14]||(n[14]=[a("Inject Context")])),_:1})]),s("li",null,[t(p,{to:"#specify-database-connection"},{default:e(()=>n[15]||(n[15]=[a("Specify Database Connection")])),_:1})]),s("li",null,[t(p,{to:"#generic-database-interface-sql-db"},{default:e(()=>n[16]||(n[16]=[a("Generic Database Interface sql.DB")])),_:1})]),s("li",null,[t(p,{to:"#get-database-instance"},{default:e(()=>n[17]||(n[17]=[a("Get Database Instance")])),_:1})]),s("li",null,[t(p,{to:"#select"},{default:e(()=>n[18]||(n[18]=[a("Select")])),_:1})]),s("li",null,[t(p,{to:"#where"},{default:e(()=>n[19]||(n[19]=[a("Where")])),_:1})]),s("li",null,[t(p,{to:"#limit"},{default:e(()=>n[20]||(n[20]=[a("Limit")])),_:1})]),s("li",null,[t(p,{to:"#offset"},{default:e(()=>n[21]||(n[21]=[a("Offset")])),_:1})]),s("li",null,[t(p,{to:"#order"},{default:e(()=>n[22]||(n[22]=[a("Order")])),_:1})]),s("li",null,[t(p,{to:"#paginate"},{default:e(()=>n[23]||(n[23]=[a("Paginate")])),_:1})]),s("li",null,[t(p,{to:"#query-single-column"},{default:e(()=>n[24]||(n[24]=[a("Query Single Column")])),_:1})]),s("li",null,[t(p,{to:"#specify-table-query"},{default:e(()=>n[25]||(n[25]=[a("Specify Table Query")])),_:1})]),s("li",null,[t(p,{to:"#get-sql"},{default:e(()=>n[26]||(n[26]=[a("Get SQL")])),_:1})]),s("li",null,[t(p,{to:"#count"},{default:e(()=>n[27]||(n[27]=[a("Count")])),_:1})]),s("li",null,[t(p,{to:"#specify-fields"},{default:e(()=>n[28]||(n[28]=[a("Specify Fields")])),_:1})]),s("li",null,[t(p,{to:"#group-by-having"},{default:e(()=>n[29]||(n[29]=[a("Group By & Having")])),_:1})]),s("li",null,[t(p,{to:"#join"},{default:e(()=>n[30]||(n[30]=[a("Join")])),_:1})]),s("li",null,[t(p,{to:"#create"},{default:e(()=>n[31]||(n[31]=[a("Create")])),_:1})]),s("li",null,[t(p,{to:"#multiple-create"},{default:e(()=>n[32]||(n[32]=[a("Multiple create")])),_:1})]),s("li",null,[t(p,{to:"#cursor"},{default:e(()=>n[33]||(n[33]=[a("Cursor")])),_:1})]),s("li",null,[t(p,{to:"#save-model"},{default:e(()=>n[34]||(n[34]=[a("Save Model")])),_:1})]),s("li",null,[t(p,{to:"#delete"},{default:e(()=>n[35]||(n[35]=[a("Delete")])),_:1})]),s("li",null,[t(p,{to:"#query-soft-delete-data"},{default:e(()=>n[36]||(n[36]=[a("Query Soft Delete Data")])),_:1})]),s("li",null,[t(p,{to:"#filter-repetition"},{default:e(()=>n[37]||(n[37]=[a("Filter Repetition")])),_:1})]),s("li",null,[t(p,{to:"#get-driver"},{default:e(()=>n[38]||(n[38]=[a("Get Driver")])),_:1})]),s("li",null,[t(p,{to:"#execute-native-sql"},{default:e(()=>n[39]||(n[39]=[a("Execute Native SQL")])),_:1})]),s("li",null,[t(p,{to:"#execute-native-update-sql"},{default:e(()=>n[40]||(n[40]=[a("Execute Native Update SQL")])),_:1})]),s("li",null,[t(p,{to:"#exists"},{default:e(()=>n[41]||(n[41]=[a("Exists")])),_:1})]),s("li",null,[t(p,{to:"#restore"},{default:e(()=>n[42]||(n[42]=[a("Restore")])),_:1})]),s("li",null,[t(p,{to:"#transaction"},{default:e(()=>n[43]||(n[43]=[a("Transaction")])),_:1})]),s("li",null,[t(p,{to:"#scopes"},{default:e(()=>n[44]||(n[44]=[a("Scopes")])),_:1})]),s("li",null,[t(p,{to:"#raw-expressions"},{default:e(()=>n[45]||(n[45]=[a("Raw Expressions")])),_:1})]),s("li",null,[t(p,{to:"#pessimistic-locking"},{default:e(()=>n[46]||(n[46]=[a("Pessimistic Locking")])),_:1})]),s("li",null,[t(p,{to:"#sum"},{default:e(()=>n[47]||(n[47]=[a("Sum")])),_:1})])])]),s("li",null,[t(p,{to:"#events"},{default:e(()=>n[48]||(n[48]=[a("Events")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#observers"},{default:e(()=>n[49]||(n[49]=[a("Observers")])),_:1})]),s("li",null,[t(p,{to:"#muting-events"},{default:e(()=>n[50]||(n[50]=[a("Muting Events")])),_:1})])])])])]),n[61]||(n[61]=c(`

Introduction

Goravel makes it easy for developers to interact with databases using facades.Orm(). Currently, it provides official support for the following four databases:

  • MySQL 5.7+
  • PostgreSQL 9.6+
  • SQLite 3.8.8+
  • SQL Server 2017+

Before you start, configure the database in .env and confirm the default configuration in config/database.go.

Configuration

To configure databases, navigate to config/database.go. This is where you can customize all database connections and choose a default connection. The configuration in this file relies on the project's environment variables and showcases various database configurations that Goravel supports.

DSN

You can also use DSN to connect to the database directly, just configure the dsn field in the configuration file:

"postgres": map[string]any{
+import{_ as u,c as r,b as s,e as t,f as e,a as c,d as a,r as o,o as d}from"./app-Ewo6p9aM.js";const k={},m={class:"table-of-contents"};function v(b,n){const p=o("router-link"),l=o("RouteLink"),i=o("CommentService");return d(),r("div",null,[n[60]||(n[60]=s("h1",{id:"getting-started",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#getting-started"},[s("span",null,"Getting Started")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[t(p,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[a("Introduction")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#dsn"},{default:e(()=>n[1]||(n[1]=[a("DSN")])),_:1})]),s("li",null,[t(p,{to:"#read-write-connections"},{default:e(()=>n[2]||(n[2]=[a("Read & Write Connections")])),_:1})]),s("li",null,[t(p,{to:"#connection-pool"},{default:e(()=>n[3]||(n[3]=[a("Connection Pool")])),_:1})]),s("li",null,[t(p,{to:"#schema"},{default:e(()=>n[4]||(n[4]=[a("Schema")])),_:1})]),s("li",null,[t(p,{to:"#get-database-information"},{default:e(()=>n[5]||(n[5]=[a("Get Database Information")])),_:1})])])]),s("li",null,[t(p,{to:"#model-definition"},{default:e(()=>n[6]||(n[6]=[a("Model Definition")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#model-convention"},{default:e(()=>n[7]||(n[7]=[a("Model Convention")])),_:1})]),s("li",null,[t(p,{to:"#create-model"},{default:e(()=>n[8]||(n[8]=[a("Create Model")])),_:1})]),s("li",null,[t(p,{to:"#specify-table-name"},{default:e(()=>n[9]||(n[9]=[a("Specify Table Name")])),_:1})]),s("li",null,[t(p,{to:"#database-connections"},{default:e(()=>n[10]||(n[10]=[a("Database Connections")])),_:1})])])]),s("li",null,[t(p,{to:"#facades-orm-available-functions"},{default:e(()=>n[11]||(n[11]=[a("facades.Orm() available functions")])),_:1})]),s("li",null,[t(p,{to:"#facades-orm-query-available-functions"},{default:e(()=>n[12]||(n[12]=[a("facades.Orm().Query() available functions")])),_:1})]),s("li",null,[t(p,{to:"#query-builder"},{default:e(()=>n[13]||(n[13]=[a("Query Builder")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#inject-context"},{default:e(()=>n[14]||(n[14]=[a("Inject Context")])),_:1})]),s("li",null,[t(p,{to:"#specify-database-connection"},{default:e(()=>n[15]||(n[15]=[a("Specify Database Connection")])),_:1})]),s("li",null,[t(p,{to:"#generic-database-interface-sql-db"},{default:e(()=>n[16]||(n[16]=[a("Generic Database Interface sql.DB")])),_:1})]),s("li",null,[t(p,{to:"#get-database-instance"},{default:e(()=>n[17]||(n[17]=[a("Get Database Instance")])),_:1})]),s("li",null,[t(p,{to:"#select"},{default:e(()=>n[18]||(n[18]=[a("Select")])),_:1})]),s("li",null,[t(p,{to:"#where"},{default:e(()=>n[19]||(n[19]=[a("Where")])),_:1})]),s("li",null,[t(p,{to:"#limit"},{default:e(()=>n[20]||(n[20]=[a("Limit")])),_:1})]),s("li",null,[t(p,{to:"#offset"},{default:e(()=>n[21]||(n[21]=[a("Offset")])),_:1})]),s("li",null,[t(p,{to:"#order"},{default:e(()=>n[22]||(n[22]=[a("Order")])),_:1})]),s("li",null,[t(p,{to:"#paginate"},{default:e(()=>n[23]||(n[23]=[a("Paginate")])),_:1})]),s("li",null,[t(p,{to:"#query-single-column"},{default:e(()=>n[24]||(n[24]=[a("Query Single Column")])),_:1})]),s("li",null,[t(p,{to:"#specify-table-query"},{default:e(()=>n[25]||(n[25]=[a("Specify Table Query")])),_:1})]),s("li",null,[t(p,{to:"#get-sql"},{default:e(()=>n[26]||(n[26]=[a("Get SQL")])),_:1})]),s("li",null,[t(p,{to:"#count"},{default:e(()=>n[27]||(n[27]=[a("Count")])),_:1})]),s("li",null,[t(p,{to:"#specify-fields"},{default:e(()=>n[28]||(n[28]=[a("Specify Fields")])),_:1})]),s("li",null,[t(p,{to:"#group-by-having"},{default:e(()=>n[29]||(n[29]=[a("Group By & Having")])),_:1})]),s("li",null,[t(p,{to:"#join"},{default:e(()=>n[30]||(n[30]=[a("Join")])),_:1})]),s("li",null,[t(p,{to:"#create"},{default:e(()=>n[31]||(n[31]=[a("Create")])),_:1})]),s("li",null,[t(p,{to:"#multiple-create"},{default:e(()=>n[32]||(n[32]=[a("Multiple create")])),_:1})]),s("li",null,[t(p,{to:"#cursor"},{default:e(()=>n[33]||(n[33]=[a("Cursor")])),_:1})]),s("li",null,[t(p,{to:"#save-model"},{default:e(()=>n[34]||(n[34]=[a("Save Model")])),_:1})]),s("li",null,[t(p,{to:"#delete"},{default:e(()=>n[35]||(n[35]=[a("Delete")])),_:1})]),s("li",null,[t(p,{to:"#query-soft-delete-data"},{default:e(()=>n[36]||(n[36]=[a("Query Soft Delete Data")])),_:1})]),s("li",null,[t(p,{to:"#filter-repetition"},{default:e(()=>n[37]||(n[37]=[a("Filter Repetition")])),_:1})]),s("li",null,[t(p,{to:"#get-driver"},{default:e(()=>n[38]||(n[38]=[a("Get Driver")])),_:1})]),s("li",null,[t(p,{to:"#execute-native-sql"},{default:e(()=>n[39]||(n[39]=[a("Execute Native SQL")])),_:1})]),s("li",null,[t(p,{to:"#execute-native-update-sql"},{default:e(()=>n[40]||(n[40]=[a("Execute Native Update SQL")])),_:1})]),s("li",null,[t(p,{to:"#exists"},{default:e(()=>n[41]||(n[41]=[a("Exists")])),_:1})]),s("li",null,[t(p,{to:"#restore"},{default:e(()=>n[42]||(n[42]=[a("Restore")])),_:1})]),s("li",null,[t(p,{to:"#transaction"},{default:e(()=>n[43]||(n[43]=[a("Transaction")])),_:1})]),s("li",null,[t(p,{to:"#scopes"},{default:e(()=>n[44]||(n[44]=[a("Scopes")])),_:1})]),s("li",null,[t(p,{to:"#raw-expressions"},{default:e(()=>n[45]||(n[45]=[a("Raw Expressions")])),_:1})]),s("li",null,[t(p,{to:"#pessimistic-locking"},{default:e(()=>n[46]||(n[46]=[a("Pessimistic Locking")])),_:1})]),s("li",null,[t(p,{to:"#sum"},{default:e(()=>n[47]||(n[47]=[a("Sum")])),_:1})])])]),s("li",null,[t(p,{to:"#events"},{default:e(()=>n[48]||(n[48]=[a("Events")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#observers"},{default:e(()=>n[49]||(n[49]=[a("Observers")])),_:1})]),s("li",null,[t(p,{to:"#muting-events"},{default:e(()=>n[50]||(n[50]=[a("Muting Events")])),_:1})])])])])]),n[61]||(n[61]=c(`

Introduction

Goravel makes it easy for developers to interact with databases using facades.Orm(). Currently, it provides official support for the following four databases:

  • MySQL 5.7+
  • PostgreSQL 9.6+
  • SQLite 3.8.8+
  • SQL Server 2017+

Before you start, configure the database in .env and confirm the default configuration in config/database.go.

Configuration

To configure databases, navigate to config/database.go. This is where you can customize all database connections and choose a default connection. The configuration in this file relies on the project's environment variables and showcases various database configurations that Goravel supports.

DSN

You can also use DSN to connect to the database directly, just configure the dsn field in the configuration file:

"postgres": map[string]any{
   "driver":   "postgres",
 ++  "dsn": "postgres://user:password@localhost:5432/dbname?sslmode=disable",
   ...
diff --git a/assets/getting-started.html-CWiAcpuW.js b/assets/getting-started.html-BDNUdeaa.js
similarity index 99%
rename from assets/getting-started.html-CWiAcpuW.js
rename to assets/getting-started.html-BDNUdeaa.js
index ffcf019d..ae0a305e 100644
--- a/assets/getting-started.html-CWiAcpuW.js
+++ b/assets/getting-started.html-BDNUdeaa.js
@@ -1,4 +1,4 @@
-import{_ as c,c as u,b as s,e,f as t,a as p,d as a,r as o,o as r}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(m,n){const i=o("router-link"),l=o("RouteLink");return r(),u("div",null,[n[34]||(n[34]=s("h1",{id:"getting-started",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#getting-started"},[s("span",null,"Getting Started")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[e(i,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[e(i,{to:"#environment"},{default:t(()=>n[1]||(n[1]=[a("Environment")])),_:1}),s("ul",null,[s("li",null,[e(i,{to:"#custom-environment-file"},{default:t(()=>n[2]||(n[2]=[a("Custom Environment File")])),_:1})]),s("li",null,[e(i,{to:"#testcase-struct"},{default:t(()=>n[3]||(n[3]=[a("TestCase Struct")])),_:1})])])]),s("li",null,[e(i,{to:"#creating-tests"},{default:t(()=>n[4]||(n[4]=[a("Creating Tests")])),_:1})]),s("li",null,[e(i,{to:"#database-testing"},{default:t(()=>n[5]||(n[5]=[a("Database Testing")])),_:1}),s("ul",null,[s("li",null,[e(i,{to:"#factories"},{default:t(()=>n[6]||(n[6]=[a("Factories")])),_:1})]),s("li",null,[e(i,{to:"#running-seeders"},{default:t(()=>n[7]||(n[7]=[a("Running Seeders")])),_:1})]),s("li",null,[e(i,{to:"#using-docker"},{default:t(()=>n[8]||(n[8]=[a("Using Docker")])),_:1})])])])])]),n[35]||(n[35]=p(`

Introduction

The testing function of Goravel relies on Golang's official test component, extending unit testing to support integration testing and improve application robustness.

Environment

Custom Environment File

By default, the .env file in the root directory is used to inject configuration information during testing. If you want to use different .env files for different packages, you can create a .env file in the package directory, and the test will read this file first.

- /app
+import{_ as c,c as u,b as s,e,f as t,a as p,d as a,r as o,o as r}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(m,n){const i=o("router-link"),l=o("RouteLink");return r(),u("div",null,[n[34]||(n[34]=s("h1",{id:"getting-started",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#getting-started"},[s("span",null,"Getting Started")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[e(i,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[e(i,{to:"#environment"},{default:t(()=>n[1]||(n[1]=[a("Environment")])),_:1}),s("ul",null,[s("li",null,[e(i,{to:"#custom-environment-file"},{default:t(()=>n[2]||(n[2]=[a("Custom Environment File")])),_:1})]),s("li",null,[e(i,{to:"#testcase-struct"},{default:t(()=>n[3]||(n[3]=[a("TestCase Struct")])),_:1})])])]),s("li",null,[e(i,{to:"#creating-tests"},{default:t(()=>n[4]||(n[4]=[a("Creating Tests")])),_:1})]),s("li",null,[e(i,{to:"#database-testing"},{default:t(()=>n[5]||(n[5]=[a("Database Testing")])),_:1}),s("ul",null,[s("li",null,[e(i,{to:"#factories"},{default:t(()=>n[6]||(n[6]=[a("Factories")])),_:1})]),s("li",null,[e(i,{to:"#running-seeders"},{default:t(()=>n[7]||(n[7]=[a("Running Seeders")])),_:1})]),s("li",null,[e(i,{to:"#using-docker"},{default:t(()=>n[8]||(n[8]=[a("Using Docker")])),_:1})])])])])]),n[35]||(n[35]=p(`

Introduction

The testing function of Goravel relies on Golang's official test component, extending unit testing to support integration testing and improve application robustness.

Environment

Custom Environment File

By default, the .env file in the root directory is used to inject configuration information during testing. If you want to use different .env files for different packages, you can create a .env file in the package directory, and the test will read this file first.

- /app
 - /config
 - ...
 - /test
diff --git a/assets/getting-started.html-CPD5PhOr.js b/assets/getting-started.html-BZLfsr3n.js
similarity index 99%
rename from assets/getting-started.html-CPD5PhOr.js
rename to assets/getting-started.html-BZLfsr3n.js
index e04f9722..5df052d8 100644
--- a/assets/getting-started.html-CPD5PhOr.js
+++ b/assets/getting-started.html-BZLfsr3n.js
@@ -1,4 +1,4 @@
-import{_ as c,c as u,b as s,e,f as t,a as l,d as a,r as o,o as r}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(m,n){const p=o("router-link"),i=o("RouteLink");return r(),u("div",null,[n[34]||(n[34]=s("h1",{id:"快速入门",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#快速入门"},[s("span",null,"快速入门")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[e(p,{to:"#介绍"},{default:t(()=>n[0]||(n[0]=[a("介绍")])),_:1})]),s("li",null,[e(p,{to:"#环境"},{default:t(()=>n[1]||(n[1]=[a("环境")])),_:1}),s("ul",null,[s("li",null,[e(p,{to:"#自定义环境配置文件"},{default:t(()=>n[2]||(n[2]=[a("自定义环境配置文件")])),_:1})]),s("li",null,[e(p,{to:"#testcase-struct"},{default:t(()=>n[3]||(n[3]=[a("TestCase Struct")])),_:1})])])]),s("li",null,[e(p,{to:"#创建测试"},{default:t(()=>n[4]||(n[4]=[a("创建测试")])),_:1})]),s("li",null,[e(p,{to:"#数据库测试"},{default:t(()=>n[5]||(n[5]=[a("数据库测试")])),_:1}),s("ul",null,[s("li",null,[e(p,{to:"#模型工厂"},{default:t(()=>n[6]||(n[6]=[a("模型工厂")])),_:1})]),s("li",null,[e(p,{to:"#运行-seeders"},{default:t(()=>n[7]||(n[7]=[a("运行 seeders")])),_:1})]),s("li",null,[e(p,{to:"#使用-docker"},{default:t(()=>n[8]||(n[8]=[a("使用 Docker")])),_:1})])])])])]),n[35]||(n[35]=l(`

介绍

Goravel 的测试功能依托于 Golang 自带的 test 官方组件,是对单元测试的扩展,使 Goravel 应用程序支持集成测试,让应用变得更加健壮。

环境

自定义环境配置文件

测试时默认使用根目录下的 .env 文件注入配置信息,如果想为不同的包使用不同的 .env 文件,可以在包目录下创建 .env 文件,测试时会优先读取该文件。

- /app
+import{_ as c,c as u,b as s,e,f as t,a as l,d as a,r as o,o as r}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(m,n){const p=o("router-link"),i=o("RouteLink");return r(),u("div",null,[n[34]||(n[34]=s("h1",{id:"快速入门",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#快速入门"},[s("span",null,"快速入门")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[e(p,{to:"#介绍"},{default:t(()=>n[0]||(n[0]=[a("介绍")])),_:1})]),s("li",null,[e(p,{to:"#环境"},{default:t(()=>n[1]||(n[1]=[a("环境")])),_:1}),s("ul",null,[s("li",null,[e(p,{to:"#自定义环境配置文件"},{default:t(()=>n[2]||(n[2]=[a("自定义环境配置文件")])),_:1})]),s("li",null,[e(p,{to:"#testcase-struct"},{default:t(()=>n[3]||(n[3]=[a("TestCase Struct")])),_:1})])])]),s("li",null,[e(p,{to:"#创建测试"},{default:t(()=>n[4]||(n[4]=[a("创建测试")])),_:1})]),s("li",null,[e(p,{to:"#数据库测试"},{default:t(()=>n[5]||(n[5]=[a("数据库测试")])),_:1}),s("ul",null,[s("li",null,[e(p,{to:"#模型工厂"},{default:t(()=>n[6]||(n[6]=[a("模型工厂")])),_:1})]),s("li",null,[e(p,{to:"#运行-seeders"},{default:t(()=>n[7]||(n[7]=[a("运行 seeders")])),_:1})]),s("li",null,[e(p,{to:"#使用-docker"},{default:t(()=>n[8]||(n[8]=[a("使用 Docker")])),_:1})])])])])]),n[35]||(n[35]=l(`

介绍

Goravel 的测试功能依托于 Golang 自带的 test 官方组件,是对单元测试的扩展,使 Goravel 应用程序支持集成测试,让应用变得更加健壮。

环境

自定义环境配置文件

测试时默认使用根目录下的 .env 文件注入配置信息,如果想为不同的包使用不同的 .env 文件,可以在包目录下创建 .env 文件,测试时会优先读取该文件。

- /app
 - /config
 - ...
 - /test
diff --git a/assets/getting-started.html-Dkt4IaiF.js b/assets/getting-started.html-DXDdKYyS.js
similarity index 99%
rename from assets/getting-started.html-Dkt4IaiF.js
rename to assets/getting-started.html-DXDdKYyS.js
index 8254b7ac..1b307534 100644
--- a/assets/getting-started.html-Dkt4IaiF.js
+++ b/assets/getting-started.html-DXDdKYyS.js
@@ -1,4 +1,4 @@
-import{_ as i,c as r,b as s,e as t,f as p,a as c,d as a,r as o,o as d}from"./app-ELDWQP0J.js";const k={},m={class:"table-of-contents"};function v(b,n){const e=o("router-link"),l=o("RouteLink"),u=o("CommentService");return d(),r("div",null,[n[61]||(n[61]=s("h1",{id:"快速入门",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#快速入门"},[s("span",null,"快速入门")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[t(e,{to:"#简介"},{default:p(()=>n[0]||(n[0]=[a("简介")])),_:1})]),s("li",null,[t(e,{to:"#配置"},{default:p(()=>n[1]||(n[1]=[a("配置")])),_:1}),s("ul",null,[s("li",null,[t(e,{to:"#dsn"},{default:p(()=>n[2]||(n[2]=[a("DSN")])),_:1})]),s("li",null,[t(e,{to:"#读写分离"},{default:p(()=>n[3]||(n[3]=[a("读写分离")])),_:1})]),s("li",null,[t(e,{to:"#连接池"},{default:p(()=>n[4]||(n[4]=[a("连接池")])),_:1})]),s("li",null,[t(e,{to:"#schema"},{default:p(()=>n[5]||(n[5]=[a("Schema")])),_:1})]),s("li",null,[t(e,{to:"#获取数据库信息"},{default:p(()=>n[6]||(n[6]=[a("获取数据库信息")])),_:1})])])]),s("li",null,[t(e,{to:"#模型"},{default:p(()=>n[7]||(n[7]=[a("模型")])),_:1}),s("ul",null,[s("li",null,[t(e,{to:"#模型约定"},{default:p(()=>n[8]||(n[8]=[a("模型约定")])),_:1})]),s("li",null,[t(e,{to:"#创建模型"},{default:p(()=>n[9]||(n[9]=[a("创建模型")])),_:1})]),s("li",null,[t(e,{to:"#指定表名"},{default:p(()=>n[10]||(n[10]=[a("指定表名")])),_:1})]),s("li",null,[t(e,{to:"#数据库连接"},{default:p(()=>n[11]||(n[11]=[a("数据库连接")])),_:1})])])]),s("li",null,[t(e,{to:"#facades-orm-可用方法"},{default:p(()=>n[12]||(n[12]=[a("facades.Orm() 可用方法")])),_:1})]),s("li",null,[t(e,{to:"#facades-orm-query-可用方法"},{default:p(()=>n[13]||(n[13]=[a("facades.Orm().Query() 可用方法")])),_:1})]),s("li",null,[t(e,{to:"#查询构造器"},{default:p(()=>n[14]||(n[14]=[a("查询构造器")])),_:1}),s("ul",null,[s("li",null,[t(e,{to:"#注入-context"},{default:p(()=>n[15]||(n[15]=[a("注入 Context")])),_:1})]),s("li",null,[t(e,{to:"#指定数据库链接"},{default:p(()=>n[16]||(n[16]=[a("指定数据库链接")])),_:1})]),s("li",null,[t(e,{to:"#获取通用数据库接口"},{default:p(()=>n[17]||(n[17]=[a("获取通用数据库接口")])),_:1})]),s("li",null,[t(e,{to:"#获取数据库实例"},{default:p(()=>n[18]||(n[18]=[a("获取数据库实例")])),_:1})]),s("li",null,[t(e,{to:"#查询"},{default:p(()=>n[19]||(n[19]=[a("查询")])),_:1})]),s("li",null,[t(e,{to:"#where-条件"},{default:p(()=>n[20]||(n[20]=[a("Where 条件")])),_:1})]),s("li",null,[t(e,{to:"#指定查询数量"},{default:p(()=>n[21]||(n[21]=[a("指定查询数量")])),_:1})]),s("li",null,[t(e,{to:"#指定查询开始位置"},{default:p(()=>n[22]||(n[22]=[a("指定查询开始位置")])),_:1})]),s("li",null,[t(e,{to:"#排序"},{default:p(()=>n[23]||(n[23]=[a("排序")])),_:1})]),s("li",null,[t(e,{to:"#分页"},{default:p(()=>n[24]||(n[24]=[a("分页")])),_:1})]),s("li",null,[t(e,{to:"#查询单列"},{default:p(()=>n[25]||(n[25]=[a("查询单列")])),_:1})]),s("li",null,[t(e,{to:"#指定表查询"},{default:p(()=>n[26]||(n[26]=[a("指定表查询")])),_:1})]),s("li",null,[t(e,{to:"#获取-sql"},{default:p(()=>n[27]||(n[27]=[a("获取 SQL")])),_:1})]),s("li",null,[t(e,{to:"#检索聚合"},{default:p(()=>n[28]||(n[28]=[a("检索聚合")])),_:1})]),s("li",null,[t(e,{to:"#指定查询列"},{default:p(()=>n[29]||(n[29]=[a("指定查询列")])),_:1})]),s("li",null,[t(e,{to:"#group-by-having"},{default:p(()=>n[30]||(n[30]=[a("Group By & Having")])),_:1})]),s("li",null,[t(e,{to:"#join-查询"},{default:p(()=>n[31]||(n[31]=[a("Join 查询")])),_:1})]),s("li",null,[t(e,{to:"#创建"},{default:p(()=>n[32]||(n[32]=[a("创建")])),_:1})]),s("li",null,[t(e,{to:"#批量创建"},{default:p(()=>n[33]||(n[33]=[a("批量创建")])),_:1})]),s("li",null,[t(e,{to:"#游标"},{default:p(()=>n[34]||(n[34]=[a("游标")])),_:1})]),s("li",null,[t(e,{to:"#更新"},{default:p(()=>n[35]||(n[35]=[a("更新")])),_:1})]),s("li",null,[t(e,{to:"#删除"},{default:p(()=>n[36]||(n[36]=[a("删除")])),_:1})]),s("li",null,[t(e,{to:"#查询软删除"},{default:p(()=>n[37]||(n[37]=[a("查询软删除")])),_:1})]),s("li",null,[t(e,{to:"#过滤重复"},{default:p(()=>n[38]||(n[38]=[a("过滤重复")])),_:1})]),s("li",null,[t(e,{to:"#获取当前驱动"},{default:p(()=>n[39]||(n[39]=[a("获取当前驱动")])),_:1})]),s("li",null,[t(e,{to:"#执行原生查询-sql"},{default:p(()=>n[40]||(n[40]=[a("执行原生查询 SQL")])),_:1})]),s("li",null,[t(e,{to:"#执行原生更新-sql"},{default:p(()=>n[41]||(n[41]=[a("执行原生更新 SQL")])),_:1})]),s("li",null,[t(e,{to:"#数据是否存在"},{default:p(()=>n[42]||(n[42]=[a("数据是否存在")])),_:1})]),s("li",null,[t(e,{to:"#恢复软删除"},{default:p(()=>n[43]||(n[43]=[a("恢复软删除")])),_:1})]),s("li",null,[t(e,{to:"#事务"},{default:p(()=>n[44]||(n[44]=[a("事务")])),_:1})]),s("li",null,[t(e,{to:"#scopes"},{default:p(()=>n[45]||(n[45]=[a("Scopes")])),_:1})]),s("li",null,[t(e,{to:"#原生表达式"},{default:p(()=>n[46]||(n[46]=[a("原生表达式")])),_:1})]),s("li",null,[t(e,{to:"#悲观锁"},{default:p(()=>n[47]||(n[47]=[a("悲观锁")])),_:1})]),s("li",null,[t(e,{to:"#求和"},{default:p(()=>n[48]||(n[48]=[a("求和")])),_:1})])])]),s("li",null,[t(e,{to:"#events"},{default:p(()=>n[49]||(n[49]=[a("Events")])),_:1}),s("ul",null,[s("li",null,[t(e,{to:"#观察者"},{default:p(()=>n[50]||(n[50]=[a("观察者")])),_:1})]),s("li",null,[t(e,{to:"#静默事件"},{default:p(()=>n[51]||(n[51]=[a("静默事件")])),_:1})])])])])]),n[62]||(n[62]=c(`

简介

Goravel 提供了一套非常简单易用的数据库交互方式,开发者可以使用 facades.Orm() 进行操作。目前,Goravel 为以下四种数据库提供了官方支持:

  • MySQL 5.7+
  • PostgreSQL 9.6+
  • SQLite 3.8.8+
  • SQL Server 2017+

在开始之前,请在 .env 文件中配置数据库链接信息,并确认 config/database.go 的默认配置。

配置

数据库的配置文件在 config/database.go 文件中。你可以在这个文件中配置所有的数据库连接,并指定默认的数据库连接。该文件中的大部分配置都基于项目的环境变量,且提供了 Goravel 所支持的数据库配置示例。

DSN

你也可以直接使用 DSN 连接数据库,只需要在配置文件中配置 dsn 字段即可:

"postgres": map[string]any{
+import{_ as i,c as r,b as s,e as t,f as p,a as c,d as a,r as o,o as d}from"./app-Ewo6p9aM.js";const k={},m={class:"table-of-contents"};function v(b,n){const e=o("router-link"),l=o("RouteLink"),u=o("CommentService");return d(),r("div",null,[n[61]||(n[61]=s("h1",{id:"快速入门",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#快速入门"},[s("span",null,"快速入门")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[t(e,{to:"#简介"},{default:p(()=>n[0]||(n[0]=[a("简介")])),_:1})]),s("li",null,[t(e,{to:"#配置"},{default:p(()=>n[1]||(n[1]=[a("配置")])),_:1}),s("ul",null,[s("li",null,[t(e,{to:"#dsn"},{default:p(()=>n[2]||(n[2]=[a("DSN")])),_:1})]),s("li",null,[t(e,{to:"#读写分离"},{default:p(()=>n[3]||(n[3]=[a("读写分离")])),_:1})]),s("li",null,[t(e,{to:"#连接池"},{default:p(()=>n[4]||(n[4]=[a("连接池")])),_:1})]),s("li",null,[t(e,{to:"#schema"},{default:p(()=>n[5]||(n[5]=[a("Schema")])),_:1})]),s("li",null,[t(e,{to:"#获取数据库信息"},{default:p(()=>n[6]||(n[6]=[a("获取数据库信息")])),_:1})])])]),s("li",null,[t(e,{to:"#模型"},{default:p(()=>n[7]||(n[7]=[a("模型")])),_:1}),s("ul",null,[s("li",null,[t(e,{to:"#模型约定"},{default:p(()=>n[8]||(n[8]=[a("模型约定")])),_:1})]),s("li",null,[t(e,{to:"#创建模型"},{default:p(()=>n[9]||(n[9]=[a("创建模型")])),_:1})]),s("li",null,[t(e,{to:"#指定表名"},{default:p(()=>n[10]||(n[10]=[a("指定表名")])),_:1})]),s("li",null,[t(e,{to:"#数据库连接"},{default:p(()=>n[11]||(n[11]=[a("数据库连接")])),_:1})])])]),s("li",null,[t(e,{to:"#facades-orm-可用方法"},{default:p(()=>n[12]||(n[12]=[a("facades.Orm() 可用方法")])),_:1})]),s("li",null,[t(e,{to:"#facades-orm-query-可用方法"},{default:p(()=>n[13]||(n[13]=[a("facades.Orm().Query() 可用方法")])),_:1})]),s("li",null,[t(e,{to:"#查询构造器"},{default:p(()=>n[14]||(n[14]=[a("查询构造器")])),_:1}),s("ul",null,[s("li",null,[t(e,{to:"#注入-context"},{default:p(()=>n[15]||(n[15]=[a("注入 Context")])),_:1})]),s("li",null,[t(e,{to:"#指定数据库链接"},{default:p(()=>n[16]||(n[16]=[a("指定数据库链接")])),_:1})]),s("li",null,[t(e,{to:"#获取通用数据库接口"},{default:p(()=>n[17]||(n[17]=[a("获取通用数据库接口")])),_:1})]),s("li",null,[t(e,{to:"#获取数据库实例"},{default:p(()=>n[18]||(n[18]=[a("获取数据库实例")])),_:1})]),s("li",null,[t(e,{to:"#查询"},{default:p(()=>n[19]||(n[19]=[a("查询")])),_:1})]),s("li",null,[t(e,{to:"#where-条件"},{default:p(()=>n[20]||(n[20]=[a("Where 条件")])),_:1})]),s("li",null,[t(e,{to:"#指定查询数量"},{default:p(()=>n[21]||(n[21]=[a("指定查询数量")])),_:1})]),s("li",null,[t(e,{to:"#指定查询开始位置"},{default:p(()=>n[22]||(n[22]=[a("指定查询开始位置")])),_:1})]),s("li",null,[t(e,{to:"#排序"},{default:p(()=>n[23]||(n[23]=[a("排序")])),_:1})]),s("li",null,[t(e,{to:"#分页"},{default:p(()=>n[24]||(n[24]=[a("分页")])),_:1})]),s("li",null,[t(e,{to:"#查询单列"},{default:p(()=>n[25]||(n[25]=[a("查询单列")])),_:1})]),s("li",null,[t(e,{to:"#指定表查询"},{default:p(()=>n[26]||(n[26]=[a("指定表查询")])),_:1})]),s("li",null,[t(e,{to:"#获取-sql"},{default:p(()=>n[27]||(n[27]=[a("获取 SQL")])),_:1})]),s("li",null,[t(e,{to:"#检索聚合"},{default:p(()=>n[28]||(n[28]=[a("检索聚合")])),_:1})]),s("li",null,[t(e,{to:"#指定查询列"},{default:p(()=>n[29]||(n[29]=[a("指定查询列")])),_:1})]),s("li",null,[t(e,{to:"#group-by-having"},{default:p(()=>n[30]||(n[30]=[a("Group By & Having")])),_:1})]),s("li",null,[t(e,{to:"#join-查询"},{default:p(()=>n[31]||(n[31]=[a("Join 查询")])),_:1})]),s("li",null,[t(e,{to:"#创建"},{default:p(()=>n[32]||(n[32]=[a("创建")])),_:1})]),s("li",null,[t(e,{to:"#批量创建"},{default:p(()=>n[33]||(n[33]=[a("批量创建")])),_:1})]),s("li",null,[t(e,{to:"#游标"},{default:p(()=>n[34]||(n[34]=[a("游标")])),_:1})]),s("li",null,[t(e,{to:"#更新"},{default:p(()=>n[35]||(n[35]=[a("更新")])),_:1})]),s("li",null,[t(e,{to:"#删除"},{default:p(()=>n[36]||(n[36]=[a("删除")])),_:1})]),s("li",null,[t(e,{to:"#查询软删除"},{default:p(()=>n[37]||(n[37]=[a("查询软删除")])),_:1})]),s("li",null,[t(e,{to:"#过滤重复"},{default:p(()=>n[38]||(n[38]=[a("过滤重复")])),_:1})]),s("li",null,[t(e,{to:"#获取当前驱动"},{default:p(()=>n[39]||(n[39]=[a("获取当前驱动")])),_:1})]),s("li",null,[t(e,{to:"#执行原生查询-sql"},{default:p(()=>n[40]||(n[40]=[a("执行原生查询 SQL")])),_:1})]),s("li",null,[t(e,{to:"#执行原生更新-sql"},{default:p(()=>n[41]||(n[41]=[a("执行原生更新 SQL")])),_:1})]),s("li",null,[t(e,{to:"#数据是否存在"},{default:p(()=>n[42]||(n[42]=[a("数据是否存在")])),_:1})]),s("li",null,[t(e,{to:"#恢复软删除"},{default:p(()=>n[43]||(n[43]=[a("恢复软删除")])),_:1})]),s("li",null,[t(e,{to:"#事务"},{default:p(()=>n[44]||(n[44]=[a("事务")])),_:1})]),s("li",null,[t(e,{to:"#scopes"},{default:p(()=>n[45]||(n[45]=[a("Scopes")])),_:1})]),s("li",null,[t(e,{to:"#原生表达式"},{default:p(()=>n[46]||(n[46]=[a("原生表达式")])),_:1})]),s("li",null,[t(e,{to:"#悲观锁"},{default:p(()=>n[47]||(n[47]=[a("悲观锁")])),_:1})]),s("li",null,[t(e,{to:"#求和"},{default:p(()=>n[48]||(n[48]=[a("求和")])),_:1})])])]),s("li",null,[t(e,{to:"#events"},{default:p(()=>n[49]||(n[49]=[a("Events")])),_:1}),s("ul",null,[s("li",null,[t(e,{to:"#观察者"},{default:p(()=>n[50]||(n[50]=[a("观察者")])),_:1})]),s("li",null,[t(e,{to:"#静默事件"},{default:p(()=>n[51]||(n[51]=[a("静默事件")])),_:1})])])])])]),n[62]||(n[62]=c(`

简介

Goravel 提供了一套非常简单易用的数据库交互方式,开发者可以使用 facades.Orm() 进行操作。目前,Goravel 为以下四种数据库提供了官方支持:

  • MySQL 5.7+
  • PostgreSQL 9.6+
  • SQLite 3.8.8+
  • SQL Server 2017+

在开始之前,请在 .env 文件中配置数据库链接信息,并确认 config/database.go 的默认配置。

配置

数据库的配置文件在 config/database.go 文件中。你可以在这个文件中配置所有的数据库连接,并指定默认的数据库连接。该文件中的大部分配置都基于项目的环境变量,且提供了 Goravel 所支持的数据库配置示例。

DSN

你也可以直接使用 DSN 连接数据库,只需要在配置文件中配置 dsn 字段即可:

"postgres": map[string]any{
   "driver":   "postgres",
 ++  "dsn": "postgres://user:password@localhost:5432/dbname?sslmode=disable",
   ...
diff --git a/assets/grpc.html-CDEALKGL.js b/assets/grpc.html-DQDUY4gB.js
similarity index 99%
rename from assets/grpc.html-CDEALKGL.js
rename to assets/grpc.html-DQDUY4gB.js
index f6eb48d7..3efa45d6 100644
--- a/assets/grpc.html-CDEALKGL.js
+++ b/assets/grpc.html-DQDUY4gB.js
@@ -1,4 +1,4 @@
-import{_ as l,c as i,b as s,e as a,f as t,a as r,r as o,o as u,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(g,n){const e=o("router-link"),c=o("CommentService");return u(),i("div",null,[n[6]||(n[6]=s("h1",{id:"grpc",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#grpc"},[s("span",null,"Grpc")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#controllers"},{default:t(()=>n[1]||(n[1]=[p("Controllers")])),_:1})]),s("li",null,[a(e,{to:"#define-routing"},{default:t(()=>n[2]||(n[2]=[p("Define routing")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#register-routing"},{default:t(()=>n[3]||(n[3]=[p("Register routing")])),_:1})])])]),s("li",null,[a(e,{to:"#start-grpc-server"},{default:t(()=>n[4]||(n[4]=[p("Start Grpc Server")])),_:1})]),s("li",null,[a(e,{to:"#interceptor"},{default:t(()=>n[5]||(n[5]=[p("Interceptor")])),_:1})])])]),n[7]||(n[7]=r(`

Introduction

Grpc module can be operated by facades.Grpc().

Controllers

Controllers can be defined in the /app/grpc/controllers directory.

// app/grpc/controllers
+import{_ as l,c as i,b as s,e as a,f as t,a as r,r as o,o as u,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(g,n){const e=o("router-link"),c=o("CommentService");return u(),i("div",null,[n[6]||(n[6]=s("h1",{id:"grpc",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#grpc"},[s("span",null,"Grpc")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#controllers"},{default:t(()=>n[1]||(n[1]=[p("Controllers")])),_:1})]),s("li",null,[a(e,{to:"#define-routing"},{default:t(()=>n[2]||(n[2]=[p("Define routing")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#register-routing"},{default:t(()=>n[3]||(n[3]=[p("Register routing")])),_:1})])])]),s("li",null,[a(e,{to:"#start-grpc-server"},{default:t(()=>n[4]||(n[4]=[p("Start Grpc Server")])),_:1})]),s("li",null,[a(e,{to:"#interceptor"},{default:t(()=>n[5]||(n[5]=[p("Interceptor")])),_:1})])])]),n[7]||(n[7]=r(`

Introduction

Grpc module can be operated by facades.Grpc().

Controllers

Controllers can be defined in the /app/grpc/controllers directory.

// app/grpc/controllers
 package controllers
 
 import (
diff --git a/assets/grpc.html-Dyii4ZbH.js b/assets/grpc.html-DsELBn-y.js
similarity index 99%
rename from assets/grpc.html-Dyii4ZbH.js
rename to assets/grpc.html-DsELBn-y.js
index 2cafc2e4..8b28fd96 100644
--- a/assets/grpc.html-Dyii4ZbH.js
+++ b/assets/grpc.html-DsELBn-y.js
@@ -1,4 +1,4 @@
-import{_ as o,c as i,b as s,e as a,f as e,a as u,r as c,o as r,d as t}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(g,n){const p=c("router-link"),l=c("CommentService");return r(),i("div",null,[n[7]||(n[7]=s("h1",{id:"grpc",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#grpc"},[s("span",null,"Grpc")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(p,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[t("简介")])),_:1})]),s("li",null,[a(p,{to:"#配置"},{default:e(()=>n[1]||(n[1]=[t("配置")])),_:1})]),s("li",null,[a(p,{to:"#控制器"},{default:e(()=>n[2]||(n[2]=[t("控制器")])),_:1})]),s("li",null,[a(p,{to:"#定义路由"},{default:e(()=>n[3]||(n[3]=[t("定义路由")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#注册路由"},{default:e(()=>n[4]||(n[4]=[t("注册路由")])),_:1})])])]),s("li",null,[a(p,{to:"#启动-grpc-服务器"},{default:e(()=>n[5]||(n[5]=[t("启动 Grpc 服务器")])),_:1})]),s("li",null,[a(p,{to:"#拦截器"},{default:e(()=>n[6]||(n[6]=[t("拦截器")])),_:1})])])]),n[8]||(n[8]=u(`

简介

Grpc 模块可以使用 facades.Grpc() 进行操作。

配置

config/grpc.go 中进行 Grpc 模块的配置,其中 grpc.host 配置 server 的域名,grpc.clients 配置 client 的相关信息。

控制器

控制器文件可以定义在 /app/grpc/controllers 目录中。

// app/grpc/controllers
+import{_ as o,c as i,b as s,e as a,f as e,a as u,r as c,o as r,d as t}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(g,n){const p=c("router-link"),l=c("CommentService");return r(),i("div",null,[n[7]||(n[7]=s("h1",{id:"grpc",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#grpc"},[s("span",null,"Grpc")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(p,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[t("简介")])),_:1})]),s("li",null,[a(p,{to:"#配置"},{default:e(()=>n[1]||(n[1]=[t("配置")])),_:1})]),s("li",null,[a(p,{to:"#控制器"},{default:e(()=>n[2]||(n[2]=[t("控制器")])),_:1})]),s("li",null,[a(p,{to:"#定义路由"},{default:e(()=>n[3]||(n[3]=[t("定义路由")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#注册路由"},{default:e(()=>n[4]||(n[4]=[t("注册路由")])),_:1})])])]),s("li",null,[a(p,{to:"#启动-grpc-服务器"},{default:e(()=>n[5]||(n[5]=[t("启动 Grpc 服务器")])),_:1})]),s("li",null,[a(p,{to:"#拦截器"},{default:e(()=>n[6]||(n[6]=[t("拦截器")])),_:1})])])]),n[8]||(n[8]=u(`

简介

Grpc 模块可以使用 facades.Grpc() 进行操作。

配置

config/grpc.go 中进行 Grpc 模块的配置,其中 grpc.host 配置 server 的域名,grpc.clients 配置 client 的相关信息。

控制器

控制器文件可以定义在 /app/grpc/controllers 目录中。

// app/grpc/controllers
 package controllers
 
 import (
diff --git a/assets/hashing.html-DAjmzRr6.js b/assets/hashing.html-BgsHt5-V.js
similarity index 99%
rename from assets/hashing.html-DAjmzRr6.js
rename to assets/hashing.html-BgsHt5-V.js
index aafd3ef2..c1147133 100644
--- a/assets/hashing.html-DAjmzRr6.js
+++ b/assets/hashing.html-BgsHt5-V.js
@@ -1,4 +1,4 @@
-import{_ as i,c,b as a,e as s,f as t,a as r,r as l,o as d,d as o}from"./app-ELDWQP0J.js";const u={},h={class:"table-of-contents"};function g(k,n){const e=l("router-link"),p=l("CommentService");return d(),c("div",null,[n[6]||(n[6]=a("h1",{id:"哈希",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#哈希"},[a("span",null,"哈希")])],-1)),a("nav",h,[a("ul",null,[a("li",null,[s(e,{to:"#简介"},{default:t(()=>n[0]||(n[0]=[o("简介")])),_:1})]),a("li",null,[s(e,{to:"#配置"},{default:t(()=>n[1]||(n[1]=[o("配置")])),_:1})]),a("li",null,[s(e,{to:"#基本用法"},{default:t(()=>n[2]||(n[2]=[o("基本用法")])),_:1}),a("ul",null,[a("li",null,[s(e,{to:"#哈希密码"},{default:t(()=>n[3]||(n[3]=[o("哈希密码")])),_:1})]),a("li",null,[s(e,{to:"#验证密码是否与哈希匹配"},{default:t(()=>n[4]||(n[4]=[o("验证密码是否与哈希匹配")])),_:1})]),a("li",null,[s(e,{to:"#检查密码是否需要重新散列-哈希"},{default:t(()=>n[5]||(n[5]=[o("检查密码是否需要重新散列 / 哈希")])),_:1})])])])])]),n[7]||(n[7]=r(`

简介

Goravel facades.Hash() 为存储用户密码提供了安全的 Argon2id 和 Bcrypt 哈希加密方式。如果你正在使用 Goravel 应用初始脚手架 ,默认情况下,将使用 Argon2id 进行注册和身份验证。

配置

你可以在 config/hashing.go 配置文件中配置默认哈希驱动程序。目前支持两种驱动程序: Bcrypt 和 Argon2id。

基本用法

哈希密码

你可以通过调用 facades.Hash()Make 方法来加密你的密码:

password, err := facades.Hash().Make(password)
+import{_ as i,c,b as a,e as s,f as t,a as r,r as l,o as d,d as o}from"./app-Ewo6p9aM.js";const u={},h={class:"table-of-contents"};function g(k,n){const e=l("router-link"),p=l("CommentService");return d(),c("div",null,[n[6]||(n[6]=a("h1",{id:"哈希",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#哈希"},[a("span",null,"哈希")])],-1)),a("nav",h,[a("ul",null,[a("li",null,[s(e,{to:"#简介"},{default:t(()=>n[0]||(n[0]=[o("简介")])),_:1})]),a("li",null,[s(e,{to:"#配置"},{default:t(()=>n[1]||(n[1]=[o("配置")])),_:1})]),a("li",null,[s(e,{to:"#基本用法"},{default:t(()=>n[2]||(n[2]=[o("基本用法")])),_:1}),a("ul",null,[a("li",null,[s(e,{to:"#哈希密码"},{default:t(()=>n[3]||(n[3]=[o("哈希密码")])),_:1})]),a("li",null,[s(e,{to:"#验证密码是否与哈希匹配"},{default:t(()=>n[4]||(n[4]=[o("验证密码是否与哈希匹配")])),_:1})]),a("li",null,[s(e,{to:"#检查密码是否需要重新散列-哈希"},{default:t(()=>n[5]||(n[5]=[o("检查密码是否需要重新散列 / 哈希")])),_:1})])])])])]),n[7]||(n[7]=r(`

简介

Goravel facades.Hash() 为存储用户密码提供了安全的 Argon2id 和 Bcrypt 哈希加密方式。如果你正在使用 Goravel 应用初始脚手架 ,默认情况下,将使用 Argon2id 进行注册和身份验证。

配置

你可以在 config/hashing.go 配置文件中配置默认哈希驱动程序。目前支持两种驱动程序: Bcrypt 和 Argon2id。

基本用法

哈希密码

你可以通过调用 facades.Hash()Make 方法来加密你的密码:

password, err := facades.Hash().Make(password)
 

验证密码是否与哈希匹配

Check 方法能为你验证一段给定的未加密字符串与给定的散列 / 哈希值是否一致:

if facades.Hash().Check("plain-text", hashedPassword) {
     // 密码匹配...
 }
diff --git a/assets/hashing.html-n8kDf70b.js b/assets/hashing.html-C0RYCNzD.js
similarity index 99%
rename from assets/hashing.html-n8kDf70b.js
rename to assets/hashing.html-C0RYCNzD.js
index 6c79656a..e07d862f 100644
--- a/assets/hashing.html-n8kDf70b.js
+++ b/assets/hashing.html-C0RYCNzD.js
@@ -1,4 +1,4 @@
-import{_ as p,c as l,b as s,e as n,f as t,a as c,r as i,o as d,d as o}from"./app-ELDWQP0J.js";const h={},u={class:"table-of-contents"};function g(f,a){const e=i("router-link"),r=i("CommentService");return d(),l("div",null,[a[6]||(a[6]=s("h1",{id:"hashing",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#hashing"},[s("span",null,"Hashing")])],-1)),s("nav",u,[s("ul",null,[s("li",null,[n(e,{to:"#introduction"},{default:t(()=>a[0]||(a[0]=[o("Introduction")])),_:1})]),s("li",null,[n(e,{to:"#configuration"},{default:t(()=>a[1]||(a[1]=[o("Configuration")])),_:1})]),s("li",null,[n(e,{to:"#basic-usage"},{default:t(()=>a[2]||(a[2]=[o("Basic Usage")])),_:1}),s("ul",null,[s("li",null,[n(e,{to:"#hashing-passwords"},{default:t(()=>a[3]||(a[3]=[o("Hashing Passwords")])),_:1})]),s("li",null,[n(e,{to:"#verifying-that-a-password-matches-a-hash"},{default:t(()=>a[4]||(a[4]=[o("Verifying That A Password Matches A Hash")])),_:1})]),s("li",null,[n(e,{to:"#determining-if-a-password-needs-to-be-rehashed"},{default:t(()=>a[5]||(a[5]=[o("Determining If A Password Needs To Be Rehashed")])),_:1})])])])])]),a[7]||(a[7]=c(`

Introduction

The Goravel facades.Hash() provides secure Argon2id and Bcrypt hashing for storing user passwords. If you are using one of the Goravel application starter kits, Argon2id will be used for registration and authentication by default.

Configuration

The default hashing driver for your application is configured in your application's config/hashing.go configuration file. There are currently several supported drivers: Argon2id and Bcrypt.

Basic Usage

Hashing Passwords

You may hash a password by calling the Make method on the facades.Hash():

password, err := facades.Hash().Make(password)
+import{_ as p,c as l,b as s,e as n,f as t,a as c,r as i,o as d,d as o}from"./app-Ewo6p9aM.js";const h={},u={class:"table-of-contents"};function g(f,a){const e=i("router-link"),r=i("CommentService");return d(),l("div",null,[a[6]||(a[6]=s("h1",{id:"hashing",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#hashing"},[s("span",null,"Hashing")])],-1)),s("nav",u,[s("ul",null,[s("li",null,[n(e,{to:"#introduction"},{default:t(()=>a[0]||(a[0]=[o("Introduction")])),_:1})]),s("li",null,[n(e,{to:"#configuration"},{default:t(()=>a[1]||(a[1]=[o("Configuration")])),_:1})]),s("li",null,[n(e,{to:"#basic-usage"},{default:t(()=>a[2]||(a[2]=[o("Basic Usage")])),_:1}),s("ul",null,[s("li",null,[n(e,{to:"#hashing-passwords"},{default:t(()=>a[3]||(a[3]=[o("Hashing Passwords")])),_:1})]),s("li",null,[n(e,{to:"#verifying-that-a-password-matches-a-hash"},{default:t(()=>a[4]||(a[4]=[o("Verifying That A Password Matches A Hash")])),_:1})]),s("li",null,[n(e,{to:"#determining-if-a-password-needs-to-be-rehashed"},{default:t(()=>a[5]||(a[5]=[o("Determining If A Password Needs To Be Rehashed")])),_:1})])])])])]),a[7]||(a[7]=c(`

Introduction

The Goravel facades.Hash() provides secure Argon2id and Bcrypt hashing for storing user passwords. If you are using one of the Goravel application starter kits, Argon2id will be used for registration and authentication by default.

Configuration

The default hashing driver for your application is configured in your application's config/hashing.go configuration file. There are currently several supported drivers: Argon2id and Bcrypt.

Basic Usage

Hashing Passwords

You may hash a password by calling the Make method on the facades.Hash():

password, err := facades.Hash().Make(password)
 

Verifying That A Password Matches A Hash

The Check method provided by the Hash facade allows you to verify that a given plain-text string corresponds to a given hash:

if facades.Hash().Check('plain-text', hashedPassword) {
     // The passwords match...
 }
diff --git a/assets/helpers.html-DZr1YU_I.js b/assets/helpers.html-Cq8AvWcV.js
similarity index 99%
rename from assets/helpers.html-DZr1YU_I.js
rename to assets/helpers.html-Cq8AvWcV.js
index f351991f..3cec7b42 100644
--- a/assets/helpers.html-DZr1YU_I.js
+++ b/assets/helpers.html-Cq8AvWcV.js
@@ -1,4 +1,4 @@
-import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},m={class:"table-of-contents"};function k(v,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[65]||(n[65]=s("h1",{id:"helpers",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#helpers"},[s("span",null,"Helpers")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[a(t,{to:"#available-methods"},{default:e(()=>n[0]||(n[0]=[p("Available Methods")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#paths"},{default:e(()=>n[1]||(n[1]=[p("Paths")])),_:1})]),s("li",null,[a(t,{to:"#time"},{default:e(()=>n[2]||(n[2]=[p("Time")])),_:1})]),s("li",null,[a(t,{to:"#debug"},{default:e(()=>n[3]||(n[3]=[p("Debug")])),_:1})]),s("li",null,[a(t,{to:"#maps"},{default:e(()=>n[4]||(n[4]=[p("Maps")])),_:1})]),s("li",null,[a(t,{to:"#convert"},{default:e(()=>n[5]||(n[5]=[p("Convert")])),_:1})]),s("li",null,[a(t,{to:"#collect"},{default:e(()=>n[6]||(n[6]=[p("Collect")])),_:1})])])]),s("li",null,[a(t,{to:"#paths-1"},{default:e(()=>n[7]||(n[7]=[p("Paths")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#path-app"},{default:e(()=>n[8]||(n[8]=[p("path.App()")])),_:1})]),s("li",null,[a(t,{to:"#path-base"},{default:e(()=>n[9]||(n[9]=[p("path.Base()")])),_:1})]),s("li",null,[a(t,{to:"#path-config"},{default:e(()=>n[10]||(n[10]=[p("path.Config()")])),_:1})]),s("li",null,[a(t,{to:"#path-database"},{default:e(()=>n[11]||(n[11]=[p("path.Database()")])),_:1})]),s("li",null,[a(t,{to:"#path-storage"},{default:e(()=>n[12]||(n[12]=[p("path.Storage()")])),_:1})]),s("li",null,[a(t,{to:"#path-public"},{default:e(()=>n[13]||(n[13]=[p("path.Public()")])),_:1})]),s("li",null,[a(t,{to:"#path-lang"},{default:e(()=>n[14]||(n[14]=[p("path.Lang()")])),_:1})])])]),s("li",null,[a(t,{to:"#time-1"},{default:e(()=>n[15]||(n[15]=[p("Time")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#carbon-now"},{default:e(()=>n[16]||(n[16]=[p("carbon.Now()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-settimezone"},{default:e(()=>n[17]||(n[17]=[p("carbon.SetTimezone()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-parse"},{default:e(()=>n[18]||(n[18]=[p("carbon.Parse()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromtimestamp"},{default:e(()=>n[19]||(n[19]=[p("carbon.FromTimestamp()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromdatetime"},{default:e(()=>n[20]||(n[20]=[p("carbon.FromDateTime()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromdate"},{default:e(()=>n[21]||(n[21]=[p("carbon.FromDate()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromtime"},{default:e(()=>n[22]||(n[22]=[p("carbon.FromTime()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromstdtime"},{default:e(()=>n[23]||(n[23]=[p("carbon.FromStdTime()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-istestnow"},{default:e(()=>n[24]||(n[24]=[p("carbon.IsTestNow()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-settestnow"},{default:e(()=>n[25]||(n[25]=[p("carbon.SetTestNow()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-unsettestnow"},{default:e(()=>n[26]||(n[26]=[p("carbon.UnsetTestNow()")])),_:1})])])]),s("li",null,[a(t,{to:"#debug-1"},{default:e(()=>n[27]||(n[27]=[p("Debug")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#debug-dump"},{default:e(()=>n[28]||(n[28]=[p("debug.Dump()")])),_:1})]),s("li",null,[a(t,{to:"#debug-fdump"},{default:e(()=>n[29]||(n[29]=[p("debug.FDump()")])),_:1})]),s("li",null,[a(t,{to:"#debug-sdump"},{default:e(()=>n[30]||(n[30]=[p("debug.SDump()")])),_:1})])])]),s("li",null,[a(t,{to:"#maps-1"},{default:e(()=>n[31]||(n[31]=[p("Maps")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#maps-add"},{default:e(()=>n[32]||(n[32]=[p("maps.Add()")])),_:1})]),s("li",null,[a(t,{to:"#maps-exists"},{default:e(()=>n[33]||(n[33]=[p("maps.Exists()")])),_:1})]),s("li",null,[a(t,{to:"#maps-forget"},{default:e(()=>n[34]||(n[34]=[p("maps.Forget()")])),_:1})]),s("li",null,[a(t,{to:"#maps-get"},{default:e(()=>n[35]||(n[35]=[p("maps.Get()")])),_:1})]),s("li",null,[a(t,{to:"#maps-has"},{default:e(()=>n[36]||(n[36]=[p("maps.Has()")])),_:1})]),s("li",null,[a(t,{to:"#maps-hasany"},{default:e(()=>n[37]||(n[37]=[p("maps.HasAny()")])),_:1})]),s("li",null,[a(t,{to:"#maps-only"},{default:e(()=>n[38]||(n[38]=[p("maps.Only()")])),_:1})]),s("li",null,[a(t,{to:"#maps-pull"},{default:e(()=>n[39]||(n[39]=[p("maps.Pull()")])),_:1})]),s("li",null,[a(t,{to:"#maps-set"},{default:e(()=>n[40]||(n[40]=[p("maps.Set()")])),_:1})]),s("li",null,[a(t,{to:"#maps-where"},{default:e(()=>n[41]||(n[41]=[p("maps.Where()")])),_:1})])])]),s("li",null,[a(t,{to:"#convert-1"},{default:e(()=>n[42]||(n[42]=[p("Convert")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#convert-tap"},{default:e(()=>n[43]||(n[43]=[p("convert.Tap()")])),_:1})]),s("li",null,[a(t,{to:"#convert-transform"},{default:e(()=>n[44]||(n[44]=[p("convert.Transform()")])),_:1})]),s("li",null,[a(t,{to:"#convert-with"},{default:e(()=>n[45]||(n[45]=[p("convert.With()")])),_:1})]),s("li",null,[a(t,{to:"#convert-default"},{default:e(()=>n[46]||(n[46]=[p("convert.Default()")])),_:1})]),s("li",null,[a(t,{to:"#convert-pointer"},{default:e(()=>n[47]||(n[47]=[p("convert.Pointer()")])),_:1})])])]),s("li",null,[a(t,{to:"#collect-1"},{default:e(()=>n[48]||(n[48]=[p("Collect")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#collect-count"},{default:e(()=>n[49]||(n[49]=[p("collect.Count()")])),_:1})]),s("li",null,[a(t,{to:"#collect-countby"},{default:e(()=>n[50]||(n[50]=[p("collect.CountBy()")])),_:1})]),s("li",null,[a(t,{to:"#collect-each"},{default:e(()=>n[51]||(n[51]=[p("collect.Each()")])),_:1})]),s("li",null,[a(t,{to:"#collect-filter"},{default:e(()=>n[52]||(n[52]=[p("collect.Filter()")])),_:1})]),s("li",null,[a(t,{to:"#collect-groupby"},{default:e(()=>n[53]||(n[53]=[p("collect.GroupBy()")])),_:1})]),s("li",null,[a(t,{to:"#collect-keys"},{default:e(()=>n[54]||(n[54]=[p("collect.Keys()")])),_:1})]),s("li",null,[a(t,{to:"#collect-map"},{default:e(()=>n[55]||(n[55]=[p("collect.Map()")])),_:1})]),s("li",null,[a(t,{to:"#collect-max"},{default:e(()=>n[56]||(n[56]=[p("collect.Max()")])),_:1})]),s("li",null,[a(t,{to:"#collect-merge"},{default:e(()=>n[57]||(n[57]=[p("collect.Merge()")])),_:1})]),s("li",null,[a(t,{to:"#collect-min"},{default:e(()=>n[58]||(n[58]=[p("collect.Min()")])),_:1})]),s("li",null,[a(t,{to:"#collect-reverse"},{default:e(()=>n[59]||(n[59]=[p("collect.Reverse()")])),_:1})]),s("li",null,[a(t,{to:"#collect-shuffle"},{default:e(()=>n[60]||(n[60]=[p("collect.Shuffle()")])),_:1})]),s("li",null,[a(t,{to:"#collect-split"},{default:e(()=>n[61]||(n[61]=[p("collect.Split()")])),_:1})]),s("li",null,[a(t,{to:"#collect-sum"},{default:e(()=>n[62]||(n[62]=[p("collect.Sum()")])),_:1})]),s("li",null,[a(t,{to:"#collect-unique"},{default:e(()=>n[63]||(n[63]=[p("collect.Unique()")])),_:1})]),s("li",null,[a(t,{to:"#collect-values"},{default:e(()=>n[64]||(n[64]=[p("collect.Values()")])),_:1})])])])])]),n[66]||(n[66]=u(`

Available Methods

Paths

path.App()path.Base()path.Config()
path.Database()path.Storage()path.Public()

Time

carbon.Now()carbon.SetTimezone()carbon.Parse()
carbon.FromTimestamp()carbon.FromDateTime()carbon.FromDate()
carbon.FromTime()carbon.FromStdTime()carbon.IsTestNow()
carbon.SetTestNow()carbon.UnsetTestNow()

Debug

debug.Dump()debug.SDump()debug.FDump()

Maps

maps.Add()maps.Exists()maps.Forget()
maps.Get()maps.Has()maps.HasAny()
maps.Only()maps.Pull()maps.Set()
maps.Where()

Convert

convert.Tap()convert.With()convert.Transform()
convert.Default()convert.Pointer()

Collect

collect.Count()collect.CountBy()collect.Each()
collect.Filter()collect.GroupBy()collect.Keys()
collect.Map()collect.Max()collect.Merge()
collect.Min()collect.Reverse()collect.Shuffle()
collect.Split()collect.Sum()collect.Unique()
collect.Values()

Paths

path.App()

The path.App() function returns the path to your application's app directory. You may also use the path.App() function to generate a path to a file relative to the application directory:

import "github.com/goravel/framework/support/path"
+import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},m={class:"table-of-contents"};function k(v,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[65]||(n[65]=s("h1",{id:"helpers",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#helpers"},[s("span",null,"Helpers")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[a(t,{to:"#available-methods"},{default:e(()=>n[0]||(n[0]=[p("Available Methods")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#paths"},{default:e(()=>n[1]||(n[1]=[p("Paths")])),_:1})]),s("li",null,[a(t,{to:"#time"},{default:e(()=>n[2]||(n[2]=[p("Time")])),_:1})]),s("li",null,[a(t,{to:"#debug"},{default:e(()=>n[3]||(n[3]=[p("Debug")])),_:1})]),s("li",null,[a(t,{to:"#maps"},{default:e(()=>n[4]||(n[4]=[p("Maps")])),_:1})]),s("li",null,[a(t,{to:"#convert"},{default:e(()=>n[5]||(n[5]=[p("Convert")])),_:1})]),s("li",null,[a(t,{to:"#collect"},{default:e(()=>n[6]||(n[6]=[p("Collect")])),_:1})])])]),s("li",null,[a(t,{to:"#paths-1"},{default:e(()=>n[7]||(n[7]=[p("Paths")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#path-app"},{default:e(()=>n[8]||(n[8]=[p("path.App()")])),_:1})]),s("li",null,[a(t,{to:"#path-base"},{default:e(()=>n[9]||(n[9]=[p("path.Base()")])),_:1})]),s("li",null,[a(t,{to:"#path-config"},{default:e(()=>n[10]||(n[10]=[p("path.Config()")])),_:1})]),s("li",null,[a(t,{to:"#path-database"},{default:e(()=>n[11]||(n[11]=[p("path.Database()")])),_:1})]),s("li",null,[a(t,{to:"#path-storage"},{default:e(()=>n[12]||(n[12]=[p("path.Storage()")])),_:1})]),s("li",null,[a(t,{to:"#path-public"},{default:e(()=>n[13]||(n[13]=[p("path.Public()")])),_:1})]),s("li",null,[a(t,{to:"#path-lang"},{default:e(()=>n[14]||(n[14]=[p("path.Lang()")])),_:1})])])]),s("li",null,[a(t,{to:"#time-1"},{default:e(()=>n[15]||(n[15]=[p("Time")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#carbon-now"},{default:e(()=>n[16]||(n[16]=[p("carbon.Now()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-settimezone"},{default:e(()=>n[17]||(n[17]=[p("carbon.SetTimezone()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-parse"},{default:e(()=>n[18]||(n[18]=[p("carbon.Parse()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromtimestamp"},{default:e(()=>n[19]||(n[19]=[p("carbon.FromTimestamp()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromdatetime"},{default:e(()=>n[20]||(n[20]=[p("carbon.FromDateTime()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromdate"},{default:e(()=>n[21]||(n[21]=[p("carbon.FromDate()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromtime"},{default:e(()=>n[22]||(n[22]=[p("carbon.FromTime()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromstdtime"},{default:e(()=>n[23]||(n[23]=[p("carbon.FromStdTime()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-istestnow"},{default:e(()=>n[24]||(n[24]=[p("carbon.IsTestNow()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-settestnow"},{default:e(()=>n[25]||(n[25]=[p("carbon.SetTestNow()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-unsettestnow"},{default:e(()=>n[26]||(n[26]=[p("carbon.UnsetTestNow()")])),_:1})])])]),s("li",null,[a(t,{to:"#debug-1"},{default:e(()=>n[27]||(n[27]=[p("Debug")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#debug-dump"},{default:e(()=>n[28]||(n[28]=[p("debug.Dump()")])),_:1})]),s("li",null,[a(t,{to:"#debug-fdump"},{default:e(()=>n[29]||(n[29]=[p("debug.FDump()")])),_:1})]),s("li",null,[a(t,{to:"#debug-sdump"},{default:e(()=>n[30]||(n[30]=[p("debug.SDump()")])),_:1})])])]),s("li",null,[a(t,{to:"#maps-1"},{default:e(()=>n[31]||(n[31]=[p("Maps")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#maps-add"},{default:e(()=>n[32]||(n[32]=[p("maps.Add()")])),_:1})]),s("li",null,[a(t,{to:"#maps-exists"},{default:e(()=>n[33]||(n[33]=[p("maps.Exists()")])),_:1})]),s("li",null,[a(t,{to:"#maps-forget"},{default:e(()=>n[34]||(n[34]=[p("maps.Forget()")])),_:1})]),s("li",null,[a(t,{to:"#maps-get"},{default:e(()=>n[35]||(n[35]=[p("maps.Get()")])),_:1})]),s("li",null,[a(t,{to:"#maps-has"},{default:e(()=>n[36]||(n[36]=[p("maps.Has()")])),_:1})]),s("li",null,[a(t,{to:"#maps-hasany"},{default:e(()=>n[37]||(n[37]=[p("maps.HasAny()")])),_:1})]),s("li",null,[a(t,{to:"#maps-only"},{default:e(()=>n[38]||(n[38]=[p("maps.Only()")])),_:1})]),s("li",null,[a(t,{to:"#maps-pull"},{default:e(()=>n[39]||(n[39]=[p("maps.Pull()")])),_:1})]),s("li",null,[a(t,{to:"#maps-set"},{default:e(()=>n[40]||(n[40]=[p("maps.Set()")])),_:1})]),s("li",null,[a(t,{to:"#maps-where"},{default:e(()=>n[41]||(n[41]=[p("maps.Where()")])),_:1})])])]),s("li",null,[a(t,{to:"#convert-1"},{default:e(()=>n[42]||(n[42]=[p("Convert")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#convert-tap"},{default:e(()=>n[43]||(n[43]=[p("convert.Tap()")])),_:1})]),s("li",null,[a(t,{to:"#convert-transform"},{default:e(()=>n[44]||(n[44]=[p("convert.Transform()")])),_:1})]),s("li",null,[a(t,{to:"#convert-with"},{default:e(()=>n[45]||(n[45]=[p("convert.With()")])),_:1})]),s("li",null,[a(t,{to:"#convert-default"},{default:e(()=>n[46]||(n[46]=[p("convert.Default()")])),_:1})]),s("li",null,[a(t,{to:"#convert-pointer"},{default:e(()=>n[47]||(n[47]=[p("convert.Pointer()")])),_:1})])])]),s("li",null,[a(t,{to:"#collect-1"},{default:e(()=>n[48]||(n[48]=[p("Collect")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#collect-count"},{default:e(()=>n[49]||(n[49]=[p("collect.Count()")])),_:1})]),s("li",null,[a(t,{to:"#collect-countby"},{default:e(()=>n[50]||(n[50]=[p("collect.CountBy()")])),_:1})]),s("li",null,[a(t,{to:"#collect-each"},{default:e(()=>n[51]||(n[51]=[p("collect.Each()")])),_:1})]),s("li",null,[a(t,{to:"#collect-filter"},{default:e(()=>n[52]||(n[52]=[p("collect.Filter()")])),_:1})]),s("li",null,[a(t,{to:"#collect-groupby"},{default:e(()=>n[53]||(n[53]=[p("collect.GroupBy()")])),_:1})]),s("li",null,[a(t,{to:"#collect-keys"},{default:e(()=>n[54]||(n[54]=[p("collect.Keys()")])),_:1})]),s("li",null,[a(t,{to:"#collect-map"},{default:e(()=>n[55]||(n[55]=[p("collect.Map()")])),_:1})]),s("li",null,[a(t,{to:"#collect-max"},{default:e(()=>n[56]||(n[56]=[p("collect.Max()")])),_:1})]),s("li",null,[a(t,{to:"#collect-merge"},{default:e(()=>n[57]||(n[57]=[p("collect.Merge()")])),_:1})]),s("li",null,[a(t,{to:"#collect-min"},{default:e(()=>n[58]||(n[58]=[p("collect.Min()")])),_:1})]),s("li",null,[a(t,{to:"#collect-reverse"},{default:e(()=>n[59]||(n[59]=[p("collect.Reverse()")])),_:1})]),s("li",null,[a(t,{to:"#collect-shuffle"},{default:e(()=>n[60]||(n[60]=[p("collect.Shuffle()")])),_:1})]),s("li",null,[a(t,{to:"#collect-split"},{default:e(()=>n[61]||(n[61]=[p("collect.Split()")])),_:1})]),s("li",null,[a(t,{to:"#collect-sum"},{default:e(()=>n[62]||(n[62]=[p("collect.Sum()")])),_:1})]),s("li",null,[a(t,{to:"#collect-unique"},{default:e(()=>n[63]||(n[63]=[p("collect.Unique()")])),_:1})]),s("li",null,[a(t,{to:"#collect-values"},{default:e(()=>n[64]||(n[64]=[p("collect.Values()")])),_:1})])])])])]),n[66]||(n[66]=u(`

Available Methods

Paths

path.App()path.Base()path.Config()
path.Database()path.Storage()path.Public()

Time

carbon.Now()carbon.SetTimezone()carbon.Parse()
carbon.FromTimestamp()carbon.FromDateTime()carbon.FromDate()
carbon.FromTime()carbon.FromStdTime()carbon.IsTestNow()
carbon.SetTestNow()carbon.UnsetTestNow()

Debug

debug.Dump()debug.SDump()debug.FDump()

Maps

maps.Add()maps.Exists()maps.Forget()
maps.Get()maps.Has()maps.HasAny()
maps.Only()maps.Pull()maps.Set()
maps.Where()

Convert

convert.Tap()convert.With()convert.Transform()
convert.Default()convert.Pointer()

Collect

collect.Count()collect.CountBy()collect.Each()
collect.Filter()collect.GroupBy()collect.Keys()
collect.Map()collect.Max()collect.Merge()
collect.Min()collect.Reverse()collect.Shuffle()
collect.Split()collect.Sum()collect.Unique()
collect.Values()

Paths

path.App()

The path.App() function returns the path to your application's app directory. You may also use the path.App() function to generate a path to a file relative to the application directory:

import "github.com/goravel/framework/support/path"
 
 path := path.App()
 path := path.App("http/controllers/controller.go")
diff --git a/assets/helpers.html-BP2SsPZW.js b/assets/helpers.html-DUXpw1q9.js
similarity index 99%
rename from assets/helpers.html-BP2SsPZW.js
rename to assets/helpers.html-DUXpw1q9.js
index 8b619451..9b2a7a79 100644
--- a/assets/helpers.html-BP2SsPZW.js
+++ b/assets/helpers.html-DUXpw1q9.js
@@ -1,4 +1,4 @@
-import{_ as c,c as i,b as s,e as a,f as e,a as u,r as l,o as r,d as p}from"./app-ELDWQP0J.js";const d={},m={class:"table-of-contents"};function k(v,n){const t=l("router-link"),o=l("CommentService");return r(),i("div",null,[n[65]||(n[65]=s("h1",{id:"辅助函数",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#辅助函数"},[s("span",null,"辅助函数")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[a(t,{to:"#可用方法"},{default:e(()=>n[0]||(n[0]=[p("可用方法")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#路径"},{default:e(()=>n[1]||(n[1]=[p("路径")])),_:1})]),s("li",null,[a(t,{to:"#时间"},{default:e(()=>n[2]||(n[2]=[p("时间")])),_:1})]),s("li",null,[a(t,{to:"#debug"},{default:e(()=>n[3]||(n[3]=[p("Debug")])),_:1})]),s("li",null,[a(t,{to:"#maps"},{default:e(()=>n[4]||(n[4]=[p("Maps")])),_:1})]),s("li",null,[a(t,{to:"#convert"},{default:e(()=>n[5]||(n[5]=[p("Convert")])),_:1})]),s("li",null,[a(t,{to:"#collect"},{default:e(()=>n[6]||(n[6]=[p("Collect")])),_:1})])])]),s("li",null,[a(t,{to:"#路径-1"},{default:e(()=>n[7]||(n[7]=[p("路径")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#path-app"},{default:e(()=>n[8]||(n[8]=[p("path.App()")])),_:1})]),s("li",null,[a(t,{to:"#path-base"},{default:e(()=>n[9]||(n[9]=[p("path.Base()")])),_:1})]),s("li",null,[a(t,{to:"#path-config"},{default:e(()=>n[10]||(n[10]=[p("path.Config()")])),_:1})]),s("li",null,[a(t,{to:"#path-database"},{default:e(()=>n[11]||(n[11]=[p("path.Database()")])),_:1})]),s("li",null,[a(t,{to:"#path-storage"},{default:e(()=>n[12]||(n[12]=[p("path.Storage()")])),_:1})]),s("li",null,[a(t,{to:"#path-public"},{default:e(()=>n[13]||(n[13]=[p("path.Public()")])),_:1})]),s("li",null,[a(t,{to:"#path-lang"},{default:e(()=>n[14]||(n[14]=[p("path.Lang()")])),_:1})])])]),s("li",null,[a(t,{to:"#时间-1"},{default:e(()=>n[15]||(n[15]=[p("时间")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#carbon-now"},{default:e(()=>n[16]||(n[16]=[p("carbon.Now()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-settimezone"},{default:e(()=>n[17]||(n[17]=[p("carbon.SetTimezone()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-parse"},{default:e(()=>n[18]||(n[18]=[p("carbon.Parse()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromtimestamp"},{default:e(()=>n[19]||(n[19]=[p("carbon.FromTimestamp()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromdatetime"},{default:e(()=>n[20]||(n[20]=[p("carbon.FromDateTime()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromdate"},{default:e(()=>n[21]||(n[21]=[p("carbon.FromDate()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromtime"},{default:e(()=>n[22]||(n[22]=[p("carbon.FromTime()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromstdtime"},{default:e(()=>n[23]||(n[23]=[p("carbon.FromStdTime()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-istestnow"},{default:e(()=>n[24]||(n[24]=[p("carbon.IsTestNow()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-settestnow"},{default:e(()=>n[25]||(n[25]=[p("carbon.SetTestNow()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-unsettestnow"},{default:e(()=>n[26]||(n[26]=[p("carbon.UnsetTestNow()")])),_:1})])])]),s("li",null,[a(t,{to:"#debug-1"},{default:e(()=>n[27]||(n[27]=[p("Debug")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#debug-dump"},{default:e(()=>n[28]||(n[28]=[p("debug.Dump()")])),_:1})]),s("li",null,[a(t,{to:"#debug-fdump"},{default:e(()=>n[29]||(n[29]=[p("debug.FDump()")])),_:1})]),s("li",null,[a(t,{to:"#debug-sdump"},{default:e(()=>n[30]||(n[30]=[p("debug.SDump()")])),_:1})])])]),s("li",null,[a(t,{to:"#maps-1"},{default:e(()=>n[31]||(n[31]=[p("Maps")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#maps-add"},{default:e(()=>n[32]||(n[32]=[p("maps.Add()")])),_:1})]),s("li",null,[a(t,{to:"#maps-exists"},{default:e(()=>n[33]||(n[33]=[p("maps.Exists()")])),_:1})]),s("li",null,[a(t,{to:"#maps-forget"},{default:e(()=>n[34]||(n[34]=[p("maps.Forget()")])),_:1})]),s("li",null,[a(t,{to:"#maps-get"},{default:e(()=>n[35]||(n[35]=[p("maps.Get()")])),_:1})]),s("li",null,[a(t,{to:"#maps-has"},{default:e(()=>n[36]||(n[36]=[p("maps.Has()")])),_:1})]),s("li",null,[a(t,{to:"#maps-hasany"},{default:e(()=>n[37]||(n[37]=[p("maps.HasAny()")])),_:1})]),s("li",null,[a(t,{to:"#maps-only"},{default:e(()=>n[38]||(n[38]=[p("maps.Only()")])),_:1})]),s("li",null,[a(t,{to:"#maps-pull"},{default:e(()=>n[39]||(n[39]=[p("maps.Pull()")])),_:1})]),s("li",null,[a(t,{to:"#maps-set"},{default:e(()=>n[40]||(n[40]=[p("maps.Set()")])),_:1})]),s("li",null,[a(t,{to:"#maps-where"},{default:e(()=>n[41]||(n[41]=[p("maps.Where()")])),_:1})])])]),s("li",null,[a(t,{to:"#convert-1"},{default:e(()=>n[42]||(n[42]=[p("Convert")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#convert-tap"},{default:e(()=>n[43]||(n[43]=[p("convert.Tap()")])),_:1})]),s("li",null,[a(t,{to:"#convert-transform"},{default:e(()=>n[44]||(n[44]=[p("convert.Transform()")])),_:1})]),s("li",null,[a(t,{to:"#convert-with"},{default:e(()=>n[45]||(n[45]=[p("convert.With()")])),_:1})]),s("li",null,[a(t,{to:"#convert-default"},{default:e(()=>n[46]||(n[46]=[p("convert.Default()")])),_:1})]),s("li",null,[a(t,{to:"#convert-pointer"},{default:e(()=>n[47]||(n[47]=[p("convert.Pointer()")])),_:1})])])]),s("li",null,[a(t,{to:"#collect-1"},{default:e(()=>n[48]||(n[48]=[p("Collect")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#collect-count"},{default:e(()=>n[49]||(n[49]=[p("collect.Count()")])),_:1})]),s("li",null,[a(t,{to:"#collect-countby"},{default:e(()=>n[50]||(n[50]=[p("collect.CountBy()")])),_:1})]),s("li",null,[a(t,{to:"#collect-each"},{default:e(()=>n[51]||(n[51]=[p("collect.Each()")])),_:1})]),s("li",null,[a(t,{to:"#collect-filter"},{default:e(()=>n[52]||(n[52]=[p("collect.Filter()")])),_:1})]),s("li",null,[a(t,{to:"#collect-groupby"},{default:e(()=>n[53]||(n[53]=[p("collect.GroupBy()")])),_:1})]),s("li",null,[a(t,{to:"#collect-keys"},{default:e(()=>n[54]||(n[54]=[p("collect.Keys()")])),_:1})]),s("li",null,[a(t,{to:"#collect-map"},{default:e(()=>n[55]||(n[55]=[p("collect.Map()")])),_:1})]),s("li",null,[a(t,{to:"#collect-max"},{default:e(()=>n[56]||(n[56]=[p("collect.Max()")])),_:1})]),s("li",null,[a(t,{to:"#collect-merge"},{default:e(()=>n[57]||(n[57]=[p("collect.Merge()")])),_:1})]),s("li",null,[a(t,{to:"#collect-min"},{default:e(()=>n[58]||(n[58]=[p("collect.Min()")])),_:1})]),s("li",null,[a(t,{to:"#collect-reverse"},{default:e(()=>n[59]||(n[59]=[p("collect.Reverse()")])),_:1})]),s("li",null,[a(t,{to:"#collect-shuffle"},{default:e(()=>n[60]||(n[60]=[p("collect.Shuffle()")])),_:1})]),s("li",null,[a(t,{to:"#collect-split"},{default:e(()=>n[61]||(n[61]=[p("collect.Split()")])),_:1})]),s("li",null,[a(t,{to:"#collect-sum"},{default:e(()=>n[62]||(n[62]=[p("collect.Sum()")])),_:1})]),s("li",null,[a(t,{to:"#collect-unique"},{default:e(()=>n[63]||(n[63]=[p("collect.Unique()")])),_:1})]),s("li",null,[a(t,{to:"#collect-values"},{default:e(()=>n[64]||(n[64]=[p("collect.Values()")])),_:1})])])])])]),n[66]||(n[66]=u(`

可用方法

路径

path.App()path.Base()path.Config()
path.Database()path.Storage()path.Public()

时间

carbon.Now()carbon.SetTimezone()carbon.Parse()
carbon.FromTimestamp()carbon.FromDateTime()carbon.FromDate()
carbon.FromTime()carbon.FromStdTime()carbon.IsTestNow()
carbon.SetTestNow()carbon.UnsetTestNow()

Debug

debug.Dump()debug.SDump()debug.FDump()

Maps

maps.Add()maps.Exists()maps.Forget()
maps.Get()maps.Has()maps.HasAny()
maps.Only()maps.Pull()maps.Set()
maps.Where()

Convert

convert.Tap()convert.With()convert.Transform()
convert.Default()convert.Pointer()

Collect

collect.Count()collect.CountBy()collect.Each()
collect.Filter()collect.GroupBy()collect.Keys()
collect.Map()collect.Max()collect.Merge()
collect.Min()collect.Reverse()collect.Shuffle()
collect.Split()collect.Sum()collect.Unique()
collect.Values()

路径

path.App()

path.App() 函数返回 app 目录的路径。您也可以用来生成应用目录下特定文件的路径:

import "github.com/goravel/framework/support/path"
+import{_ as c,c as i,b as s,e as a,f as e,a as u,r as l,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},m={class:"table-of-contents"};function k(v,n){const t=l("router-link"),o=l("CommentService");return r(),i("div",null,[n[65]||(n[65]=s("h1",{id:"辅助函数",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#辅助函数"},[s("span",null,"辅助函数")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[a(t,{to:"#可用方法"},{default:e(()=>n[0]||(n[0]=[p("可用方法")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#路径"},{default:e(()=>n[1]||(n[1]=[p("路径")])),_:1})]),s("li",null,[a(t,{to:"#时间"},{default:e(()=>n[2]||(n[2]=[p("时间")])),_:1})]),s("li",null,[a(t,{to:"#debug"},{default:e(()=>n[3]||(n[3]=[p("Debug")])),_:1})]),s("li",null,[a(t,{to:"#maps"},{default:e(()=>n[4]||(n[4]=[p("Maps")])),_:1})]),s("li",null,[a(t,{to:"#convert"},{default:e(()=>n[5]||(n[5]=[p("Convert")])),_:1})]),s("li",null,[a(t,{to:"#collect"},{default:e(()=>n[6]||(n[6]=[p("Collect")])),_:1})])])]),s("li",null,[a(t,{to:"#路径-1"},{default:e(()=>n[7]||(n[7]=[p("路径")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#path-app"},{default:e(()=>n[8]||(n[8]=[p("path.App()")])),_:1})]),s("li",null,[a(t,{to:"#path-base"},{default:e(()=>n[9]||(n[9]=[p("path.Base()")])),_:1})]),s("li",null,[a(t,{to:"#path-config"},{default:e(()=>n[10]||(n[10]=[p("path.Config()")])),_:1})]),s("li",null,[a(t,{to:"#path-database"},{default:e(()=>n[11]||(n[11]=[p("path.Database()")])),_:1})]),s("li",null,[a(t,{to:"#path-storage"},{default:e(()=>n[12]||(n[12]=[p("path.Storage()")])),_:1})]),s("li",null,[a(t,{to:"#path-public"},{default:e(()=>n[13]||(n[13]=[p("path.Public()")])),_:1})]),s("li",null,[a(t,{to:"#path-lang"},{default:e(()=>n[14]||(n[14]=[p("path.Lang()")])),_:1})])])]),s("li",null,[a(t,{to:"#时间-1"},{default:e(()=>n[15]||(n[15]=[p("时间")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#carbon-now"},{default:e(()=>n[16]||(n[16]=[p("carbon.Now()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-settimezone"},{default:e(()=>n[17]||(n[17]=[p("carbon.SetTimezone()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-parse"},{default:e(()=>n[18]||(n[18]=[p("carbon.Parse()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromtimestamp"},{default:e(()=>n[19]||(n[19]=[p("carbon.FromTimestamp()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromdatetime"},{default:e(()=>n[20]||(n[20]=[p("carbon.FromDateTime()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromdate"},{default:e(()=>n[21]||(n[21]=[p("carbon.FromDate()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromtime"},{default:e(()=>n[22]||(n[22]=[p("carbon.FromTime()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-fromstdtime"},{default:e(()=>n[23]||(n[23]=[p("carbon.FromStdTime()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-istestnow"},{default:e(()=>n[24]||(n[24]=[p("carbon.IsTestNow()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-settestnow"},{default:e(()=>n[25]||(n[25]=[p("carbon.SetTestNow()")])),_:1})]),s("li",null,[a(t,{to:"#carbon-unsettestnow"},{default:e(()=>n[26]||(n[26]=[p("carbon.UnsetTestNow()")])),_:1})])])]),s("li",null,[a(t,{to:"#debug-1"},{default:e(()=>n[27]||(n[27]=[p("Debug")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#debug-dump"},{default:e(()=>n[28]||(n[28]=[p("debug.Dump()")])),_:1})]),s("li",null,[a(t,{to:"#debug-fdump"},{default:e(()=>n[29]||(n[29]=[p("debug.FDump()")])),_:1})]),s("li",null,[a(t,{to:"#debug-sdump"},{default:e(()=>n[30]||(n[30]=[p("debug.SDump()")])),_:1})])])]),s("li",null,[a(t,{to:"#maps-1"},{default:e(()=>n[31]||(n[31]=[p("Maps")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#maps-add"},{default:e(()=>n[32]||(n[32]=[p("maps.Add()")])),_:1})]),s("li",null,[a(t,{to:"#maps-exists"},{default:e(()=>n[33]||(n[33]=[p("maps.Exists()")])),_:1})]),s("li",null,[a(t,{to:"#maps-forget"},{default:e(()=>n[34]||(n[34]=[p("maps.Forget()")])),_:1})]),s("li",null,[a(t,{to:"#maps-get"},{default:e(()=>n[35]||(n[35]=[p("maps.Get()")])),_:1})]),s("li",null,[a(t,{to:"#maps-has"},{default:e(()=>n[36]||(n[36]=[p("maps.Has()")])),_:1})]),s("li",null,[a(t,{to:"#maps-hasany"},{default:e(()=>n[37]||(n[37]=[p("maps.HasAny()")])),_:1})]),s("li",null,[a(t,{to:"#maps-only"},{default:e(()=>n[38]||(n[38]=[p("maps.Only()")])),_:1})]),s("li",null,[a(t,{to:"#maps-pull"},{default:e(()=>n[39]||(n[39]=[p("maps.Pull()")])),_:1})]),s("li",null,[a(t,{to:"#maps-set"},{default:e(()=>n[40]||(n[40]=[p("maps.Set()")])),_:1})]),s("li",null,[a(t,{to:"#maps-where"},{default:e(()=>n[41]||(n[41]=[p("maps.Where()")])),_:1})])])]),s("li",null,[a(t,{to:"#convert-1"},{default:e(()=>n[42]||(n[42]=[p("Convert")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#convert-tap"},{default:e(()=>n[43]||(n[43]=[p("convert.Tap()")])),_:1})]),s("li",null,[a(t,{to:"#convert-transform"},{default:e(()=>n[44]||(n[44]=[p("convert.Transform()")])),_:1})]),s("li",null,[a(t,{to:"#convert-with"},{default:e(()=>n[45]||(n[45]=[p("convert.With()")])),_:1})]),s("li",null,[a(t,{to:"#convert-default"},{default:e(()=>n[46]||(n[46]=[p("convert.Default()")])),_:1})]),s("li",null,[a(t,{to:"#convert-pointer"},{default:e(()=>n[47]||(n[47]=[p("convert.Pointer()")])),_:1})])])]),s("li",null,[a(t,{to:"#collect-1"},{default:e(()=>n[48]||(n[48]=[p("Collect")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#collect-count"},{default:e(()=>n[49]||(n[49]=[p("collect.Count()")])),_:1})]),s("li",null,[a(t,{to:"#collect-countby"},{default:e(()=>n[50]||(n[50]=[p("collect.CountBy()")])),_:1})]),s("li",null,[a(t,{to:"#collect-each"},{default:e(()=>n[51]||(n[51]=[p("collect.Each()")])),_:1})]),s("li",null,[a(t,{to:"#collect-filter"},{default:e(()=>n[52]||(n[52]=[p("collect.Filter()")])),_:1})]),s("li",null,[a(t,{to:"#collect-groupby"},{default:e(()=>n[53]||(n[53]=[p("collect.GroupBy()")])),_:1})]),s("li",null,[a(t,{to:"#collect-keys"},{default:e(()=>n[54]||(n[54]=[p("collect.Keys()")])),_:1})]),s("li",null,[a(t,{to:"#collect-map"},{default:e(()=>n[55]||(n[55]=[p("collect.Map()")])),_:1})]),s("li",null,[a(t,{to:"#collect-max"},{default:e(()=>n[56]||(n[56]=[p("collect.Max()")])),_:1})]),s("li",null,[a(t,{to:"#collect-merge"},{default:e(()=>n[57]||(n[57]=[p("collect.Merge()")])),_:1})]),s("li",null,[a(t,{to:"#collect-min"},{default:e(()=>n[58]||(n[58]=[p("collect.Min()")])),_:1})]),s("li",null,[a(t,{to:"#collect-reverse"},{default:e(()=>n[59]||(n[59]=[p("collect.Reverse()")])),_:1})]),s("li",null,[a(t,{to:"#collect-shuffle"},{default:e(()=>n[60]||(n[60]=[p("collect.Shuffle()")])),_:1})]),s("li",null,[a(t,{to:"#collect-split"},{default:e(()=>n[61]||(n[61]=[p("collect.Split()")])),_:1})]),s("li",null,[a(t,{to:"#collect-sum"},{default:e(()=>n[62]||(n[62]=[p("collect.Sum()")])),_:1})]),s("li",null,[a(t,{to:"#collect-unique"},{default:e(()=>n[63]||(n[63]=[p("collect.Unique()")])),_:1})]),s("li",null,[a(t,{to:"#collect-values"},{default:e(()=>n[64]||(n[64]=[p("collect.Values()")])),_:1})])])])])]),n[66]||(n[66]=u(`

可用方法

路径

path.App()path.Base()path.Config()
path.Database()path.Storage()path.Public()

时间

carbon.Now()carbon.SetTimezone()carbon.Parse()
carbon.FromTimestamp()carbon.FromDateTime()carbon.FromDate()
carbon.FromTime()carbon.FromStdTime()carbon.IsTestNow()
carbon.SetTestNow()carbon.UnsetTestNow()

Debug

debug.Dump()debug.SDump()debug.FDump()

Maps

maps.Add()maps.Exists()maps.Forget()
maps.Get()maps.Has()maps.HasAny()
maps.Only()maps.Pull()maps.Set()
maps.Where()

Convert

convert.Tap()convert.With()convert.Transform()
convert.Default()convert.Pointer()

Collect

collect.Count()collect.CountBy()collect.Each()
collect.Filter()collect.GroupBy()collect.Keys()
collect.Map()collect.Max()collect.Merge()
collect.Min()collect.Reverse()collect.Shuffle()
collect.Split()collect.Sum()collect.Unique()
collect.Values()

路径

path.App()

path.App() 函数返回 app 目录的路径。您也可以用来生成应用目录下特定文件的路径:

import "github.com/goravel/framework/support/path"
 
 path := path.App()
 path := path.App("http/controllers/controller.go")
diff --git a/assets/history.html-fNToLLSU.js b/assets/history.html-B2eZNqyp.js
similarity index 97%
rename from assets/history.html-fNToLLSU.js
rename to assets/history.html-B2eZNqyp.js
index d50c2f05..52e60e9b 100644
--- a/assets/history.html-fNToLLSU.js
+++ b/assets/history.html-B2eZNqyp.js
@@ -1 +1 @@
-import{_ as n,c as d,b as r,e as o,f as l,r as p,o as i,d as a}from"./app-ELDWQP0J.js";const g={};function u(m,t){const e=p("RouteLink");return i(),d("div",null,[t[12]||(t[12]=r("h1",{id:"history-upgrade",tabindex:"-1"},[r("a",{class:"header-anchor",href:"#history-upgrade"},[r("span",null,"History Upgrade")])],-1)),r("ul",null,[r("li",null,[o(e,{to:"/upgrade/v1.12.html"},{default:l(()=>t[0]||(t[0]=[a("Upgrading To v1.12 From v1.11")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.11.html"},{default:l(()=>t[1]||(t[1]=[a("Upgrading To v1.11 From v1.10")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.10.html"},{default:l(()=>t[2]||(t[2]=[a("Upgrading To v1.10 From v1.9")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.9.html"},{default:l(()=>t[3]||(t[3]=[a("Upgrading To v1.9 From v1.8")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.8.html"},{default:l(()=>t[4]||(t[4]=[a("Upgrading To v1.8 From v1.7")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.7.html"},{default:l(()=>t[5]||(t[5]=[a("Upgrading To v1.7 From v1.6")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.6.html"},{default:l(()=>t[6]||(t[6]=[a("Upgrading To v1.6 From v1.5")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.5.html"},{default:l(()=>t[7]||(t[7]=[a("Upgrading To v1.5 From v1.4")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.4.html"},{default:l(()=>t[8]||(t[8]=[a("Upgrading To v1.4 From v1.3")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.3.html"},{default:l(()=>t[9]||(t[9]=[a("Upgrading To v1.3 From v1.2")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.2.html"},{default:l(()=>t[10]||(t[10]=[a("Upgrading To v1.2 From v1.1")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.1.html"},{default:l(()=>t[11]||(t[11]=[a("Upgrading To v1.1 From v1.0")])),_:1})])])])}const v=n(g,[["render",u],["__file","history.html.vue"]]),f=JSON.parse('{"path":"/upgrade/history.html","title":"History Upgrade","lang":"en-US","frontmatter":{"description":"History Upgrade","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/upgrade/history.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/upgrade/history.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/history.html"}],["meta",{"property":"og:description","content":"History Upgrade"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"History Upgrade\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"upgrade/history.md","autoDesc":true}');export{v as comp,f as data};
+import{_ as n,c as d,b as r,e as o,f as l,r as p,o as i,d as a}from"./app-Ewo6p9aM.js";const g={};function u(m,t){const e=p("RouteLink");return i(),d("div",null,[t[12]||(t[12]=r("h1",{id:"history-upgrade",tabindex:"-1"},[r("a",{class:"header-anchor",href:"#history-upgrade"},[r("span",null,"History Upgrade")])],-1)),r("ul",null,[r("li",null,[o(e,{to:"/upgrade/v1.12.html"},{default:l(()=>t[0]||(t[0]=[a("Upgrading To v1.12 From v1.11")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.11.html"},{default:l(()=>t[1]||(t[1]=[a("Upgrading To v1.11 From v1.10")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.10.html"},{default:l(()=>t[2]||(t[2]=[a("Upgrading To v1.10 From v1.9")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.9.html"},{default:l(()=>t[3]||(t[3]=[a("Upgrading To v1.9 From v1.8")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.8.html"},{default:l(()=>t[4]||(t[4]=[a("Upgrading To v1.8 From v1.7")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.7.html"},{default:l(()=>t[5]||(t[5]=[a("Upgrading To v1.7 From v1.6")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.6.html"},{default:l(()=>t[6]||(t[6]=[a("Upgrading To v1.6 From v1.5")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.5.html"},{default:l(()=>t[7]||(t[7]=[a("Upgrading To v1.5 From v1.4")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.4.html"},{default:l(()=>t[8]||(t[8]=[a("Upgrading To v1.4 From v1.3")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.3.html"},{default:l(()=>t[9]||(t[9]=[a("Upgrading To v1.3 From v1.2")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.2.html"},{default:l(()=>t[10]||(t[10]=[a("Upgrading To v1.2 From v1.1")])),_:1})]),r("li",null,[o(e,{to:"/upgrade/v1.1.html"},{default:l(()=>t[11]||(t[11]=[a("Upgrading To v1.1 From v1.0")])),_:1})])])])}const v=n(g,[["render",u],["__file","history.html.vue"]]),f=JSON.parse('{"path":"/upgrade/history.html","title":"History Upgrade","lang":"en-US","frontmatter":{"description":"History Upgrade","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/upgrade/history.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/upgrade/history.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/history.html"}],["meta",{"property":"og:description","content":"History Upgrade"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"History Upgrade\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"upgrade/history.md","autoDesc":true}');export{v as comp,f as data};
diff --git a/assets/history.html-DHMt6lzE.js b/assets/history.html-D3fbw5gF.js
similarity index 97%
rename from assets/history.html-DHMt6lzE.js
rename to assets/history.html-D3fbw5gF.js
index b6e34d70..1954bf5f 100644
--- a/assets/history.html-DHMt6lzE.js
+++ b/assets/history.html-D3fbw5gF.js
@@ -1 +1 @@
-import{_ as a,c as u,b as e,e as o,f as r,r as d,o as p,d as n}from"./app-ELDWQP0J.js";const i={};function v(s,t){const l=d("RouteLink");return p(),u("div",null,[t[12]||(t[12]=e("h1",{id:"历史版本升级",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#历史版本升级"},[e("span",null,"历史版本升级")])],-1)),e("ul",null,[e("li",null,[o(l,{to:"/zh/upgrade/v1.12.html"},{default:r(()=>t[0]||(t[0]=[n("从 v1.11 升级到 v1.12")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.11.html"},{default:r(()=>t[1]||(t[1]=[n("从 v1.10 升级到 v1.11")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.10.html"},{default:r(()=>t[2]||(t[2]=[n("从 v1.9 升级到 v1.10")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.9.html"},{default:r(()=>t[3]||(t[3]=[n("从 v1.8 升级到 v1.9")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.8.html"},{default:r(()=>t[4]||(t[4]=[n("从 v1.7 升级到 v1.8")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.7.html"},{default:r(()=>t[5]||(t[5]=[n("从 v1.6 升级到 v1.7")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.6.html"},{default:r(()=>t[6]||(t[6]=[n("从 v1.5 升级到 v1.6")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.5.html"},{default:r(()=>t[7]||(t[7]=[n("从 v1.4 升级到 v1.5")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.4.html"},{default:r(()=>t[8]||(t[8]=[n("从 v1.3 升级到 v1.4")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.3.html"},{default:r(()=>t[9]||(t[9]=[n("从 v1.2 升级到 v1.3")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.2.html"},{default:r(()=>t[10]||(t[10]=[n("从 v1.1 升级到 v1.2")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.1.html"},{default:r(()=>t[11]||(t[11]=[n("从 v1.0 升级到 v1.1")])),_:1})])])])}const h=a(i,[["render",v],["__file","history.html.vue"]]),g=JSON.parse('{"path":"/zh/upgrade/history.html","title":"历史版本升级","lang":"zh-CN","frontmatter":{"description":"历史版本升级","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/upgrade/history.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/upgrade/history.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/history.html"}],["meta",{"property":"og:description","content":"历史版本升级"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"历史版本升级\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/upgrade/history.md","autoDesc":true}');export{h as comp,g as data};
+import{_ as a,c as u,b as e,e as o,f as r,r as d,o as p,d as n}from"./app-Ewo6p9aM.js";const i={};function v(s,t){const l=d("RouteLink");return p(),u("div",null,[t[12]||(t[12]=e("h1",{id:"历史版本升级",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#历史版本升级"},[e("span",null,"历史版本升级")])],-1)),e("ul",null,[e("li",null,[o(l,{to:"/zh/upgrade/v1.12.html"},{default:r(()=>t[0]||(t[0]=[n("从 v1.11 升级到 v1.12")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.11.html"},{default:r(()=>t[1]||(t[1]=[n("从 v1.10 升级到 v1.11")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.10.html"},{default:r(()=>t[2]||(t[2]=[n("从 v1.9 升级到 v1.10")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.9.html"},{default:r(()=>t[3]||(t[3]=[n("从 v1.8 升级到 v1.9")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.8.html"},{default:r(()=>t[4]||(t[4]=[n("从 v1.7 升级到 v1.8")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.7.html"},{default:r(()=>t[5]||(t[5]=[n("从 v1.6 升级到 v1.7")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.6.html"},{default:r(()=>t[6]||(t[6]=[n("从 v1.5 升级到 v1.6")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.5.html"},{default:r(()=>t[7]||(t[7]=[n("从 v1.4 升级到 v1.5")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.4.html"},{default:r(()=>t[8]||(t[8]=[n("从 v1.3 升级到 v1.4")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.3.html"},{default:r(()=>t[9]||(t[9]=[n("从 v1.2 升级到 v1.3")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.2.html"},{default:r(()=>t[10]||(t[10]=[n("从 v1.1 升级到 v1.2")])),_:1})]),e("li",null,[o(l,{to:"/zh/upgrade/v1.1.html"},{default:r(()=>t[11]||(t[11]=[n("从 v1.0 升级到 v1.1")])),_:1})])])])}const h=a(i,[["render",v],["__file","history.html.vue"]]),g=JSON.parse('{"path":"/zh/upgrade/history.html","title":"历史版本升级","lang":"zh-CN","frontmatter":{"description":"历史版本升级","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/upgrade/history.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/upgrade/history.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/history.html"}],["meta",{"property":"og:description","content":"历史版本升级"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"历史版本升级\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/upgrade/history.md","autoDesc":true}');export{h as comp,g as data};
diff --git a/assets/http-tests.html-B-d0DuGG.js b/assets/http-tests.html-Ce3n6X9u.js
similarity index 99%
rename from assets/http-tests.html-B-d0DuGG.js
rename to assets/http-tests.html-Ce3n6X9u.js
index 94d89538..c36415d5 100644
--- a/assets/http-tests.html-B-d0DuGG.js
+++ b/assets/http-tests.html-Ce3n6X9u.js
@@ -1,4 +1,4 @@
-import{_ as l,c,b as n,e as a,f as t,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function h(m,s){const e=o("router-link"),i=o("CommentService");return r(),c("div",null,[s[53]||(s[53]=n("h1",{id:"http-tests",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#http-tests"},[n("span",null,"HTTP Tests")])],-1)),n("nav",k,[n("ul",null,[n("li",null,[a(e,{to:"#introduction"},{default:t(()=>s[0]||(s[0]=[p("Introduction")])),_:1})]),n("li",null,[a(e,{to:"#make-requests"},{default:t(()=>s[1]||(s[1]=[p("Make Requests")])),_:1}),n("ul",null,[n("li",null,[a(e,{to:"#customize-request-headers"},{default:t(()=>s[2]||(s[2]=[p("Customize Request Headers")])),_:1})]),n("li",null,[a(e,{to:"#cookies"},{default:t(()=>s[3]||(s[3]=[p("Cookies")])),_:1})]),n("li",null,[a(e,{to:"#withsession"},{default:t(()=>s[4]||(s[4]=[p("WithSession")])),_:1})]),n("li",null,[a(e,{to:"#debugging-responses"},{default:t(()=>s[5]||(s[5]=[p("Debugging Responses")])),_:1})])])]),n("li",null,[a(e,{to:"#building-body"},{default:t(()=>s[6]||(s[6]=[p("Building Body")])),_:1})]),n("li",null,[a(e,{to:"#testing-json-apis"},{default:t(()=>s[7]||(s[7]=[p("Testing Json APIs")])),_:1}),n("ul",null,[n("li",null,[a(e,{to:"#asserting-exact-json-matches"},{default:t(()=>s[8]||(s[8]=[p("Asserting Exact JSON Matches")])),_:1})]),n("li",null,[a(e,{to:"#fluent-json-testing"},{default:t(()=>s[9]||(s[9]=[p("Fluent JSON Testing")])),_:1})]),n("li",null,[a(e,{to:"#asserting-attribute-presence-absence"},{default:t(()=>s[10]||(s[10]=[p("Asserting Attribute Presence / Absence")])),_:1})]),n("li",null,[a(e,{to:"#scoping-json-collection-assertions"},{default:t(()=>s[11]||(s[11]=[p("Scoping JSON Collection Assertions")])),_:1})])])]),n("li",null,[a(e,{to:"#available-assertions"},{default:t(()=>s[12]||(s[12]=[p("Available Assertions")])),_:1}),n("ul",null,[n("li",null,[a(e,{to:"#response-assertions"},{default:t(()=>s[13]||(s[13]=[p("Response Assertions")])),_:1})]),n("li",null,[a(e,{to:"#assertaccepted"},{default:t(()=>s[14]||(s[14]=[p("AssertAccepted")])),_:1})]),n("li",null,[a(e,{to:"#assertbadrequest"},{default:t(()=>s[15]||(s[15]=[p("AssertBadRequest")])),_:1})]),n("li",null,[a(e,{to:"#assertconflict"},{default:t(()=>s[16]||(s[16]=[p("AssertConflict")])),_:1})]),n("li",null,[a(e,{to:"#assertcookie"},{default:t(()=>s[17]||(s[17]=[p("AssertCookie")])),_:1})]),n("li",null,[a(e,{to:"#assertcookieexpired"},{default:t(()=>s[18]||(s[18]=[p("AssertCookieExpired")])),_:1})]),n("li",null,[a(e,{to:"#assertcookiemissing"},{default:t(()=>s[19]||(s[19]=[p("AssertCookieMissing")])),_:1})]),n("li",null,[a(e,{to:"#assertcookienotexpired"},{default:t(()=>s[20]||(s[20]=[p("AssertCookieNotExpired")])),_:1})]),n("li",null,[a(e,{to:"#assertcreated"},{default:t(()=>s[21]||(s[21]=[p("AssertCreated")])),_:1})]),n("li",null,[a(e,{to:"#assertdontsee"},{default:t(()=>s[22]||(s[22]=[p("AssertDontSee")])),_:1})]),n("li",null,[a(e,{to:"#assertexactjson"},{default:t(()=>s[23]||(s[23]=[p("AssertExactJson")])),_:1})]),n("li",null,[a(e,{to:"#assertfluentjson"},{default:t(()=>s[24]||(s[24]=[p("AssertFluentJson")])),_:1})]),n("li",null,[a(e,{to:"#assertforbidden"},{default:t(()=>s[25]||(s[25]=[p("AssertForbidden")])),_:1})]),n("li",null,[a(e,{to:"#assertfound"},{default:t(()=>s[26]||(s[26]=[p("AssertFound")])),_:1})]),n("li",null,[a(e,{to:"#assertgone"},{default:t(()=>s[27]||(s[27]=[p("AssertGone")])),_:1})]),n("li",null,[a(e,{to:"#assertheader"},{default:t(()=>s[28]||(s[28]=[p("AssertHeader")])),_:1})]),n("li",null,[a(e,{to:"#assertheadermissing"},{default:t(()=>s[29]||(s[29]=[p("AssertHeaderMissing")])),_:1})]),n("li",null,[a(e,{to:"#assertinternalservererror"},{default:t(()=>s[30]||(s[30]=[p("AssertInternalServerError")])),_:1})]),n("li",null,[a(e,{to:"#assertjson"},{default:t(()=>s[31]||(s[31]=[p("AssertJson")])),_:1})]),n("li",null,[a(e,{to:"#assertjsonmissing"},{default:t(()=>s[32]||(s[32]=[p("AssertJsonMissing")])),_:1})]),n("li",null,[a(e,{to:"#assertmethodnotallowed"},{default:t(()=>s[33]||(s[33]=[p("AssertMethodNotAllowed")])),_:1})]),n("li",null,[a(e,{to:"#assertmovedpermanently"},{default:t(()=>s[34]||(s[34]=[p("AssertMovedPermanently")])),_:1})]),n("li",null,[a(e,{to:"#assertnocontent"},{default:t(()=>s[35]||(s[35]=[p("AssertNoContent")])),_:1})]),n("li",null,[a(e,{to:"#assertnotacceptable"},{default:t(()=>s[36]||(s[36]=[p("AssertNotAcceptable")])),_:1})]),n("li",null,[a(e,{to:"#assertnotfound"},{default:t(()=>s[37]||(s[37]=[p("AssertNotFound")])),_:1})]),n("li",null,[a(e,{to:"#assertnotmodified"},{default:t(()=>s[38]||(s[38]=[p("AssertNotModified")])),_:1})]),n("li",null,[a(e,{to:"#assertok"},{default:t(()=>s[39]||(s[39]=[p("AssertOk")])),_:1})]),n("li",null,[a(e,{to:"#assertpartialcontent"},{default:t(()=>s[40]||(s[40]=[p("AssertPartialContent")])),_:1})]),n("li",null,[a(e,{to:"#assertpaymentrequired"},{default:t(()=>s[41]||(s[41]=[p("AssertPaymentRequired")])),_:1})]),n("li",null,[a(e,{to:"#assertrequesttimeout"},{default:t(()=>s[42]||(s[42]=[p("AssertRequestTimeout")])),_:1})]),n("li",null,[a(e,{to:"#assertsee"},{default:t(()=>s[43]||(s[43]=[p("AssertSee")])),_:1})]),n("li",null,[a(e,{to:"#assertseeinorder"},{default:t(()=>s[44]||(s[44]=[p("AssertSeeInOrder")])),_:1})]),n("li",null,[a(e,{to:"#assertservererror"},{default:t(()=>s[45]||(s[45]=[p("AssertServerError")])),_:1})]),n("li",null,[a(e,{to:"#assertserviceunavailable"},{default:t(()=>s[46]||(s[46]=[p("AssertServiceUnavailable")])),_:1})]),n("li",null,[a(e,{to:"#assertstatus"},{default:t(()=>s[47]||(s[47]=[p("AssertStatus")])),_:1})]),n("li",null,[a(e,{to:"#assertsuccessful"},{default:t(()=>s[48]||(s[48]=[p("AssertSuccessful")])),_:1})]),n("li",null,[a(e,{to:"#asserttemporaryredirect"},{default:t(()=>s[49]||(s[49]=[p("AssertTemporaryRedirect")])),_:1})]),n("li",null,[a(e,{to:"#asserttoomanyrequests"},{default:t(()=>s[50]||(s[50]=[p("AssertTooManyRequests")])),_:1})]),n("li",null,[a(e,{to:"#assertunauthorized"},{default:t(()=>s[51]||(s[51]=[p("AssertUnauthorized")])),_:1})]),n("li",null,[a(e,{to:"#assertunprocessableentity"},{default:t(()=>s[52]||(s[52]=[p("AssertUnprocessableEntity")])),_:1})])])])])]),s[54]||(s[54]=u(`

Introduction

When building web applications, you'll often need to test if your HTTP requests work correctly from start to finish. Goravel's testing tools make this straightforward - you can simulate requests and verify responses without setting up complex test environments.

Make Requests

Testing HTTP endpoints in Goravel uses a simple pattern. Start with the Http method from your TestCase, which needs a *testing.T parameter for assertions. This gives you a request object (framework/contracts/testing.TestRequest) that handles all common HTTP verbs like Get, Post, and Put.

Instead of making real HTTP calls, these methods simulate your application's request cycle internally. Each request returns a response object (framework/contracts/testing.TestResponse) with methods to check the results.

Here's a basic example:

func (s *ExampleTestSuite) TestIndex() {
+import{_ as l,c,b as n,e as a,f as t,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function h(m,s){const e=o("router-link"),i=o("CommentService");return r(),c("div",null,[s[53]||(s[53]=n("h1",{id:"http-tests",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#http-tests"},[n("span",null,"HTTP Tests")])],-1)),n("nav",k,[n("ul",null,[n("li",null,[a(e,{to:"#introduction"},{default:t(()=>s[0]||(s[0]=[p("Introduction")])),_:1})]),n("li",null,[a(e,{to:"#make-requests"},{default:t(()=>s[1]||(s[1]=[p("Make Requests")])),_:1}),n("ul",null,[n("li",null,[a(e,{to:"#customize-request-headers"},{default:t(()=>s[2]||(s[2]=[p("Customize Request Headers")])),_:1})]),n("li",null,[a(e,{to:"#cookies"},{default:t(()=>s[3]||(s[3]=[p("Cookies")])),_:1})]),n("li",null,[a(e,{to:"#withsession"},{default:t(()=>s[4]||(s[4]=[p("WithSession")])),_:1})]),n("li",null,[a(e,{to:"#debugging-responses"},{default:t(()=>s[5]||(s[5]=[p("Debugging Responses")])),_:1})])])]),n("li",null,[a(e,{to:"#building-body"},{default:t(()=>s[6]||(s[6]=[p("Building Body")])),_:1})]),n("li",null,[a(e,{to:"#testing-json-apis"},{default:t(()=>s[7]||(s[7]=[p("Testing Json APIs")])),_:1}),n("ul",null,[n("li",null,[a(e,{to:"#asserting-exact-json-matches"},{default:t(()=>s[8]||(s[8]=[p("Asserting Exact JSON Matches")])),_:1})]),n("li",null,[a(e,{to:"#fluent-json-testing"},{default:t(()=>s[9]||(s[9]=[p("Fluent JSON Testing")])),_:1})]),n("li",null,[a(e,{to:"#asserting-attribute-presence-absence"},{default:t(()=>s[10]||(s[10]=[p("Asserting Attribute Presence / Absence")])),_:1})]),n("li",null,[a(e,{to:"#scoping-json-collection-assertions"},{default:t(()=>s[11]||(s[11]=[p("Scoping JSON Collection Assertions")])),_:1})])])]),n("li",null,[a(e,{to:"#available-assertions"},{default:t(()=>s[12]||(s[12]=[p("Available Assertions")])),_:1}),n("ul",null,[n("li",null,[a(e,{to:"#response-assertions"},{default:t(()=>s[13]||(s[13]=[p("Response Assertions")])),_:1})]),n("li",null,[a(e,{to:"#assertaccepted"},{default:t(()=>s[14]||(s[14]=[p("AssertAccepted")])),_:1})]),n("li",null,[a(e,{to:"#assertbadrequest"},{default:t(()=>s[15]||(s[15]=[p("AssertBadRequest")])),_:1})]),n("li",null,[a(e,{to:"#assertconflict"},{default:t(()=>s[16]||(s[16]=[p("AssertConflict")])),_:1})]),n("li",null,[a(e,{to:"#assertcookie"},{default:t(()=>s[17]||(s[17]=[p("AssertCookie")])),_:1})]),n("li",null,[a(e,{to:"#assertcookieexpired"},{default:t(()=>s[18]||(s[18]=[p("AssertCookieExpired")])),_:1})]),n("li",null,[a(e,{to:"#assertcookiemissing"},{default:t(()=>s[19]||(s[19]=[p("AssertCookieMissing")])),_:1})]),n("li",null,[a(e,{to:"#assertcookienotexpired"},{default:t(()=>s[20]||(s[20]=[p("AssertCookieNotExpired")])),_:1})]),n("li",null,[a(e,{to:"#assertcreated"},{default:t(()=>s[21]||(s[21]=[p("AssertCreated")])),_:1})]),n("li",null,[a(e,{to:"#assertdontsee"},{default:t(()=>s[22]||(s[22]=[p("AssertDontSee")])),_:1})]),n("li",null,[a(e,{to:"#assertexactjson"},{default:t(()=>s[23]||(s[23]=[p("AssertExactJson")])),_:1})]),n("li",null,[a(e,{to:"#assertfluentjson"},{default:t(()=>s[24]||(s[24]=[p("AssertFluentJson")])),_:1})]),n("li",null,[a(e,{to:"#assertforbidden"},{default:t(()=>s[25]||(s[25]=[p("AssertForbidden")])),_:1})]),n("li",null,[a(e,{to:"#assertfound"},{default:t(()=>s[26]||(s[26]=[p("AssertFound")])),_:1})]),n("li",null,[a(e,{to:"#assertgone"},{default:t(()=>s[27]||(s[27]=[p("AssertGone")])),_:1})]),n("li",null,[a(e,{to:"#assertheader"},{default:t(()=>s[28]||(s[28]=[p("AssertHeader")])),_:1})]),n("li",null,[a(e,{to:"#assertheadermissing"},{default:t(()=>s[29]||(s[29]=[p("AssertHeaderMissing")])),_:1})]),n("li",null,[a(e,{to:"#assertinternalservererror"},{default:t(()=>s[30]||(s[30]=[p("AssertInternalServerError")])),_:1})]),n("li",null,[a(e,{to:"#assertjson"},{default:t(()=>s[31]||(s[31]=[p("AssertJson")])),_:1})]),n("li",null,[a(e,{to:"#assertjsonmissing"},{default:t(()=>s[32]||(s[32]=[p("AssertJsonMissing")])),_:1})]),n("li",null,[a(e,{to:"#assertmethodnotallowed"},{default:t(()=>s[33]||(s[33]=[p("AssertMethodNotAllowed")])),_:1})]),n("li",null,[a(e,{to:"#assertmovedpermanently"},{default:t(()=>s[34]||(s[34]=[p("AssertMovedPermanently")])),_:1})]),n("li",null,[a(e,{to:"#assertnocontent"},{default:t(()=>s[35]||(s[35]=[p("AssertNoContent")])),_:1})]),n("li",null,[a(e,{to:"#assertnotacceptable"},{default:t(()=>s[36]||(s[36]=[p("AssertNotAcceptable")])),_:1})]),n("li",null,[a(e,{to:"#assertnotfound"},{default:t(()=>s[37]||(s[37]=[p("AssertNotFound")])),_:1})]),n("li",null,[a(e,{to:"#assertnotmodified"},{default:t(()=>s[38]||(s[38]=[p("AssertNotModified")])),_:1})]),n("li",null,[a(e,{to:"#assertok"},{default:t(()=>s[39]||(s[39]=[p("AssertOk")])),_:1})]),n("li",null,[a(e,{to:"#assertpartialcontent"},{default:t(()=>s[40]||(s[40]=[p("AssertPartialContent")])),_:1})]),n("li",null,[a(e,{to:"#assertpaymentrequired"},{default:t(()=>s[41]||(s[41]=[p("AssertPaymentRequired")])),_:1})]),n("li",null,[a(e,{to:"#assertrequesttimeout"},{default:t(()=>s[42]||(s[42]=[p("AssertRequestTimeout")])),_:1})]),n("li",null,[a(e,{to:"#assertsee"},{default:t(()=>s[43]||(s[43]=[p("AssertSee")])),_:1})]),n("li",null,[a(e,{to:"#assertseeinorder"},{default:t(()=>s[44]||(s[44]=[p("AssertSeeInOrder")])),_:1})]),n("li",null,[a(e,{to:"#assertservererror"},{default:t(()=>s[45]||(s[45]=[p("AssertServerError")])),_:1})]),n("li",null,[a(e,{to:"#assertserviceunavailable"},{default:t(()=>s[46]||(s[46]=[p("AssertServiceUnavailable")])),_:1})]),n("li",null,[a(e,{to:"#assertstatus"},{default:t(()=>s[47]||(s[47]=[p("AssertStatus")])),_:1})]),n("li",null,[a(e,{to:"#assertsuccessful"},{default:t(()=>s[48]||(s[48]=[p("AssertSuccessful")])),_:1})]),n("li",null,[a(e,{to:"#asserttemporaryredirect"},{default:t(()=>s[49]||(s[49]=[p("AssertTemporaryRedirect")])),_:1})]),n("li",null,[a(e,{to:"#asserttoomanyrequests"},{default:t(()=>s[50]||(s[50]=[p("AssertTooManyRequests")])),_:1})]),n("li",null,[a(e,{to:"#assertunauthorized"},{default:t(()=>s[51]||(s[51]=[p("AssertUnauthorized")])),_:1})]),n("li",null,[a(e,{to:"#assertunprocessableentity"},{default:t(()=>s[52]||(s[52]=[p("AssertUnprocessableEntity")])),_:1})])])])])]),s[54]||(s[54]=u(`

Introduction

When building web applications, you'll often need to test if your HTTP requests work correctly from start to finish. Goravel's testing tools make this straightforward - you can simulate requests and verify responses without setting up complex test environments.

Make Requests

Testing HTTP endpoints in Goravel uses a simple pattern. Start with the Http method from your TestCase, which needs a *testing.T parameter for assertions. This gives you a request object (framework/contracts/testing.TestRequest) that handles all common HTTP verbs like Get, Post, and Put.

Instead of making real HTTP calls, these methods simulate your application's request cycle internally. Each request returns a response object (framework/contracts/testing.TestResponse) with methods to check the results.

Here's a basic example:

func (s *ExampleTestSuite) TestIndex() {
 	response, err := s.Http(s.T()).Get("/users/1")
 	s.Nil(err)
 	response.AssertStatus(200)
diff --git a/assets/http-tests.html-DJZPGIdY.js b/assets/http-tests.html-QexOHz8g.js
similarity index 99%
rename from assets/http-tests.html-DJZPGIdY.js
rename to assets/http-tests.html-QexOHz8g.js
index 2ef9ba9b..d03b32f7 100644
--- a/assets/http-tests.html-DJZPGIdY.js
+++ b/assets/http-tests.html-QexOHz8g.js
@@ -1,4 +1,4 @@
-import{_ as l,c,b as n,e as a,f as t,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(m,s){const e=o("router-link"),i=o("CommentService");return r(),c("div",null,[s[53]||(s[53]=n("h1",{id:"http-tests",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#http-tests"},[n("span",null,"HTTP Tests")])],-1)),n("nav",k,[n("ul",null,[n("li",null,[a(e,{to:"#介绍"},{default:t(()=>s[0]||(s[0]=[p("介绍")])),_:1})]),n("li",null,[a(e,{to:"#发起-http-请求"},{default:t(()=>s[1]||(s[1]=[p("发起 HTTP 请求")])),_:1}),n("ul",null,[n("li",null,[a(e,{to:"#自定义请求头"},{default:t(()=>s[2]||(s[2]=[p("自定义请求头")])),_:1})]),n("li",null,[a(e,{to:"#cookies"},{default:t(()=>s[3]||(s[3]=[p("Cookies")])),_:1})]),n("li",null,[a(e,{to:"#withsession"},{default:t(()=>s[4]||(s[4]=[p("WithSession")])),_:1})]),n("li",null,[a(e,{to:"#调试响应"},{default:t(()=>s[5]||(s[5]=[p("调试响应")])),_:1})])])]),n("li",null,[a(e,{to:"#构建请求体"},{default:t(()=>s[6]||(s[6]=[p("构建请求体")])),_:1})]),n("li",null,[a(e,{to:"#测试-json-api"},{default:t(()=>s[7]||(s[7]=[p("测试 JSON API")])),_:1}),n("ul",null,[n("li",null,[a(e,{to:"#断言精确匹配的-json"},{default:t(()=>s[8]||(s[8]=[p("断言精确匹配的 JSON")])),_:1})]),n("li",null,[a(e,{to:"#fluent-json-testing"},{default:t(()=>s[9]||(s[9]=[p("Fluent JSON Testing")])),_:1})]),n("li",null,[a(e,{to:"#断言属性的存在-缺失"},{default:t(()=>s[10]||(s[10]=[p("断言属性的存在/缺失")])),_:1})]),n("li",null,[a(e,{to:"#断言-json-集合"},{default:t(()=>s[11]||(s[11]=[p("断言 JSON 集合")])),_:1})])])]),n("li",null,[a(e,{to:"#可用断言"},{default:t(()=>s[12]||(s[12]=[p("可用断言")])),_:1}),n("ul",null,[n("li",null,[a(e,{to:"#断言响应"},{default:t(()=>s[13]||(s[13]=[p("断言响应")])),_:1})]),n("li",null,[a(e,{to:"#assertaccepted"},{default:t(()=>s[14]||(s[14]=[p("AssertAccepted")])),_:1})]),n("li",null,[a(e,{to:"#assertbadrequest"},{default:t(()=>s[15]||(s[15]=[p("AssertBadRequest")])),_:1})]),n("li",null,[a(e,{to:"#assertconflict"},{default:t(()=>s[16]||(s[16]=[p("AssertConflict")])),_:1})]),n("li",null,[a(e,{to:"#assertcookie"},{default:t(()=>s[17]||(s[17]=[p("AssertCookie")])),_:1})]),n("li",null,[a(e,{to:"#assertcookieexpired"},{default:t(()=>s[18]||(s[18]=[p("AssertCookieExpired")])),_:1})]),n("li",null,[a(e,{to:"#assertcookiemissing"},{default:t(()=>s[19]||(s[19]=[p("AssertCookieMissing")])),_:1})]),n("li",null,[a(e,{to:"#assertcookienotexpired"},{default:t(()=>s[20]||(s[20]=[p("AssertCookieNotExpired")])),_:1})]),n("li",null,[a(e,{to:"#assertcreated"},{default:t(()=>s[21]||(s[21]=[p("AssertCreated")])),_:1})]),n("li",null,[a(e,{to:"#assertdontsee"},{default:t(()=>s[22]||(s[22]=[p("AssertDontSee")])),_:1})]),n("li",null,[a(e,{to:"#assertexactjson"},{default:t(()=>s[23]||(s[23]=[p("AssertExactJson")])),_:1})]),n("li",null,[a(e,{to:"#assertfluentjson"},{default:t(()=>s[24]||(s[24]=[p("AssertFluentJson")])),_:1})]),n("li",null,[a(e,{to:"#assertforbidden"},{default:t(()=>s[25]||(s[25]=[p("AssertForbidden")])),_:1})]),n("li",null,[a(e,{to:"#assertfound"},{default:t(()=>s[26]||(s[26]=[p("AssertFound")])),_:1})]),n("li",null,[a(e,{to:"#assertgone"},{default:t(()=>s[27]||(s[27]=[p("AssertGone")])),_:1})]),n("li",null,[a(e,{to:"#assertheader"},{default:t(()=>s[28]||(s[28]=[p("AssertHeader")])),_:1})]),n("li",null,[a(e,{to:"#assertheadermissing"},{default:t(()=>s[29]||(s[29]=[p("AssertHeaderMissing")])),_:1})]),n("li",null,[a(e,{to:"#assertinternalservererror"},{default:t(()=>s[30]||(s[30]=[p("AssertInternalServerError")])),_:1})]),n("li",null,[a(e,{to:"#assertjson"},{default:t(()=>s[31]||(s[31]=[p("AssertJson")])),_:1})]),n("li",null,[a(e,{to:"#assertjsonmissing"},{default:t(()=>s[32]||(s[32]=[p("AssertJsonMissing")])),_:1})]),n("li",null,[a(e,{to:"#assertmethodnotallowed"},{default:t(()=>s[33]||(s[33]=[p("AssertMethodNotAllowed")])),_:1})]),n("li",null,[a(e,{to:"#assertmovedpermanently"},{default:t(()=>s[34]||(s[34]=[p("AssertMovedPermanently")])),_:1})]),n("li",null,[a(e,{to:"#assertnocontent"},{default:t(()=>s[35]||(s[35]=[p("AssertNoContent")])),_:1})]),n("li",null,[a(e,{to:"#assertnotacceptable"},{default:t(()=>s[36]||(s[36]=[p("AssertNotAcceptable")])),_:1})]),n("li",null,[a(e,{to:"#assertnotfound"},{default:t(()=>s[37]||(s[37]=[p("AssertNotFound")])),_:1})]),n("li",null,[a(e,{to:"#assertnotmodified"},{default:t(()=>s[38]||(s[38]=[p("AssertNotModified")])),_:1})]),n("li",null,[a(e,{to:"#assertok"},{default:t(()=>s[39]||(s[39]=[p("AssertOk")])),_:1})]),n("li",null,[a(e,{to:"#assertpartialcontent"},{default:t(()=>s[40]||(s[40]=[p("AssertPartialContent")])),_:1})]),n("li",null,[a(e,{to:"#assertpaymentrequired"},{default:t(()=>s[41]||(s[41]=[p("AssertPaymentRequired")])),_:1})]),n("li",null,[a(e,{to:"#assertrequesttimeout"},{default:t(()=>s[42]||(s[42]=[p("AssertRequestTimeout")])),_:1})]),n("li",null,[a(e,{to:"#assertsee"},{default:t(()=>s[43]||(s[43]=[p("AssertSee")])),_:1})]),n("li",null,[a(e,{to:"#assertseeinorder"},{default:t(()=>s[44]||(s[44]=[p("AssertSeeInOrder")])),_:1})]),n("li",null,[a(e,{to:"#assertservererror"},{default:t(()=>s[45]||(s[45]=[p("AssertServerError")])),_:1})]),n("li",null,[a(e,{to:"#assertserviceunavailable"},{default:t(()=>s[46]||(s[46]=[p("AssertServiceUnavailable")])),_:1})]),n("li",null,[a(e,{to:"#assertstatus"},{default:t(()=>s[47]||(s[47]=[p("AssertStatus")])),_:1})]),n("li",null,[a(e,{to:"#assertsuccessful"},{default:t(()=>s[48]||(s[48]=[p("AssertSuccessful")])),_:1})]),n("li",null,[a(e,{to:"#asserttemporaryredirect"},{default:t(()=>s[49]||(s[49]=[p("AssertTemporaryRedirect")])),_:1})]),n("li",null,[a(e,{to:"#asserttoomanyrequests"},{default:t(()=>s[50]||(s[50]=[p("AssertTooManyRequests")])),_:1})]),n("li",null,[a(e,{to:"#assertunauthorized"},{default:t(()=>s[51]||(s[51]=[p("AssertUnauthorized")])),_:1})]),n("li",null,[a(e,{to:"#assertunprocessableentity"},{default:t(()=>s[52]||(s[52]=[p("AssertUnprocessableEntity")])),_:1})])])])])]),s[54]||(s[54]=u(`

介绍

在构建Web应用程序时,您通常需要从头到尾测试您的HTTP请求是否正常工作。Goravel的测试工具使这变得简单——您可以模拟请求并验证响应,而无需设置复杂的测试环境。

发起 HTTP 请求

测试 Goravel 中的 HTTP 接口使用了一个简单的模式。使用 TestCaseHttp 方法,它需要一个 *testing.T 参数用于断言。该方法将返回一个实例(framework/contracts/testing.TestRequest),它处理所有常见的 HTTP 请求,如 GetPostPut

不需要真正的 HTTP 调用,这些方法在内部模拟了应用程序的请求周期。每个请求都返回一个响应对象(framework/contracts/testing.TestResponse),其中包含检查结果的方法。

一个简单的例子:

func (s *ExampleTestSuite) TestIndex() {
+import{_ as l,c,b as n,e as a,f as t,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(m,s){const e=o("router-link"),i=o("CommentService");return r(),c("div",null,[s[53]||(s[53]=n("h1",{id:"http-tests",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#http-tests"},[n("span",null,"HTTP Tests")])],-1)),n("nav",k,[n("ul",null,[n("li",null,[a(e,{to:"#介绍"},{default:t(()=>s[0]||(s[0]=[p("介绍")])),_:1})]),n("li",null,[a(e,{to:"#发起-http-请求"},{default:t(()=>s[1]||(s[1]=[p("发起 HTTP 请求")])),_:1}),n("ul",null,[n("li",null,[a(e,{to:"#自定义请求头"},{default:t(()=>s[2]||(s[2]=[p("自定义请求头")])),_:1})]),n("li",null,[a(e,{to:"#cookies"},{default:t(()=>s[3]||(s[3]=[p("Cookies")])),_:1})]),n("li",null,[a(e,{to:"#withsession"},{default:t(()=>s[4]||(s[4]=[p("WithSession")])),_:1})]),n("li",null,[a(e,{to:"#调试响应"},{default:t(()=>s[5]||(s[5]=[p("调试响应")])),_:1})])])]),n("li",null,[a(e,{to:"#构建请求体"},{default:t(()=>s[6]||(s[6]=[p("构建请求体")])),_:1})]),n("li",null,[a(e,{to:"#测试-json-api"},{default:t(()=>s[7]||(s[7]=[p("测试 JSON API")])),_:1}),n("ul",null,[n("li",null,[a(e,{to:"#断言精确匹配的-json"},{default:t(()=>s[8]||(s[8]=[p("断言精确匹配的 JSON")])),_:1})]),n("li",null,[a(e,{to:"#fluent-json-testing"},{default:t(()=>s[9]||(s[9]=[p("Fluent JSON Testing")])),_:1})]),n("li",null,[a(e,{to:"#断言属性的存在-缺失"},{default:t(()=>s[10]||(s[10]=[p("断言属性的存在/缺失")])),_:1})]),n("li",null,[a(e,{to:"#断言-json-集合"},{default:t(()=>s[11]||(s[11]=[p("断言 JSON 集合")])),_:1})])])]),n("li",null,[a(e,{to:"#可用断言"},{default:t(()=>s[12]||(s[12]=[p("可用断言")])),_:1}),n("ul",null,[n("li",null,[a(e,{to:"#断言响应"},{default:t(()=>s[13]||(s[13]=[p("断言响应")])),_:1})]),n("li",null,[a(e,{to:"#assertaccepted"},{default:t(()=>s[14]||(s[14]=[p("AssertAccepted")])),_:1})]),n("li",null,[a(e,{to:"#assertbadrequest"},{default:t(()=>s[15]||(s[15]=[p("AssertBadRequest")])),_:1})]),n("li",null,[a(e,{to:"#assertconflict"},{default:t(()=>s[16]||(s[16]=[p("AssertConflict")])),_:1})]),n("li",null,[a(e,{to:"#assertcookie"},{default:t(()=>s[17]||(s[17]=[p("AssertCookie")])),_:1})]),n("li",null,[a(e,{to:"#assertcookieexpired"},{default:t(()=>s[18]||(s[18]=[p("AssertCookieExpired")])),_:1})]),n("li",null,[a(e,{to:"#assertcookiemissing"},{default:t(()=>s[19]||(s[19]=[p("AssertCookieMissing")])),_:1})]),n("li",null,[a(e,{to:"#assertcookienotexpired"},{default:t(()=>s[20]||(s[20]=[p("AssertCookieNotExpired")])),_:1})]),n("li",null,[a(e,{to:"#assertcreated"},{default:t(()=>s[21]||(s[21]=[p("AssertCreated")])),_:1})]),n("li",null,[a(e,{to:"#assertdontsee"},{default:t(()=>s[22]||(s[22]=[p("AssertDontSee")])),_:1})]),n("li",null,[a(e,{to:"#assertexactjson"},{default:t(()=>s[23]||(s[23]=[p("AssertExactJson")])),_:1})]),n("li",null,[a(e,{to:"#assertfluentjson"},{default:t(()=>s[24]||(s[24]=[p("AssertFluentJson")])),_:1})]),n("li",null,[a(e,{to:"#assertforbidden"},{default:t(()=>s[25]||(s[25]=[p("AssertForbidden")])),_:1})]),n("li",null,[a(e,{to:"#assertfound"},{default:t(()=>s[26]||(s[26]=[p("AssertFound")])),_:1})]),n("li",null,[a(e,{to:"#assertgone"},{default:t(()=>s[27]||(s[27]=[p("AssertGone")])),_:1})]),n("li",null,[a(e,{to:"#assertheader"},{default:t(()=>s[28]||(s[28]=[p("AssertHeader")])),_:1})]),n("li",null,[a(e,{to:"#assertheadermissing"},{default:t(()=>s[29]||(s[29]=[p("AssertHeaderMissing")])),_:1})]),n("li",null,[a(e,{to:"#assertinternalservererror"},{default:t(()=>s[30]||(s[30]=[p("AssertInternalServerError")])),_:1})]),n("li",null,[a(e,{to:"#assertjson"},{default:t(()=>s[31]||(s[31]=[p("AssertJson")])),_:1})]),n("li",null,[a(e,{to:"#assertjsonmissing"},{default:t(()=>s[32]||(s[32]=[p("AssertJsonMissing")])),_:1})]),n("li",null,[a(e,{to:"#assertmethodnotallowed"},{default:t(()=>s[33]||(s[33]=[p("AssertMethodNotAllowed")])),_:1})]),n("li",null,[a(e,{to:"#assertmovedpermanently"},{default:t(()=>s[34]||(s[34]=[p("AssertMovedPermanently")])),_:1})]),n("li",null,[a(e,{to:"#assertnocontent"},{default:t(()=>s[35]||(s[35]=[p("AssertNoContent")])),_:1})]),n("li",null,[a(e,{to:"#assertnotacceptable"},{default:t(()=>s[36]||(s[36]=[p("AssertNotAcceptable")])),_:1})]),n("li",null,[a(e,{to:"#assertnotfound"},{default:t(()=>s[37]||(s[37]=[p("AssertNotFound")])),_:1})]),n("li",null,[a(e,{to:"#assertnotmodified"},{default:t(()=>s[38]||(s[38]=[p("AssertNotModified")])),_:1})]),n("li",null,[a(e,{to:"#assertok"},{default:t(()=>s[39]||(s[39]=[p("AssertOk")])),_:1})]),n("li",null,[a(e,{to:"#assertpartialcontent"},{default:t(()=>s[40]||(s[40]=[p("AssertPartialContent")])),_:1})]),n("li",null,[a(e,{to:"#assertpaymentrequired"},{default:t(()=>s[41]||(s[41]=[p("AssertPaymentRequired")])),_:1})]),n("li",null,[a(e,{to:"#assertrequesttimeout"},{default:t(()=>s[42]||(s[42]=[p("AssertRequestTimeout")])),_:1})]),n("li",null,[a(e,{to:"#assertsee"},{default:t(()=>s[43]||(s[43]=[p("AssertSee")])),_:1})]),n("li",null,[a(e,{to:"#assertseeinorder"},{default:t(()=>s[44]||(s[44]=[p("AssertSeeInOrder")])),_:1})]),n("li",null,[a(e,{to:"#assertservererror"},{default:t(()=>s[45]||(s[45]=[p("AssertServerError")])),_:1})]),n("li",null,[a(e,{to:"#assertserviceunavailable"},{default:t(()=>s[46]||(s[46]=[p("AssertServiceUnavailable")])),_:1})]),n("li",null,[a(e,{to:"#assertstatus"},{default:t(()=>s[47]||(s[47]=[p("AssertStatus")])),_:1})]),n("li",null,[a(e,{to:"#assertsuccessful"},{default:t(()=>s[48]||(s[48]=[p("AssertSuccessful")])),_:1})]),n("li",null,[a(e,{to:"#asserttemporaryredirect"},{default:t(()=>s[49]||(s[49]=[p("AssertTemporaryRedirect")])),_:1})]),n("li",null,[a(e,{to:"#asserttoomanyrequests"},{default:t(()=>s[50]||(s[50]=[p("AssertTooManyRequests")])),_:1})]),n("li",null,[a(e,{to:"#assertunauthorized"},{default:t(()=>s[51]||(s[51]=[p("AssertUnauthorized")])),_:1})]),n("li",null,[a(e,{to:"#assertunprocessableentity"},{default:t(()=>s[52]||(s[52]=[p("AssertUnprocessableEntity")])),_:1})])])])])]),s[54]||(s[54]=u(`

介绍

在构建Web应用程序时,您通常需要从头到尾测试您的HTTP请求是否正常工作。Goravel的测试工具使这变得简单——您可以模拟请求并验证响应,而无需设置复杂的测试环境。

发起 HTTP 请求

测试 Goravel 中的 HTTP 接口使用了一个简单的模式。使用 TestCaseHttp 方法,它需要一个 *testing.T 参数用于断言。该方法将返回一个实例(framework/contracts/testing.TestRequest),它处理所有常见的 HTTP 请求,如 GetPostPut

不需要真正的 HTTP 调用,这些方法在内部模拟了应用程序的请求周期。每个请求都返回一个响应对象(framework/contracts/testing.TestResponse),其中包含检查结果的方法。

一个简单的例子:

func (s *ExampleTestSuite) TestIndex() {
 	response, err := s.Http(s.T()).Get("/users/1")
 	s.Nil(err)
 	response.AssertStatus(200)
diff --git a/assets/index.html-BVAG0IOP.js b/assets/index.html-3b3KoC5i.js
similarity index 95%
rename from assets/index.html-BVAG0IOP.js
rename to assets/index.html-3b3KoC5i.js
index 66f4ccc6..d0cd6bfa 100644
--- a/assets/index.html-BVAG0IOP.js
+++ b/assets/index.html-3b3KoC5i.js
@@ -1 +1 @@
-import{_ as a,c as r,b as t,o as n}from"./app-ELDWQP0J.js";const o={};function l(i,e){return n(),r("div",null,e[0]||(e[0]=[t("h1",{id:"入门指南",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#入门指南"},[t("span",null,"入门指南")])],-1)]))}const s=a(o,[["render",l],["__file","index.html.vue"]]),c=JSON.parse('{"path":"/zh/getting-started/","title":"入门指南","lang":"zh-CN","frontmatter":{"description":"入门指南","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/getting-started/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/getting-started/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/getting-started/"}],["meta",{"property":"og:description","content":"入门指南"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"入门指南\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/getting-started/README.md","autoDesc":true}');export{s as comp,c as data};
+import{_ as a,c as r,b as t,o as n}from"./app-Ewo6p9aM.js";const o={};function l(i,e){return n(),r("div",null,e[0]||(e[0]=[t("h1",{id:"入门指南",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#入门指南"},[t("span",null,"入门指南")])],-1)]))}const s=a(o,[["render",l],["__file","index.html.vue"]]),c=JSON.parse('{"path":"/zh/getting-started/","title":"入门指南","lang":"zh-CN","frontmatter":{"description":"入门指南","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/getting-started/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/getting-started/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/getting-started/"}],["meta",{"property":"og:description","content":"入门指南"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"入门指南\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/getting-started/README.md","autoDesc":true}');export{s as comp,c as data};
diff --git a/assets/index.html-B-JSxCCx.js b/assets/index.html-B-JSxCCx.js
new file mode 100644
index 00000000..fc510b55
--- /dev/null
+++ b/assets/index.html-B-JSxCCx.js
@@ -0,0 +1 @@
+import{_ as i}from"./logo-CxXS7KxG.js";import{_ as s,c as n,a as h,b as e,e as o,f as l,d as r,r as g,o as u}from"./app-Ewo6p9aM.js";const p="/reward-wechat.jpg",d="/wechat.jpg",m={};function b(v,t){const a=g("RouteLink");return u(),n("div",null,[t[32]||(t[32]=h('
Logo

DocGoReleaseTestReport CardCodecovLicense

',1)),e("p",null,[o(a,{to:"/"},{default:l(()=>t[0]||(t[0]=[r("English")])),_:1}),t[1]||(t[1]=r(" | 中文"))]),t[33]||(t[33]=h('

关于 Goravel

Goravel 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。

框架风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可以愉快的玩转 Golang!致敬 Laravel!

欢迎 Star, PR, Issues!

主要功能

',5)),e("table",null,[t[27]||(t[27]=e("thead",null,[e("tr",null,[e("th"),e("th"),e("th"),e("th"),e("th")])],-1)),e("tbody",null,[e("tr",null,[e("td",null,[o(a,{to:"/zh/getting-started/configuration.html"},{default:l(()=>t[2]||(t[2]=[r("自定义配置")])),_:1})]),e("td",null,[o(a,{to:"/zh/the-basics/routing.html"},{default:l(()=>t[3]||(t[3]=[r("HTTP 服务")])),_:1})]),e("td",null,[o(a,{to:"/zh/security/authentication.html"},{default:l(()=>t[4]||(t[4]=[r("用户认证")])),_:1})]),e("td",null,[o(a,{to:"/zh/security/authorization.html"},{default:l(()=>t[5]||(t[5]=[r("用户授权")])),_:1})]),e("td",null,[o(a,{to:"/zh/orm/getting-started.html"},{default:l(()=>t[6]||(t[6]=[r("数据库 ORM")])),_:1})])]),e("tr",null,[e("td",null,[o(a,{to:"/zh/orm/migrations.html"},{default:l(()=>t[7]||(t[7]=[r("数据库迁移")])),_:1})]),e("td",null,[o(a,{to:"/the-basics/logging.html"},{default:l(()=>t[8]||(t[8]=[r("日志")])),_:1})]),e("td",null,[o(a,{to:"/digging-deeper/cache.html"},{default:l(()=>t[9]||(t[9]=[r("缓存")])),_:1})]),e("td",null,[o(a,{to:"/the-basics/grpc.html"},{default:l(()=>t[10]||(t[10]=[r("Grpc")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/artisan-console.html"},{default:l(()=>t[11]||(t[11]=[r("Artisan 命令行")])),_:1})])]),e("tr",null,[e("td",null,[o(a,{to:"/zh/digging-deeper/task-scheduling.html"},{default:l(()=>t[12]||(t[12]=[r("任务调度")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/queues.html"},{default:l(()=>t[13]||(t[13]=[r("队列")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/event.html"},{default:l(()=>t[14]||(t[14]=[r("事件系统")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/filesystem.html"},{default:l(()=>t[15]||(t[15]=[r("文件存储")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/mail.html"},{default:l(()=>t[16]||(t[16]=[r("邮件")])),_:1})])]),e("tr",null,[e("td",null,[o(a,{to:"/zh/the-basics/validation.html"},{default:l(()=>t[17]||(t[17]=[r("表单验证")])),_:1})]),e("td",null,[o(a,{to:"/zh/testing/mock.html"},{default:l(()=>t[18]||(t[18]=[r("Mock")])),_:1})]),e("td",null,[o(a,{to:"/zh/security/hashing.html"},{default:l(()=>t[19]||(t[19]=[r("Hash")])),_:1})]),e("td",null,[o(a,{to:"/zh/security/encryption.html"},{default:l(()=>t[20]||(t[20]=[r("Crypt")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/helpers.html"},{default:l(()=>t[21]||(t[21]=[r("Carbon")])),_:1})])]),e("tr",null,[e("td",null,[o(a,{to:"/zh/digging-deeper/package-development.html"},{default:l(()=>t[22]||(t[22]=[r("扩展包开发")])),_:1})]),e("td",null,[o(a,{to:"/zh/testing/getting-started.html"},{default:l(()=>t[23]||(t[23]=[r("测试")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/localization.html"},{default:l(()=>t[24]||(t[24]=[r("本地化")])),_:1})]),e("td",null,[o(a,{to:"/zh/the-basics/session.html"},{default:l(()=>t[25]||(t[25]=[r("Session")])),_:1})]),t[26]||(t[26]=e("td",null,null,-1))])])]),t[34]||(t[34]=h('

路线图

For Detail

优秀扩展包

',3)),e("p",null,[o(a,{to:"/zh/prologue/packages.html"},{default:l(()=>t[28]||(t[28]=[r("查看详情")])),_:1})]),t[35]||(t[35]=h('

文档

在线文档 https://www.goravel.dev/zh

示例 https://github.com/goravel/example

优化文档,请提交 PR 至文档仓库 https://github.com/goravel/docs

Contributors

',5)),e("p",null,[t[30]||(t[30]=r("这个项目的存在要归功于所有做出贡献的人,参与贡献请查看")),o(a,{to:"/zh/prologue/contributions.html"},{default:l(()=>t[29]||(t[29]=[r("贡献指南")])),_:1}),t[31]||(t[31]=r("。"))]),t[36]||(t[36]=h('

打赏

开源项目的发展离不开您的支持,感谢微信打赏。

群组

微信入群,请备注 Goravel

开源许可

Goravel 框架是在 MIT 许可 下的开源软件。

',9))])}const k=s(m,[["render",b],["__file","index.html.vue"]]),w=JSON.parse('{"path":"/zh/","title":"关于 Goravel","lang":"zh-CN","frontmatter":{"description":"Logo Doc Go Release Test Report Card Codecov License | 中文 关于 Goravel Goravel 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。 框架风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/"}],["meta",{"property":"og:description","content":"Logo Doc Go Release Test Report Card Codecov License | 中文 关于 Goravel Goravel 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。 框架风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pkg.go.dev/badge/github.com/goravel/framework"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"关于 Goravel\\",\\"image\\":[\\"https://pkg.go.dev/badge/github.com/goravel/framework\\",\\"https://img.shields.io/github/go-mod/go-version/goravel/framework\\",\\"https://img.shields.io/github/release/goravel/framework.svg\\",\\"https://github.com/goravel/framework/actions/workflows/test.yml/badge.svg\\",\\"https://goreportcard.com/badge/github.com/goravel/framework\\",\\"https://codecov.io/gh/goravel/framework/branch/master/graph/badge.svg\\",\\"https://img.shields.io/github/license/goravel/framework\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"主要功能","slug":"主要功能","link":"#主要功能","children":[]},{"level":2,"title":"路线图","slug":"路线图","link":"#路线图","children":[]},{"level":2,"title":"优秀扩展包","slug":"优秀扩展包","link":"#优秀扩展包","children":[]},{"level":2,"title":"文档","slug":"文档","link":"#文档","children":[]},{"level":2,"title":"Contributors","slug":"contributors","link":"#contributors","children":[]},{"level":2,"title":"打赏","slug":"打赏","link":"#打赏","children":[]},{"level":2,"title":"群组","slug":"群组","link":"#群组","children":[]},{"level":2,"title":"开源许可","slug":"开源许可","link":"#开源许可","children":[]}],"git":{},"filePathRelative":"zh/README.md","autoDesc":true}');export{k as comp,w as data}; diff --git a/assets/index.html-BEuBVW2c.js b/assets/index.html-B4mmnR5Q.js similarity index 94% rename from assets/index.html-BEuBVW2c.js rename to assets/index.html-B4mmnR5Q.js index 6fea15ab..8b6d7849 100644 --- a/assets/index.html-BEuBVW2c.js +++ b/assets/index.html-B4mmnR5Q.js @@ -1 +1 @@ -import{_ as n,c as a,b as e,o}from"./app-ELDWQP0J.js";const r={};function i(s,t){return o(),a("div",null,t[0]||(t[0]=[e("h1",{id:"testing",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#testing"},[e("span",null,"Testing")])],-1)]))}const c=n(r,[["render",i],["__file","index.html.vue"]]),p=JSON.parse('{"path":"/testing/","title":"Testing","lang":"en-US","frontmatter":{"description":"Testing","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/testing/"}],["meta",{"property":"og:url","content":"https://goravel.dev/testing/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/testing/"}],["meta",{"property":"og:description","content":"Testing"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Testing\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"testing/README.md","autoDesc":true}');export{c as comp,p as data}; +import{_ as n,c as a,b as e,o}from"./app-Ewo6p9aM.js";const r={};function i(s,t){return o(),a("div",null,t[0]||(t[0]=[e("h1",{id:"testing",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#testing"},[e("span",null,"Testing")])],-1)]))}const c=n(r,[["render",i],["__file","index.html.vue"]]),p=JSON.parse('{"path":"/testing/","title":"Testing","lang":"en-US","frontmatter":{"description":"Testing","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/testing/"}],["meta",{"property":"og:url","content":"https://goravel.dev/testing/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/testing/"}],["meta",{"property":"og:description","content":"Testing"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Testing\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"testing/README.md","autoDesc":true}');export{c as comp,p as data}; diff --git a/assets/index.html-BBFqSAWn.js b/assets/index.html-BBFqSAWn.js deleted file mode 100644 index 462c2646..00000000 --- a/assets/index.html-BBFqSAWn.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as s,a as h,b as e,e as o,f as l,d as r,r as n,o as g}from"./app-ELDWQP0J.js";const u={};function p(d,t){const a=n("RouteLink");return g(),s("div",null,[t[32]||(t[32]=h('
Logo

DocGoReleaseTestReport CardCodecovLicense

',1)),e("p",null,[o(a,{to:"/"},{default:l(()=>t[0]||(t[0]=[r("English")])),_:1}),t[1]||(t[1]=r(" | 中文"))]),t[33]||(t[33]=h('

关于 Goravel

Goravel 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。

框架风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可以愉快的玩转 Golang!致敬 Laravel!

欢迎 Star, PR, Issues!

主要功能

',5)),e("table",null,[t[27]||(t[27]=e("thead",null,[e("tr",null,[e("th"),e("th"),e("th"),e("th"),e("th")])],-1)),e("tbody",null,[e("tr",null,[e("td",null,[o(a,{to:"/zh/getting-started/configuration.html"},{default:l(()=>t[2]||(t[2]=[r("自定义配置")])),_:1})]),e("td",null,[o(a,{to:"/zh/the-basics/routing.html"},{default:l(()=>t[3]||(t[3]=[r("HTTP 服务")])),_:1})]),e("td",null,[o(a,{to:"/zh/security/authentication.html"},{default:l(()=>t[4]||(t[4]=[r("用户认证")])),_:1})]),e("td",null,[o(a,{to:"/zh/security/authorization.html"},{default:l(()=>t[5]||(t[5]=[r("用户授权")])),_:1})]),e("td",null,[o(a,{to:"/zh/orm/getting-started.html"},{default:l(()=>t[6]||(t[6]=[r("数据库 ORM")])),_:1})])]),e("tr",null,[e("td",null,[o(a,{to:"/zh/orm/migrations.html"},{default:l(()=>t[7]||(t[7]=[r("数据库迁移")])),_:1})]),e("td",null,[o(a,{to:"/the-basics/logging.html"},{default:l(()=>t[8]||(t[8]=[r("日志")])),_:1})]),e("td",null,[o(a,{to:"/digging-deeper/cache.html"},{default:l(()=>t[9]||(t[9]=[r("缓存")])),_:1})]),e("td",null,[o(a,{to:"/the-basics/grpc.html"},{default:l(()=>t[10]||(t[10]=[r("Grpc")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/artisan-console.html"},{default:l(()=>t[11]||(t[11]=[r("Artisan 命令行")])),_:1})])]),e("tr",null,[e("td",null,[o(a,{to:"/zh/digging-deeper/task-scheduling.html"},{default:l(()=>t[12]||(t[12]=[r("任务调度")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/queues.html"},{default:l(()=>t[13]||(t[13]=[r("队列")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/event.html"},{default:l(()=>t[14]||(t[14]=[r("事件系统")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/filesystem.html"},{default:l(()=>t[15]||(t[15]=[r("文件存储")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/mail.html"},{default:l(()=>t[16]||(t[16]=[r("邮件")])),_:1})])]),e("tr",null,[e("td",null,[o(a,{to:"/zh/the-basics/validation.html"},{default:l(()=>t[17]||(t[17]=[r("表单验证")])),_:1})]),e("td",null,[o(a,{to:"/zh/testing/mock.html"},{default:l(()=>t[18]||(t[18]=[r("Mock")])),_:1})]),e("td",null,[o(a,{to:"/zh/security/hashing.html"},{default:l(()=>t[19]||(t[19]=[r("Hash")])),_:1})]),e("td",null,[o(a,{to:"/zh/security/encryption.html"},{default:l(()=>t[20]||(t[20]=[r("Crypt")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/helpers.html"},{default:l(()=>t[21]||(t[21]=[r("Carbon")])),_:1})])]),e("tr",null,[e("td",null,[o(a,{to:"/zh/digging-deeper/package-development.html"},{default:l(()=>t[22]||(t[22]=[r("扩展包开发")])),_:1})]),e("td",null,[o(a,{to:"/zh/testing/getting-started.html"},{default:l(()=>t[23]||(t[23]=[r("测试")])),_:1})]),e("td",null,[o(a,{to:"/zh/digging-deeper/localization.html"},{default:l(()=>t[24]||(t[24]=[r("本地化")])),_:1})]),e("td",null,[o(a,{to:"/zh/the-basics/session.html"},{default:l(()=>t[25]||(t[25]=[r("Session")])),_:1})]),t[26]||(t[26]=e("td",null,null,-1))])])]),t[34]||(t[34]=h('

路线图

For Detail

优秀扩展包

',3)),e("p",null,[o(a,{to:"/zh/prologue/packages.html"},{default:l(()=>t[28]||(t[28]=[r("查看详情")])),_:1})]),t[35]||(t[35]=h('

文档

在线文档 https://www.goravel.dev/zh

示例 https://github.com/goravel/example

优化文档,请提交 PR 至文档仓库 https://github.com/goravel/docs

Contributors

',5)),e("p",null,[t[30]||(t[30]=r("这个项目的存在要归功于所有做出贡献的人,参与贡献请查看")),o(a,{to:"/zh/prologue/contributions.html"},{default:l(()=>t[29]||(t[29]=[r("贡献指南")])),_:1}),t[31]||(t[31]=r("。"))]),t[36]||(t[36]=h('

打赏

开源项目的发展离不开您的支持,感谢微信打赏。

群组

微信入群,请备注 Goravel

开源许可

Goravel 框架是在 MIT 许可 下的开源软件。

',9))])}const b=i(u,[["render",p],["__file","index.html.vue"]]),v=JSON.parse('{"path":"/zh/","title":"关于 Goravel","lang":"zh-CN","frontmatter":{"description":"Logo Doc Go Release Test Report Card Codecov License | 中文 关于 Goravel Goravel 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。 框架风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/"}],["meta",{"property":"og:description","content":"Logo Doc Go Release Test Report Card Codecov License | 中文 关于 Goravel Goravel 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。 框架风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pkg.go.dev/badge/github.com/goravel/framework"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"关于 Goravel\\",\\"image\\":[\\"https://pkg.go.dev/badge/github.com/goravel/framework\\",\\"https://img.shields.io/github/go-mod/go-version/goravel/framework\\",\\"https://img.shields.io/github/release/goravel/framework.svg\\",\\"https://github.com/goravel/framework/actions/workflows/test.yml/badge.svg\\",\\"https://goreportcard.com/badge/github.com/goravel/framework\\",\\"https://codecov.io/gh/goravel/framework/branch/master/graph/badge.svg\\",\\"https://img.shields.io/github/license/goravel/framework\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"主要功能","slug":"主要功能","link":"#主要功能","children":[]},{"level":2,"title":"路线图","slug":"路线图","link":"#路线图","children":[]},{"level":2,"title":"优秀扩展包","slug":"优秀扩展包","link":"#优秀扩展包","children":[]},{"level":2,"title":"文档","slug":"文档","link":"#文档","children":[]},{"level":2,"title":"Contributors","slug":"contributors","link":"#contributors","children":[]},{"level":2,"title":"打赏","slug":"打赏","link":"#打赏","children":[]},{"level":2,"title":"群组","slug":"群组","link":"#群组","children":[]},{"level":2,"title":"开源许可","slug":"开源许可","link":"#开源许可","children":[]}],"git":{},"filePathRelative":"zh/README.md","autoDesc":true}');export{b as comp,v as data}; diff --git a/assets/index.html-ByKWtYVD.js b/assets/index.html-BSWJWxby.js similarity index 95% rename from assets/index.html-ByKWtYVD.js rename to assets/index.html-BSWJWxby.js index 63d1938f..9ac728a8 100644 --- a/assets/index.html-ByKWtYVD.js +++ b/assets/index.html-BSWJWxby.js @@ -1 +1 @@ -import{_ as r,c as a,b as e,o}from"./app-ELDWQP0J.js";const n={};function c(p,t){return o(),a("div",null,t[0]||(t[0]=[e("h1",{id:"核心架构",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#核心架构"},[e("span",null,"核心架构")])],-1)]))}const i=r(n,[["render",c],["__file","index.html.vue"]]),s=JSON.parse('{"path":"/zh/architecutre-concepts/","title":"核心架构","lang":"zh-CN","frontmatter":{"description":"核心架构","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/architecutre-concepts/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/architecutre-concepts/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/architecutre-concepts/"}],["meta",{"property":"og:description","content":"核心架构"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"核心架构\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/architecutre-concepts/README.md","autoDesc":true}');export{i as comp,s as data}; +import{_ as r,c as a,b as e,o}from"./app-Ewo6p9aM.js";const n={};function c(p,t){return o(),a("div",null,t[0]||(t[0]=[e("h1",{id:"核心架构",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#核心架构"},[e("span",null,"核心架构")])],-1)]))}const i=r(n,[["render",c],["__file","index.html.vue"]]),s=JSON.parse('{"path":"/zh/architecutre-concepts/","title":"核心架构","lang":"zh-CN","frontmatter":{"description":"核心架构","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/architecutre-concepts/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/architecutre-concepts/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/architecutre-concepts/"}],["meta",{"property":"og:description","content":"核心架构"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"核心架构\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/architecutre-concepts/README.md","autoDesc":true}');export{i as comp,s as data}; diff --git a/assets/index.html-UkIBF4JQ.js b/assets/index.html-BcXYMCkI.js similarity index 94% rename from assets/index.html-UkIBF4JQ.js rename to assets/index.html-BcXYMCkI.js index ab9d960d..6efdcd16 100644 --- a/assets/index.html-UkIBF4JQ.js +++ b/assets/index.html-BcXYMCkI.js @@ -1 +1 @@ -import{_ as o,c as r,b as e,o as a}from"./app-ELDWQP0J.js";const n={};function l(c,t){return a(),r("div",null,t[0]||(t[0]=[e("h1",{id:"orm",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#orm"},[e("span",null,"ORM")])],-1)]))}const i=o(n,[["render",l],["__file","index.html.vue"]]),s=JSON.parse('{"path":"/orm/","title":"ORM","lang":"en-US","frontmatter":{"description":"ORM","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/orm/"}],["meta",{"property":"og:url","content":"https://goravel.dev/orm/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/orm/"}],["meta",{"property":"og:description","content":"ORM"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"ORM\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"orm/README.md","autoDesc":true}');export{i as comp,s as data}; +import{_ as o,c as r,b as e,o as a}from"./app-Ewo6p9aM.js";const n={};function l(c,t){return a(),r("div",null,t[0]||(t[0]=[e("h1",{id:"orm",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#orm"},[e("span",null,"ORM")])],-1)]))}const i=o(n,[["render",l],["__file","index.html.vue"]]),s=JSON.parse('{"path":"/orm/","title":"ORM","lang":"en-US","frontmatter":{"description":"ORM","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/orm/"}],["meta",{"property":"og:url","content":"https://goravel.dev/orm/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/orm/"}],["meta",{"property":"og:description","content":"ORM"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"ORM\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"orm/README.md","autoDesc":true}');export{i as comp,s as data}; diff --git a/assets/index.html-Deh-LlCG.js b/assets/index.html-BkjDAmZb.js similarity index 95% rename from assets/index.html-Deh-LlCG.js rename to assets/index.html-BkjDAmZb.js index 0c127960..a87d0964 100644 --- a/assets/index.html-Deh-LlCG.js +++ b/assets/index.html-BkjDAmZb.js @@ -1 +1 @@ -import{_ as c,c as r,b as e,o}from"./app-ELDWQP0J.js";const n={};function a(p,t){return o(),r("div",null,t[0]||(t[0]=[e("h1",{id:"architecture-concepts",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#architecture-concepts"},[e("span",null,"Architecture Concepts")])],-1)]))}const s=c(n,[["render",a],["__file","index.html.vue"]]),l=JSON.parse('{"path":"/architecutre-concepts/","title":"Architecture Concepts","lang":"en-US","frontmatter":{"description":"Architecture Concepts","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/architecutre-concepts/"}],["meta",{"property":"og:url","content":"https://goravel.dev/architecutre-concepts/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/architecutre-concepts/"}],["meta",{"property":"og:description","content":"Architecture Concepts"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Architecture Concepts\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"architecutre-concepts/README.md","autoDesc":true}');export{s as comp,l as data}; +import{_ as c,c as r,b as e,o}from"./app-Ewo6p9aM.js";const n={};function a(p,t){return o(),r("div",null,t[0]||(t[0]=[e("h1",{id:"architecture-concepts",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#architecture-concepts"},[e("span",null,"Architecture Concepts")])],-1)]))}const s=c(n,[["render",a],["__file","index.html.vue"]]),l=JSON.parse('{"path":"/architecutre-concepts/","title":"Architecture Concepts","lang":"en-US","frontmatter":{"description":"Architecture Concepts","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/architecutre-concepts/"}],["meta",{"property":"og:url","content":"https://goravel.dev/architecutre-concepts/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/architecutre-concepts/"}],["meta",{"property":"og:description","content":"Architecture Concepts"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Architecture Concepts\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"architecutre-concepts/README.md","autoDesc":true}');export{s as comp,l as data}; diff --git a/assets/index.html-CzAmH-u1.js b/assets/index.html-C0_A7UL3.js similarity index 94% rename from assets/index.html-CzAmH-u1.js rename to assets/index.html-C0_A7UL3.js index cd2ce6b5..5889eb9e 100644 --- a/assets/index.html-CzAmH-u1.js +++ b/assets/index.html-C0_A7UL3.js @@ -1 +1 @@ -import{_ as t,c as r,b as n,o}from"./app-ELDWQP0J.js";const a={};function i(p,e){return o(),r("div",null,e[0]||(e[0]=[n("p",null,"Digging Deeper",-1)]))}const l=t(a,[["render",i],["__file","index.html.vue"]]),c=JSON.parse('{"path":"/digging-deeper/","title":"","lang":"en-US","frontmatter":{"description":"Digging Deeper","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/digging-deeper/"}],["meta",{"property":"og:url","content":"https://goravel.dev/digging-deeper/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/digging-deeper/"}],["meta",{"property":"og:description","content":"Digging Deeper"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"digging-deeper/README.md","autoDesc":true}');export{l as comp,c as data}; +import{_ as t,c as r,b as n,o}from"./app-Ewo6p9aM.js";const a={};function i(p,e){return o(),r("div",null,e[0]||(e[0]=[n("p",null,"Digging Deeper",-1)]))}const l=t(a,[["render",i],["__file","index.html.vue"]]),c=JSON.parse('{"path":"/digging-deeper/","title":"","lang":"en-US","frontmatter":{"description":"Digging Deeper","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/digging-deeper/"}],["meta",{"property":"og:url","content":"https://goravel.dev/digging-deeper/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/digging-deeper/"}],["meta",{"property":"og:description","content":"Digging Deeper"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"digging-deeper/README.md","autoDesc":true}');export{l as comp,c as data}; diff --git a/assets/index.html-CT0kaf7E.js b/assets/index.html-CT0kaf7E.js deleted file mode 100644 index b01399b4..00000000 --- a/assets/index.html-CT0kaf7E.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as l,c as s,a as i,b as e,d as a,e as o,f as n,r as g,o as h}from"./app-ELDWQP0J.js";const u={};function p(d,t){const r=g("RouteLink");return h(),s("div",null,[t[32]||(t[32]=i('
Logo

DocGoReleaseTestReport CardCodecovLicense

',1)),e("p",null,[t[1]||(t[1]=a("English | ")),o(r,{to:"/zh/"},{default:n(()=>t[0]||(t[0]=[a("中文")])),_:1})]),t[33]||(t[33]=i('

About Goravel

Goravel is a web application framework with complete functions and excellent scalability. As a starting scaffolding to help Gopher quickly build their own applications.

The framework's design is consistent with Laravel, simplifying the learning curve for PHPers. Kudos to Laravel!

We are open to receiving stars, PRs, and issues!

Main Function

',5)),e("table",null,[t[27]||(t[27]=e("thead",null,[e("tr",null,[e("th"),e("th"),e("th"),e("th"),e("th")])],-1)),e("tbody",null,[e("tr",null,[e("td",null,[o(r,{to:"/getting-started/configuration.html"},{default:n(()=>t[2]||(t[2]=[a("Config")])),_:1})]),e("td",null,[o(r,{to:"/the-basics/routing.html"},{default:n(()=>t[3]||(t[3]=[a("Http")])),_:1})]),e("td",null,[o(r,{to:"/security/authentication.html"},{default:n(()=>t[4]||(t[4]=[a("Authentication")])),_:1})]),e("td",null,[o(r,{to:"/security/authorization.html"},{default:n(()=>t[5]||(t[5]=[a("Authorization")])),_:1})]),e("td",null,[o(r,{to:"/orm/getting-started.html"},{default:n(()=>t[6]||(t[6]=[a("Orm")])),_:1})])]),e("tr",null,[e("td",null,[o(r,{to:"/orm/migrations.html"},{default:n(()=>t[7]||(t[7]=[a("Migrate")])),_:1})]),e("td",null,[o(r,{to:"/the-basics/logging.html"},{default:n(()=>t[8]||(t[8]=[a("Logger")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/cache.html"},{default:n(()=>t[9]||(t[9]=[a("Cache")])),_:1})]),e("td",null,[o(r,{to:"/the-basics/grpc.html"},{default:n(()=>t[10]||(t[10]=[a("Grpc")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/artisan-console.html"},{default:n(()=>t[11]||(t[11]=[a("Artisan Console")])),_:1})])]),e("tr",null,[e("td",null,[o(r,{to:"/digging-deeper/task-scheduling.html"},{default:n(()=>t[12]||(t[12]=[a("Task Scheduling")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/queues.html"},{default:n(()=>t[13]||(t[13]=[a("Queue")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/event.html"},{default:n(()=>t[14]||(t[14]=[a("Event")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/filesystem.html"},{default:n(()=>t[15]||(t[15]=[a("FileStorage")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/mail.html"},{default:n(()=>t[16]||(t[16]=[a("Mail")])),_:1})])]),e("tr",null,[e("td",null,[o(r,{to:"/the-basics/validation.html"},{default:n(()=>t[17]||(t[17]=[a("Validation")])),_:1})]),e("td",null,[o(r,{to:"/testing/mock.html"},{default:n(()=>t[18]||(t[18]=[a("Mock")])),_:1})]),e("td",null,[o(r,{to:"/security/hashing.html"},{default:n(()=>t[19]||(t[19]=[a("Hash")])),_:1})]),e("td",null,[o(r,{to:"/security/encryption.html"},{default:n(()=>t[20]||(t[20]=[a("Crypt")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/helpers.html"},{default:n(()=>t[21]||(t[21]=[a("Carbon")])),_:1})])]),e("tr",null,[e("td",null,[o(r,{to:"/digging-deeper/package-development.html"},{default:n(()=>t[22]||(t[22]=[a("Package Development")])),_:1})]),e("td",null,[o(r,{to:"/testing/getting-started.html"},{default:n(()=>t[23]||(t[23]=[a("Testing")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/localization.html"},{default:n(()=>t[24]||(t[24]=[a("Localization")])),_:1})]),e("td",null,[o(r,{to:"/the-basics/session.html"},{default:n(()=>t[25]||(t[25]=[a("Session")])),_:1})]),t[26]||(t[26]=e("td",null,null,-1))])])]),t[34]||(t[34]=i('

Roadmap

For Detail

Excellent Extend Packages

',3)),e("p",null,[o(r,{to:"/prologue/packages.html"},{default:n(()=>t[28]||(t[28]=[a("For Detail")])),_:1})]),t[35]||(t[35]=i('

Documentation

Online documentation https://www.goravel.dev

Example https://github.com/goravel/example

To optimize the documentation, please submit a PR to the documentation repository https://github.com/goravel/docs

Contributors

',5)),e("p",null,[t[30]||(t[30]=a("This project is made possible by everyone who contributes. To contribute, please consult the ")),o(r,{to:"/prologue/contributions.html"},{default:n(()=>t[29]||(t[29]=[a("Contribution Guide")])),_:1}),t[31]||(t[31]=a("."))]),t[36]||(t[36]=i('

Better development of the project is inseparable from your support, reward us by Open Collective.

Group

Welcome more discussion in Discord.

https://discord.gg/cFc5csczzS

License

The Goravel framework is open-sourced software licensed under the MIT license.

',9))])}const c=l(u,[["render",p],["__file","index.html.vue"]]),b=JSON.parse('{"path":"/","title":"","lang":"en-US","frontmatter":{"description":"Logo Doc Go Release Test Report Card Codecov License English | About Goravel Goravel is a web application framework with complete functions and excellent scalability. As a start...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/"}],["meta",{"property":"og:url","content":"https://goravel.dev/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/"}],["meta",{"property":"og:description","content":"Logo Doc Go Release Test Report Card Codecov License English | About Goravel Goravel is a web application framework with complete functions and excellent scalability. As a start..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pkg.go.dev/badge/github.com/goravel/framework"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"\\",\\"image\\":[\\"https://pkg.go.dev/badge/github.com/goravel/framework\\",\\"https://img.shields.io/github/go-mod/go-version/goravel/framework\\",\\"https://img.shields.io/github/release/goravel/framework.svg\\",\\"https://github.com/goravel/framework/actions/workflows/test.yml/badge.svg\\",\\"https://goreportcard.com/badge/github.com/goravel/framework\\",\\"https://codecov.io/gh/goravel/framework/branch/master/graph/badge.svg\\",\\"https://img.shields.io/github/license/goravel/framework\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"About Goravel","slug":"about-goravel","link":"#about-goravel","children":[]},{"level":2,"title":"Main Function","slug":"main-function","link":"#main-function","children":[]},{"level":2,"title":"Roadmap","slug":"roadmap","link":"#roadmap","children":[]},{"level":2,"title":"Excellent Extend Packages","slug":"excellent-extend-packages","link":"#excellent-extend-packages","children":[]},{"level":2,"title":"Documentation","slug":"documentation","link":"#documentation","children":[]},{"level":2,"title":"Contributors","slug":"contributors","link":"#contributors","children":[]},{"level":2,"title":"Sponsor","slug":"sponsor","link":"#sponsor","children":[]},{"level":2,"title":"Group","slug":"group","link":"#group","children":[]},{"level":2,"title":"License","slug":"license","link":"#license","children":[]}],"git":{},"filePathRelative":"README.md","autoDesc":true}');export{c as comp,b as data}; diff --git a/assets/index.html-VPpLgu3h.js b/assets/index.html-Cae7jPN6.js similarity index 94% rename from assets/index.html-VPpLgu3h.js rename to assets/index.html-Cae7jPN6.js index 54737e85..f245319b 100644 --- a/assets/index.html-VPpLgu3h.js +++ b/assets/index.html-Cae7jPN6.js @@ -1 +1 @@ -import{_ as o,c as r,b as e,o as a}from"./app-ELDWQP0J.js";const n={};function l(p,t){return a(),r("div",null,t[0]||(t[0]=[e("h1",{id:"orm",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#orm"},[e("span",null,"ORM")])],-1)]))}const i=o(n,[["render",l],["__file","index.html.vue"]]),s=JSON.parse('{"path":"/zh/orm/","title":"ORM","lang":"zh-CN","frontmatter":{"description":"ORM","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/orm/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/orm/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/orm/"}],["meta",{"property":"og:description","content":"ORM"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"ORM\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/orm/README.md","autoDesc":true}');export{i as comp,s as data}; +import{_ as o,c as r,b as e,o as a}from"./app-Ewo6p9aM.js";const n={};function l(p,t){return a(),r("div",null,t[0]||(t[0]=[e("h1",{id:"orm",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#orm"},[e("span",null,"ORM")])],-1)]))}const i=o(n,[["render",l],["__file","index.html.vue"]]),s=JSON.parse('{"path":"/zh/orm/","title":"ORM","lang":"zh-CN","frontmatter":{"description":"ORM","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/orm/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/orm/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/orm/"}],["meta",{"property":"og:description","content":"ORM"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"ORM\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/orm/README.md","autoDesc":true}');export{i as comp,s as data}; diff --git a/assets/index.html-IziS7bPz.js b/assets/index.html-Cm8gFo-6.js similarity index 94% rename from assets/index.html-IziS7bPz.js rename to assets/index.html-Cm8gFo-6.js index 491f4952..743f055b 100644 --- a/assets/index.html-IziS7bPz.js +++ b/assets/index.html-Cm8gFo-6.js @@ -1 +1 @@ -import{_ as a,c as o,b as e,o as r}from"./app-ELDWQP0J.js";const n={};function s(c,t){return r(),o("div",null,t[0]||(t[0]=[e("h1",{id:"基本功能",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#基本功能"},[e("span",null,"基本功能")])],-1)]))}const i=a(n,[["render",s],["__file","index.html.vue"]]),p=JSON.parse('{"path":"/zh/the-basics/","title":"基本功能","lang":"zh-CN","frontmatter":{"description":"基本功能","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/the-basics/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/the-basics/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/the-basics/"}],["meta",{"property":"og:description","content":"基本功能"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"基本功能\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/the-basics/README.md","autoDesc":true}');export{i as comp,p as data}; +import{_ as a,c as o,b as e,o as r}from"./app-Ewo6p9aM.js";const n={};function s(c,t){return r(),o("div",null,t[0]||(t[0]=[e("h1",{id:"基本功能",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#基本功能"},[e("span",null,"基本功能")])],-1)]))}const i=a(n,[["render",s],["__file","index.html.vue"]]),p=JSON.parse('{"path":"/zh/the-basics/","title":"基本功能","lang":"zh-CN","frontmatter":{"description":"基本功能","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/the-basics/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/the-basics/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/the-basics/"}],["meta",{"property":"og:description","content":"基本功能"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"基本功能\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/the-basics/README.md","autoDesc":true}');export{i as comp,p as data}; diff --git a/assets/index.html-Df977mn_.js b/assets/index.html-Df977mn_.js new file mode 100644 index 00000000..7b1697d2 --- /dev/null +++ b/assets/index.html-Df977mn_.js @@ -0,0 +1 @@ +import{_ as l}from"./logo-CxXS7KxG.js";import{_ as s,c as g,a as i,b as e,d as a,e as o,f as n,r as h,o as u}from"./app-Ewo6p9aM.js";const p="/reward.png",d={};function m(c,t){const r=h("RouteLink");return u(),g("div",null,[t[32]||(t[32]=i('
Logo

DocGoReleaseTestReport CardCodecovLicense

',1)),e("p",null,[t[1]||(t[1]=a("English | ")),o(r,{to:"/zh/"},{default:n(()=>t[0]||(t[0]=[a("中文")])),_:1})]),t[33]||(t[33]=i('

About Goravel

Goravel is a web application framework with complete functions and excellent scalability. As a starting scaffolding to help Gopher quickly build their own applications.

The framework's design is consistent with Laravel, simplifying the learning curve for PHPers. Kudos to Laravel!

We are open to receiving stars, PRs, and issues!

Main Function

',5)),e("table",null,[t[27]||(t[27]=e("thead",null,[e("tr",null,[e("th"),e("th"),e("th"),e("th"),e("th")])],-1)),e("tbody",null,[e("tr",null,[e("td",null,[o(r,{to:"/getting-started/configuration.html"},{default:n(()=>t[2]||(t[2]=[a("Config")])),_:1})]),e("td",null,[o(r,{to:"/the-basics/routing.html"},{default:n(()=>t[3]||(t[3]=[a("Http")])),_:1})]),e("td",null,[o(r,{to:"/security/authentication.html"},{default:n(()=>t[4]||(t[4]=[a("Authentication")])),_:1})]),e("td",null,[o(r,{to:"/security/authorization.html"},{default:n(()=>t[5]||(t[5]=[a("Authorization")])),_:1})]),e("td",null,[o(r,{to:"/orm/getting-started.html"},{default:n(()=>t[6]||(t[6]=[a("Orm")])),_:1})])]),e("tr",null,[e("td",null,[o(r,{to:"/orm/migrations.html"},{default:n(()=>t[7]||(t[7]=[a("Migrate")])),_:1})]),e("td",null,[o(r,{to:"/the-basics/logging.html"},{default:n(()=>t[8]||(t[8]=[a("Logger")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/cache.html"},{default:n(()=>t[9]||(t[9]=[a("Cache")])),_:1})]),e("td",null,[o(r,{to:"/the-basics/grpc.html"},{default:n(()=>t[10]||(t[10]=[a("Grpc")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/artisan-console.html"},{default:n(()=>t[11]||(t[11]=[a("Artisan Console")])),_:1})])]),e("tr",null,[e("td",null,[o(r,{to:"/digging-deeper/task-scheduling.html"},{default:n(()=>t[12]||(t[12]=[a("Task Scheduling")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/queues.html"},{default:n(()=>t[13]||(t[13]=[a("Queue")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/event.html"},{default:n(()=>t[14]||(t[14]=[a("Event")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/filesystem.html"},{default:n(()=>t[15]||(t[15]=[a("FileStorage")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/mail.html"},{default:n(()=>t[16]||(t[16]=[a("Mail")])),_:1})])]),e("tr",null,[e("td",null,[o(r,{to:"/the-basics/validation.html"},{default:n(()=>t[17]||(t[17]=[a("Validation")])),_:1})]),e("td",null,[o(r,{to:"/testing/mock.html"},{default:n(()=>t[18]||(t[18]=[a("Mock")])),_:1})]),e("td",null,[o(r,{to:"/security/hashing.html"},{default:n(()=>t[19]||(t[19]=[a("Hash")])),_:1})]),e("td",null,[o(r,{to:"/security/encryption.html"},{default:n(()=>t[20]||(t[20]=[a("Crypt")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/helpers.html"},{default:n(()=>t[21]||(t[21]=[a("Carbon")])),_:1})])]),e("tr",null,[e("td",null,[o(r,{to:"/digging-deeper/package-development.html"},{default:n(()=>t[22]||(t[22]=[a("Package Development")])),_:1})]),e("td",null,[o(r,{to:"/testing/getting-started.html"},{default:n(()=>t[23]||(t[23]=[a("Testing")])),_:1})]),e("td",null,[o(r,{to:"/digging-deeper/localization.html"},{default:n(()=>t[24]||(t[24]=[a("Localization")])),_:1})]),e("td",null,[o(r,{to:"/the-basics/session.html"},{default:n(()=>t[25]||(t[25]=[a("Session")])),_:1})]),t[26]||(t[26]=e("td",null,null,-1))])])]),t[34]||(t[34]=i('

Roadmap

For Detail

Excellent Extend Packages

',3)),e("p",null,[o(r,{to:"/prologue/packages.html"},{default:n(()=>t[28]||(t[28]=[a("For Detail")])),_:1})]),t[35]||(t[35]=i('

Documentation

Online documentation https://www.goravel.dev

Example https://github.com/goravel/example

To optimize the documentation, please submit a PR to the documentation repository https://github.com/goravel/docs

Contributors

',5)),e("p",null,[t[30]||(t[30]=a("This project is made possible by everyone who contributes. To contribute, please consult the ")),o(r,{to:"/prologue/contributions.html"},{default:n(()=>t[29]||(t[29]=[a("Contribution Guide")])),_:1}),t[31]||(t[31]=a("."))]),t[36]||(t[36]=i('

Better development of the project is inseparable from your support, reward us by Open Collective.

Group

Welcome more discussion in Discord.

https://discord.gg/cFc5csczzS

License

The Goravel framework is open-sourced software licensed under the MIT license.

',9))])}const v=s(d,[["render",m],["__file","index.html.vue"]]),k=JSON.parse('{"path":"/","title":"","lang":"en-US","frontmatter":{"description":"Logo Doc Go Release Test Report Card Codecov License English | About Goravel Goravel is a web application framework with complete functions and excellent scalability. As a start...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/"}],["meta",{"property":"og:url","content":"https://goravel.dev/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/"}],["meta",{"property":"og:description","content":"Logo Doc Go Release Test Report Card Codecov License English | About Goravel Goravel is a web application framework with complete functions and excellent scalability. As a start..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pkg.go.dev/badge/github.com/goravel/framework"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"\\",\\"image\\":[\\"https://pkg.go.dev/badge/github.com/goravel/framework\\",\\"https://img.shields.io/github/go-mod/go-version/goravel/framework\\",\\"https://img.shields.io/github/release/goravel/framework.svg\\",\\"https://github.com/goravel/framework/actions/workflows/test.yml/badge.svg\\",\\"https://goreportcard.com/badge/github.com/goravel/framework\\",\\"https://codecov.io/gh/goravel/framework/branch/master/graph/badge.svg\\",\\"https://img.shields.io/github/license/goravel/framework\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"About Goravel","slug":"about-goravel","link":"#about-goravel","children":[]},{"level":2,"title":"Main Function","slug":"main-function","link":"#main-function","children":[]},{"level":2,"title":"Roadmap","slug":"roadmap","link":"#roadmap","children":[]},{"level":2,"title":"Excellent Extend Packages","slug":"excellent-extend-packages","link":"#excellent-extend-packages","children":[]},{"level":2,"title":"Documentation","slug":"documentation","link":"#documentation","children":[]},{"level":2,"title":"Contributors","slug":"contributors","link":"#contributors","children":[]},{"level":2,"title":"Sponsor","slug":"sponsor","link":"#sponsor","children":[]},{"level":2,"title":"Group","slug":"group","link":"#group","children":[]},{"level":2,"title":"License","slug":"license","link":"#license","children":[]}],"git":{},"filePathRelative":"README.md","autoDesc":true}');export{v as comp,k as data}; diff --git a/assets/index.html-DG7cQ81A.js b/assets/index.html-DgIIss5c.js similarity index 95% rename from assets/index.html-DG7cQ81A.js rename to assets/index.html-DgIIss5c.js index 3cd38672..258b9562 100644 --- a/assets/index.html-DG7cQ81A.js +++ b/assets/index.html-DgIIss5c.js @@ -1 +1 @@ -import{_ as a,c as r,b as t,o as n}from"./app-ELDWQP0J.js";const o={};function i(l,e){return n(),r("div",null,e[0]||(e[0]=[t("h1",{id:"getting-started",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#getting-started"},[t("span",null,"Getting Started")])],-1)]))}const s=a(o,[["render",i],["__file","index.html.vue"]]),c=JSON.parse('{"path":"/getting-started/","title":"Getting Started","lang":"en-US","frontmatter":{"description":"Getting Started","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/getting-started/"}],["meta",{"property":"og:url","content":"https://goravel.dev/getting-started/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/getting-started/"}],["meta",{"property":"og:description","content":"Getting Started"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Getting Started\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"getting-started/README.md","autoDesc":true}');export{s as comp,c as data}; +import{_ as a,c as r,b as t,o as n}from"./app-Ewo6p9aM.js";const o={};function i(l,e){return n(),r("div",null,e[0]||(e[0]=[t("h1",{id:"getting-started",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#getting-started"},[t("span",null,"Getting Started")])],-1)]))}const s=a(o,[["render",i],["__file","index.html.vue"]]),c=JSON.parse('{"path":"/getting-started/","title":"Getting Started","lang":"en-US","frontmatter":{"description":"Getting Started","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/getting-started/"}],["meta",{"property":"og:url","content":"https://goravel.dev/getting-started/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/getting-started/"}],["meta",{"property":"og:description","content":"Getting Started"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Getting Started\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"getting-started/README.md","autoDesc":true}');export{s as comp,c as data}; diff --git a/assets/index.html-mt-dD_0e.js b/assets/index.html-DzLqAZ-M.js similarity index 95% rename from assets/index.html-mt-dD_0e.js rename to assets/index.html-DzLqAZ-M.js index 13c2e2ce..fd3daae0 100644 --- a/assets/index.html-mt-dD_0e.js +++ b/assets/index.html-DzLqAZ-M.js @@ -1 +1 @@ -import{_ as r,c as n,b as e,o as a}from"./app-ELDWQP0J.js";const o={};function i(p,t){return a(),n("div",null,t[0]||(t[0]=[e("h1",{id:"综合话题",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#综合话题"},[e("span",null,"综合话题")])],-1)]))}const c=r(o,[["render",i],["__file","index.html.vue"]]),d=JSON.parse('{"path":"/zh/digging-deeper/","title":"综合话题","lang":"zh-CN","frontmatter":{"description":"综合话题","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/digging-deeper/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/digging-deeper/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/digging-deeper/"}],["meta",{"property":"og:description","content":"综合话题"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"综合话题\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/digging-deeper/README.md","autoDesc":true}');export{c as comp,d as data}; +import{_ as r,c as n,b as e,o as a}from"./app-Ewo6p9aM.js";const o={};function i(p,t){return a(),n("div",null,t[0]||(t[0]=[e("h1",{id:"综合话题",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#综合话题"},[e("span",null,"综合话题")])],-1)]))}const c=r(o,[["render",i],["__file","index.html.vue"]]),d=JSON.parse('{"path":"/zh/digging-deeper/","title":"综合话题","lang":"zh-CN","frontmatter":{"description":"综合话题","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/digging-deeper/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/digging-deeper/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/digging-deeper/"}],["meta",{"property":"og:description","content":"综合话题"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"综合话题\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/digging-deeper/README.md","autoDesc":true}');export{c as comp,d as data}; diff --git a/assets/index.html-lmPszigo.js b/assets/index.html-RQUretvc.js similarity index 94% rename from assets/index.html-lmPszigo.js rename to assets/index.html-RQUretvc.js index 76f3c48f..e1077dff 100644 --- a/assets/index.html-lmPszigo.js +++ b/assets/index.html-RQUretvc.js @@ -1 +1 @@ -import{_ as a,c as o,b as e,o as s}from"./app-ELDWQP0J.js";const r={};function n(c,t){return s(),o("div",null,t[0]||(t[0]=[e("h1",{id:"the-basics",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#the-basics"},[e("span",null,"The Basics")])],-1)]))}const l=a(r,[["render",n],["__file","index.html.vue"]]),p=JSON.parse('{"path":"/the-basics/","title":"The Basics","lang":"en-US","frontmatter":{"description":"The Basics","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/the-basics/"}],["meta",{"property":"og:url","content":"https://goravel.dev/the-basics/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/the-basics/"}],["meta",{"property":"og:description","content":"The Basics"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"The Basics\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"the-basics/README.md","autoDesc":true}');export{l as comp,p as data}; +import{_ as a,c as o,b as e,o as s}from"./app-Ewo6p9aM.js";const r={};function n(c,t){return s(),o("div",null,t[0]||(t[0]=[e("h1",{id:"the-basics",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#the-basics"},[e("span",null,"The Basics")])],-1)]))}const l=a(r,[["render",n],["__file","index.html.vue"]]),p=JSON.parse('{"path":"/the-basics/","title":"The Basics","lang":"en-US","frontmatter":{"description":"The Basics","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/the-basics/"}],["meta",{"property":"og:url","content":"https://goravel.dev/the-basics/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/the-basics/"}],["meta",{"property":"og:description","content":"The Basics"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"The Basics\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"the-basics/README.md","autoDesc":true}');export{l as comp,p as data}; diff --git a/assets/index.html-BvGPStsm.js b/assets/index.html-Vt8tv1Xv.js similarity index 94% rename from assets/index.html-BvGPStsm.js rename to assets/index.html-Vt8tv1Xv.js index 8ad0424b..9c8482a8 100644 --- a/assets/index.html-BvGPStsm.js +++ b/assets/index.html-Vt8tv1Xv.js @@ -1 +1 @@ -import{_ as n,c as a,b as e,o}from"./app-ELDWQP0J.js";const r={};function l(i,t){return o(),a("div",null,t[0]||(t[0]=[e("h1",{id:"测试相关",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#测试相关"},[e("span",null,"测试相关")])],-1)]))}const s=n(r,[["render",l],["__file","index.html.vue"]]),c=JSON.parse('{"path":"/zh/testing/","title":"测试相关","lang":"zh-CN","frontmatter":{"description":"测试相关","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/testing/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/testing/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/testing/"}],["meta",{"property":"og:description","content":"测试相关"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"测试相关\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/testing/README.md","autoDesc":true}');export{s as comp,c as data}; +import{_ as n,c as a,b as e,o}from"./app-Ewo6p9aM.js";const r={};function l(i,t){return o(),a("div",null,t[0]||(t[0]=[e("h1",{id:"测试相关",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#测试相关"},[e("span",null,"测试相关")])],-1)]))}const s=n(r,[["render",l],["__file","index.html.vue"]]),c=JSON.parse('{"path":"/zh/testing/","title":"测试相关","lang":"zh-CN","frontmatter":{"description":"测试相关","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/testing/"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/testing/"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/testing/"}],["meta",{"property":"og:description","content":"测试相关"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"测试相关\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/testing/README.md","autoDesc":true}');export{s as comp,c as data}; diff --git a/assets/installation.html-8lnSZIsI.js b/assets/installation.html-V65Je3iJ.js similarity index 99% rename from assets/installation.html-8lnSZIsI.js rename to assets/installation.html-V65Je3iJ.js index a3febc49..4af81f01 100644 --- a/assets/installation.html-8lnSZIsI.js +++ b/assets/installation.html-V65Je3iJ.js @@ -1,4 +1,4 @@ -import{_ as p,c as u,b as n,e as s,f as l,a as r,d as a,r as i,o as c}from"./app-ELDWQP0J.js";const v={},h={class:"table-of-contents"};function m(g,e){const t=i("router-link"),o=i("RouteLink"),d=i("CommentService");return c(),u("div",null,[e[16]||(e[16]=n("h1",{id:"安装",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#安装"},[n("span",null,"安装")])],-1)),n("nav",h,[n("ul",null,[n("li",null,[s(t,{to:"#服务器要求"},{default:l(()=>e[0]||(e[0]=[a("服务器要求")])),_:1})]),n("li",null,[s(t,{to:"#安装-goravel"},{default:l(()=>e[1]||(e[1]=[a("安装 Goravel")])),_:1}),n("ul",null,[n("li",null,[s(t,{to:"#使用-goravel-安装器"},{default:l(()=>e[2]||(e[2]=[a("使用 Goravel 安装器")])),_:1})]),n("li",null,[s(t,{to:"#手动安装"},{default:l(()=>e[3]||(e[3]=[a("手动安装")])),_:1})])])]),n("li",null,[s(t,{to:"#启动-http-服务"},{default:l(()=>e[4]||(e[4]=[a("启动 HTTP 服务")])),_:1}),n("ul",null,[n("li",null,[s(t,{to:"#根据根目录下的-env-文件启动服务"},{default:l(()=>e[5]||(e[5]=[a("根据根目录下的 .env 文件启动服务")])),_:1})]),n("li",null,[s(t,{to:"#指定-env-文件启动服务"},{default:l(()=>e[6]||(e[6]=[a("指定 .env 文件启动服务")])),_:1})]),n("li",null,[s(t,{to:"#使用环境变量启动服务"},{default:l(()=>e[7]||(e[7]=[a("使用环境变量启动服务")])),_:1})]),n("li",null,[s(t,{to:"#热更新"},{default:l(()=>e[8]||(e[8]=[a("热更新")])),_:1})])])]),n("li",null,[s(t,{to:"#配置"},{default:l(()=>e[9]||(e[9]=[a("配置")])),_:1}),n("ul",null,[n("li",null,[s(t,{to:"#配置文件"},{default:l(()=>e[10]||(e[10]=[a("配置文件")])),_:1})]),n("li",null,[s(t,{to:"#生成密钥"},{default:l(()=>e[11]||(e[11]=[a("生成密钥")])),_:1})]),n("li",null,[s(t,{to:"#生成-jwt-token"},{default:l(()=>e[12]||(e[12]=[a("生成 JWT Token")])),_:1})])])])])]),e[17]||(e[17]=r(`

服务器要求

  • Golang >= 1.21

安装 Goravel

使用 Goravel 安装器

根据文档初始化安装器,然后使用下面命令初始化一个新的 Goravel 项目:

// 进入想要安装项目的目录
+import{_ as p,c as u,b as n,e as s,f as l,a as r,d as a,r as i,o as c}from"./app-Ewo6p9aM.js";const v={},h={class:"table-of-contents"};function m(g,e){const t=i("router-link"),o=i("RouteLink"),d=i("CommentService");return c(),u("div",null,[e[16]||(e[16]=n("h1",{id:"安装",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#安装"},[n("span",null,"安装")])],-1)),n("nav",h,[n("ul",null,[n("li",null,[s(t,{to:"#服务器要求"},{default:l(()=>e[0]||(e[0]=[a("服务器要求")])),_:1})]),n("li",null,[s(t,{to:"#安装-goravel"},{default:l(()=>e[1]||(e[1]=[a("安装 Goravel")])),_:1}),n("ul",null,[n("li",null,[s(t,{to:"#使用-goravel-安装器"},{default:l(()=>e[2]||(e[2]=[a("使用 Goravel 安装器")])),_:1})]),n("li",null,[s(t,{to:"#手动安装"},{default:l(()=>e[3]||(e[3]=[a("手动安装")])),_:1})])])]),n("li",null,[s(t,{to:"#启动-http-服务"},{default:l(()=>e[4]||(e[4]=[a("启动 HTTP 服务")])),_:1}),n("ul",null,[n("li",null,[s(t,{to:"#根据根目录下的-env-文件启动服务"},{default:l(()=>e[5]||(e[5]=[a("根据根目录下的 .env 文件启动服务")])),_:1})]),n("li",null,[s(t,{to:"#指定-env-文件启动服务"},{default:l(()=>e[6]||(e[6]=[a("指定 .env 文件启动服务")])),_:1})]),n("li",null,[s(t,{to:"#使用环境变量启动服务"},{default:l(()=>e[7]||(e[7]=[a("使用环境变量启动服务")])),_:1})]),n("li",null,[s(t,{to:"#热更新"},{default:l(()=>e[8]||(e[8]=[a("热更新")])),_:1})])])]),n("li",null,[s(t,{to:"#配置"},{default:l(()=>e[9]||(e[9]=[a("配置")])),_:1}),n("ul",null,[n("li",null,[s(t,{to:"#配置文件"},{default:l(()=>e[10]||(e[10]=[a("配置文件")])),_:1})]),n("li",null,[s(t,{to:"#生成密钥"},{default:l(()=>e[11]||(e[11]=[a("生成密钥")])),_:1})]),n("li",null,[s(t,{to:"#生成-jwt-token"},{default:l(()=>e[12]||(e[12]=[a("生成 JWT Token")])),_:1})])])])])]),e[17]||(e[17]=r(`

服务器要求

  • Golang >= 1.21

安装 Goravel

使用 Goravel 安装器

根据文档初始化安装器,然后使用下面命令初始化一个新的 Goravel 项目:

// 进入想要安装项目的目录
 goravel new blog
 

手动安装

// 下载框架
 git clone https://github.com/goravel/goravel.git && rm -rf goravel/.git*
diff --git a/assets/installation.html-BIybxPEG.js b/assets/installation.html-wUPfcyRS.js
similarity index 99%
rename from assets/installation.html-BIybxPEG.js
rename to assets/installation.html-wUPfcyRS.js
index 63491204..9512367d 100644
--- a/assets/installation.html-BIybxPEG.js
+++ b/assets/installation.html-wUPfcyRS.js
@@ -1,4 +1,4 @@
-import{_ as c,c as p,b as n,e as t,f as i,a as r,d as a,r as l,o as u}from"./app-ELDWQP0J.js";const v={},g={class:"table-of-contents"};function h(m,e){const s=l("router-link"),o=l("RouteLink"),d=l("CommentService");return u(),p("div",null,[e[16]||(e[16]=n("h1",{id:"installation",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#installation"},[n("span",null,"Installation")])],-1)),n("nav",g,[n("ul",null,[n("li",null,[t(s,{to:"#server-requirements"},{default:i(()=>e[0]||(e[0]=[a("Server Requirements")])),_:1})]),n("li",null,[t(s,{to:"#installation-1"},{default:i(()=>e[1]||(e[1]=[a("Installation")])),_:1}),n("ul",null,[n("li",null,[t(s,{to:"#using-goravel-installer"},{default:i(()=>e[2]||(e[2]=[a("Using Goravel Installer")])),_:1})]),n("li",null,[t(s,{to:"#manual-installation"},{default:i(()=>e[3]||(e[3]=[a("Manual Installation")])),_:1})])])]),n("li",null,[t(s,{to:"#start-http-service"},{default:i(()=>e[4]||(e[4]=[a("Start HTTP Service")])),_:1}),n("ul",null,[n("li",null,[t(s,{to:"#start-service-according-to-env-file-in-the-root-directory"},{default:i(()=>e[5]||(e[5]=[a("Start Service According To .env File In The Root Directory")])),_:1})]),n("li",null,[t(s,{to:"#specify-env-file-to-start-service"},{default:i(()=>e[6]||(e[6]=[a("Specify .env File To Start Service")])),_:1})]),n("li",null,[t(s,{to:"#start-service-using-environment-variables"},{default:i(()=>e[7]||(e[7]=[a("Start Service Using Environment Variables")])),_:1})]),n("li",null,[t(s,{to:"#live-reload"},{default:i(()=>e[8]||(e[8]=[a("Live reload")])),_:1})])])]),n("li",null,[t(s,{to:"#configuration"},{default:i(()=>e[9]||(e[9]=[a("Configuration")])),_:1}),n("ul",null,[n("li",null,[t(s,{to:"#configuration-files"},{default:i(()=>e[10]||(e[10]=[a("Configuration files")])),_:1})]),n("li",null,[t(s,{to:"#generate-application-key"},{default:i(()=>e[11]||(e[11]=[a("Generate Application key")])),_:1})]),n("li",null,[t(s,{to:"#generate-jwt-token"},{default:i(()=>e[12]||(e[12]=[a("Generate JWT Token")])),_:1})])])])])]),e[17]||(e[17]=r(`

Server Requirements

  • Golang >= 1.21

Installation

Using Goravel Installer

Initialize the installer according to the documentation, and then initialize a new Goravel project using the following command:

// Enter the directory where you want to install the project
+import{_ as c,c as p,b as n,e as t,f as i,a as r,d as a,r as l,o as u}from"./app-Ewo6p9aM.js";const v={},g={class:"table-of-contents"};function h(m,e){const s=l("router-link"),o=l("RouteLink"),d=l("CommentService");return u(),p("div",null,[e[16]||(e[16]=n("h1",{id:"installation",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#installation"},[n("span",null,"Installation")])],-1)),n("nav",g,[n("ul",null,[n("li",null,[t(s,{to:"#server-requirements"},{default:i(()=>e[0]||(e[0]=[a("Server Requirements")])),_:1})]),n("li",null,[t(s,{to:"#installation-1"},{default:i(()=>e[1]||(e[1]=[a("Installation")])),_:1}),n("ul",null,[n("li",null,[t(s,{to:"#using-goravel-installer"},{default:i(()=>e[2]||(e[2]=[a("Using Goravel Installer")])),_:1})]),n("li",null,[t(s,{to:"#manual-installation"},{default:i(()=>e[3]||(e[3]=[a("Manual Installation")])),_:1})])])]),n("li",null,[t(s,{to:"#start-http-service"},{default:i(()=>e[4]||(e[4]=[a("Start HTTP Service")])),_:1}),n("ul",null,[n("li",null,[t(s,{to:"#start-service-according-to-env-file-in-the-root-directory"},{default:i(()=>e[5]||(e[5]=[a("Start Service According To .env File In The Root Directory")])),_:1})]),n("li",null,[t(s,{to:"#specify-env-file-to-start-service"},{default:i(()=>e[6]||(e[6]=[a("Specify .env File To Start Service")])),_:1})]),n("li",null,[t(s,{to:"#start-service-using-environment-variables"},{default:i(()=>e[7]||(e[7]=[a("Start Service Using Environment Variables")])),_:1})]),n("li",null,[t(s,{to:"#live-reload"},{default:i(()=>e[8]||(e[8]=[a("Live reload")])),_:1})])])]),n("li",null,[t(s,{to:"#configuration"},{default:i(()=>e[9]||(e[9]=[a("Configuration")])),_:1}),n("ul",null,[n("li",null,[t(s,{to:"#configuration-files"},{default:i(()=>e[10]||(e[10]=[a("Configuration files")])),_:1})]),n("li",null,[t(s,{to:"#generate-application-key"},{default:i(()=>e[11]||(e[11]=[a("Generate Application key")])),_:1})]),n("li",null,[t(s,{to:"#generate-jwt-token"},{default:i(()=>e[12]||(e[12]=[a("Generate JWT Token")])),_:1})])])])])]),e[17]||(e[17]=r(`

Server Requirements

  • Golang >= 1.21

Installation

Using Goravel Installer

Initialize the installer according to the documentation, and then initialize a new Goravel project using the following command:

// Enter the directory where you want to install the project
 goravel new blog
 

Manual Installation

// Download framework
 git clone https://github.com/goravel/goravel.git && rm -rf goravel/.git*
diff --git a/assets/localization.html-DRqEi7DE.js b/assets/localization.html-aHKhjEZN.js
similarity index 99%
rename from assets/localization.html-DRqEi7DE.js
rename to assets/localization.html-aHKhjEZN.js
index 473d536f..0b346d26 100644
--- a/assets/localization.html-DRqEi7DE.js
+++ b/assets/localization.html-aHKhjEZN.js
@@ -1,4 +1,4 @@
-import{_ as r,c,b as n,e as s,f as l,a as o,r as t,o as p,d as i}from"./app-ELDWQP0J.js";const u={},v={class:"table-of-contents"};function m(g,e){const a=t("router-link"),d=t("CommentService");return p(),c("div",null,[e[5]||(e[5]=n("h1",{id:"本地化",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#本地化"},[n("span",null,"本地化")])],-1)),n("nav",v,[n("ul",null,[n("li",null,[s(a,{to:"#简介"},{default:l(()=>e[0]||(e[0]=[i("简介")])),_:1})]),n("li",null,[s(a,{to:"#配置语言环境"},{default:l(()=>e[1]||(e[1]=[i("配置语言环境")])),_:1}),n("ul",null,[n("li",null,[s(a,{to:"#确定当前的语言环境"},{default:l(()=>e[2]||(e[2]=[i("确定当前的语言环境")])),_:1})]),n("li",null,[s(a,{to:"#定义翻译字符串"},{default:l(()=>e[3]||(e[3]=[i("定义翻译字符串")])),_:1})]),n("li",null,[s(a,{to:"#检索翻译字符串"},{default:l(()=>e[4]||(e[4]=[i("检索翻译字符串")])),_:1})])])])])]),e[6]||(e[6]=o(`

简介

Goravel 的本地化功能提供了一种方便的方法来检索各种语言的字符串,从而使你可以轻松地在应用程序中支持多种语言。语言字符串存储在 lang 目录里的文件中,Goravel 支持两种方式组织语言文件:

每一种语言文件独立一个文件:

/lang
+import{_ as r,c,b as n,e as s,f as l,a as o,r as t,o as p,d as i}from"./app-Ewo6p9aM.js";const u={},v={class:"table-of-contents"};function m(g,e){const a=t("router-link"),d=t("CommentService");return p(),c("div",null,[e[5]||(e[5]=n("h1",{id:"本地化",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#本地化"},[n("span",null,"本地化")])],-1)),n("nav",v,[n("ul",null,[n("li",null,[s(a,{to:"#简介"},{default:l(()=>e[0]||(e[0]=[i("简介")])),_:1})]),n("li",null,[s(a,{to:"#配置语言环境"},{default:l(()=>e[1]||(e[1]=[i("配置语言环境")])),_:1}),n("ul",null,[n("li",null,[s(a,{to:"#确定当前的语言环境"},{default:l(()=>e[2]||(e[2]=[i("确定当前的语言环境")])),_:1})]),n("li",null,[s(a,{to:"#定义翻译字符串"},{default:l(()=>e[3]||(e[3]=[i("定义翻译字符串")])),_:1})]),n("li",null,[s(a,{to:"#检索翻译字符串"},{default:l(()=>e[4]||(e[4]=[i("检索翻译字符串")])),_:1})])])])])]),e[6]||(e[6]=o(`

简介

Goravel 的本地化功能提供了一种方便的方法来检索各种语言的字符串,从而使你可以轻松地在应用程序中支持多种语言。语言字符串存储在 lang 目录里的文件中,Goravel 支持两种方式组织语言文件:

每一种语言文件独立一个文件:

/lang
   en.json
   cn.json
 

或者当语言过多时,可以对其进行分类:

/lang
diff --git a/assets/localization.html-BkLT5oeb.js b/assets/localization.html-ioRlV1eG.js
similarity index 99%
rename from assets/localization.html-BkLT5oeb.js
rename to assets/localization.html-ioRlV1eG.js
index 86c715cd..bd0e2e1f 100644
--- a/assets/localization.html-BkLT5oeb.js
+++ b/assets/localization.html-ioRlV1eG.js
@@ -1,4 +1,4 @@
-import{_ as o,c as d,b as n,e as a,f as i,a as c,r as l,o as u,d as t}from"./app-ELDWQP0J.js";const p={},g={class:"table-of-contents"};function v(m,e){const s=l("router-link"),r=l("CommentService");return u(),d("div",null,[e[5]||(e[5]=n("h1",{id:"localization",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#localization"},[n("span",null,"Localization")])],-1)),n("nav",g,[n("ul",null,[n("li",null,[a(s,{to:"#introduction"},{default:i(()=>e[0]||(e[0]=[t("Introduction")])),_:1})]),n("li",null,[a(s,{to:"#configuring-the-locale"},{default:i(()=>e[1]||(e[1]=[t("Configuring the Locale")])),_:1}),n("ul",null,[n("li",null,[a(s,{to:"#determining-the-current-locale"},{default:i(()=>e[2]||(e[2]=[t("Determining the Current Locale")])),_:1})]),n("li",null,[a(s,{to:"#defining-translation-strings"},{default:i(()=>e[3]||(e[3]=[t("Defining Translation Strings")])),_:1})]),n("li",null,[a(s,{to:"#retrieving-translation-strings"},{default:i(()=>e[4]||(e[4]=[t("Retrieving Translation Strings")])),_:1})])])])])]),e[6]||(e[6]=c(`

Introduction

Goravel's localization features provide a convenient way to retrieve strings in various languages, making it easy to support multiple languages in your application. Language strings are stored in files in the lang directory, and Goravel supports two ways to organize language files:

Each language has its own file:

/lang
+import{_ as o,c as d,b as n,e as a,f as i,a as c,r as l,o as u,d as t}from"./app-Ewo6p9aM.js";const p={},g={class:"table-of-contents"};function v(m,e){const s=l("router-link"),r=l("CommentService");return u(),d("div",null,[e[5]||(e[5]=n("h1",{id:"localization",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#localization"},[n("span",null,"Localization")])],-1)),n("nav",g,[n("ul",null,[n("li",null,[a(s,{to:"#introduction"},{default:i(()=>e[0]||(e[0]=[t("Introduction")])),_:1})]),n("li",null,[a(s,{to:"#configuring-the-locale"},{default:i(()=>e[1]||(e[1]=[t("Configuring the Locale")])),_:1}),n("ul",null,[n("li",null,[a(s,{to:"#determining-the-current-locale"},{default:i(()=>e[2]||(e[2]=[t("Determining the Current Locale")])),_:1})]),n("li",null,[a(s,{to:"#defining-translation-strings"},{default:i(()=>e[3]||(e[3]=[t("Defining Translation Strings")])),_:1})]),n("li",null,[a(s,{to:"#retrieving-translation-strings"},{default:i(()=>e[4]||(e[4]=[t("Retrieving Translation Strings")])),_:1})])])])])]),e[6]||(e[6]=c(`

Introduction

Goravel's localization features provide a convenient way to retrieve strings in various languages, making it easy to support multiple languages in your application. Language strings are stored in files in the lang directory, and Goravel supports two ways to organize language files:

Each language has its own file:

/lang
   en.json
   cn.json
 

Or, when there are too many translations, they can be categorized:

/lang
diff --git a/assets/logging.html-Bp8flR3X.js b/assets/logging.html-D8i8HGpu.js
similarity index 99%
rename from assets/logging.html-Bp8flR3X.js
rename to assets/logging.html-D8i8HGpu.js
index 00f467b8..f587b311 100644
--- a/assets/logging.html-Bp8flR3X.js
+++ b/assets/logging.html-D8i8HGpu.js
@@ -1,4 +1,4 @@
-import{_ as c,c as i,b as s,e as a,f as e,a as u,r as o,o as d,d as p}from"./app-ELDWQP0J.js";const r={},k={class:"table-of-contents"};function g(v,n){const t=o("router-link"),l=o("CommentService");return d(),i("div",null,[n[9]||(n[9]=s("h1",{id:"日志",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#日志"},[s("span",null,"日志")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#配置"},{default:e(()=>n[1]||(n[1]=[p("配置")])),_:1})]),s("li",null,[a(t,{to:"#可用的通道驱动"},{default:e(()=>n[2]||(n[2]=[p("可用的通道驱动")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#注入-context"},{default:e(()=>n[3]||(n[3]=[p("注入 Context")])),_:1})])])]),s("li",null,[a(t,{to:"#写日志消息"},{default:e(()=>n[4]||(n[4]=[p("写日志消息")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#写入特定通道"},{default:e(()=>n[5]||(n[5]=[p("写入特定通道")])),_:1})])])]),s("li",null,[a(t,{to:"#链式方法"},{default:e(()=>n[6]||(n[6]=[p("链式方法")])),_:1})]),s("li",null,[a(t,{to:"#创建自定义通道"},{default:e(()=>n[7]||(n[7]=[p("创建自定义通道")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#编写驱动"},{default:e(()=>n[8]||(n[8]=[p("编写驱动")])),_:1})])])])])]),n[10]||(n[10]=u(`

简介

为了了解应用程序的运行状况,Goravel 提供了强大的日志模块,可以通过 facades.Log() 将日志消息、系统错误记录到文件或其他通道。

配置

config/logging.go 中进行所有自定义配置,允许配置不同的日志通道。

Goravel 默认使用 stack 通道记录日志,stack 允许日志转发到多个通道中。

singledaily 驱动中的 print 配置可以控制日志输出到控制台。

可用的通道驱动

名称描述
stack允许使用多个通道
single单日志文件
daily每天一个日志文件
custom自定义驱动

注入 Context

facades.Log().WithContext(ctx)
+import{_ as c,c as i,b as s,e as a,f as e,a as u,r as o,o as d,d as p}from"./app-Ewo6p9aM.js";const r={},k={class:"table-of-contents"};function g(v,n){const t=o("router-link"),l=o("CommentService");return d(),i("div",null,[n[9]||(n[9]=s("h1",{id:"日志",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#日志"},[s("span",null,"日志")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#配置"},{default:e(()=>n[1]||(n[1]=[p("配置")])),_:1})]),s("li",null,[a(t,{to:"#可用的通道驱动"},{default:e(()=>n[2]||(n[2]=[p("可用的通道驱动")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#注入-context"},{default:e(()=>n[3]||(n[3]=[p("注入 Context")])),_:1})])])]),s("li",null,[a(t,{to:"#写日志消息"},{default:e(()=>n[4]||(n[4]=[p("写日志消息")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#写入特定通道"},{default:e(()=>n[5]||(n[5]=[p("写入特定通道")])),_:1})])])]),s("li",null,[a(t,{to:"#链式方法"},{default:e(()=>n[6]||(n[6]=[p("链式方法")])),_:1})]),s("li",null,[a(t,{to:"#创建自定义通道"},{default:e(()=>n[7]||(n[7]=[p("创建自定义通道")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#编写驱动"},{default:e(()=>n[8]||(n[8]=[p("编写驱动")])),_:1})])])])])]),n[10]||(n[10]=u(`

简介

为了了解应用程序的运行状况,Goravel 提供了强大的日志模块,可以通过 facades.Log() 将日志消息、系统错误记录到文件或其他通道。

配置

config/logging.go 中进行所有自定义配置,允许配置不同的日志通道。

Goravel 默认使用 stack 通道记录日志,stack 允许日志转发到多个通道中。

singledaily 驱动中的 print 配置可以控制日志输出到控制台。

可用的通道驱动

名称描述
stack允许使用多个通道
single单日志文件
daily每天一个日志文件
custom自定义驱动

注入 Context

facades.Log().WithContext(ctx)
 

写日志消息

facades.Log().Debug(message)
 facades.Log().Debugf(message, args)
 facades.Log().Info(message)
diff --git a/assets/logging.html-B154Sv3t.js b/assets/logging.html-v2chIVWM.js
similarity index 99%
rename from assets/logging.html-B154Sv3t.js
rename to assets/logging.html-v2chIVWM.js
index 15001e58..bbd01757 100644
--- a/assets/logging.html-B154Sv3t.js
+++ b/assets/logging.html-v2chIVWM.js
@@ -1,4 +1,4 @@
-import{_ as c,c as i,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function g(m,n){const t=o("router-link"),l=o("CommentService");return r(),i("div",null,[n[9]||(n[9]=s("h1",{id:"logging",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#logging"},[s("span",null,"Logging")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(t,{to:"#configuration"},{default:e(()=>n[1]||(n[1]=[p("Configuration")])),_:1})]),s("li",null,[a(t,{to:"#available-channel-drivers"},{default:e(()=>n[2]||(n[2]=[p("Available channel drivers")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#inject-context"},{default:e(()=>n[3]||(n[3]=[p("Inject Context")])),_:1})])])]),s("li",null,[a(t,{to:"#write-log-messages"},{default:e(()=>n[4]||(n[4]=[p("Write log messages")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#write-to-a-specific-channel"},{default:e(()=>n[5]||(n[5]=[p("Write to a specific channel")])),_:1})])])]),s("li",null,[a(t,{to:"#chain-methods"},{default:e(()=>n[6]||(n[6]=[p("Chain Methods")])),_:1})]),s("li",null,[a(t,{to:"#create-a-custom-channel"},{default:e(()=>n[7]||(n[7]=[p("Create a custom channel")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#implement-driver"},{default:e(()=>n[8]||(n[8]=[p("Implement Driver")])),_:1})])])])])]),n[10]||(n[10]=u(`

Introduction

In order to understand the running status of the application, Goravel provides a powerful log service that can record log messages and system errors to a file or other channels through facades.Log().

Configuration

To configure various log channels, custom configurations can be made in config/logging.go.

Goravel uses stack channel to record logs by default, stack allows logs to be forwarded to multiple channels.

The print configuration in single and daily drivers can control log output to the console.

Available channel drivers

NameDescription
stackAllow multiple channels
singleSingle log file
dailyOne log file per day
customCustom drive

Inject Context

facades.Log().WithContext(ctx)
+import{_ as c,c as i,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function g(m,n){const t=o("router-link"),l=o("CommentService");return r(),i("div",null,[n[9]||(n[9]=s("h1",{id:"logging",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#logging"},[s("span",null,"Logging")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(t,{to:"#configuration"},{default:e(()=>n[1]||(n[1]=[p("Configuration")])),_:1})]),s("li",null,[a(t,{to:"#available-channel-drivers"},{default:e(()=>n[2]||(n[2]=[p("Available channel drivers")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#inject-context"},{default:e(()=>n[3]||(n[3]=[p("Inject Context")])),_:1})])])]),s("li",null,[a(t,{to:"#write-log-messages"},{default:e(()=>n[4]||(n[4]=[p("Write log messages")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#write-to-a-specific-channel"},{default:e(()=>n[5]||(n[5]=[p("Write to a specific channel")])),_:1})])])]),s("li",null,[a(t,{to:"#chain-methods"},{default:e(()=>n[6]||(n[6]=[p("Chain Methods")])),_:1})]),s("li",null,[a(t,{to:"#create-a-custom-channel"},{default:e(()=>n[7]||(n[7]=[p("Create a custom channel")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#implement-driver"},{default:e(()=>n[8]||(n[8]=[p("Implement Driver")])),_:1})])])])])]),n[10]||(n[10]=u(`

Introduction

In order to understand the running status of the application, Goravel provides a powerful log service that can record log messages and system errors to a file or other channels through facades.Log().

Configuration

To configure various log channels, custom configurations can be made in config/logging.go.

Goravel uses stack channel to record logs by default, stack allows logs to be forwarded to multiple channels.

The print configuration in single and daily drivers can control log output to the console.

Available channel drivers

NameDescription
stackAllow multiple channels
singleSingle log file
dailyOne log file per day
customCustom drive

Inject Context

facades.Log().WithContext(ctx)
 

Write log messages

facades.Log().Debug(message)
 facades.Log().Debugf(message, args)
 facades.Log().Info(message)
diff --git a/assets/logo-CxXS7KxG.js b/assets/logo-CxXS7KxG.js
new file mode 100644
index 00000000..c5346b0f
--- /dev/null
+++ b/assets/logo-CxXS7KxG.js
@@ -0,0 +1 @@
+const o="/logo.png";export{o as _};
diff --git a/assets/mail.html-8Xog75UY.js b/assets/mail.html-B61PCqmJ.js
similarity index 99%
rename from assets/mail.html-8Xog75UY.js
rename to assets/mail.html-B61PCqmJ.js
index 08a5300f..a58f550b 100644
--- a/assets/mail.html-8Xog75UY.js
+++ b/assets/mail.html-B61PCqmJ.js
@@ -1,4 +1,4 @@
-import{_ as l,c as i,b as s,e as a,f as p,a as u,r as o,o as r,d as e}from"./app-ELDWQP0J.js";const k={},d={class:"table-of-contents"};function m(g,n){const t=o("router-link"),c=o("CommentService");return r(),i("div",null,[n[6]||(n[6]=s("h1",{id:"mail",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#mail"},[s("span",null,"Mail")])],-1)),s("nav",d,[s("ul",null,[s("li",null,[a(t,{to:"#introduction"},{default:p(()=>n[0]||(n[0]=[e("Introduction")])),_:1})]),s("li",null,[a(t,{to:"#configuration"},{default:p(()=>n[1]||(n[1]=[e("Configuration")])),_:1})]),s("li",null,[a(t,{to:"#send-mail"},{default:p(()=>n[2]||(n[2]=[e("Send Mail")])),_:1})]),s("li",null,[a(t,{to:"#send-mail-by-queue"},{default:p(()=>n[3]||(n[3]=[e("Send Mail By Queue")])),_:1})]),s("li",null,[a(t,{to:"#setting-sender"},{default:p(()=>n[4]||(n[4]=[e("Setting Sender")])),_:1})]),s("li",null,[a(t,{to:"#using-mailable"},{default:p(()=>n[5]||(n[5]=[e("Using Mailable")])),_:1})])])]),n[7]||(n[7]=u(`

Introduction

Goravel can use facades.Mail() to easily send mail locally.

Configuration

Before sending an email, you need to configure the config/mail.go configuration file.

Send Mail

import "github.com/goravel/framework/mail"
+import{_ as l,c as i,b as s,e as a,f as p,a as u,r as o,o as r,d as e}from"./app-Ewo6p9aM.js";const k={},d={class:"table-of-contents"};function m(g,n){const t=o("router-link"),c=o("CommentService");return r(),i("div",null,[n[6]||(n[6]=s("h1",{id:"mail",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#mail"},[s("span",null,"Mail")])],-1)),s("nav",d,[s("ul",null,[s("li",null,[a(t,{to:"#introduction"},{default:p(()=>n[0]||(n[0]=[e("Introduction")])),_:1})]),s("li",null,[a(t,{to:"#configuration"},{default:p(()=>n[1]||(n[1]=[e("Configuration")])),_:1})]),s("li",null,[a(t,{to:"#send-mail"},{default:p(()=>n[2]||(n[2]=[e("Send Mail")])),_:1})]),s("li",null,[a(t,{to:"#send-mail-by-queue"},{default:p(()=>n[3]||(n[3]=[e("Send Mail By Queue")])),_:1})]),s("li",null,[a(t,{to:"#setting-sender"},{default:p(()=>n[4]||(n[4]=[e("Setting Sender")])),_:1})]),s("li",null,[a(t,{to:"#using-mailable"},{default:p(()=>n[5]||(n[5]=[e("Using Mailable")])),_:1})])])]),n[7]||(n[7]=u(`

Introduction

Goravel can use facades.Mail() to easily send mail locally.

Configuration

Before sending an email, you need to configure the config/mail.go configuration file.

Send Mail

import "github.com/goravel/framework/mail"
 
 err := facades.Mail().To([]string{"example@example.com"}).
   Cc([]string{"example@example.com"}).
diff --git a/assets/mail.html-CNknEOHN.js b/assets/mail.html-B8fLiBJF.js
similarity index 99%
rename from assets/mail.html-CNknEOHN.js
rename to assets/mail.html-B8fLiBJF.js
index dd163308..e9602ec7 100644
--- a/assets/mail.html-CNknEOHN.js
+++ b/assets/mail.html-B8fLiBJF.js
@@ -1,4 +1,4 @@
-import{_ as l,c as i,b as s,e as a,f as p,a as u,r as o,o as k,d as e}from"./app-ELDWQP0J.js";const r={},d={class:"table-of-contents"};function m(v,n){const t=o("router-link"),c=o("CommentService");return k(),i("div",null,[n[6]||(n[6]=s("h1",{id:"发送邮件",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#发送邮件"},[s("span",null,"发送邮件")])],-1)),s("nav",d,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:p(()=>n[0]||(n[0]=[e("简介")])),_:1})]),s("li",null,[a(t,{to:"#配置"},{default:p(()=>n[1]||(n[1]=[e("配置")])),_:1})]),s("li",null,[a(t,{to:"#发送邮件-1"},{default:p(()=>n[2]||(n[2]=[e("发送邮件")])),_:1})]),s("li",null,[a(t,{to:"#以队列发送邮件"},{default:p(()=>n[3]||(n[3]=[e("以队列发送邮件")])),_:1})]),s("li",null,[a(t,{to:"#设置发件人"},{default:p(()=>n[4]||(n[4]=[e("设置发件人")])),_:1})]),s("li",null,[a(t,{to:"#使用-mailable"},{default:p(()=>n[5]||(n[5]=[e("使用 Mailable")])),_:1})])])]),n[7]||(n[7]=u(`

简介

Goravel 可以使用 facades.Mail() 便捷的在本地发送邮件。

配置

在发送邮件前,需要先对 config/mail.go 配置文件进行配置。

发送邮件

import "github.com/goravel/framework/mail"
+import{_ as l,c as i,b as s,e as a,f as p,a as u,r as o,o as k,d as e}from"./app-Ewo6p9aM.js";const r={},d={class:"table-of-contents"};function m(v,n){const t=o("router-link"),c=o("CommentService");return k(),i("div",null,[n[6]||(n[6]=s("h1",{id:"发送邮件",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#发送邮件"},[s("span",null,"发送邮件")])],-1)),s("nav",d,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:p(()=>n[0]||(n[0]=[e("简介")])),_:1})]),s("li",null,[a(t,{to:"#配置"},{default:p(()=>n[1]||(n[1]=[e("配置")])),_:1})]),s("li",null,[a(t,{to:"#发送邮件-1"},{default:p(()=>n[2]||(n[2]=[e("发送邮件")])),_:1})]),s("li",null,[a(t,{to:"#以队列发送邮件"},{default:p(()=>n[3]||(n[3]=[e("以队列发送邮件")])),_:1})]),s("li",null,[a(t,{to:"#设置发件人"},{default:p(()=>n[4]||(n[4]=[e("设置发件人")])),_:1})]),s("li",null,[a(t,{to:"#使用-mailable"},{default:p(()=>n[5]||(n[5]=[e("使用 Mailable")])),_:1})])])]),n[7]||(n[7]=u(`

简介

Goravel 可以使用 facades.Mail() 便捷的在本地发送邮件。

配置

在发送邮件前,需要先对 config/mail.go 配置文件进行配置。

发送邮件

import "github.com/goravel/framework/mail"
 
 err := facades.Mail().To([]string{"example@example.com"}).
   Cc([]string{"example@example.com"}).
diff --git a/assets/middleware.html-BL7jUq09.js b/assets/middleware.html-BS2d13x5.js
similarity index 99%
rename from assets/middleware.html-BL7jUq09.js
rename to assets/middleware.html-BS2d13x5.js
index 73b935ad..6ccb04e2 100644
--- a/assets/middleware.html-BL7jUq09.js
+++ b/assets/middleware.html-BS2d13x5.js
@@ -1,4 +1,4 @@
-import{_ as o,c,b as a,e as s,f as t,a as r,r as l,o as d,d as i}from"./app-ELDWQP0J.js";const u={},m={class:"table-of-contents"};function k(v,n){const e=l("router-link"),p=l("CommentService");return d(),c("div",null,[n[7]||(n[7]=a("h1",{id:"middleware",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#middleware"},[a("span",null,"Middleware")])],-1)),a("nav",m,[a("ul",null,[a("li",null,[s(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[i("Introduction")])),_:1})]),a("li",null,[s(e,{to:"#define-middleware"},{default:t(()=>n[1]||(n[1]=[i("Define Middleware")])),_:1}),a("ul",null,[a("li",null,[s(e,{to:"#create-middleware-by-command"},{default:t(()=>n[2]||(n[2]=[i("Create Middleware By Command")])),_:1})])])]),a("li",null,[s(e,{to:"#register-middleware"},{default:t(()=>n[3]||(n[3]=[i("Register Middleware")])),_:1}),a("ul",null,[a("li",null,[s(e,{to:"#global-middleware"},{default:t(()=>n[4]||(n[4]=[i("Global Middleware")])),_:1})]),a("li",null,[s(e,{to:"#assign-middleware-for-routing"},{default:t(()=>n[5]||(n[5]=[i("Assign Middleware for Routing")])),_:1})])])]),a("li",null,[s(e,{to:"#abort-request"},{default:t(()=>n[6]||(n[6]=[i("Abort Request")])),_:1})])])]),n[8]||(n[8]=r(`

Introduction

Middleware provide a convenient mechanism for inspecting and filtering HTTP requests entering your application.

Define Middleware

You can create your own middleware in the app/http/middleware directory, the structure is as follows.

package middleware
+import{_ as o,c,b as a,e as s,f as t,a as r,r as l,o as d,d as i}from"./app-Ewo6p9aM.js";const u={},m={class:"table-of-contents"};function k(v,n){const e=l("router-link"),p=l("CommentService");return d(),c("div",null,[n[7]||(n[7]=a("h1",{id:"middleware",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#middleware"},[a("span",null,"Middleware")])],-1)),a("nav",m,[a("ul",null,[a("li",null,[s(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[i("Introduction")])),_:1})]),a("li",null,[s(e,{to:"#define-middleware"},{default:t(()=>n[1]||(n[1]=[i("Define Middleware")])),_:1}),a("ul",null,[a("li",null,[s(e,{to:"#create-middleware-by-command"},{default:t(()=>n[2]||(n[2]=[i("Create Middleware By Command")])),_:1})])])]),a("li",null,[s(e,{to:"#register-middleware"},{default:t(()=>n[3]||(n[3]=[i("Register Middleware")])),_:1}),a("ul",null,[a("li",null,[s(e,{to:"#global-middleware"},{default:t(()=>n[4]||(n[4]=[i("Global Middleware")])),_:1})]),a("li",null,[s(e,{to:"#assign-middleware-for-routing"},{default:t(()=>n[5]||(n[5]=[i("Assign Middleware for Routing")])),_:1})])])]),a("li",null,[s(e,{to:"#abort-request"},{default:t(()=>n[6]||(n[6]=[i("Abort Request")])),_:1})])])]),n[8]||(n[8]=r(`

Introduction

Middleware provide a convenient mechanism for inspecting and filtering HTTP requests entering your application.

Define Middleware

You can create your own middleware in the app/http/middleware directory, the structure is as follows.

package middleware
 
 import (
   "github.com/goravel/framework/contracts/http"
diff --git a/assets/middleware.html-wZMDQOd4.js b/assets/middleware.html-CXKWpfrh.js
similarity index 99%
rename from assets/middleware.html-wZMDQOd4.js
rename to assets/middleware.html-CXKWpfrh.js
index 0af6e41d..7308fad8 100644
--- a/assets/middleware.html-wZMDQOd4.js
+++ b/assets/middleware.html-CXKWpfrh.js
@@ -1,4 +1,4 @@
-import{_ as o,c,b as s,e as a,f as t,a as u,r as l,o as d,d as p}from"./app-ELDWQP0J.js";const r={},k={class:"table-of-contents"};function m(v,n){const e=l("router-link"),i=l("CommentService");return d(),c("div",null,[n[7]||(n[7]=s("h1",{id:"http-中间件",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#http-中间件"},[s("span",null,"HTTP 中间件")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#简介"},{default:t(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(e,{to:"#定义中间件"},{default:t(()=>n[1]||(n[1]=[p("定义中间件")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#命令创建中间件"},{default:t(()=>n[2]||(n[2]=[p("命令创建中间件")])),_:1})])])]),s("li",null,[a(e,{to:"#注册中间件"},{default:t(()=>n[3]||(n[3]=[p("注册中间件")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#全局中间件"},{default:t(()=>n[4]||(n[4]=[p("全局中间件")])),_:1})]),s("li",null,[a(e,{to:"#为路由分配中间件"},{default:t(()=>n[5]||(n[5]=[p("为路由分配中间件")])),_:1})])])]),s("li",null,[a(e,{to:"#中断请求"},{default:t(()=>n[6]||(n[6]=[p("中断请求")])),_:1})])])]),n[8]||(n[8]=u(`

简介

中间件可以过滤进入应用程序的 HTTP 请求。

定义中间件

你可以在 app/http/middleware 目录中创建自己的中间件,结构如下。

package middleware
+import{_ as o,c,b as s,e as a,f as t,a as u,r as l,o as d,d as p}from"./app-Ewo6p9aM.js";const r={},k={class:"table-of-contents"};function m(v,n){const e=l("router-link"),i=l("CommentService");return d(),c("div",null,[n[7]||(n[7]=s("h1",{id:"http-中间件",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#http-中间件"},[s("span",null,"HTTP 中间件")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#简介"},{default:t(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(e,{to:"#定义中间件"},{default:t(()=>n[1]||(n[1]=[p("定义中间件")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#命令创建中间件"},{default:t(()=>n[2]||(n[2]=[p("命令创建中间件")])),_:1})])])]),s("li",null,[a(e,{to:"#注册中间件"},{default:t(()=>n[3]||(n[3]=[p("注册中间件")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#全局中间件"},{default:t(()=>n[4]||(n[4]=[p("全局中间件")])),_:1})]),s("li",null,[a(e,{to:"#为路由分配中间件"},{default:t(()=>n[5]||(n[5]=[p("为路由分配中间件")])),_:1})])])]),s("li",null,[a(e,{to:"#中断请求"},{default:t(()=>n[6]||(n[6]=[p("中断请求")])),_:1})])])]),n[8]||(n[8]=u(`

简介

中间件可以过滤进入应用程序的 HTTP 请求。

定义中间件

你可以在 app/http/middleware 目录中创建自己的中间件,结构如下。

package middleware
 
 import (
   "github.com/goravel/framework/contracts/http"
diff --git a/assets/migrations.html-D7dZl_CR.js b/assets/migrations.html-CFNqP66E.js
similarity index 99%
rename from assets/migrations.html-D7dZl_CR.js
rename to assets/migrations.html-CFNqP66E.js
index 93dda6ce..d11b6a05 100644
--- a/assets/migrations.html-D7dZl_CR.js
+++ b/assets/migrations.html-CFNqP66E.js
@@ -1,4 +1,4 @@
-import{_ as i,c,b as s,e as a,f as e,a as u,r as l,o as d,d as p}from"./app-ELDWQP0J.js";const r={},k={class:"table-of-contents"};function m(v,n){const t=l("router-link"),o=l("CommentService");return d(),c("div",null,[n[28]||(n[28]=s("h1",{id:"数据库迁移",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#数据库迁移"},[s("span",null,"数据库迁移")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#配置"},{default:e(()=>n[1]||(n[1]=[p("配置")])),_:1})]),s("li",null,[a(t,{to:"#生成迁移"},{default:e(()=>n[2]||(n[2]=[p("生成迁移")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#快捷生成"},{default:e(()=>n[3]||(n[3]=[p("快捷生成")])),_:1})])])]),s("li",null,[a(t,{to:"#迁移结构"},{default:e(()=>n[4]||(n[4]=[p("迁移结构")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#go-语言迁移"},{default:e(()=>n[5]||(n[5]=[p("Go 语言迁移")])),_:1})]),s("li",null,[a(t,{to:"#sql-迁移"},{default:e(()=>n[6]||(n[6]=[p("SQL 迁移")])),_:1})])])]),s("li",null,[a(t,{to:"#注册迁移"},{default:e(()=>n[7]||(n[7]=[p("注册迁移")])),_:1})]),s("li",null,[a(t,{to:"#执行迁移"},{default:e(()=>n[8]||(n[8]=[p("执行迁移")])),_:1})]),s("li",null,[a(t,{to:"#回滚迁移"},{default:e(()=>n[9]||(n[9]=[p("回滚迁移")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#使用单个命令同时进行回滚和迁移操作"},{default:e(()=>n[10]||(n[10]=[p("使用单个命令同时进行回滚和迁移操作")])),_:1})]),s("li",null,[a(t,{to:"#删除所有表然后执行迁移"},{default:e(()=>n[11]||(n[11]=[p("删除所有表然后执行迁移")])),_:1})])])]),s("li",null,[a(t,{to:"#tables"},{default:e(()=>n[12]||(n[12]=[p("Tables")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#创建表"},{default:e(()=>n[13]||(n[13]=[p("创建表")])),_:1})]),s("li",null,[a(t,{to:"#检查表-列是否存在"},{default:e(()=>n[14]||(n[14]=[p("检查表 / 列是否存在")])),_:1})]),s("li",null,[a(t,{to:"#数据库连接"},{default:e(()=>n[15]||(n[15]=[p("数据库连接")])),_:1})]),s("li",null,[a(t,{to:"#更新表"},{default:e(()=>n[16]||(n[16]=[p("更新表")])),_:1})]),s("li",null,[a(t,{to:"#重命名-删除表"},{default:e(()=>n[17]||(n[17]=[p("重命名 / 删除表")])),_:1})])])]),s("li",null,[a(t,{to:"#字段"},{default:e(()=>n[18]||(n[18]=[p("字段")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#可用的字段类型"},{default:e(()=>n[19]||(n[19]=[p("可用的字段类型")])),_:1})]),s("li",null,[a(t,{to:"#列修饰符"},{default:e(()=>n[20]||(n[20]=[p("列修饰符")])),_:1})]),s("li",null,[a(t,{to:"#删除列"},{default:e(()=>n[21]||(n[21]=[p("删除列")])),_:1})])])]),s("li",null,[a(t,{to:"#索引"},{default:e(()=>n[22]||(n[22]=[p("索引")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#创建索引"},{default:e(()=>n[23]||(n[23]=[p("创建索引")])),_:1})]),s("li",null,[a(t,{to:"#重命名索引"},{default:e(()=>n[24]||(n[24]=[p("重命名索引")])),_:1})]),s("li",null,[a(t,{to:"#删除索引"},{default:e(()=>n[25]||(n[25]=[p("删除索引")])),_:1})]),s("li",null,[a(t,{to:"#外键约束"},{default:e(()=>n[26]||(n[26]=[p("外键约束")])),_:1})]),s("li",null,[a(t,{to:"#删除外键"},{default:e(()=>n[27]||(n[27]=[p("删除外键")])),_:1})])])])])]),n[29]||(n[29]=u(`

简介

当多人协作开发应用程序时,如果同步数据库结构没有一个统一的规范,以保证所有人的本地数据都是一致的,那将是灾难。数据库迁移就是为了解决这个问题,将数据库的结构进行版本控制,以保证所有开发人员的数据库结构的一致性。

配置

数据库迁移文件存放在 database/migrations 目录下,你可以在 config/database.go 文件中配置数据库连接信息。当前支持 Go 语言迁移和 SQL 迁移两个驱动,但 SQL 迁移将在后续版本中移除。

// Available Drivers: "default", "sql"
+import{_ as i,c,b as s,e as a,f as e,a as u,r as l,o as d,d as p}from"./app-Ewo6p9aM.js";const r={},k={class:"table-of-contents"};function m(v,n){const t=l("router-link"),o=l("CommentService");return d(),c("div",null,[n[28]||(n[28]=s("h1",{id:"数据库迁移",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#数据库迁移"},[s("span",null,"数据库迁移")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#配置"},{default:e(()=>n[1]||(n[1]=[p("配置")])),_:1})]),s("li",null,[a(t,{to:"#生成迁移"},{default:e(()=>n[2]||(n[2]=[p("生成迁移")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#快捷生成"},{default:e(()=>n[3]||(n[3]=[p("快捷生成")])),_:1})])])]),s("li",null,[a(t,{to:"#迁移结构"},{default:e(()=>n[4]||(n[4]=[p("迁移结构")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#go-语言迁移"},{default:e(()=>n[5]||(n[5]=[p("Go 语言迁移")])),_:1})]),s("li",null,[a(t,{to:"#sql-迁移"},{default:e(()=>n[6]||(n[6]=[p("SQL 迁移")])),_:1})])])]),s("li",null,[a(t,{to:"#注册迁移"},{default:e(()=>n[7]||(n[7]=[p("注册迁移")])),_:1})]),s("li",null,[a(t,{to:"#执行迁移"},{default:e(()=>n[8]||(n[8]=[p("执行迁移")])),_:1})]),s("li",null,[a(t,{to:"#回滚迁移"},{default:e(()=>n[9]||(n[9]=[p("回滚迁移")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#使用单个命令同时进行回滚和迁移操作"},{default:e(()=>n[10]||(n[10]=[p("使用单个命令同时进行回滚和迁移操作")])),_:1})]),s("li",null,[a(t,{to:"#删除所有表然后执行迁移"},{default:e(()=>n[11]||(n[11]=[p("删除所有表然后执行迁移")])),_:1})])])]),s("li",null,[a(t,{to:"#tables"},{default:e(()=>n[12]||(n[12]=[p("Tables")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#创建表"},{default:e(()=>n[13]||(n[13]=[p("创建表")])),_:1})]),s("li",null,[a(t,{to:"#检查表-列是否存在"},{default:e(()=>n[14]||(n[14]=[p("检查表 / 列是否存在")])),_:1})]),s("li",null,[a(t,{to:"#数据库连接"},{default:e(()=>n[15]||(n[15]=[p("数据库连接")])),_:1})]),s("li",null,[a(t,{to:"#更新表"},{default:e(()=>n[16]||(n[16]=[p("更新表")])),_:1})]),s("li",null,[a(t,{to:"#重命名-删除表"},{default:e(()=>n[17]||(n[17]=[p("重命名 / 删除表")])),_:1})])])]),s("li",null,[a(t,{to:"#字段"},{default:e(()=>n[18]||(n[18]=[p("字段")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#可用的字段类型"},{default:e(()=>n[19]||(n[19]=[p("可用的字段类型")])),_:1})]),s("li",null,[a(t,{to:"#列修饰符"},{default:e(()=>n[20]||(n[20]=[p("列修饰符")])),_:1})]),s("li",null,[a(t,{to:"#删除列"},{default:e(()=>n[21]||(n[21]=[p("删除列")])),_:1})])])]),s("li",null,[a(t,{to:"#索引"},{default:e(()=>n[22]||(n[22]=[p("索引")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#创建索引"},{default:e(()=>n[23]||(n[23]=[p("创建索引")])),_:1})]),s("li",null,[a(t,{to:"#重命名索引"},{default:e(()=>n[24]||(n[24]=[p("重命名索引")])),_:1})]),s("li",null,[a(t,{to:"#删除索引"},{default:e(()=>n[25]||(n[25]=[p("删除索引")])),_:1})]),s("li",null,[a(t,{to:"#外键约束"},{default:e(()=>n[26]||(n[26]=[p("外键约束")])),_:1})]),s("li",null,[a(t,{to:"#删除外键"},{default:e(()=>n[27]||(n[27]=[p("删除外键")])),_:1})])])])])]),n[29]||(n[29]=u(`

简介

当多人协作开发应用程序时,如果同步数据库结构没有一个统一的规范,以保证所有人的本地数据都是一致的,那将是灾难。数据库迁移就是为了解决这个问题,将数据库的结构进行版本控制,以保证所有开发人员的数据库结构的一致性。

配置

数据库迁移文件存放在 database/migrations 目录下,你可以在 config/database.go 文件中配置数据库连接信息。当前支持 Go 语言迁移和 SQL 迁移两个驱动,但 SQL 迁移将在后续版本中移除。

// Available Drivers: "default", "sql"
 "migrations": map[string]any{
   "driver": "default",
   // You can cumstomize the table name of migrations
diff --git a/assets/migrations.html-BxQwb3BO.js b/assets/migrations.html-WE2FpGDS.js
similarity index 99%
rename from assets/migrations.html-BxQwb3BO.js
rename to assets/migrations.html-WE2FpGDS.js
index 1d93eec4..fdfa2813 100644
--- a/assets/migrations.html-BxQwb3BO.js
+++ b/assets/migrations.html-WE2FpGDS.js
@@ -1,4 +1,4 @@
-import{_ as l,c,b as s,e as a,f as e,a as u,r as i,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function m(g,n){const t=i("router-link"),o=i("CommentService");return r(),c("div",null,[n[28]||(n[28]=s("h1",{id:"migrations",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#migrations"},[s("span",null,"Migrations")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(t,{to:"#configuration"},{default:e(()=>n[1]||(n[1]=[p("Configuration")])),_:1})]),s("li",null,[a(t,{to:"#create-migrations"},{default:e(()=>n[2]||(n[2]=[p("Create Migrations")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#quickly-create"},{default:e(()=>n[3]||(n[3]=[p("Quickly Create")])),_:1})])])]),s("li",null,[a(t,{to:"#migration-structure"},{default:e(()=>n[4]||(n[4]=[p("Migration Structure")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#go-language-migration"},{default:e(()=>n[5]||(n[5]=[p("Go Language Migration")])),_:1})]),s("li",null,[a(t,{to:"#sql-migration"},{default:e(()=>n[6]||(n[6]=[p("SQL Migration")])),_:1})])])]),s("li",null,[a(t,{to:"#register-migrations"},{default:e(()=>n[7]||(n[7]=[p("Register Migrations")])),_:1})]),s("li",null,[a(t,{to:"#run-migrations"},{default:e(()=>n[8]||(n[8]=[p("Run Migrations")])),_:1})]),s("li",null,[a(t,{to:"#rolling-back-migrations"},{default:e(()=>n[9]||(n[9]=[p("Rolling Back Migrations")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#roll-back-migrate-using-a-single-command"},{default:e(()=>n[10]||(n[10]=[p("Roll Back & Migrate Using A Single Command")])),_:1})]),s("li",null,[a(t,{to:"#drop-all-tables-migrate"},{default:e(()=>n[11]||(n[11]=[p("Drop All Tables & Migrate")])),_:1})])])]),s("li",null,[a(t,{to:"#tables"},{default:e(()=>n[12]||(n[12]=[p("Tables")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#create-table"},{default:e(()=>n[13]||(n[13]=[p("Create Table")])),_:1})]),s("li",null,[a(t,{to:"#check-if-table-column-exists"},{default:e(()=>n[14]||(n[14]=[p("Check If Table / Column Exists")])),_:1})]),s("li",null,[a(t,{to:"#database-connection"},{default:e(()=>n[15]||(n[15]=[p("Database Connection")])),_:1})]),s("li",null,[a(t,{to:"#update-table"},{default:e(()=>n[16]||(n[16]=[p("Update Table")])),_:1})]),s("li",null,[a(t,{to:"#rename-drop-table"},{default:e(()=>n[17]||(n[17]=[p("Rename / Drop Table")])),_:1})])])]),s("li",null,[a(t,{to:"#columns"},{default:e(()=>n[18]||(n[18]=[p("Columns")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#available-column-types"},{default:e(()=>n[19]||(n[19]=[p("Available Column Types")])),_:1})]),s("li",null,[a(t,{to:"#column-modifiers"},{default:e(()=>n[20]||(n[20]=[p("Column Modifiers")])),_:1})]),s("li",null,[a(t,{to:"#drop-column"},{default:e(()=>n[21]||(n[21]=[p("Drop Column")])),_:1})])])]),s("li",null,[a(t,{to:"#indexes"},{default:e(()=>n[22]||(n[22]=[p("Indexes")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#create-index"},{default:e(()=>n[23]||(n[23]=[p("Create Index")])),_:1})]),s("li",null,[a(t,{to:"#rename-index"},{default:e(()=>n[24]||(n[24]=[p("Rename Index")])),_:1})]),s("li",null,[a(t,{to:"#drop-index"},{default:e(()=>n[25]||(n[25]=[p("Drop Index")])),_:1})]),s("li",null,[a(t,{to:"#create-foreign-key"},{default:e(()=>n[26]||(n[26]=[p("Create Foreign Key")])),_:1})]),s("li",null,[a(t,{to:"#drop-foreign-key"},{default:e(()=>n[27]||(n[27]=[p("Drop Foreign Key")])),_:1})])])])])]),n[29]||(n[29]=u(`

Introduction

When multiple people collaborate to develop applications, it's crucial to have a standardized database structure for synchronization. Without this, there could be chaos as everyone's individual data won't match up. Database migration is the solution to this problem. The database structure is version-controlled to ensure its consistency within all developers.

Configuration

The database migration files are stored in the database/migrations directory. You can configure the database connection information in the config/database.go file. Currently, there are two drivers available for migrations: Go language migration and SQL migration. However, the SQL migration will be removed in future versions.

// Available Drivers: "default", "sql"
+import{_ as l,c,b as s,e as a,f as e,a as u,r as i,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function m(g,n){const t=i("router-link"),o=i("CommentService");return r(),c("div",null,[n[28]||(n[28]=s("h1",{id:"migrations",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#migrations"},[s("span",null,"Migrations")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(t,{to:"#configuration"},{default:e(()=>n[1]||(n[1]=[p("Configuration")])),_:1})]),s("li",null,[a(t,{to:"#create-migrations"},{default:e(()=>n[2]||(n[2]=[p("Create Migrations")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#quickly-create"},{default:e(()=>n[3]||(n[3]=[p("Quickly Create")])),_:1})])])]),s("li",null,[a(t,{to:"#migration-structure"},{default:e(()=>n[4]||(n[4]=[p("Migration Structure")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#go-language-migration"},{default:e(()=>n[5]||(n[5]=[p("Go Language Migration")])),_:1})]),s("li",null,[a(t,{to:"#sql-migration"},{default:e(()=>n[6]||(n[6]=[p("SQL Migration")])),_:1})])])]),s("li",null,[a(t,{to:"#register-migrations"},{default:e(()=>n[7]||(n[7]=[p("Register Migrations")])),_:1})]),s("li",null,[a(t,{to:"#run-migrations"},{default:e(()=>n[8]||(n[8]=[p("Run Migrations")])),_:1})]),s("li",null,[a(t,{to:"#rolling-back-migrations"},{default:e(()=>n[9]||(n[9]=[p("Rolling Back Migrations")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#roll-back-migrate-using-a-single-command"},{default:e(()=>n[10]||(n[10]=[p("Roll Back & Migrate Using A Single Command")])),_:1})]),s("li",null,[a(t,{to:"#drop-all-tables-migrate"},{default:e(()=>n[11]||(n[11]=[p("Drop All Tables & Migrate")])),_:1})])])]),s("li",null,[a(t,{to:"#tables"},{default:e(()=>n[12]||(n[12]=[p("Tables")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#create-table"},{default:e(()=>n[13]||(n[13]=[p("Create Table")])),_:1})]),s("li",null,[a(t,{to:"#check-if-table-column-exists"},{default:e(()=>n[14]||(n[14]=[p("Check If Table / Column Exists")])),_:1})]),s("li",null,[a(t,{to:"#database-connection"},{default:e(()=>n[15]||(n[15]=[p("Database Connection")])),_:1})]),s("li",null,[a(t,{to:"#update-table"},{default:e(()=>n[16]||(n[16]=[p("Update Table")])),_:1})]),s("li",null,[a(t,{to:"#rename-drop-table"},{default:e(()=>n[17]||(n[17]=[p("Rename / Drop Table")])),_:1})])])]),s("li",null,[a(t,{to:"#columns"},{default:e(()=>n[18]||(n[18]=[p("Columns")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#available-column-types"},{default:e(()=>n[19]||(n[19]=[p("Available Column Types")])),_:1})]),s("li",null,[a(t,{to:"#column-modifiers"},{default:e(()=>n[20]||(n[20]=[p("Column Modifiers")])),_:1})]),s("li",null,[a(t,{to:"#drop-column"},{default:e(()=>n[21]||(n[21]=[p("Drop Column")])),_:1})])])]),s("li",null,[a(t,{to:"#indexes"},{default:e(()=>n[22]||(n[22]=[p("Indexes")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#create-index"},{default:e(()=>n[23]||(n[23]=[p("Create Index")])),_:1})]),s("li",null,[a(t,{to:"#rename-index"},{default:e(()=>n[24]||(n[24]=[p("Rename Index")])),_:1})]),s("li",null,[a(t,{to:"#drop-index"},{default:e(()=>n[25]||(n[25]=[p("Drop Index")])),_:1})]),s("li",null,[a(t,{to:"#create-foreign-key"},{default:e(()=>n[26]||(n[26]=[p("Create Foreign Key")])),_:1})]),s("li",null,[a(t,{to:"#drop-foreign-key"},{default:e(()=>n[27]||(n[27]=[p("Drop Foreign Key")])),_:1})])])])])]),n[29]||(n[29]=u(`

Introduction

When multiple people collaborate to develop applications, it's crucial to have a standardized database structure for synchronization. Without this, there could be chaos as everyone's individual data won't match up. Database migration is the solution to this problem. The database structure is version-controlled to ensure its consistency within all developers.

Configuration

The database migration files are stored in the database/migrations directory. You can configure the database connection information in the config/database.go file. Currently, there are two drivers available for migrations: Go language migration and SQL migration. However, the SQL migration will be removed in future versions.

// Available Drivers: "default", "sql"
 "migrations": map[string]any{
   "driver": "default",
   // You can cumstomize the table name of migrations
diff --git a/assets/mock.html-Cjt9THLr.js b/assets/mock.html-DGC_6HL_.js
similarity index 99%
rename from assets/mock.html-Cjt9THLr.js
rename to assets/mock.html-DGC_6HL_.js
index 591fbc54..c33bcf5d 100644
--- a/assets/mock.html-Cjt9THLr.js
+++ b/assets/mock.html-DGC_6HL_.js
@@ -1,4 +1,4 @@
-import{_ as l,c as i,b as s,e as a,f as p,a as u,r as o,o as k,d as c}from"./app-ELDWQP0J.js";const r={},d={class:"table-of-contents"};function v(m,n){const t=o("router-link"),e=o("CommentService");return k(),i("div",null,[n[19]||(n[19]=s("h1",{id:"mock",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#mock"},[s("span",null,"Mock")])],-1)),s("nav",d,[s("ul",null,[s("li",null,[a(t,{to:"#description"},{default:p(()=>n[0]||(n[0]=[c("Description")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-app"},{default:p(()=>n[1]||(n[1]=[c("Mock facades.App")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-artisan"},{default:p(()=>n[2]||(n[2]=[c("Mock facades.Artisan")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-auth"},{default:p(()=>n[3]||(n[3]=[c("Mock facades.Auth")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-cache"},{default:p(()=>n[4]||(n[4]=[c("Mock facades.Cache")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-config"},{default:p(()=>n[5]||(n[5]=[c("Mock facades.Config")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-crypt"},{default:p(()=>n[6]||(n[6]=[c("Mock facades.Crypt")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-event"},{default:p(()=>n[7]||(n[7]=[c("Mock facades.Event")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-gate"},{default:p(()=>n[8]||(n[8]=[c("Mock facades.Gate")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-grpc"},{default:p(()=>n[9]||(n[9]=[c("Mock facades.Grpc")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-hash"},{default:p(()=>n[10]||(n[10]=[c("Mock facades.Hash")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-lang"},{default:p(()=>n[11]||(n[11]=[c("Mock facades.Lang")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-log"},{default:p(()=>n[12]||(n[12]=[c("Mock facades.Log")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-mail"},{default:p(()=>n[13]||(n[13]=[c("Mock facades.Mail")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-orm"},{default:p(()=>n[14]||(n[14]=[c("Mock facades.Orm")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-queue"},{default:p(()=>n[15]||(n[15]=[c("Mock facades.Queue")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-storage"},{default:p(()=>n[16]||(n[16]=[c("Mock facades.Storage")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-validation"},{default:p(()=>n[17]||(n[17]=[c("Mock facades.Validation")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-view"},{default:p(()=>n[18]||(n[18]=[c("Mock facades.View")])),_:1})])])]),n[20]||(n[20]=u(`

Description

All functions of Goravel are implemented using facades, and all facades are made up of interfaces. So with the mock function from stretchr/testify, Goravel can deliver an exceptional testing experience.

Mock facades.App

func CurrentLocale() string {
+import{_ as l,c as i,b as s,e as a,f as p,a as u,r as o,o as k,d as c}from"./app-Ewo6p9aM.js";const r={},d={class:"table-of-contents"};function v(m,n){const t=o("router-link"),e=o("CommentService");return k(),i("div",null,[n[19]||(n[19]=s("h1",{id:"mock",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#mock"},[s("span",null,"Mock")])],-1)),s("nav",d,[s("ul",null,[s("li",null,[a(t,{to:"#description"},{default:p(()=>n[0]||(n[0]=[c("Description")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-app"},{default:p(()=>n[1]||(n[1]=[c("Mock facades.App")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-artisan"},{default:p(()=>n[2]||(n[2]=[c("Mock facades.Artisan")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-auth"},{default:p(()=>n[3]||(n[3]=[c("Mock facades.Auth")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-cache"},{default:p(()=>n[4]||(n[4]=[c("Mock facades.Cache")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-config"},{default:p(()=>n[5]||(n[5]=[c("Mock facades.Config")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-crypt"},{default:p(()=>n[6]||(n[6]=[c("Mock facades.Crypt")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-event"},{default:p(()=>n[7]||(n[7]=[c("Mock facades.Event")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-gate"},{default:p(()=>n[8]||(n[8]=[c("Mock facades.Gate")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-grpc"},{default:p(()=>n[9]||(n[9]=[c("Mock facades.Grpc")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-hash"},{default:p(()=>n[10]||(n[10]=[c("Mock facades.Hash")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-lang"},{default:p(()=>n[11]||(n[11]=[c("Mock facades.Lang")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-log"},{default:p(()=>n[12]||(n[12]=[c("Mock facades.Log")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-mail"},{default:p(()=>n[13]||(n[13]=[c("Mock facades.Mail")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-orm"},{default:p(()=>n[14]||(n[14]=[c("Mock facades.Orm")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-queue"},{default:p(()=>n[15]||(n[15]=[c("Mock facades.Queue")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-storage"},{default:p(()=>n[16]||(n[16]=[c("Mock facades.Storage")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-validation"},{default:p(()=>n[17]||(n[17]=[c("Mock facades.Validation")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-view"},{default:p(()=>n[18]||(n[18]=[c("Mock facades.View")])),_:1})])])]),n[20]||(n[20]=u(`

Description

All functions of Goravel are implemented using facades, and all facades are made up of interfaces. So with the mock function from stretchr/testify, Goravel can deliver an exceptional testing experience.

Mock facades.App

func CurrentLocale() string {
   return facades.App().CurrentLocale(context.Background())
 }
 
diff --git a/assets/mock.html-BJWTScb4.js b/assets/mock.html-ZesMHtBg.js
similarity index 99%
rename from assets/mock.html-BJWTScb4.js
rename to assets/mock.html-ZesMHtBg.js
index 348392fa..cf92a32b 100644
--- a/assets/mock.html-BJWTScb4.js
+++ b/assets/mock.html-ZesMHtBg.js
@@ -1,4 +1,4 @@
-import{_ as l,c as i,b as s,e as a,f as p,a as u,r as o,o as k,d as c}from"./app-ELDWQP0J.js";const r={},d={class:"table-of-contents"};function v(m,n){const t=o("router-link"),e=o("CommentService");return k(),i("div",null,[n[19]||(n[19]=s("h1",{id:"mock",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#mock"},[s("span",null,"Mock")])],-1)),s("nav",d,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:p(()=>n[0]||(n[0]=[c("简介")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-app"},{default:p(()=>n[1]||(n[1]=[c("Mock facades.App")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-artisan"},{default:p(()=>n[2]||(n[2]=[c("Mock facades.Artisan")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-auth"},{default:p(()=>n[3]||(n[3]=[c("Mock facades.Auth")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-cache"},{default:p(()=>n[4]||(n[4]=[c("Mock facades.Cache")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-config"},{default:p(()=>n[5]||(n[5]=[c("Mock facades.Config")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-crypt"},{default:p(()=>n[6]||(n[6]=[c("Mock facades.Crypt")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-event"},{default:p(()=>n[7]||(n[7]=[c("Mock facades.Event")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-gate"},{default:p(()=>n[8]||(n[8]=[c("Mock facades.Gate")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-grpc"},{default:p(()=>n[9]||(n[9]=[c("Mock facades.Grpc")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-hash"},{default:p(()=>n[10]||(n[10]=[c("Mock facades.Hash")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-lang"},{default:p(()=>n[11]||(n[11]=[c("Mock facades.Lang")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-log"},{default:p(()=>n[12]||(n[12]=[c("Mock facades.Log")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-mail"},{default:p(()=>n[13]||(n[13]=[c("Mock facades.Mail")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-orm"},{default:p(()=>n[14]||(n[14]=[c("Mock facades.Orm")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-queue"},{default:p(()=>n[15]||(n[15]=[c("Mock facades.Queue")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-storage"},{default:p(()=>n[16]||(n[16]=[c("Mock facades.Storage")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-validation"},{default:p(()=>n[17]||(n[17]=[c("Mock facades.Validation")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-view"},{default:p(()=>n[18]||(n[18]=[c("Mock facades.View")])),_:1})])])]),n[20]||(n[20]=u(`

简介

Goravel 所有功能都使用 facades 实现,而所有的 facades 均由接口构成。因此配合 stretchr/testify 的 mock 功能,Goravel 可以提供优秀的测试体验。

Mock facades.App

func CurrentLocale() string {
+import{_ as l,c as i,b as s,e as a,f as p,a as u,r as o,o as k,d as c}from"./app-Ewo6p9aM.js";const r={},d={class:"table-of-contents"};function v(m,n){const t=o("router-link"),e=o("CommentService");return k(),i("div",null,[n[19]||(n[19]=s("h1",{id:"mock",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#mock"},[s("span",null,"Mock")])],-1)),s("nav",d,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:p(()=>n[0]||(n[0]=[c("简介")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-app"},{default:p(()=>n[1]||(n[1]=[c("Mock facades.App")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-artisan"},{default:p(()=>n[2]||(n[2]=[c("Mock facades.Artisan")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-auth"},{default:p(()=>n[3]||(n[3]=[c("Mock facades.Auth")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-cache"},{default:p(()=>n[4]||(n[4]=[c("Mock facades.Cache")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-config"},{default:p(()=>n[5]||(n[5]=[c("Mock facades.Config")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-crypt"},{default:p(()=>n[6]||(n[6]=[c("Mock facades.Crypt")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-event"},{default:p(()=>n[7]||(n[7]=[c("Mock facades.Event")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-gate"},{default:p(()=>n[8]||(n[8]=[c("Mock facades.Gate")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-grpc"},{default:p(()=>n[9]||(n[9]=[c("Mock facades.Grpc")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-hash"},{default:p(()=>n[10]||(n[10]=[c("Mock facades.Hash")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-lang"},{default:p(()=>n[11]||(n[11]=[c("Mock facades.Lang")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-log"},{default:p(()=>n[12]||(n[12]=[c("Mock facades.Log")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-mail"},{default:p(()=>n[13]||(n[13]=[c("Mock facades.Mail")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-orm"},{default:p(()=>n[14]||(n[14]=[c("Mock facades.Orm")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-queue"},{default:p(()=>n[15]||(n[15]=[c("Mock facades.Queue")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-storage"},{default:p(()=>n[16]||(n[16]=[c("Mock facades.Storage")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-validation"},{default:p(()=>n[17]||(n[17]=[c("Mock facades.Validation")])),_:1})]),s("li",null,[a(t,{to:"#mock-facades-view"},{default:p(()=>n[18]||(n[18]=[c("Mock facades.View")])),_:1})])])]),n[20]||(n[20]=u(`

简介

Goravel 所有功能都使用 facades 实现,而所有的 facades 均由接口构成。因此配合 stretchr/testify 的 mock 功能,Goravel 可以提供优秀的测试体验。

Mock facades.App

func CurrentLocale() string {
   return facades.App().CurrentLocale(context.Background())
 }
 
diff --git a/assets/package-development.html-BH8s19OD.js b/assets/package-development.html-BZNmOuwR.js
similarity index 99%
rename from assets/package-development.html-BH8s19OD.js
rename to assets/package-development.html-BZNmOuwR.js
index ff92e782..8c4ffb75 100644
--- a/assets/package-development.html-BH8s19OD.js
+++ b/assets/package-development.html-BZNmOuwR.js
@@ -1,4 +1,4 @@
-import{_ as c,c as r,b as a,e as t,f as e,a as l,d as s,r as i,o as d}from"./app-ELDWQP0J.js";const k={},g={class:"table-of-contents"};function v(m,n){const p=i("router-link"),o=i("RouteLink"),u=i("CommentService");return d(),r("div",null,[n[37]||(n[37]=a("h1",{id:"扩展包开发",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#扩展包开发"},[a("span",null,"扩展包开发")])],-1)),a("nav",g,[a("ul",null,[a("li",null,[t(p,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[s("简介")])),_:1})]),a("li",null,[t(p,{to:"#创建包"},{default:e(()=>n[1]||(n[1]=[s("创建包")])),_:1})]),a("li",null,[t(p,{to:"#服务提供者"},{default:e(()=>n[2]||(n[2]=[s("服务提供者")])),_:1})]),a("li",null,[t(p,{to:"#使用"},{default:e(()=>n[3]||(n[3]=[s("使用")])),_:1})]),a("li",null,[t(p,{to:"#资源"},{default:e(()=>n[4]||(n[4]=[s("资源")])),_:1}),a("ul",null,[a("li",null,[t(p,{to:"#配置"},{default:e(()=>n[5]||(n[5]=[s("配置")])),_:1})]),a("li",null,[t(p,{to:"#路由"},{default:e(()=>n[6]||(n[6]=[s("路由")])),_:1})]),a("li",null,[t(p,{to:"#迁移"},{default:e(()=>n[7]||(n[7]=[s("迁移")])),_:1})]),a("li",null,[t(p,{to:"#命令"},{default:e(()=>n[8]||(n[8]=[s("命令")])),_:1})]),a("li",null,[t(p,{to:"#公共资源"},{default:e(()=>n[9]||(n[9]=[s("公共资源")])),_:1})]),a("li",null,[t(p,{to:"#发布文件组"},{default:e(()=>n[10]||(n[10]=[s("发布文件组")])),_:1})]),a("li",null,[t(p,{to:"#发布资源"},{default:e(()=>n[11]||(n[11]=[s("发布资源")])),_:1})])])])])]),n[38]||(n[38]=l(`

简介

包是向 Goravel 添加功能的主要方式,这些包可能包含专门用于增强 Goravel 应用程序的路由、控制器和配置。本指南主要涵盖了那些特定于 Goravel 的包的开发。这里有一个关于包开发的官方示例:goravel/example-package

创建包

您可以使用 Artisan 命令便捷的创建一个包模板:

go run . artisan make:package sms
+import{_ as c,c as r,b as a,e as t,f as e,a as l,d as s,r as i,o as d}from"./app-Ewo6p9aM.js";const k={},g={class:"table-of-contents"};function v(m,n){const p=i("router-link"),o=i("RouteLink"),u=i("CommentService");return d(),r("div",null,[n[37]||(n[37]=a("h1",{id:"扩展包开发",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#扩展包开发"},[a("span",null,"扩展包开发")])],-1)),a("nav",g,[a("ul",null,[a("li",null,[t(p,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[s("简介")])),_:1})]),a("li",null,[t(p,{to:"#创建包"},{default:e(()=>n[1]||(n[1]=[s("创建包")])),_:1})]),a("li",null,[t(p,{to:"#服务提供者"},{default:e(()=>n[2]||(n[2]=[s("服务提供者")])),_:1})]),a("li",null,[t(p,{to:"#使用"},{default:e(()=>n[3]||(n[3]=[s("使用")])),_:1})]),a("li",null,[t(p,{to:"#资源"},{default:e(()=>n[4]||(n[4]=[s("资源")])),_:1}),a("ul",null,[a("li",null,[t(p,{to:"#配置"},{default:e(()=>n[5]||(n[5]=[s("配置")])),_:1})]),a("li",null,[t(p,{to:"#路由"},{default:e(()=>n[6]||(n[6]=[s("路由")])),_:1})]),a("li",null,[t(p,{to:"#迁移"},{default:e(()=>n[7]||(n[7]=[s("迁移")])),_:1})]),a("li",null,[t(p,{to:"#命令"},{default:e(()=>n[8]||(n[8]=[s("命令")])),_:1})]),a("li",null,[t(p,{to:"#公共资源"},{default:e(()=>n[9]||(n[9]=[s("公共资源")])),_:1})]),a("li",null,[t(p,{to:"#发布文件组"},{default:e(()=>n[10]||(n[10]=[s("发布文件组")])),_:1})]),a("li",null,[t(p,{to:"#发布资源"},{default:e(()=>n[11]||(n[11]=[s("发布资源")])),_:1})])])])])]),n[38]||(n[38]=l(`

简介

包是向 Goravel 添加功能的主要方式,这些包可能包含专门用于增强 Goravel 应用程序的路由、控制器和配置。本指南主要涵盖了那些特定于 Goravel 的包的开发。这里有一个关于包开发的官方示例:goravel/example-package

创建包

您可以使用 Artisan 命令便捷的创建一个包模板:

go run . artisan make:package sms
 

创建的文件默认保存在根目录 packages 文件夹中,您可以使用 --root 选项自定义:

go run . artisan make:package --root=pkg sms
 

服务提供者

`,8)),a("p",null,[t(o,{to:"/zh/architecutre-concepts/service-providers.html"},{default:e(()=>n[12]||(n[12]=[s("服务提供者")])),_:1}),n[14]||(n[14]=s("是您的包和 Goravel 之间的连接点,通常位于包的根目录中:")),n[15]||(n[15]=a("code",null,"service_provider.go",-1)),n[16]||(n[16]=s("。服务提供者负责将事物绑定到 Goravel 的")),t(o,{to:"/zh/architecutre-concepts/service-container.html"},{default:e(()=>n[13]||(n[13]=[s("服务容器")])),_:1}),n[17]||(n[17]=s("并通知 Goravel 在哪里加载包资源。"))]),n[39]||(n[39]=l(`

使用

将包内的 ServiceProvider 注册到 config/app.go::providers,然后将 facades 导出到应用中即可,详细步骤可以参考:goravel/example-package

资源

配置

通常,您需要将包的配置文件发布到应用程序的 config 目录。这将允许您的包的用户轻松覆盖您的默认配置选项。要允许发布配置文件,请从服务提供者的 Boot 方法中调用 Publishes 方法,该方法第一个参数为包名,第二个参数为当前包文件路径与项目路径的映射:

func (receiver *ServiceProvider) Boot(app foundation.Application) {
   app.Publishes("github.com/goravel/example-package", map[string]string{
diff --git a/assets/package-development.html-XO5_ome_.js b/assets/package-development.html-DHPBH4od.js
similarity index 99%
rename from assets/package-development.html-XO5_ome_.js
rename to assets/package-development.html-DHPBH4od.js
index 3f464953..90f34eea 100644
--- a/assets/package-development.html-XO5_ome_.js
+++ b/assets/package-development.html-DHPBH4od.js
@@ -1,4 +1,4 @@
-import{_ as u,c as r,b as a,e,f as t,a as p,d as s,r as l,o as d}from"./app-ELDWQP0J.js";const g={},k={class:"table-of-contents"};function m(v,n){const o=l("router-link"),i=l("RouteLink"),c=l("CommentService");return d(),r("div",null,[n[35]||(n[35]=a("h1",{id:"package-development",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#package-development"},[a("span",null,"Package Development")])],-1)),a("nav",k,[a("ul",null,[a("li",null,[e(o,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[s("Introduction")])),_:1})]),a("li",null,[e(o,{to:"#creating-a-package"},{default:t(()=>n[1]||(n[1]=[s("Creating A Package")])),_:1})]),a("li",null,[e(o,{to:"#service-providers"},{default:t(()=>n[2]||(n[2]=[s("Service Providers")])),_:1})]),a("li",null,[e(o,{to:"#usage"},{default:t(()=>n[3]||(n[3]=[s("Usage")])),_:1})]),a("li",null,[e(o,{to:"#resources"},{default:t(()=>n[4]||(n[4]=[s("Resources")])),_:1}),a("ul",null,[a("li",null,[e(o,{to:"#configuration"},{default:t(()=>n[5]||(n[5]=[s("Configuration")])),_:1})]),a("li",null,[e(o,{to:"#routes"},{default:t(()=>n[6]||(n[6]=[s("Routes")])),_:1})]),a("li",null,[e(o,{to:"#migrations"},{default:t(()=>n[7]||(n[7]=[s("Migrations")])),_:1})])])]),a("li",null,[e(o,{to:"#commands"},{default:t(()=>n[8]||(n[8]=[s("Commands")])),_:1})]),a("li",null,[e(o,{to:"#public-assets"},{default:t(()=>n[9]||(n[9]=[s("Public Assets")])),_:1})]),a("li",null,[e(o,{to:"#publishing-file-groups"},{default:t(()=>n[10]||(n[10]=[s("Publishing File Groups")])),_:1})]),a("li",null,[e(o,{to:"#publish-resources"},{default:t(()=>n[11]||(n[11]=[s("Publish Resources")])),_:1})])])]),n[36]||(n[36]=p(`

Introduction

Packages are the primary way of adding functionality to Goravel. These packages may contain routes, controllers, and configurations that are specifically designed to enhance a Goravel application. This guide focuses on developing Goravel-specific packages.

Here is an example for building a third-party package: goravel/example-package

Creating A Package

You can use easily create a package template using the Artisan command:

go run . artisan make:package sms
+import{_ as u,c as r,b as a,e,f as t,a as p,d as s,r as l,o as d}from"./app-Ewo6p9aM.js";const g={},k={class:"table-of-contents"};function m(v,n){const o=l("router-link"),i=l("RouteLink"),c=l("CommentService");return d(),r("div",null,[n[35]||(n[35]=a("h1",{id:"package-development",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#package-development"},[a("span",null,"Package Development")])],-1)),a("nav",k,[a("ul",null,[a("li",null,[e(o,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[s("Introduction")])),_:1})]),a("li",null,[e(o,{to:"#creating-a-package"},{default:t(()=>n[1]||(n[1]=[s("Creating A Package")])),_:1})]),a("li",null,[e(o,{to:"#service-providers"},{default:t(()=>n[2]||(n[2]=[s("Service Providers")])),_:1})]),a("li",null,[e(o,{to:"#usage"},{default:t(()=>n[3]||(n[3]=[s("Usage")])),_:1})]),a("li",null,[e(o,{to:"#resources"},{default:t(()=>n[4]||(n[4]=[s("Resources")])),_:1}),a("ul",null,[a("li",null,[e(o,{to:"#configuration"},{default:t(()=>n[5]||(n[5]=[s("Configuration")])),_:1})]),a("li",null,[e(o,{to:"#routes"},{default:t(()=>n[6]||(n[6]=[s("Routes")])),_:1})]),a("li",null,[e(o,{to:"#migrations"},{default:t(()=>n[7]||(n[7]=[s("Migrations")])),_:1})])])]),a("li",null,[e(o,{to:"#commands"},{default:t(()=>n[8]||(n[8]=[s("Commands")])),_:1})]),a("li",null,[e(o,{to:"#public-assets"},{default:t(()=>n[9]||(n[9]=[s("Public Assets")])),_:1})]),a("li",null,[e(o,{to:"#publishing-file-groups"},{default:t(()=>n[10]||(n[10]=[s("Publishing File Groups")])),_:1})]),a("li",null,[e(o,{to:"#publish-resources"},{default:t(()=>n[11]||(n[11]=[s("Publish Resources")])),_:1})])])]),n[36]||(n[36]=p(`

Introduction

Packages are the primary way of adding functionality to Goravel. These packages may contain routes, controllers, and configurations that are specifically designed to enhance a Goravel application. This guide focuses on developing Goravel-specific packages.

Here is an example for building a third-party package: goravel/example-package

Creating A Package

You can use easily create a package template using the Artisan command:

go run . artisan make:package sms
 

The created files are saved by default in the root packages folder, you can use --root option to customize:

go run . artisan make:package --root=pkg sms
 

Service Providers

`,9)),a("p",null,[e(i,{to:"/architecutre-concepts/service-providers.html"},{default:t(()=>n[12]||(n[12]=[s("Service providers")])),_:1}),n[13]||(n[13]=s(" act as the bridge between your package and Goravel. They are typically located in the root of the package as a ")),n[14]||(n[14]=a("code",null,"service_provider.go",-1)),n[15]||(n[15]=s(" file. Their main function is to bind items into Goravel's service container and guide Goravel in loading package resources."))]),n[37]||(n[37]=p(`

Usage

Register the ServiceProvider in the package to config/app.go::providers, then export facades to the application. For detailed steps, refer to goravel/example-package.

Resources

Configuration

Typically, you will need to publish your package's configuration file to the application's config directory. This will allow users of your package to easily override your default configuration options. To allow your configuration files to be published, call the Publishes method from the Boot method of your service provider, the first parameter is the package name, and the second parameter is the mapping between the current package file path and the project path:

func (receiver *ServiceProvider) Boot(app foundation.Application) {
   app.Publishes("github.com/goravel/example-package", map[string]string{
diff --git a/assets/packages.html-Dfo0Uatf.js b/assets/packages.html-D_mXOzrI.js
similarity index 98%
rename from assets/packages.html-Dfo0Uatf.js
rename to assets/packages.html-D_mXOzrI.js
index f5b87b31..36cdbf5b 100644
--- a/assets/packages.html-Dfo0Uatf.js
+++ b/assets/packages.html-D_mXOzrI.js
@@ -1 +1 @@
-import{_ as t,c as r,a as o,o as a}from"./app-ELDWQP0J.js";const d={};function l(n,e){return a(),r("div",null,e[0]||(e[0]=[o('

优秀扩展包

您可以在这里寻找 Goravel 扩展包,您也可以为 goravel/docs 创建一个 PR 将自己的扩展包添加到这里,请尽可能提高包的测试覆盖率。

介绍测试覆盖率
goravel/ginfacades.Route() 模块 Gin 驱动83.1%
goravel/fiberfacades.Route() 模块 Fiber 驱动81.0%
goravel/cosfacades.Storage() 模块 Cos 驱动80.2%
goravel/miniofacades.Storage() 模块 Minio 驱动79.6%
goravel/redisfacades.Cache() 模块 Redis 驱动79.1%
goravel/s3facades.Storage() 模块 S3 驱动77.8%
goravel/ossfacades.Storage() 模块 Oss 驱动76.5%
goravel/installerGoravel 安装器76.2%
goravel/cloudinaryfacades.Storage() 模块 Cloudinary 驱动75.4%
hulutech-web/goravel-workflowgoravel 审批流扩展包4.4%
hulutech-web/goravel-crudgoravel crud工具4.2%
hulutech-web/tinkergoravel tinker工具3.6%
hulutech-web/goravel-socketgoravelwebsocket扩展包0%
',3)]))}const h=t(d,[["render",l],["__file","packages.html.vue"]]),g=JSON.parse('{"path":"/zh/prologue/packages.html","title":"优秀扩展包","lang":"zh-CN","frontmatter":{"description":"优秀扩展包 您可以在这里寻找 Goravel 扩展包,您也可以为 goravel/docs 创建一个 PR 将自己的扩展包添加到这里,请尽可能提高包的测试覆盖率。","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/prologue/packages.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/prologue/packages.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/prologue/packages.html"}],["meta",{"property":"og:description","content":"优秀扩展包 您可以在这里寻找 Goravel 扩展包,您也可以为 goravel/docs 创建一个 PR 将自己的扩展包添加到这里,请尽可能提高包的测试覆盖率。"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"优秀扩展包\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/prologue/packages.md","autoDesc":true}');export{h as comp,g as data}; +import{_ as t,c as r,a as o,o as a}from"./app-Ewo6p9aM.js";const d={};function l(n,e){return a(),r("div",null,e[0]||(e[0]=[o('

优秀扩展包

您可以在这里寻找 Goravel 扩展包,您也可以为 goravel/docs 创建一个 PR 将自己的扩展包添加到这里,请尽可能提高包的测试覆盖率。

介绍测试覆盖率
goravel/ginfacades.Route() 模块 Gin 驱动83.1%
goravel/fiberfacades.Route() 模块 Fiber 驱动81.0%
goravel/cosfacades.Storage() 模块 Cos 驱动80.2%
goravel/miniofacades.Storage() 模块 Minio 驱动79.6%
goravel/redisfacades.Cache() 模块 Redis 驱动79.1%
goravel/s3facades.Storage() 模块 S3 驱动77.8%
goravel/ossfacades.Storage() 模块 Oss 驱动76.5%
goravel/installerGoravel 安装器76.2%
goravel/cloudinaryfacades.Storage() 模块 Cloudinary 驱动75.4%
hulutech-web/goravel-workflowgoravel 审批流扩展包4.4%
hulutech-web/goravel-crudgoravel crud工具4.2%
hulutech-web/tinkergoravel tinker工具3.6%
hulutech-web/goravel-socketgoravelwebsocket扩展包0%
',3)]))}const h=t(d,[["render",l],["__file","packages.html.vue"]]),g=JSON.parse('{"path":"/zh/prologue/packages.html","title":"优秀扩展包","lang":"zh-CN","frontmatter":{"description":"优秀扩展包 您可以在这里寻找 Goravel 扩展包,您也可以为 goravel/docs 创建一个 PR 将自己的扩展包添加到这里,请尽可能提高包的测试覆盖率。","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/prologue/packages.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/prologue/packages.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/prologue/packages.html"}],["meta",{"property":"og:description","content":"优秀扩展包 您可以在这里寻找 Goravel 扩展包,您也可以为 goravel/docs 创建一个 PR 将自己的扩展包添加到这里,请尽可能提高包的测试覆盖率。"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"优秀扩展包\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"zh/prologue/packages.md","autoDesc":true}');export{h as comp,g as data}; diff --git a/assets/packages.html-QsGxcqGQ.js b/assets/packages.html-IAGwRamE.js similarity index 98% rename from assets/packages.html-QsGxcqGQ.js rename to assets/packages.html-IAGwRamE.js index e72c24a6..572b5f77 100644 --- a/assets/packages.html-QsGxcqGQ.js +++ b/assets/packages.html-IAGwRamE.js @@ -1 +1 @@ -import{_ as t,c as r,a,o}from"./app-ELDWQP0J.js";const d={};function n(l,e){return o(),r("div",null,e[0]||(e[0]=[a('

Excellent Extend Packages

You can find extended packages for Goravel here, and you can also create a PR for goravel/docs to commit your owner package, please improve the test coverage of your package as much as possible.

PackageDescriptionTest Coverage
goravel/ginThe Gin driver for facades.Route()83.1%
goravel/fiberThe Fiber driver for facades.Route()81.0%
goravel/cosA COS disk driver for facades.Storage()80.2%
goravel/minioA Minio disk driver for facades.Storage()79.6%
goravel/redisA Redis disk driver for facades.Cache()79.1%
goravel/s3A S3 disk driver for facades.Storage()77.8%
goravel/ossA OSS disk driver for facades.Storage()76.5%
goravel/installerGoravel installer76.2%
goravel/cloudinaryA Cloudinary disk driver for `facades.Storage()75.4%
hulutech-web/goravel-workflowA workflow package4.4%
hulutech-web/goravel-crudA goravel crud package4.2%
hulutech-web/tinkerA goravel tinker package3.6%
hulutech-web/goravel-socketA webSocket package0%
',3)]))}const g=t(d,[["render",n],["__file","packages.html.vue"]]),s=JSON.parse('{"path":"/prologue/packages.html","title":"Excellent Extend Packages","lang":"en-US","frontmatter":{"description":"Excellent Extend Packages You can find extended packages for Goravel here, and you can also create a PR for goravel/docs to commit your owner package, please improve the test co...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/prologue/packages.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/prologue/packages.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/prologue/packages.html"}],["meta",{"property":"og:description","content":"Excellent Extend Packages You can find extended packages for Goravel here, and you can also create a PR for goravel/docs to commit your owner package, please improve the test co..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Excellent Extend Packages\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"prologue/packages.md","autoDesc":true}');export{g as comp,s as data}; +import{_ as t,c as r,a,o}from"./app-Ewo6p9aM.js";const d={};function n(l,e){return o(),r("div",null,e[0]||(e[0]=[a('

Excellent Extend Packages

You can find extended packages for Goravel here, and you can also create a PR for goravel/docs to commit your owner package, please improve the test coverage of your package as much as possible.

PackageDescriptionTest Coverage
goravel/ginThe Gin driver for facades.Route()83.1%
goravel/fiberThe Fiber driver for facades.Route()81.0%
goravel/cosA COS disk driver for facades.Storage()80.2%
goravel/minioA Minio disk driver for facades.Storage()79.6%
goravel/redisA Redis disk driver for facades.Cache()79.1%
goravel/s3A S3 disk driver for facades.Storage()77.8%
goravel/ossA OSS disk driver for facades.Storage()76.5%
goravel/installerGoravel installer76.2%
goravel/cloudinaryA Cloudinary disk driver for `facades.Storage()75.4%
hulutech-web/goravel-workflowA workflow package4.4%
hulutech-web/goravel-crudA goravel crud package4.2%
hulutech-web/tinkerA goravel tinker package3.6%
hulutech-web/goravel-socketA webSocket package0%
',3)]))}const g=t(d,[["render",n],["__file","packages.html.vue"]]),s=JSON.parse('{"path":"/prologue/packages.html","title":"Excellent Extend Packages","lang":"en-US","frontmatter":{"description":"Excellent Extend Packages You can find extended packages for Goravel here, and you can also create a PR for goravel/docs to commit your owner package, please improve the test co...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/prologue/packages.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/prologue/packages.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/prologue/packages.html"}],["meta",{"property":"og:description","content":"Excellent Extend Packages You can find extended packages for Goravel here, and you can also create a PR for goravel/docs to commit your owner package, please improve the test co..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Excellent Extend Packages\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[],"git":{},"filePathRelative":"prologue/packages.md","autoDesc":true}');export{g as comp,s as data}; diff --git a/assets/privacy-policy.html-B95hGl3B.js b/assets/privacy-policy.html-B2lf6jGC.js similarity index 98% rename from assets/privacy-policy.html-B95hGl3B.js rename to assets/privacy-policy.html-B2lf6jGC.js index a43a6c2c..819180e6 100644 --- a/assets/privacy-policy.html-B95hGl3B.js +++ b/assets/privacy-policy.html-B2lf6jGC.js @@ -1 +1 @@ -import{_ as o,c as i,a as t,o as a}from"./app-ELDWQP0J.js";const r={};function n(l,e){return a(),i("div",null,e[0]||(e[0]=[t('

Privacy Policy

Collection of Information

We collect certain information about you when you visit goravel.dev. This information may include:

  • Information about the pages you visit on our website
  • Any other information you provide voluntarily

Use of Information

We may use the collected information for various purposes, including:

  • Personalizing your experience on our website
  • Improving our website and services
  • Contacting you regarding your inquiries or requests

Data Security

We take the security of your data seriously. We implement appropriate technical and organizational measures to protect your information from unauthorized access, disclosure, alteration, or destruction.

Third-Party Disclosure

We may share your information with trusted third parties who assist us in operating our website or providing services to you. These third parties are contractually obligated to keep your information confidential and secure.

Cookies

Our website may use cookies to enhance your browsing experience. Cookies are small files stored on your device that enable certain features and functionality. You may choose to disable cookies in your browser settings, but please note that some parts of our website may not function properly.

Changes to this Policy

We may update this Privacy Policy from time to time. Any changes will be posted on this page, and the revised policy will take effect immediately upon posting.

',15)]))}const c=o(r,[["render",n],["__file","privacy-policy.html.vue"]]),p=JSON.parse('{"path":"/prologue/privacy-policy.html","title":"Privacy Policy","lang":"en-US","frontmatter":{"description":"Privacy Policy Collection of Information We collect certain information about you when you visit goravel.dev. This information may include: Information about the pages you visit...","head":[["meta",{"property":"og:url","content":"https://goravel.dev/prologue/privacy-policy.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/prologue/privacy-policy.html"}],["meta",{"property":"og:description","content":"Privacy Policy Collection of Information We collect certain information about you when you visit goravel.dev. This information may include: Information about the pages you visit..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Privacy Policy\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"Collection of Information","slug":"collection-of-information","link":"#collection-of-information","children":[]},{"level":2,"title":"Use of Information","slug":"use-of-information","link":"#use-of-information","children":[]},{"level":2,"title":"Data Security","slug":"data-security","link":"#data-security","children":[]},{"level":2,"title":"Third-Party Disclosure","slug":"third-party-disclosure","link":"#third-party-disclosure","children":[]},{"level":2,"title":"Cookies","slug":"cookies","link":"#cookies","children":[]},{"level":2,"title":"Changes to this Policy","slug":"changes-to-this-policy","link":"#changes-to-this-policy","children":[]}],"git":{},"filePathRelative":"prologue/privacy-policy.md","autoDesc":true}');export{c as comp,p as data}; +import{_ as o,c as i,a as t,o as a}from"./app-Ewo6p9aM.js";const r={};function n(l,e){return a(),i("div",null,e[0]||(e[0]=[t('

Privacy Policy

Collection of Information

We collect certain information about you when you visit goravel.dev. This information may include:

  • Information about the pages you visit on our website
  • Any other information you provide voluntarily

Use of Information

We may use the collected information for various purposes, including:

  • Personalizing your experience on our website
  • Improving our website and services
  • Contacting you regarding your inquiries or requests

Data Security

We take the security of your data seriously. We implement appropriate technical and organizational measures to protect your information from unauthorized access, disclosure, alteration, or destruction.

Third-Party Disclosure

We may share your information with trusted third parties who assist us in operating our website or providing services to you. These third parties are contractually obligated to keep your information confidential and secure.

Cookies

Our website may use cookies to enhance your browsing experience. Cookies are small files stored on your device that enable certain features and functionality. You may choose to disable cookies in your browser settings, but please note that some parts of our website may not function properly.

Changes to this Policy

We may update this Privacy Policy from time to time. Any changes will be posted on this page, and the revised policy will take effect immediately upon posting.

',15)]))}const c=o(r,[["render",n],["__file","privacy-policy.html.vue"]]),p=JSON.parse('{"path":"/prologue/privacy-policy.html","title":"Privacy Policy","lang":"en-US","frontmatter":{"description":"Privacy Policy Collection of Information We collect certain information about you when you visit goravel.dev. This information may include: Information about the pages you visit...","head":[["meta",{"property":"og:url","content":"https://goravel.dev/prologue/privacy-policy.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/prologue/privacy-policy.html"}],["meta",{"property":"og:description","content":"Privacy Policy Collection of Information We collect certain information about you when you visit goravel.dev. This information may include: Information about the pages you visit..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Privacy Policy\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"Collection of Information","slug":"collection-of-information","link":"#collection-of-information","children":[]},{"level":2,"title":"Use of Information","slug":"use-of-information","link":"#use-of-information","children":[]},{"level":2,"title":"Data Security","slug":"data-security","link":"#data-security","children":[]},{"level":2,"title":"Third-Party Disclosure","slug":"third-party-disclosure","link":"#third-party-disclosure","children":[]},{"level":2,"title":"Cookies","slug":"cookies","link":"#cookies","children":[]},{"level":2,"title":"Changes to this Policy","slug":"changes-to-this-policy","link":"#changes-to-this-policy","children":[]}],"git":{},"filePathRelative":"prologue/privacy-policy.md","autoDesc":true}');export{c as comp,p as data}; diff --git a/assets/queues.html-C0Cbu1pl.js b/assets/queues.html-CWus8EaR.js similarity index 99% rename from assets/queues.html-C0Cbu1pl.js rename to assets/queues.html-CWus8EaR.js index 2eea0031..a8e233e1 100644 --- a/assets/queues.html-C0Cbu1pl.js +++ b/assets/queues.html-CWus8EaR.js @@ -1,4 +1,4 @@ -import{_ as c,c as l,b as s,e as a,f as t,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(b,n){const e=o("router-link"),i=o("CommentService");return r(),l("div",null,[n[13]||(n[13]=s("h1",{id:"queues",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#queues"},[s("span",null,"Queues")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[p("Introduction")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#connections-vs-queues"},{default:t(()=>n[1]||(n[1]=[p("Connections Vs. Queues")])),_:1})])])]),s("li",null,[a(e,{to:"#creating-jobs"},{default:t(()=>n[2]||(n[2]=[p("Creating Jobs")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#generating-job-classes"},{default:t(()=>n[3]||(n[3]=[p("Generating Job Classes")])),_:1})]),s("li",null,[a(e,{to:"#class-structure"},{default:t(()=>n[4]||(n[4]=[p("Class Structure")])),_:1})]),s("li",null,[a(e,{to:"#register-job"},{default:t(()=>n[5]||(n[5]=[p("Register Job")])),_:1})])])]),s("li",null,[a(e,{to:"#start-queue-server"},{default:t(()=>n[6]||(n[6]=[p("Start Queue Server")])),_:1})]),s("li",null,[a(e,{to:"#dispatching-jobs"},{default:t(()=>n[7]||(n[7]=[p("Dispatching Jobs")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#synchronous-dispatching"},{default:t(()=>n[8]||(n[8]=[p("Synchronous Dispatching")])),_:1})]),s("li",null,[a(e,{to:"#job-chaining"},{default:t(()=>n[9]||(n[9]=[p("Job Chaining")])),_:1})]),s("li",null,[a(e,{to:"#delayed-dispatching"},{default:t(()=>n[10]||(n[10]=[p("Delayed Dispatching")])),_:1})]),s("li",null,[a(e,{to:"#customizing-the-queue-connection"},{default:t(()=>n[11]||(n[11]=[p("Customizing The Queue & Connection")])),_:1})])])]),s("li",null,[a(e,{to:"#queue-arg-type-supported-types"},{default:t(()=>n[12]||(n[12]=[p("queue.Arg.Type Supported Types")])),_:1})])])]),n[14]||(n[14]=u(`

Introduction

When building your web application, there may be tasks, like parsing and storing an uploaded CSV file, that take too long to complete during a web request. Fortunately, Goravel offers a solution by allowing you to create queued jobs that can run in the background. This way, by moving time-intensive tasks to a queue, your application can respond to web requests much faster and provide a better user experience for your customers. To implement this feature, we use facades.Queue().

Goravel's queue configuration options are saved in your application's config/queue.go configuration file. Goravel supports two drivers: redis and sync.

Connections Vs. Queues

Before delving into Goravel queues, it's important to understand the difference between "connections" and "queues". In the configuration file, config/queue.go, you'll find an array for connections configuration. This option specifies the connections to backend queue services like Redis. However, every queue connection can have multiple "queues", which can be thought of as different stacks or piles of queued jobs.

It's essential to note that each connection configuration example in the queue configuration file includes a queue attribute. This attribute is the default queue to which jobs will be dispatched when they are sent to a given connection. In simpler terms, if you dispatch a job without explicitly defining which queue it should be dispatched to, the job will be placed in the queue defined in the queue attribute of the connection configuration.

// This job is sent to the default connection's default queue
+import{_ as c,c as l,b as s,e as a,f as t,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(b,n){const e=o("router-link"),i=o("CommentService");return r(),l("div",null,[n[13]||(n[13]=s("h1",{id:"queues",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#queues"},[s("span",null,"Queues")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[p("Introduction")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#connections-vs-queues"},{default:t(()=>n[1]||(n[1]=[p("Connections Vs. Queues")])),_:1})])])]),s("li",null,[a(e,{to:"#creating-jobs"},{default:t(()=>n[2]||(n[2]=[p("Creating Jobs")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#generating-job-classes"},{default:t(()=>n[3]||(n[3]=[p("Generating Job Classes")])),_:1})]),s("li",null,[a(e,{to:"#class-structure"},{default:t(()=>n[4]||(n[4]=[p("Class Structure")])),_:1})]),s("li",null,[a(e,{to:"#register-job"},{default:t(()=>n[5]||(n[5]=[p("Register Job")])),_:1})])])]),s("li",null,[a(e,{to:"#start-queue-server"},{default:t(()=>n[6]||(n[6]=[p("Start Queue Server")])),_:1})]),s("li",null,[a(e,{to:"#dispatching-jobs"},{default:t(()=>n[7]||(n[7]=[p("Dispatching Jobs")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#synchronous-dispatching"},{default:t(()=>n[8]||(n[8]=[p("Synchronous Dispatching")])),_:1})]),s("li",null,[a(e,{to:"#job-chaining"},{default:t(()=>n[9]||(n[9]=[p("Job Chaining")])),_:1})]),s("li",null,[a(e,{to:"#delayed-dispatching"},{default:t(()=>n[10]||(n[10]=[p("Delayed Dispatching")])),_:1})]),s("li",null,[a(e,{to:"#customizing-the-queue-connection"},{default:t(()=>n[11]||(n[11]=[p("Customizing The Queue & Connection")])),_:1})])])]),s("li",null,[a(e,{to:"#queue-arg-type-supported-types"},{default:t(()=>n[12]||(n[12]=[p("queue.Arg.Type Supported Types")])),_:1})])])]),n[14]||(n[14]=u(`

Introduction

When building your web application, there may be tasks, like parsing and storing an uploaded CSV file, that take too long to complete during a web request. Fortunately, Goravel offers a solution by allowing you to create queued jobs that can run in the background. This way, by moving time-intensive tasks to a queue, your application can respond to web requests much faster and provide a better user experience for your customers. To implement this feature, we use facades.Queue().

Goravel's queue configuration options are saved in your application's config/queue.go configuration file. Goravel supports two drivers: redis and sync.

Connections Vs. Queues

Before delving into Goravel queues, it's important to understand the difference between "connections" and "queues". In the configuration file, config/queue.go, you'll find an array for connections configuration. This option specifies the connections to backend queue services like Redis. However, every queue connection can have multiple "queues", which can be thought of as different stacks or piles of queued jobs.

It's essential to note that each connection configuration example in the queue configuration file includes a queue attribute. This attribute is the default queue to which jobs will be dispatched when they are sent to a given connection. In simpler terms, if you dispatch a job without explicitly defining which queue it should be dispatched to, the job will be placed in the queue defined in the queue attribute of the connection configuration.

// This job is sent to the default connection's default queue
 err := facades.Queue().Job(&jobs.Test{}, []queue.Arg{
   {Type: "int", Value: 1},
 }).Dispatch()
diff --git a/assets/queues.html-D-b0oVFC.js b/assets/queues.html-DwZaProp.js
similarity index 99%
rename from assets/queues.html-D-b0oVFC.js
rename to assets/queues.html-DwZaProp.js
index 964d9708..85e46e42 100644
--- a/assets/queues.html-D-b0oVFC.js
+++ b/assets/queues.html-DwZaProp.js
@@ -1,4 +1,4 @@
-import{_ as l,c as i,b as s,e as a,f as t,a as u,r as c,o as r,d as e}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(m,n){const p=c("router-link"),o=c("CommentService");return r(),i("div",null,[n[13]||(n[13]=s("h1",{id:"队列",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#队列"},[s("span",null,"队列")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(p,{to:"#简介"},{default:t(()=>n[0]||(n[0]=[e("简介")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#连接-vs-队列"},{default:t(()=>n[1]||(n[1]=[e("连接 Vs 队列")])),_:1})])])]),s("li",null,[a(p,{to:"#创建任务"},{default:t(()=>n[2]||(n[2]=[e("创建任务")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#生成任务类"},{default:t(()=>n[3]||(n[3]=[e("生成任务类")])),_:1})]),s("li",null,[a(p,{to:"#类结构"},{default:t(()=>n[4]||(n[4]=[e("类结构")])),_:1})]),s("li",null,[a(p,{to:"#注册任务"},{default:t(()=>n[5]||(n[5]=[e("注册任务")])),_:1})])])]),s("li",null,[a(p,{to:"#启动队列服务器"},{default:t(()=>n[6]||(n[6]=[e("启动队列服务器")])),_:1})]),s("li",null,[a(p,{to:"#调度任务"},{default:t(()=>n[7]||(n[7]=[e("调度任务")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#同步调度"},{default:t(()=>n[8]||(n[8]=[e("同步调度")])),_:1})]),s("li",null,[a(p,{to:"#任务链"},{default:t(()=>n[9]||(n[9]=[e("任务链")])),_:1})]),s("li",null,[a(p,{to:"#延迟调度"},{default:t(()=>n[10]||(n[10]=[e("延迟调度")])),_:1})]),s("li",null,[a(p,{to:"#自定义队列-连接"},{default:t(()=>n[11]||(n[11]=[e("自定义队列 & 连接")])),_:1})])])]),s("li",null,[a(p,{to:"#queue-arg-type-支持的类型"},{default:t(()=>n[12]||(n[12]=[e("queue.Arg.Type 支持的类型")])),_:1})])])]),n[14]||(n[14]=u(`

简介

在构建 Web 应用程序时,你可能需要执行一些比较耗时的任务(例如解析和存储上传的 CSV 文件),Goravel 可以让你轻松地创建可在后台排队处理的任务。通过将耗时的任务移到队列中,你的应用程序可以以超快的速度响应 Web 请求,并为客户提供更好的用户体验。我们使用 facades.Queue() 实现这些功能。

队列配置文件存储在 config/queue.go 中。目前框架支持两种队列驱动: redissync

连接 Vs 队列

在开始使用 Goravel 队列之前,理解「连接」和「队列」之间的区别非常重要。在 config/queue.go 配置文件中,有一个 connections 配置选项。此选项定义到后端服务(如 Redis)的特定连接。然而,任何给定的队列连接都可能有多个「队列」,这些「队列」可能被认为是不同的堆栈或成堆的排队任务。

请注意,config/queue.go 文件中的每个连接配置示例都包含一个 queue 属性。 这是将任务发送到给定连接时将被分配到的默认队列。换句话说,如果你没有显式地定义任务应该被发送到哪个队列,那么该任务将被放置在 queue 定义的队列上:

// 这个任务将被推送到默认队列
+import{_ as l,c as i,b as s,e as a,f as t,a as u,r as c,o as r,d as e}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(m,n){const p=c("router-link"),o=c("CommentService");return r(),i("div",null,[n[13]||(n[13]=s("h1",{id:"队列",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#队列"},[s("span",null,"队列")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(p,{to:"#简介"},{default:t(()=>n[0]||(n[0]=[e("简介")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#连接-vs-队列"},{default:t(()=>n[1]||(n[1]=[e("连接 Vs 队列")])),_:1})])])]),s("li",null,[a(p,{to:"#创建任务"},{default:t(()=>n[2]||(n[2]=[e("创建任务")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#生成任务类"},{default:t(()=>n[3]||(n[3]=[e("生成任务类")])),_:1})]),s("li",null,[a(p,{to:"#类结构"},{default:t(()=>n[4]||(n[4]=[e("类结构")])),_:1})]),s("li",null,[a(p,{to:"#注册任务"},{default:t(()=>n[5]||(n[5]=[e("注册任务")])),_:1})])])]),s("li",null,[a(p,{to:"#启动队列服务器"},{default:t(()=>n[6]||(n[6]=[e("启动队列服务器")])),_:1})]),s("li",null,[a(p,{to:"#调度任务"},{default:t(()=>n[7]||(n[7]=[e("调度任务")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#同步调度"},{default:t(()=>n[8]||(n[8]=[e("同步调度")])),_:1})]),s("li",null,[a(p,{to:"#任务链"},{default:t(()=>n[9]||(n[9]=[e("任务链")])),_:1})]),s("li",null,[a(p,{to:"#延迟调度"},{default:t(()=>n[10]||(n[10]=[e("延迟调度")])),_:1})]),s("li",null,[a(p,{to:"#自定义队列-连接"},{default:t(()=>n[11]||(n[11]=[e("自定义队列 & 连接")])),_:1})])])]),s("li",null,[a(p,{to:"#queue-arg-type-支持的类型"},{default:t(()=>n[12]||(n[12]=[e("queue.Arg.Type 支持的类型")])),_:1})])])]),n[14]||(n[14]=u(`

简介

在构建 Web 应用程序时,你可能需要执行一些比较耗时的任务(例如解析和存储上传的 CSV 文件),Goravel 可以让你轻松地创建可在后台排队处理的任务。通过将耗时的任务移到队列中,你的应用程序可以以超快的速度响应 Web 请求,并为客户提供更好的用户体验。我们使用 facades.Queue() 实现这些功能。

队列配置文件存储在 config/queue.go 中。目前框架支持两种队列驱动: redissync

连接 Vs 队列

在开始使用 Goravel 队列之前,理解「连接」和「队列」之间的区别非常重要。在 config/queue.go 配置文件中,有一个 connections 配置选项。此选项定义到后端服务(如 Redis)的特定连接。然而,任何给定的队列连接都可能有多个「队列」,这些「队列」可能被认为是不同的堆栈或成堆的排队任务。

请注意,config/queue.go 文件中的每个连接配置示例都包含一个 queue 属性。 这是将任务发送到给定连接时将被分配到的默认队列。换句话说,如果你没有显式地定义任务应该被发送到哪个队列,那么该任务将被放置在 queue 定义的队列上:

// 这个任务将被推送到默认队列
 err := facades.Queue().Job(&jobs.Test{}, []queue.Arg{
   {Type: "int", Value: 1},
 }).Dispatch()
diff --git a/assets/relationships.html-CqaEkpsM.js b/assets/relationships.html-BSq_nKu_.js
similarity index 99%
rename from assets/relationships.html-CqaEkpsM.js
rename to assets/relationships.html-BSq_nKu_.js
index 2528c611..929ce98d 100644
--- a/assets/relationships.html-CqaEkpsM.js
+++ b/assets/relationships.html-BSq_nKu_.js
@@ -1,4 +1,4 @@
-import{_ as l,c,b as s,e as a,f as t,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function m(v,n){const e=o("router-link"),i=o("CommentService");return r(),c("div",null,[n[27]||(n[27]=s("h1",{id:"relationships",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#relationships"},[s("span",null,"Relationships")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#defining-relationships"},{default:t(()=>n[1]||(n[1]=[p("Defining Relationships")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#one-to-one"},{default:t(()=>n[2]||(n[2]=[p("One To One")])),_:1})]),s("li",null,[a(e,{to:"#one-to-many"},{default:t(()=>n[3]||(n[3]=[p("One To Many")])),_:1})]),s("li",null,[a(e,{to:"#one-to-many-inverse-belongs-to"},{default:t(()=>n[4]||(n[4]=[p("One To Many (Inverse) / Belongs To")])),_:1})])])]),s("li",null,[a(e,{to:"#many-to-many-relationships"},{default:t(()=>n[5]||(n[5]=[p("Many To Many Relationships")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#table-structure"},{default:t(()=>n[6]||(n[6]=[p("Table Structure")])),_:1})]),s("li",null,[a(e,{to:"#model-structure"},{default:t(()=>n[7]||(n[7]=[p("Model Structure")])),_:1})]),s("li",null,[a(e,{to:"#defining-the-inverse-of-the-relationship-1"},{default:t(()=>n[8]||(n[8]=[p("Defining The Inverse Of The Relationship")])),_:1})]),s("li",null,[a(e,{to:"#custom-intermediate-table"},{default:t(()=>n[9]||(n[9]=[p("Custom intermediate table")])),_:1})])])]),s("li",null,[a(e,{to:"#polymorphic"},{default:t(()=>n[10]||(n[10]=[p("Polymorphic")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#table-structure-1"},{default:t(()=>n[11]||(n[11]=[p("Table structure")])),_:1})]),s("li",null,[a(e,{to:"#model-structure-1"},{default:t(()=>n[12]||(n[12]=[p("Model Structure")])),_:1})])])]),s("li",null,[a(e,{to:"#querying-associations"},{default:t(()=>n[13]||(n[13]=[p("Querying Associations")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#create-or-update-associations"},{default:t(()=>n[14]||(n[14]=[p("Create or Update Associations")])),_:1})]),s("li",null,[a(e,{to:"#find-associations"},{default:t(()=>n[15]||(n[15]=[p("Find Associations")])),_:1})]),s("li",null,[a(e,{to:"#append-associations"},{default:t(()=>n[16]||(n[16]=[p("Append Associations")])),_:1})]),s("li",null,[a(e,{to:"#replace-associations"},{default:t(()=>n[17]||(n[17]=[p("Replace Associations")])),_:1})]),s("li",null,[a(e,{to:"#delete-associations"},{default:t(()=>n[18]||(n[18]=[p("Delete Associations")])),_:1})]),s("li",null,[a(e,{to:"#clear-associations"},{default:t(()=>n[19]||(n[19]=[p("Clear Associations")])),_:1})]),s("li",null,[a(e,{to:"#count-associations"},{default:t(()=>n[20]||(n[20]=[p("Count Associations")])),_:1})]),s("li",null,[a(e,{to:"#batch-data"},{default:t(()=>n[21]||(n[21]=[p("Batch Data")])),_:1})])])]),s("li",null,[a(e,{to:"#eager-loading"},{default:t(()=>n[22]||(n[22]=[p("Eager Loading")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#eager-loading-multiple-relationships"},{default:t(()=>n[23]||(n[23]=[p("Eager Loading Multiple Relationships")])),_:1})]),s("li",null,[a(e,{to:"#nested-eager-loading"},{default:t(()=>n[24]||(n[24]=[p("Nested Eager Loading")])),_:1})]),s("li",null,[a(e,{to:"#constraining-eager-loads"},{default:t(()=>n[25]||(n[25]=[p("Constraining Eager Loads")])),_:1})]),s("li",null,[a(e,{to:"#lazy-eager-loading"},{default:t(()=>n[26]||(n[26]=[p("Lazy Eager Loading")])),_:1})])])])])]),n[28]||(n[28]=u(`

Introduction

It's common for database tables to be interconnected. For instance, a blog post may have many comments, or an order may be linked to the user who placed it. Orm simplifies managing and dealing with such relationships, and it can handle various common relationships:

Defining Relationships

One To One

A one-to-one relationship is a very basic type of database relationship. For example, a User model might be associated with one Phone model.

type User struct {
+import{_ as l,c,b as s,e as a,f as t,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function m(v,n){const e=o("router-link"),i=o("CommentService");return r(),c("div",null,[n[27]||(n[27]=s("h1",{id:"relationships",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#relationships"},[s("span",null,"Relationships")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#defining-relationships"},{default:t(()=>n[1]||(n[1]=[p("Defining Relationships")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#one-to-one"},{default:t(()=>n[2]||(n[2]=[p("One To One")])),_:1})]),s("li",null,[a(e,{to:"#one-to-many"},{default:t(()=>n[3]||(n[3]=[p("One To Many")])),_:1})]),s("li",null,[a(e,{to:"#one-to-many-inverse-belongs-to"},{default:t(()=>n[4]||(n[4]=[p("One To Many (Inverse) / Belongs To")])),_:1})])])]),s("li",null,[a(e,{to:"#many-to-many-relationships"},{default:t(()=>n[5]||(n[5]=[p("Many To Many Relationships")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#table-structure"},{default:t(()=>n[6]||(n[6]=[p("Table Structure")])),_:1})]),s("li",null,[a(e,{to:"#model-structure"},{default:t(()=>n[7]||(n[7]=[p("Model Structure")])),_:1})]),s("li",null,[a(e,{to:"#defining-the-inverse-of-the-relationship-1"},{default:t(()=>n[8]||(n[8]=[p("Defining The Inverse Of The Relationship")])),_:1})]),s("li",null,[a(e,{to:"#custom-intermediate-table"},{default:t(()=>n[9]||(n[9]=[p("Custom intermediate table")])),_:1})])])]),s("li",null,[a(e,{to:"#polymorphic"},{default:t(()=>n[10]||(n[10]=[p("Polymorphic")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#table-structure-1"},{default:t(()=>n[11]||(n[11]=[p("Table structure")])),_:1})]),s("li",null,[a(e,{to:"#model-structure-1"},{default:t(()=>n[12]||(n[12]=[p("Model Structure")])),_:1})])])]),s("li",null,[a(e,{to:"#querying-associations"},{default:t(()=>n[13]||(n[13]=[p("Querying Associations")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#create-or-update-associations"},{default:t(()=>n[14]||(n[14]=[p("Create or Update Associations")])),_:1})]),s("li",null,[a(e,{to:"#find-associations"},{default:t(()=>n[15]||(n[15]=[p("Find Associations")])),_:1})]),s("li",null,[a(e,{to:"#append-associations"},{default:t(()=>n[16]||(n[16]=[p("Append Associations")])),_:1})]),s("li",null,[a(e,{to:"#replace-associations"},{default:t(()=>n[17]||(n[17]=[p("Replace Associations")])),_:1})]),s("li",null,[a(e,{to:"#delete-associations"},{default:t(()=>n[18]||(n[18]=[p("Delete Associations")])),_:1})]),s("li",null,[a(e,{to:"#clear-associations"},{default:t(()=>n[19]||(n[19]=[p("Clear Associations")])),_:1})]),s("li",null,[a(e,{to:"#count-associations"},{default:t(()=>n[20]||(n[20]=[p("Count Associations")])),_:1})]),s("li",null,[a(e,{to:"#batch-data"},{default:t(()=>n[21]||(n[21]=[p("Batch Data")])),_:1})])])]),s("li",null,[a(e,{to:"#eager-loading"},{default:t(()=>n[22]||(n[22]=[p("Eager Loading")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#eager-loading-multiple-relationships"},{default:t(()=>n[23]||(n[23]=[p("Eager Loading Multiple Relationships")])),_:1})]),s("li",null,[a(e,{to:"#nested-eager-loading"},{default:t(()=>n[24]||(n[24]=[p("Nested Eager Loading")])),_:1})]),s("li",null,[a(e,{to:"#constraining-eager-loads"},{default:t(()=>n[25]||(n[25]=[p("Constraining Eager Loads")])),_:1})]),s("li",null,[a(e,{to:"#lazy-eager-loading"},{default:t(()=>n[26]||(n[26]=[p("Lazy Eager Loading")])),_:1})])])])])]),n[28]||(n[28]=u(`

Introduction

It's common for database tables to be interconnected. For instance, a blog post may have many comments, or an order may be linked to the user who placed it. Orm simplifies managing and dealing with such relationships, and it can handle various common relationships:

Defining Relationships

One To One

A one-to-one relationship is a very basic type of database relationship. For example, a User model might be associated with one Phone model.

type User struct {
   orm.Model
   Name  string
   Phone   *Phone
diff --git a/assets/relationships.html-DB51a1Hp.js b/assets/relationships.html-DP1bUOq_.js
similarity index 99%
rename from assets/relationships.html-DB51a1Hp.js
rename to assets/relationships.html-DP1bUOq_.js
index e0b07bee..a4f472b7 100644
--- a/assets/relationships.html-DB51a1Hp.js
+++ b/assets/relationships.html-DP1bUOq_.js
@@ -1,4 +1,4 @@
-import{_ as c,c as i,b as s,e as a,f as e,a as u,r as o,o as r,d as t}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function m(v,n){const p=o("router-link"),l=o("CommentService");return r(),i("div",null,[n[27]||(n[27]=s("h1",{id:"模型关联",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#模型关联"},[s("span",null,"模型关联")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(p,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[t("简介")])),_:1})]),s("li",null,[a(p,{to:"#定义关联"},{default:e(()=>n[1]||(n[1]=[t("定义关联")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#一对一"},{default:e(()=>n[2]||(n[2]=[t("一对一")])),_:1})]),s("li",null,[a(p,{to:"#一对多"},{default:e(()=>n[3]||(n[3]=[t("一对多")])),_:1})]),s("li",null,[a(p,{to:"#一对多-反向-属于"},{default:e(()=>n[4]||(n[4]=[t("一对多 (反向) / 属于")])),_:1})])])]),s("li",null,[a(p,{to:"#多对多关联"},{default:e(()=>n[5]||(n[5]=[t("多对多关联")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#表结构"},{default:e(()=>n[6]||(n[6]=[t("表结构")])),_:1})]),s("li",null,[a(p,{to:"#模型结构"},{default:e(()=>n[7]||(n[7]=[t("模型结构")])),_:1})]),s("li",null,[a(p,{to:"#定义反向关联-1"},{default:e(()=>n[8]||(n[8]=[t("定义反向关联")])),_:1})]),s("li",null,[a(p,{to:"#自定义中间表"},{default:e(()=>n[9]||(n[9]=[t("自定义中间表")])),_:1})])])]),s("li",null,[a(p,{to:"#多态"},{default:e(()=>n[10]||(n[10]=[t("多态")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#表结构-1"},{default:e(()=>n[11]||(n[11]=[t("表结构")])),_:1})]),s("li",null,[a(p,{to:"#模型结构-1"},{default:e(()=>n[12]||(n[12]=[t("模型结构")])),_:1})])])]),s("li",null,[a(p,{to:"#关联操作"},{default:e(()=>n[13]||(n[13]=[t("关联操作")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#创建-更新关联"},{default:e(()=>n[14]||(n[14]=[t("创建/更新关联")])),_:1})]),s("li",null,[a(p,{to:"#查找关联"},{default:e(()=>n[15]||(n[15]=[t("查找关联")])),_:1})]),s("li",null,[a(p,{to:"#添加关联"},{default:e(()=>n[16]||(n[16]=[t("添加关联")])),_:1})]),s("li",null,[a(p,{to:"#替换关联"},{default:e(()=>n[17]||(n[17]=[t("替换关联")])),_:1})]),s("li",null,[a(p,{to:"#删除关联"},{default:e(()=>n[18]||(n[18]=[t("删除关联")])),_:1})]),s("li",null,[a(p,{to:"#清空关联"},{default:e(()=>n[19]||(n[19]=[t("清空关联")])),_:1})]),s("li",null,[a(p,{to:"#关联计数"},{default:e(()=>n[20]||(n[20]=[t("关联计数")])),_:1})]),s("li",null,[a(p,{to:"#批量处理数据"},{default:e(()=>n[21]||(n[21]=[t("批量处理数据")])),_:1})])])]),s("li",null,[a(p,{to:"#预加载"},{default:e(()=>n[22]||(n[22]=[t("预加载")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#预加载多个关联"},{default:e(()=>n[23]||(n[23]=[t("预加载多个关联")])),_:1})]),s("li",null,[a(p,{to:"#嵌套预加载"},{default:e(()=>n[24]||(n[24]=[t("嵌套预加载")])),_:1})]),s("li",null,[a(p,{to:"#为预加载添加约束"},{default:e(()=>n[25]||(n[25]=[t("为预加载添加约束")])),_:1})]),s("li",null,[a(p,{to:"#延迟预加载"},{default:e(()=>n[26]||(n[26]=[t("延迟预加载")])),_:1})])])])])]),n[28]||(n[28]=u(`

简介

数据库表通常相互关联。例如,一篇博客文章可能有许多评论,或者一个订单对应一个下单用户。Orm 让这些关联的管理和使用变得简单,并支持多种常用的关联类型:

定义关联

一对一

一对一是最基本的数据库关系。 例如,一个 User 模型可能与一个 Phone 模型相关联。为了定义这个关联关系,我们要在 User 模型中定义一个 Phone

type User struct {
+import{_ as c,c as i,b as s,e as a,f as e,a as u,r as o,o as r,d as t}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function m(v,n){const p=o("router-link"),l=o("CommentService");return r(),i("div",null,[n[27]||(n[27]=s("h1",{id:"模型关联",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#模型关联"},[s("span",null,"模型关联")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(p,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[t("简介")])),_:1})]),s("li",null,[a(p,{to:"#定义关联"},{default:e(()=>n[1]||(n[1]=[t("定义关联")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#一对一"},{default:e(()=>n[2]||(n[2]=[t("一对一")])),_:1})]),s("li",null,[a(p,{to:"#一对多"},{default:e(()=>n[3]||(n[3]=[t("一对多")])),_:1})]),s("li",null,[a(p,{to:"#一对多-反向-属于"},{default:e(()=>n[4]||(n[4]=[t("一对多 (反向) / 属于")])),_:1})])])]),s("li",null,[a(p,{to:"#多对多关联"},{default:e(()=>n[5]||(n[5]=[t("多对多关联")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#表结构"},{default:e(()=>n[6]||(n[6]=[t("表结构")])),_:1})]),s("li",null,[a(p,{to:"#模型结构"},{default:e(()=>n[7]||(n[7]=[t("模型结构")])),_:1})]),s("li",null,[a(p,{to:"#定义反向关联-1"},{default:e(()=>n[8]||(n[8]=[t("定义反向关联")])),_:1})]),s("li",null,[a(p,{to:"#自定义中间表"},{default:e(()=>n[9]||(n[9]=[t("自定义中间表")])),_:1})])])]),s("li",null,[a(p,{to:"#多态"},{default:e(()=>n[10]||(n[10]=[t("多态")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#表结构-1"},{default:e(()=>n[11]||(n[11]=[t("表结构")])),_:1})]),s("li",null,[a(p,{to:"#模型结构-1"},{default:e(()=>n[12]||(n[12]=[t("模型结构")])),_:1})])])]),s("li",null,[a(p,{to:"#关联操作"},{default:e(()=>n[13]||(n[13]=[t("关联操作")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#创建-更新关联"},{default:e(()=>n[14]||(n[14]=[t("创建/更新关联")])),_:1})]),s("li",null,[a(p,{to:"#查找关联"},{default:e(()=>n[15]||(n[15]=[t("查找关联")])),_:1})]),s("li",null,[a(p,{to:"#添加关联"},{default:e(()=>n[16]||(n[16]=[t("添加关联")])),_:1})]),s("li",null,[a(p,{to:"#替换关联"},{default:e(()=>n[17]||(n[17]=[t("替换关联")])),_:1})]),s("li",null,[a(p,{to:"#删除关联"},{default:e(()=>n[18]||(n[18]=[t("删除关联")])),_:1})]),s("li",null,[a(p,{to:"#清空关联"},{default:e(()=>n[19]||(n[19]=[t("清空关联")])),_:1})]),s("li",null,[a(p,{to:"#关联计数"},{default:e(()=>n[20]||(n[20]=[t("关联计数")])),_:1})]),s("li",null,[a(p,{to:"#批量处理数据"},{default:e(()=>n[21]||(n[21]=[t("批量处理数据")])),_:1})])])]),s("li",null,[a(p,{to:"#预加载"},{default:e(()=>n[22]||(n[22]=[t("预加载")])),_:1}),s("ul",null,[s("li",null,[a(p,{to:"#预加载多个关联"},{default:e(()=>n[23]||(n[23]=[t("预加载多个关联")])),_:1})]),s("li",null,[a(p,{to:"#嵌套预加载"},{default:e(()=>n[24]||(n[24]=[t("嵌套预加载")])),_:1})]),s("li",null,[a(p,{to:"#为预加载添加约束"},{default:e(()=>n[25]||(n[25]=[t("为预加载添加约束")])),_:1})]),s("li",null,[a(p,{to:"#延迟预加载"},{default:e(()=>n[26]||(n[26]=[t("延迟预加载")])),_:1})])])])])]),n[28]||(n[28]=u(`

简介

数据库表通常相互关联。例如,一篇博客文章可能有许多评论,或者一个订单对应一个下单用户。Orm 让这些关联的管理和使用变得简单,并支持多种常用的关联类型:

定义关联

一对一

一对一是最基本的数据库关系。 例如,一个 User 模型可能与一个 Phone 模型相关联。为了定义这个关联关系,我们要在 User 模型中定义一个 Phone

type User struct {
   orm.Model
   Name  string
   Phone   *Phone
diff --git a/assets/request-lifecycle.html-CxhD0_ek.js b/assets/request-lifecycle.html-DHOcG7yE.js
similarity index 98%
rename from assets/request-lifecycle.html-CxhD0_ek.js
rename to assets/request-lifecycle.html-DHOcG7yE.js
index a7ac6099..19678cf4 100644
--- a/assets/request-lifecycle.html-CxhD0_ek.js
+++ b/assets/request-lifecycle.html-DHOcG7yE.js
@@ -1 +1 @@
-import{_ as s,c,b as t,e as n,f as a,a as d,d as o,r,o as u}from"./app-ELDWQP0J.js";const m={},f={class:"table-of-contents"};function g(h,e){const l=r("router-link"),p=r("RouteLink"),i=r("CommentService");return u(),c("div",null,[e[8]||(e[8]=t("h1",{id:"请求周期",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#请求周期"},[t("span",null,"请求周期")])],-1)),t("nav",f,[t("ul",null,[t("li",null,[n(l,{to:"#简介"},{default:a(()=>e[0]||(e[0]=[o("简介")])),_:1})])])]),e[9]||(e[9]=d('

简介

Goravel 应用的所有请求入口都是 main.go 文件,该文件中使用 bootstrap.Boot() 引导框架加载。

然后在 bootstrap/app.go 脚本中创建 Goravel 实例 app := foundation.Application{}

',3)),t("p",null,[e[2]||(e[2]=o("之后使用 ")),e[3]||(e[3]=t("code",null,"app.Boot()",-1)),e[4]||(e[4]=o(" 引导加载框架中注册的 ")),n(p,{to:"/zh/architecutre-concepts/service-providers.html"},{default:a(()=>e[1]||(e[1]=[o("服务提供者")])),_:1}),e[5]||(e[5]=o(",使用 ")),e[6]||(e[6]=t("code",null,"config.Boot()",-1)),e[7]||(e[7]=o(" 加载 config 目录下的配置文件。"))]),e[10]||(e[10]=t("p",null,[o("最后,在 "),t("code",null,"main.go"),o(" 文件中使用 "),t("code",null,'facades.Route().Run(facades.Config().GetString("app.host"))'),o(" 启动 HTTP 服务器。")],-1)),n(i)])}const y=s(m,[["render",g],["__file","request-lifecycle.html.vue"]]),b=JSON.parse('{"path":"/zh/architecutre-concepts/request-lifecycle.html","title":"请求周期","lang":"zh-CN","frontmatter":{"description":"请求周期 简介 Goravel 应用的所有请求入口都是 main.go 文件,该文件中使用 bootstrap.Boot() 引导框架加载。 然后在 bootstrap/app.go 脚本中创建 Goravel 实例 app := foundation.Application{}。 之后使用 app.Boot() 引导加载框架中注册的 ,使用 conf...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/architecutre-concepts/request-lifecycle.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/architecutre-concepts/request-lifecycle.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/architecutre-concepts/request-lifecycle.html"}],["meta",{"property":"og:description","content":"请求周期 简介 Goravel 应用的所有请求入口都是 main.go 文件,该文件中使用 bootstrap.Boot() 引导框架加载。 然后在 bootstrap/app.go 脚本中创建 Goravel 实例 app := foundation.Application{}。 之后使用 app.Boot() 引导加载框架中注册的 ,使用 conf..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"请求周期\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"简介","slug":"简介","link":"#简介","children":[]}],"git":{},"filePathRelative":"zh/architecutre-concepts/request-lifecycle.md","autoDesc":true}');export{y as comp,b as data}; +import{_ as s,c,b as t,e as n,f as a,a as d,d as o,r,o as u}from"./app-Ewo6p9aM.js";const m={},f={class:"table-of-contents"};function g(h,e){const l=r("router-link"),p=r("RouteLink"),i=r("CommentService");return u(),c("div",null,[e[8]||(e[8]=t("h1",{id:"请求周期",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#请求周期"},[t("span",null,"请求周期")])],-1)),t("nav",f,[t("ul",null,[t("li",null,[n(l,{to:"#简介"},{default:a(()=>e[0]||(e[0]=[o("简介")])),_:1})])])]),e[9]||(e[9]=d('

简介

Goravel 应用的所有请求入口都是 main.go 文件,该文件中使用 bootstrap.Boot() 引导框架加载。

然后在 bootstrap/app.go 脚本中创建 Goravel 实例 app := foundation.Application{}

',3)),t("p",null,[e[2]||(e[2]=o("之后使用 ")),e[3]||(e[3]=t("code",null,"app.Boot()",-1)),e[4]||(e[4]=o(" 引导加载框架中注册的 ")),n(p,{to:"/zh/architecutre-concepts/service-providers.html"},{default:a(()=>e[1]||(e[1]=[o("服务提供者")])),_:1}),e[5]||(e[5]=o(",使用 ")),e[6]||(e[6]=t("code",null,"config.Boot()",-1)),e[7]||(e[7]=o(" 加载 config 目录下的配置文件。"))]),e[10]||(e[10]=t("p",null,[o("最后,在 "),t("code",null,"main.go"),o(" 文件中使用 "),t("code",null,'facades.Route().Run(facades.Config().GetString("app.host"))'),o(" 启动 HTTP 服务器。")],-1)),n(i)])}const y=s(m,[["render",g],["__file","request-lifecycle.html.vue"]]),b=JSON.parse('{"path":"/zh/architecutre-concepts/request-lifecycle.html","title":"请求周期","lang":"zh-CN","frontmatter":{"description":"请求周期 简介 Goravel 应用的所有请求入口都是 main.go 文件,该文件中使用 bootstrap.Boot() 引导框架加载。 然后在 bootstrap/app.go 脚本中创建 Goravel 实例 app := foundation.Application{}。 之后使用 app.Boot() 引导加载框架中注册的 ,使用 conf...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/architecutre-concepts/request-lifecycle.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/architecutre-concepts/request-lifecycle.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/architecutre-concepts/request-lifecycle.html"}],["meta",{"property":"og:description","content":"请求周期 简介 Goravel 应用的所有请求入口都是 main.go 文件,该文件中使用 bootstrap.Boot() 引导框架加载。 然后在 bootstrap/app.go 脚本中创建 Goravel 实例 app := foundation.Application{}。 之后使用 app.Boot() 引导加载框架中注册的 ,使用 conf..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"请求周期\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"简介","slug":"简介","link":"#简介","children":[]}],"git":{},"filePathRelative":"zh/architecutre-concepts/request-lifecycle.md","autoDesc":true}');export{y as comp,b as data}; diff --git a/assets/request-lifecycle.html-B95lifw3.js b/assets/request-lifecycle.html-DunQQCpy.js similarity index 98% rename from assets/request-lifecycle.html-B95lifw3.js rename to assets/request-lifecycle.html-DunQQCpy.js index c0718fa5..487c7219 100644 --- a/assets/request-lifecycle.html-B95lifw3.js +++ b/assets/request-lifecycle.html-DunQQCpy.js @@ -1 +1 @@ -import{_ as s,c as p,b as t,e as n,f as r,a as u,d as o,r as i,o as d}from"./app-ELDWQP0J.js";const f={},h={class:"table-of-contents"};function m(y,e){const l=i("router-link"),a=i("RouteLink"),c=i("CommentService");return d(),p("div",null,[e[8]||(e[8]=t("h1",{id:"request-lifecycle",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#request-lifecycle"},[t("span",null,"Request Lifecycle")])],-1)),t("nav",h,[t("ul",null,[t("li",null,[n(l,{to:"#introduction"},{default:r(()=>e[0]||(e[0]=[o("Introduction")])),_:1})])])]),e[9]||(e[9]=u('

Introduction

The main.go file serves as the entry point for all requests in the Goravel application. It utilizes the bootstrap.Boot() function to initialize the framework.

Then a Goravel instance is created by app := foundation.NewApplication() in bootstrap/app.go.

',3)),t("p",null,[e[2]||(e[2]=o("After this, use ")),e[3]||(e[3]=t("code",null,"app.Boot()",-1)),e[4]||(e[4]=o(" to load the ")),n(a,{to:"/architecutre-concepts/service-providers.html"},{default:r(()=>e[1]||(e[1]=[o("Service Provider")])),_:1}),e[5]||(e[5]=o(" registered, and ")),e[6]||(e[6]=t("code",null,"config.Boot()",-1)),e[7]||(e[7]=o(" to load the configuration files under the config directory."))]),e[10]||(e[10]=t("p",null,[o("Finally, start the HTTP server by using "),t("code",null,'facades.Route().Run(facades.Config().GetString("app.host"))'),o(" in "),t("code",null,"main.go"),o(".")],-1)),n(c)])}const v=s(f,[["render",m],["__file","request-lifecycle.html.vue"]]),q=JSON.parse('{"path":"/architecutre-concepts/request-lifecycle.html","title":"Request Lifecycle","lang":"en-US","frontmatter":{"description":"Request Lifecycle Introduction The main.go file serves as the entry point for all requests in the Goravel application. It utilizes the bootstrap.Boot() function to initialize th...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/architecutre-concepts/request-lifecycle.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/architecutre-concepts/request-lifecycle.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/architecutre-concepts/request-lifecycle.html"}],["meta",{"property":"og:description","content":"Request Lifecycle Introduction The main.go file serves as the entry point for all requests in the Goravel application. It utilizes the bootstrap.Boot() function to initialize th..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Request Lifecycle\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"Introduction","slug":"introduction","link":"#introduction","children":[]}],"git":{},"filePathRelative":"architecutre-concepts/request-lifecycle.md","autoDesc":true}');export{v as comp,q as data}; +import{_ as s,c as p,b as t,e as n,f as r,a as u,d as o,r as i,o as d}from"./app-Ewo6p9aM.js";const f={},h={class:"table-of-contents"};function m(y,e){const l=i("router-link"),a=i("RouteLink"),c=i("CommentService");return d(),p("div",null,[e[8]||(e[8]=t("h1",{id:"request-lifecycle",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#request-lifecycle"},[t("span",null,"Request Lifecycle")])],-1)),t("nav",h,[t("ul",null,[t("li",null,[n(l,{to:"#introduction"},{default:r(()=>e[0]||(e[0]=[o("Introduction")])),_:1})])])]),e[9]||(e[9]=u('

Introduction

The main.go file serves as the entry point for all requests in the Goravel application. It utilizes the bootstrap.Boot() function to initialize the framework.

Then a Goravel instance is created by app := foundation.NewApplication() in bootstrap/app.go.

',3)),t("p",null,[e[2]||(e[2]=o("After this, use ")),e[3]||(e[3]=t("code",null,"app.Boot()",-1)),e[4]||(e[4]=o(" to load the ")),n(a,{to:"/architecutre-concepts/service-providers.html"},{default:r(()=>e[1]||(e[1]=[o("Service Provider")])),_:1}),e[5]||(e[5]=o(" registered, and ")),e[6]||(e[6]=t("code",null,"config.Boot()",-1)),e[7]||(e[7]=o(" to load the configuration files under the config directory."))]),e[10]||(e[10]=t("p",null,[o("Finally, start the HTTP server by using "),t("code",null,'facades.Route().Run(facades.Config().GetString("app.host"))'),o(" in "),t("code",null,"main.go"),o(".")],-1)),n(c)])}const v=s(f,[["render",m],["__file","request-lifecycle.html.vue"]]),q=JSON.parse('{"path":"/architecutre-concepts/request-lifecycle.html","title":"Request Lifecycle","lang":"en-US","frontmatter":{"description":"Request Lifecycle Introduction The main.go file serves as the entry point for all requests in the Goravel application. It utilizes the bootstrap.Boot() function to initialize th...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/architecutre-concepts/request-lifecycle.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/architecutre-concepts/request-lifecycle.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/architecutre-concepts/request-lifecycle.html"}],["meta",{"property":"og:description","content":"Request Lifecycle Introduction The main.go file serves as the entry point for all requests in the Goravel application. It utilizes the bootstrap.Boot() function to initialize th..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Request Lifecycle\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"Introduction","slug":"introduction","link":"#introduction","children":[]}],"git":{},"filePathRelative":"architecutre-concepts/request-lifecycle.md","autoDesc":true}');export{v as comp,q as data}; diff --git a/assets/request.html-Car_orJ0.js b/assets/request.html-BRO6Ir3A.js similarity index 99% rename from assets/request.html-Car_orJ0.js rename to assets/request.html-BRO6Ir3A.js index b3ea2763..bb9db3d2 100644 --- a/assets/request.html-Car_orJ0.js +++ b/assets/request.html-BRO6Ir3A.js @@ -1,4 +1,4 @@ -import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(m,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[26]||(n[26]=s("h1",{id:"请求",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#请求"},[s("span",null,"请求")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#与请求交互"},{default:e(()=>n[1]||(n[1]=[p("与请求交互")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#获取请求路径"},{default:e(()=>n[2]||(n[2]=[p("获取请求路径")])),_:1})]),s("li",null,[a(t,{to:"#获取请求-url"},{default:e(()=>n[3]||(n[3]=[p("获取请求 URL")])),_:1})]),s("li",null,[a(t,{to:"#获取请求-host"},{default:e(()=>n[4]||(n[4]=[p("获取请求 HOST")])),_:1})]),s("li",null,[a(t,{to:"#获取完整-url"},{default:e(()=>n[5]||(n[5]=[p("获取完整 URL")])),_:1})]),s("li",null,[a(t,{to:"#获取请求方法"},{default:e(()=>n[6]||(n[6]=[p("获取请求方法")])),_:1})]),s("li",null,[a(t,{to:"#获取请求头"},{default:e(()=>n[7]||(n[7]=[p("获取请求头")])),_:1})]),s("li",null,[a(t,{to:"#获取-ip-地址"},{default:e(()=>n[8]||(n[8]=[p("获取 IP 地址")])),_:1})])])]),s("li",null,[a(t,{to:"#输入"},{default:e(()=>n[9]||(n[9]=[p("输入")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#获取所有输入数据"},{default:e(()=>n[10]||(n[10]=[p("获取所有输入数据")])),_:1})]),s("li",null,[a(t,{to:"#获取路由中的参数"},{default:e(()=>n[11]||(n[11]=[p("获取路由中的参数")])),_:1})]),s("li",null,[a(t,{to:"#获取路由传入的参数"},{default:e(()=>n[12]||(n[12]=[p("获取路由传入的参数")])),_:1})]),s("li",null,[a(t,{to:"#检索一个输入值"},{default:e(()=>n[13]||(n[13]=[p("检索一个输入值")])),_:1})]),s("li",null,[a(t,{to:"#绑定-json-form"},{default:e(()=>n[14]||(n[14]=[p("绑定 json/form")])),_:1})]),s("li",null,[a(t,{to:"#绑定-query"},{default:e(()=>n[15]||(n[15]=[p("绑定 Query")])),_:1})])])]),s("li",null,[a(t,{to:"#cookie"},{default:e(()=>n[16]||(n[16]=[p("Cookie")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#获取-cookie"},{default:e(()=>n[17]||(n[17]=[p("获取 Cookie")])),_:1})])])]),s("li",null,[a(t,{to:"#文件"},{default:e(()=>n[18]||(n[18]=[p("文件")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#获取上传的文件"},{default:e(()=>n[19]||(n[19]=[p("获取上传的文件")])),_:1})]),s("li",null,[a(t,{to:"#储存上传的文件"},{default:e(()=>n[20]||(n[20]=[p("储存上传的文件")])),_:1})]),s("li",null,[a(t,{to:"#获取原始-request"},{default:e(()=>n[21]||(n[21]=[p("获取原始 Request")])),_:1})]),s("li",null,[a(t,{to:"#附加数据"},{default:e(()=>n[22]||(n[22]=[p("附加数据")])),_:1})]),s("li",null,[a(t,{to:"#获取数据"},{default:e(()=>n[23]||(n[23]=[p("获取数据")])),_:1})]),s("li",null,[a(t,{to:"#获取-context"},{default:e(()=>n[24]||(n[24]=[p("获取 Context")])),_:1})])])]),s("li",null,[a(t,{to:"#自定义-recovery"},{default:e(()=>n[25]||(n[25]=[p("自定义 Recovery")])),_:1})])])]),n[27]||(n[27]=u(`

简介

Goravel 的 contracts/http/Request 方法可以与应用程序处理的当前 HTTP 请求进行交互,以及检索与请求一起提交的输入内容和文件。

与请求交互

http.Context 实例被自动注入到控制器中:

import "github.com/goravel/framework/contracts/http"
+import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(m,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[26]||(n[26]=s("h1",{id:"请求",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#请求"},[s("span",null,"请求")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#与请求交互"},{default:e(()=>n[1]||(n[1]=[p("与请求交互")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#获取请求路径"},{default:e(()=>n[2]||(n[2]=[p("获取请求路径")])),_:1})]),s("li",null,[a(t,{to:"#获取请求-url"},{default:e(()=>n[3]||(n[3]=[p("获取请求 URL")])),_:1})]),s("li",null,[a(t,{to:"#获取请求-host"},{default:e(()=>n[4]||(n[4]=[p("获取请求 HOST")])),_:1})]),s("li",null,[a(t,{to:"#获取完整-url"},{default:e(()=>n[5]||(n[5]=[p("获取完整 URL")])),_:1})]),s("li",null,[a(t,{to:"#获取请求方法"},{default:e(()=>n[6]||(n[6]=[p("获取请求方法")])),_:1})]),s("li",null,[a(t,{to:"#获取请求头"},{default:e(()=>n[7]||(n[7]=[p("获取请求头")])),_:1})]),s("li",null,[a(t,{to:"#获取-ip-地址"},{default:e(()=>n[8]||(n[8]=[p("获取 IP 地址")])),_:1})])])]),s("li",null,[a(t,{to:"#输入"},{default:e(()=>n[9]||(n[9]=[p("输入")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#获取所有输入数据"},{default:e(()=>n[10]||(n[10]=[p("获取所有输入数据")])),_:1})]),s("li",null,[a(t,{to:"#获取路由中的参数"},{default:e(()=>n[11]||(n[11]=[p("获取路由中的参数")])),_:1})]),s("li",null,[a(t,{to:"#获取路由传入的参数"},{default:e(()=>n[12]||(n[12]=[p("获取路由传入的参数")])),_:1})]),s("li",null,[a(t,{to:"#检索一个输入值"},{default:e(()=>n[13]||(n[13]=[p("检索一个输入值")])),_:1})]),s("li",null,[a(t,{to:"#绑定-json-form"},{default:e(()=>n[14]||(n[14]=[p("绑定 json/form")])),_:1})]),s("li",null,[a(t,{to:"#绑定-query"},{default:e(()=>n[15]||(n[15]=[p("绑定 Query")])),_:1})])])]),s("li",null,[a(t,{to:"#cookie"},{default:e(()=>n[16]||(n[16]=[p("Cookie")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#获取-cookie"},{default:e(()=>n[17]||(n[17]=[p("获取 Cookie")])),_:1})])])]),s("li",null,[a(t,{to:"#文件"},{default:e(()=>n[18]||(n[18]=[p("文件")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#获取上传的文件"},{default:e(()=>n[19]||(n[19]=[p("获取上传的文件")])),_:1})]),s("li",null,[a(t,{to:"#储存上传的文件"},{default:e(()=>n[20]||(n[20]=[p("储存上传的文件")])),_:1})]),s("li",null,[a(t,{to:"#获取原始-request"},{default:e(()=>n[21]||(n[21]=[p("获取原始 Request")])),_:1})]),s("li",null,[a(t,{to:"#附加数据"},{default:e(()=>n[22]||(n[22]=[p("附加数据")])),_:1})]),s("li",null,[a(t,{to:"#获取数据"},{default:e(()=>n[23]||(n[23]=[p("获取数据")])),_:1})]),s("li",null,[a(t,{to:"#获取-context"},{default:e(()=>n[24]||(n[24]=[p("获取 Context")])),_:1})])])]),s("li",null,[a(t,{to:"#自定义-recovery"},{default:e(()=>n[25]||(n[25]=[p("自定义 Recovery")])),_:1})])])]),n[27]||(n[27]=u(`

简介

Goravel 的 contracts/http/Request 方法可以与应用程序处理的当前 HTTP 请求进行交互,以及检索与请求一起提交的输入内容和文件。

与请求交互

http.Context 实例被自动注入到控制器中:

import "github.com/goravel/framework/contracts/http"
 
 facades.Route().Get("/", func(ctx http.Context) {
 
diff --git a/assets/request.html-DFk1Innn.js b/assets/request.html-InRYZk6S.js
similarity index 99%
rename from assets/request.html-DFk1Innn.js
rename to assets/request.html-InRYZk6S.js
index ad4c0a45..f5d09761 100644
--- a/assets/request.html-DFk1Innn.js
+++ b/assets/request.html-InRYZk6S.js
@@ -1,4 +1,4 @@
-import{_ as l,c as u,b as s,e as a,f as t,a as c,r as i,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(g,n){const e=i("router-link"),o=i("CommentService");return r(),u("div",null,[n[26]||(n[26]=s("h1",{id:"http-requests",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#http-requests"},[s("span",null,"HTTP Requests")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#interacting-with-the-request"},{default:t(()=>n[1]||(n[1]=[p("Interacting With The Request")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#retrieving-the-request-path"},{default:t(()=>n[2]||(n[2]=[p("Retrieving The Request Path")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-the-request-url"},{default:t(()=>n[3]||(n[3]=[p("Retrieving The Request URL")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-the-request-host"},{default:t(()=>n[4]||(n[4]=[p("Retrieving The Request HOST")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-the-full-request-url"},{default:t(()=>n[5]||(n[5]=[p("Retrieving The Full Request URL")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-the-request-method"},{default:t(()=>n[6]||(n[6]=[p("Retrieving The Request Method")])),_:1})]),s("li",null,[a(e,{to:"#request-headers"},{default:t(()=>n[7]||(n[7]=[p("Request Headers")])),_:1})]),s("li",null,[a(e,{to:"#request-ip-address"},{default:t(()=>n[8]||(n[8]=[p("Request IP Address")])),_:1})])])]),s("li",null,[a(e,{to:"#input"},{default:t(()=>n[9]||(n[9]=[p("Input")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#retrieving-all-input-data"},{default:t(()=>n[10]||(n[10]=[p("Retrieving All Input Data")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-a-route-value"},{default:t(()=>n[11]||(n[11]=[p("Retrieving a Route Value")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-input-from-the-query-string"},{default:t(()=>n[12]||(n[12]=[p("Retrieving Input From The Query String")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-an-input-value"},{default:t(()=>n[13]||(n[13]=[p("Retrieving An Input Value")])),_:1})]),s("li",null,[a(e,{to:"#bind-json-form"},{default:t(()=>n[14]||(n[14]=[p("Bind Json/Form")])),_:1})]),s("li",null,[a(e,{to:"#bind-query"},{default:t(()=>n[15]||(n[15]=[p("Bind Query")])),_:1})])])]),s("li",null,[a(e,{to:"#cookie"},{default:t(()=>n[16]||(n[16]=[p("Cookie")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#retrieving-a-cookie-value"},{default:t(()=>n[17]||(n[17]=[p("Retrieving a Cookie Value")])),_:1})])])]),s("li",null,[a(e,{to:"#file"},{default:t(()=>n[18]||(n[18]=[p("File")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#retrieving-file"},{default:t(()=>n[19]||(n[19]=[p("Retrieving File")])),_:1})]),s("li",null,[a(e,{to:"#save-file"},{default:t(()=>n[20]||(n[20]=[p("Save File")])),_:1})]),s("li",null,[a(e,{to:"#get-origin-request"},{default:t(()=>n[21]||(n[21]=[p("Get Origin Request")])),_:1})]),s("li",null,[a(e,{to:"#attach-data"},{default:t(()=>n[22]||(n[22]=[p("Attach Data")])),_:1})]),s("li",null,[a(e,{to:"#get-data"},{default:t(()=>n[23]||(n[23]=[p("Get Data")])),_:1})]),s("li",null,[a(e,{to:"#get-context"},{default:t(()=>n[24]||(n[24]=[p("Get Context")])),_:1})])])]),s("li",null,[a(e,{to:"#custom-recovery"},{default:t(()=>n[25]||(n[25]=[p("Custom Recovery")])),_:1})])])]),n[27]||(n[27]=c(`

Introduction

The contracts/http/Request method of Goravel can interact with the current HTTP request processed by the application, and get the input and files submitted together.

Interacting With The Request

The http.Context instance is automatically injected into the controller:

import "github.com/goravel/framework/contracts/http"
+import{_ as l,c as u,b as s,e as a,f as t,a as c,r as i,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(g,n){const e=i("router-link"),o=i("CommentService");return r(),u("div",null,[n[26]||(n[26]=s("h1",{id:"http-requests",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#http-requests"},[s("span",null,"HTTP Requests")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#interacting-with-the-request"},{default:t(()=>n[1]||(n[1]=[p("Interacting With The Request")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#retrieving-the-request-path"},{default:t(()=>n[2]||(n[2]=[p("Retrieving The Request Path")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-the-request-url"},{default:t(()=>n[3]||(n[3]=[p("Retrieving The Request URL")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-the-request-host"},{default:t(()=>n[4]||(n[4]=[p("Retrieving The Request HOST")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-the-full-request-url"},{default:t(()=>n[5]||(n[5]=[p("Retrieving The Full Request URL")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-the-request-method"},{default:t(()=>n[6]||(n[6]=[p("Retrieving The Request Method")])),_:1})]),s("li",null,[a(e,{to:"#request-headers"},{default:t(()=>n[7]||(n[7]=[p("Request Headers")])),_:1})]),s("li",null,[a(e,{to:"#request-ip-address"},{default:t(()=>n[8]||(n[8]=[p("Request IP Address")])),_:1})])])]),s("li",null,[a(e,{to:"#input"},{default:t(()=>n[9]||(n[9]=[p("Input")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#retrieving-all-input-data"},{default:t(()=>n[10]||(n[10]=[p("Retrieving All Input Data")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-a-route-value"},{default:t(()=>n[11]||(n[11]=[p("Retrieving a Route Value")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-input-from-the-query-string"},{default:t(()=>n[12]||(n[12]=[p("Retrieving Input From The Query String")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-an-input-value"},{default:t(()=>n[13]||(n[13]=[p("Retrieving An Input Value")])),_:1})]),s("li",null,[a(e,{to:"#bind-json-form"},{default:t(()=>n[14]||(n[14]=[p("Bind Json/Form")])),_:1})]),s("li",null,[a(e,{to:"#bind-query"},{default:t(()=>n[15]||(n[15]=[p("Bind Query")])),_:1})])])]),s("li",null,[a(e,{to:"#cookie"},{default:t(()=>n[16]||(n[16]=[p("Cookie")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#retrieving-a-cookie-value"},{default:t(()=>n[17]||(n[17]=[p("Retrieving a Cookie Value")])),_:1})])])]),s("li",null,[a(e,{to:"#file"},{default:t(()=>n[18]||(n[18]=[p("File")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#retrieving-file"},{default:t(()=>n[19]||(n[19]=[p("Retrieving File")])),_:1})]),s("li",null,[a(e,{to:"#save-file"},{default:t(()=>n[20]||(n[20]=[p("Save File")])),_:1})]),s("li",null,[a(e,{to:"#get-origin-request"},{default:t(()=>n[21]||(n[21]=[p("Get Origin Request")])),_:1})]),s("li",null,[a(e,{to:"#attach-data"},{default:t(()=>n[22]||(n[22]=[p("Attach Data")])),_:1})]),s("li",null,[a(e,{to:"#get-data"},{default:t(()=>n[23]||(n[23]=[p("Get Data")])),_:1})]),s("li",null,[a(e,{to:"#get-context"},{default:t(()=>n[24]||(n[24]=[p("Get Context")])),_:1})])])]),s("li",null,[a(e,{to:"#custom-recovery"},{default:t(()=>n[25]||(n[25]=[p("Custom Recovery")])),_:1})])])]),n[27]||(n[27]=c(`

Introduction

The contracts/http/Request method of Goravel can interact with the current HTTP request processed by the application, and get the input and files submitted together.

Interacting With The Request

The http.Context instance is automatically injected into the controller:

import "github.com/goravel/framework/contracts/http"
 
 facades.Route().Get("/", func(ctx http.Context) {
 
diff --git a/assets/response.html-8chm0-dC.js b/assets/response.html-B35yVy49.js
similarity index 99%
rename from assets/response.html-8chm0-dC.js
rename to assets/response.html-B35yVy49.js
index 9cfd62b4..6b53341a 100644
--- a/assets/response.html-8chm0-dC.js
+++ b/assets/response.html-B35yVy49.js
@@ -1,4 +1,4 @@
-import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(m,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[16]||(n[16]=s("h1",{id:"响应",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#响应"},[s("span",null,"响应")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#字符串"},{default:e(()=>n[1]||(n[1]=[p("字符串")])),_:1})]),s("li",null,[a(t,{to:"#json"},{default:e(()=>n[2]||(n[2]=[p("JSON")])),_:1})]),s("li",null,[a(t,{to:"#自定义返回"},{default:e(()=>n[3]||(n[3]=[p("自定义返回")])),_:1})]),s("li",null,[a(t,{to:"#文件响应"},{default:e(()=>n[4]||(n[4]=[p("文件响应")])),_:1})]),s("li",null,[a(t,{to:"#下载文件"},{default:e(()=>n[5]||(n[5]=[p("下载文件")])),_:1})]),s("li",null,[a(t,{to:"#附加-header"},{default:e(()=>n[6]||(n[6]=[p("附加 Header")])),_:1})]),s("li",null,[a(t,{to:"#cookie"},{default:e(()=>n[7]||(n[7]=[p("Cookie")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#设置-cookie"},{default:e(()=>n[8]||(n[8]=[p("设置 Cookie")])),_:1})]),s("li",null,[a(t,{to:"#过期-cookie"},{default:e(()=>n[9]||(n[9]=[p("过期 Cookie")])),_:1})])])]),s("li",null,[a(t,{to:"#返回成功"},{default:e(()=>n[10]||(n[10]=[p("返回成功")])),_:1})]),s("li",null,[a(t,{to:"#自定义-code"},{default:e(()=>n[11]||(n[11]=[p("自定义 Code")])),_:1})]),s("li",null,[a(t,{to:"#返回-stream"},{default:e(()=>n[12]||(n[12]=[p("返回 Stream")])),_:1})]),s("li",null,[a(t,{to:"#重定向"},{default:e(()=>n[13]||(n[13]=[p("重定向")])),_:1})]),s("li",null,[a(t,{to:"#空响应"},{default:e(()=>n[14]||(n[14]=[p("空响应")])),_:1})]),s("li",null,[a(t,{to:"#获取响应"},{default:e(()=>n[15]||(n[15]=[p("获取响应")])),_:1})])])]),n[17]||(n[17]=u(`

简介

可以使用 ctx.Response() 在控制其中进行 HTTP 响应。

字符串

import "github.com/goravel/framework/contracts/http"
+import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(m,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[16]||(n[16]=s("h1",{id:"响应",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#响应"},[s("span",null,"响应")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#字符串"},{default:e(()=>n[1]||(n[1]=[p("字符串")])),_:1})]),s("li",null,[a(t,{to:"#json"},{default:e(()=>n[2]||(n[2]=[p("JSON")])),_:1})]),s("li",null,[a(t,{to:"#自定义返回"},{default:e(()=>n[3]||(n[3]=[p("自定义返回")])),_:1})]),s("li",null,[a(t,{to:"#文件响应"},{default:e(()=>n[4]||(n[4]=[p("文件响应")])),_:1})]),s("li",null,[a(t,{to:"#下载文件"},{default:e(()=>n[5]||(n[5]=[p("下载文件")])),_:1})]),s("li",null,[a(t,{to:"#附加-header"},{default:e(()=>n[6]||(n[6]=[p("附加 Header")])),_:1})]),s("li",null,[a(t,{to:"#cookie"},{default:e(()=>n[7]||(n[7]=[p("Cookie")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#设置-cookie"},{default:e(()=>n[8]||(n[8]=[p("设置 Cookie")])),_:1})]),s("li",null,[a(t,{to:"#过期-cookie"},{default:e(()=>n[9]||(n[9]=[p("过期 Cookie")])),_:1})])])]),s("li",null,[a(t,{to:"#返回成功"},{default:e(()=>n[10]||(n[10]=[p("返回成功")])),_:1})]),s("li",null,[a(t,{to:"#自定义-code"},{default:e(()=>n[11]||(n[11]=[p("自定义 Code")])),_:1})]),s("li",null,[a(t,{to:"#返回-stream"},{default:e(()=>n[12]||(n[12]=[p("返回 Stream")])),_:1})]),s("li",null,[a(t,{to:"#重定向"},{default:e(()=>n[13]||(n[13]=[p("重定向")])),_:1})]),s("li",null,[a(t,{to:"#空响应"},{default:e(()=>n[14]||(n[14]=[p("空响应")])),_:1})]),s("li",null,[a(t,{to:"#获取响应"},{default:e(()=>n[15]||(n[15]=[p("获取响应")])),_:1})])])]),n[17]||(n[17]=u(`

简介

可以使用 ctx.Response() 在控制其中进行 HTTP 响应。

字符串

import "github.com/goravel/framework/contracts/http"
 
 ctx.Response().String(http.StatusOK, "Hello Goravel")
 

JSON

import (
diff --git a/assets/response.html-4zROuYC6.js b/assets/response.html-D9zNjqyg.js
similarity index 99%
rename from assets/response.html-4zROuYC6.js
rename to assets/response.html-D9zNjqyg.js
index fca1f00c..394eea3d 100644
--- a/assets/response.html-4zROuYC6.js
+++ b/assets/response.html-D9zNjqyg.js
@@ -1,4 +1,4 @@
-import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(m,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[16]||(n[16]=s("h1",{id:"http-response",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#http-response"},[s("span",null,"HTTP Response")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(t,{to:"#string"},{default:e(()=>n[1]||(n[1]=[p("String")])),_:1})]),s("li",null,[a(t,{to:"#json"},{default:e(()=>n[2]||(n[2]=[p("JSON")])),_:1})]),s("li",null,[a(t,{to:"#custom-return"},{default:e(()=>n[3]||(n[3]=[p("Custom Return")])),_:1})]),s("li",null,[a(t,{to:"#response-file"},{default:e(()=>n[4]||(n[4]=[p("Response File")])),_:1})]),s("li",null,[a(t,{to:"#download-file"},{default:e(()=>n[5]||(n[5]=[p("Download File")])),_:1})]),s("li",null,[a(t,{to:"#attach-header"},{default:e(()=>n[6]||(n[6]=[p("Attach Header")])),_:1})]),s("li",null,[a(t,{to:"#cookie"},{default:e(()=>n[7]||(n[7]=[p("Cookie")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#set-cookie"},{default:e(()=>n[8]||(n[8]=[p("Set Cookie")])),_:1})]),s("li",null,[a(t,{to:"#expire-cookie"},{default:e(()=>n[9]||(n[9]=[p("Expire Cookie")])),_:1})])])]),s("li",null,[a(t,{to:"#return-success"},{default:e(()=>n[10]||(n[10]=[p("Return Success")])),_:1})]),s("li",null,[a(t,{to:"#custom-code"},{default:e(()=>n[11]||(n[11]=[p("Custom Code")])),_:1})]),s("li",null,[a(t,{to:"#return-stream"},{default:e(()=>n[12]||(n[12]=[p("Return Stream")])),_:1})]),s("li",null,[a(t,{to:"#redirect"},{default:e(()=>n[13]||(n[13]=[p("Redirect")])),_:1})]),s("li",null,[a(t,{to:"#no-content"},{default:e(()=>n[14]||(n[14]=[p("No Content")])),_:1})]),s("li",null,[a(t,{to:"#get-response"},{default:e(()=>n[15]||(n[15]=[p("Get Response")])),_:1})])])]),n[17]||(n[17]=u(`

Introduction

You can use ctx.Response() for HTTP response in the Controller.

String

import "github.com/goravel/framework/contracts/http"
+import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(m,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[16]||(n[16]=s("h1",{id:"http-response",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#http-response"},[s("span",null,"HTTP Response")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(t,{to:"#string"},{default:e(()=>n[1]||(n[1]=[p("String")])),_:1})]),s("li",null,[a(t,{to:"#json"},{default:e(()=>n[2]||(n[2]=[p("JSON")])),_:1})]),s("li",null,[a(t,{to:"#custom-return"},{default:e(()=>n[3]||(n[3]=[p("Custom Return")])),_:1})]),s("li",null,[a(t,{to:"#response-file"},{default:e(()=>n[4]||(n[4]=[p("Response File")])),_:1})]),s("li",null,[a(t,{to:"#download-file"},{default:e(()=>n[5]||(n[5]=[p("Download File")])),_:1})]),s("li",null,[a(t,{to:"#attach-header"},{default:e(()=>n[6]||(n[6]=[p("Attach Header")])),_:1})]),s("li",null,[a(t,{to:"#cookie"},{default:e(()=>n[7]||(n[7]=[p("Cookie")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#set-cookie"},{default:e(()=>n[8]||(n[8]=[p("Set Cookie")])),_:1})]),s("li",null,[a(t,{to:"#expire-cookie"},{default:e(()=>n[9]||(n[9]=[p("Expire Cookie")])),_:1})])])]),s("li",null,[a(t,{to:"#return-success"},{default:e(()=>n[10]||(n[10]=[p("Return Success")])),_:1})]),s("li",null,[a(t,{to:"#custom-code"},{default:e(()=>n[11]||(n[11]=[p("Custom Code")])),_:1})]),s("li",null,[a(t,{to:"#return-stream"},{default:e(()=>n[12]||(n[12]=[p("Return Stream")])),_:1})]),s("li",null,[a(t,{to:"#redirect"},{default:e(()=>n[13]||(n[13]=[p("Redirect")])),_:1})]),s("li",null,[a(t,{to:"#no-content"},{default:e(()=>n[14]||(n[14]=[p("No Content")])),_:1})]),s("li",null,[a(t,{to:"#get-response"},{default:e(()=>n[15]||(n[15]=[p("Get Response")])),_:1})])])]),n[17]||(n[17]=u(`

Introduction

You can use ctx.Response() for HTTP response in the Controller.

String

import "github.com/goravel/framework/contracts/http"
 
 ctx.Response().String(http.StatusOK, "Hello Goravel")
 

JSON

import (
diff --git a/assets/routing.html-BLEaQZzR.js b/assets/routing.html-CAhxGT-v.js
similarity index 99%
rename from assets/routing.html-BLEaQZzR.js
rename to assets/routing.html-CAhxGT-v.js
index 93ed284a..e6dddb06 100644
--- a/assets/routing.html-BLEaQZzR.js
+++ b/assets/routing.html-CAhxGT-v.js
@@ -1,4 +1,4 @@
-import{_ as u,c as r,b as s,e as t,f as e,a as o,d as a,r as i,o as d}from"./app-ELDWQP0J.js";const k={},m={class:"table-of-contents"};function v(g,n){const p=i("router-link"),c=i("RouteLink"),l=i("CommentService");return d(),r("div",null,[n[23]||(n[23]=s("h1",{id:"routing",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#routing"},[s("span",null,"Routing")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[t(p,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[t(p,{to:"#http-driver"},{default:e(()=>n[1]||(n[1]=[a("HTTP Driver")])),_:1})]),s("li",null,[t(p,{to:"#default-routing-file"},{default:e(()=>n[2]||(n[2]=[a("Default Routing File")])),_:1})]),s("li",null,[t(p,{to:"#start-http-server"},{default:e(()=>n[3]||(n[3]=[a("Start HTTP Server")])),_:1})]),s("li",null,[t(p,{to:"#start-https-server"},{default:e(()=>n[4]||(n[4]=[a("Start HTTPS Server")])),_:1})]),s("li",null,[t(p,{to:"#close-http-https-server"},{default:e(()=>n[5]||(n[5]=[a("Close HTTP/HTTPS Server")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#routing-methods"},{default:e(()=>n[6]||(n[6]=[a("Routing Methods")])),_:1})])])]),s("li",null,[t(p,{to:"#basic-routing"},{default:e(()=>n[7]||(n[7]=[a("Basic Routing")])),_:1})]),s("li",null,[t(p,{to:"#resource-routing"},{default:e(()=>n[8]||(n[8]=[a("Resource Routing")])),_:1})]),s("li",null,[t(p,{to:"#group-routing"},{default:e(()=>n[9]||(n[9]=[a("Group Routing")])),_:1})]),s("li",null,[t(p,{to:"#routing-prefix"},{default:e(()=>n[10]||(n[10]=[a("Routing Prefix")])),_:1})]),s("li",null,[t(p,{to:"#file-routing"},{default:e(()=>n[11]||(n[11]=[a("File Routing")])),_:1})]),s("li",null,[t(p,{to:"#routing-parameters"},{default:e(()=>n[12]||(n[12]=[a("Routing Parameters")])),_:1})]),s("li",null,[t(p,{to:"#middleware"},{default:e(()=>n[13]||(n[13]=[a("Middleware")])),_:1})]),s("li",null,[t(p,{to:"#fallback-routes"},{default:e(()=>n[14]||(n[14]=[a("Fallback Routes")])),_:1})]),s("li",null,[t(p,{to:"#rate-limiting"},{default:e(()=>n[15]||(n[15]=[a("Rate Limiting")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#defining-rate-limiters"},{default:e(()=>n[16]||(n[16]=[a("Defining Rate Limiters")])),_:1})]),s("li",null,[t(p,{to:"#attaching-rate-limiters-to-routes"},{default:e(()=>n[17]||(n[17]=[a("Attaching Rate Limiters To Routes")])),_:1})])])]),s("li",null,[t(p,{to:"#cross-origin-resource-sharing-cors"},{default:e(()=>n[18]||(n[18]=[a("Cross-Origin Resource Sharing (CORS)")])),_:1})])])]),n[24]||(n[24]=o(`

Introduction

The Goravel routing module can be operated by facades.Route().

HTTP Driver

Goravel uses gin as its default HTTP driver. To use other drivers, configure them in the config/http.go file. The official default supports gin and fiber.

DriverLink
Ginhttps://github.com/goravel/gin
Fiberhttps://github.com/goravel/fiber

Default Routing File

To define routing files, simply navigate to the /routes directory. By default, the framework utilizes a sample route located in /routes/web.go. To establish routing binding, the func Web() method is registered in the app/providers/route_service_provider.go file.

If you require more precise management, you can add routing files to the /routes directory and register them in the app/providers/route_service_provider.go file.

Start HTTP Server

Start the HTTP server in main.go in the root directory by calling facades.Route().Run(). This will automatically fetch the route.host configuration.

package main
+import{_ as u,c as r,b as s,e as t,f as e,a as o,d as a,r as i,o as d}from"./app-Ewo6p9aM.js";const k={},m={class:"table-of-contents"};function v(g,n){const p=i("router-link"),c=i("RouteLink"),l=i("CommentService");return d(),r("div",null,[n[23]||(n[23]=s("h1",{id:"routing",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#routing"},[s("span",null,"Routing")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[t(p,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[t(p,{to:"#http-driver"},{default:e(()=>n[1]||(n[1]=[a("HTTP Driver")])),_:1})]),s("li",null,[t(p,{to:"#default-routing-file"},{default:e(()=>n[2]||(n[2]=[a("Default Routing File")])),_:1})]),s("li",null,[t(p,{to:"#start-http-server"},{default:e(()=>n[3]||(n[3]=[a("Start HTTP Server")])),_:1})]),s("li",null,[t(p,{to:"#start-https-server"},{default:e(()=>n[4]||(n[4]=[a("Start HTTPS Server")])),_:1})]),s("li",null,[t(p,{to:"#close-http-https-server"},{default:e(()=>n[5]||(n[5]=[a("Close HTTP/HTTPS Server")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#routing-methods"},{default:e(()=>n[6]||(n[6]=[a("Routing Methods")])),_:1})])])]),s("li",null,[t(p,{to:"#basic-routing"},{default:e(()=>n[7]||(n[7]=[a("Basic Routing")])),_:1})]),s("li",null,[t(p,{to:"#resource-routing"},{default:e(()=>n[8]||(n[8]=[a("Resource Routing")])),_:1})]),s("li",null,[t(p,{to:"#group-routing"},{default:e(()=>n[9]||(n[9]=[a("Group Routing")])),_:1})]),s("li",null,[t(p,{to:"#routing-prefix"},{default:e(()=>n[10]||(n[10]=[a("Routing Prefix")])),_:1})]),s("li",null,[t(p,{to:"#file-routing"},{default:e(()=>n[11]||(n[11]=[a("File Routing")])),_:1})]),s("li",null,[t(p,{to:"#routing-parameters"},{default:e(()=>n[12]||(n[12]=[a("Routing Parameters")])),_:1})]),s("li",null,[t(p,{to:"#middleware"},{default:e(()=>n[13]||(n[13]=[a("Middleware")])),_:1})]),s("li",null,[t(p,{to:"#fallback-routes"},{default:e(()=>n[14]||(n[14]=[a("Fallback Routes")])),_:1})]),s("li",null,[t(p,{to:"#rate-limiting"},{default:e(()=>n[15]||(n[15]=[a("Rate Limiting")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#defining-rate-limiters"},{default:e(()=>n[16]||(n[16]=[a("Defining Rate Limiters")])),_:1})]),s("li",null,[t(p,{to:"#attaching-rate-limiters-to-routes"},{default:e(()=>n[17]||(n[17]=[a("Attaching Rate Limiters To Routes")])),_:1})])])]),s("li",null,[t(p,{to:"#cross-origin-resource-sharing-cors"},{default:e(()=>n[18]||(n[18]=[a("Cross-Origin Resource Sharing (CORS)")])),_:1})])])]),n[24]||(n[24]=o(`

Introduction

The Goravel routing module can be operated by facades.Route().

HTTP Driver

Goravel uses gin as its default HTTP driver. To use other drivers, configure them in the config/http.go file. The official default supports gin and fiber.

DriverLink
Ginhttps://github.com/goravel/gin
Fiberhttps://github.com/goravel/fiber

Default Routing File

To define routing files, simply navigate to the /routes directory. By default, the framework utilizes a sample route located in /routes/web.go. To establish routing binding, the func Web() method is registered in the app/providers/route_service_provider.go file.

If you require more precise management, you can add routing files to the /routes directory and register them in the app/providers/route_service_provider.go file.

Start HTTP Server

Start the HTTP server in main.go in the root directory by calling facades.Route().Run(). This will automatically fetch the route.host configuration.

package main
 
 import (
   "github.com/goravel/framework/facades"
diff --git a/assets/routing.html-Df_eKiQu.js b/assets/routing.html-mXSyj-Cl.js
similarity index 99%
rename from assets/routing.html-Df_eKiQu.js
rename to assets/routing.html-mXSyj-Cl.js
index 9e833495..cd6b9571 100644
--- a/assets/routing.html-Df_eKiQu.js
+++ b/assets/routing.html-mXSyj-Cl.js
@@ -1,4 +1,4 @@
-import{_ as u,c as r,b as s,e as t,f as p,a as o,d as a,r as c,o as k}from"./app-ELDWQP0J.js";const d={},v={class:"table-of-contents"};function m(h,n){const e=c("router-link"),l=c("RouteLink"),i=c("CommentService");return k(),r("div",null,[n[23]||(n[23]=s("h1",{id:"路由",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#路由"},[s("span",null,"路由")])],-1)),s("nav",v,[s("ul",null,[s("li",null,[t(e,{to:"#简介"},{default:p(()=>n[0]||(n[0]=[a("简介")])),_:1})]),s("li",null,[t(e,{to:"#http-驱动"},{default:p(()=>n[1]||(n[1]=[a("HTTP 驱动")])),_:1})]),s("li",null,[t(e,{to:"#默认路由文件"},{default:p(()=>n[2]||(n[2]=[a("默认路由文件")])),_:1})]),s("li",null,[t(e,{to:"#启动-http-服务器"},{default:p(()=>n[3]||(n[3]=[a("启动 HTTP 服务器")])),_:1})]),s("li",null,[t(e,{to:"#启动-https-服务器"},{default:p(()=>n[4]||(n[4]=[a("启动 HTTPS 服务器")])),_:1})]),s("li",null,[t(e,{to:"#关闭-http-https-服务器"},{default:p(()=>n[5]||(n[5]=[a("关闭 HTTP/HTTPS 服务器")])),_:1}),s("ul",null,[s("li",null,[t(e,{to:"#路由方法"},{default:p(()=>n[6]||(n[6]=[a("路由方法")])),_:1})])])]),s("li",null,[t(e,{to:"#基本路由"},{default:p(()=>n[7]||(n[7]=[a("基本路由")])),_:1})]),s("li",null,[t(e,{to:"#资源路由"},{default:p(()=>n[8]||(n[8]=[a("资源路由")])),_:1})]),s("li",null,[t(e,{to:"#路由分组"},{default:p(()=>n[9]||(n[9]=[a("路由分组")])),_:1})]),s("li",null,[t(e,{to:"#路由前缀"},{default:p(()=>n[10]||(n[10]=[a("路由前缀")])),_:1})]),s("li",null,[t(e,{to:"#文件路由"},{default:p(()=>n[11]||(n[11]=[a("文件路由")])),_:1})]),s("li",null,[t(e,{to:"#路由传参"},{default:p(()=>n[12]||(n[12]=[a("路由传参")])),_:1})]),s("li",null,[t(e,{to:"#中间件"},{default:p(()=>n[13]||(n[13]=[a("中间件")])),_:1})]),s("li",null,[t(e,{to:"#fallback-路由"},{default:p(()=>n[14]||(n[14]=[a("Fallback 路由")])),_:1})]),s("li",null,[t(e,{to:"#速率限制"},{default:p(()=>n[15]||(n[15]=[a("速率限制")])),_:1}),s("ul",null,[s("li",null,[t(e,{to:"#定义速率限制器"},{default:p(()=>n[16]||(n[16]=[a("定义速率限制器")])),_:1})]),s("li",null,[t(e,{to:"#将速率限制器附加到路由"},{default:p(()=>n[17]||(n[17]=[a("将速率限制器附加到路由")])),_:1})])])]),s("li",null,[t(e,{to:"#跨域资源共享-cors"},{default:p(()=>n[18]||(n[18]=[a("跨域资源共享 (CORS)")])),_:1})])])]),n[24]||(n[24]=o(`

简介

Goravel 路由模块可以使用 facades.Route() 进行操作。

HTTP 驱动

Goravel 默认使用 gin 作为 HTTP 驱动,如果想使用其他驱动,可以到 config/http.go 中进行配置,目前官方默认支持 ginfiber 两种驱动:

驱动地址
Ginhttps://github.com/goravel/gin
Fiberhttps://github.com/goravel/fiber

默认路由文件

所有路由文件都在 /routes 目录中进行定义。框架默认有一个示例路由 /routes/web.go,其中 func Web() 方法被注册到 app/providers/route_service_provider.go 文件中,以实现路由的绑定。

你可以在 routes 目录下新增路由文件,以进行更细颗粒的管理,然后在 app/providers/route_service_provider.go 文件中进行注册。

启动 HTTP 服务器

在根目录下 main.go 中启动 HTTP 服务器,facades.Route().Run() 将会自动获取 route.host 的配置。

package main
+import{_ as u,c as r,b as s,e as t,f as p,a as o,d as a,r as c,o as k}from"./app-Ewo6p9aM.js";const d={},v={class:"table-of-contents"};function m(h,n){const e=c("router-link"),l=c("RouteLink"),i=c("CommentService");return k(),r("div",null,[n[23]||(n[23]=s("h1",{id:"路由",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#路由"},[s("span",null,"路由")])],-1)),s("nav",v,[s("ul",null,[s("li",null,[t(e,{to:"#简介"},{default:p(()=>n[0]||(n[0]=[a("简介")])),_:1})]),s("li",null,[t(e,{to:"#http-驱动"},{default:p(()=>n[1]||(n[1]=[a("HTTP 驱动")])),_:1})]),s("li",null,[t(e,{to:"#默认路由文件"},{default:p(()=>n[2]||(n[2]=[a("默认路由文件")])),_:1})]),s("li",null,[t(e,{to:"#启动-http-服务器"},{default:p(()=>n[3]||(n[3]=[a("启动 HTTP 服务器")])),_:1})]),s("li",null,[t(e,{to:"#启动-https-服务器"},{default:p(()=>n[4]||(n[4]=[a("启动 HTTPS 服务器")])),_:1})]),s("li",null,[t(e,{to:"#关闭-http-https-服务器"},{default:p(()=>n[5]||(n[5]=[a("关闭 HTTP/HTTPS 服务器")])),_:1}),s("ul",null,[s("li",null,[t(e,{to:"#路由方法"},{default:p(()=>n[6]||(n[6]=[a("路由方法")])),_:1})])])]),s("li",null,[t(e,{to:"#基本路由"},{default:p(()=>n[7]||(n[7]=[a("基本路由")])),_:1})]),s("li",null,[t(e,{to:"#资源路由"},{default:p(()=>n[8]||(n[8]=[a("资源路由")])),_:1})]),s("li",null,[t(e,{to:"#路由分组"},{default:p(()=>n[9]||(n[9]=[a("路由分组")])),_:1})]),s("li",null,[t(e,{to:"#路由前缀"},{default:p(()=>n[10]||(n[10]=[a("路由前缀")])),_:1})]),s("li",null,[t(e,{to:"#文件路由"},{default:p(()=>n[11]||(n[11]=[a("文件路由")])),_:1})]),s("li",null,[t(e,{to:"#路由传参"},{default:p(()=>n[12]||(n[12]=[a("路由传参")])),_:1})]),s("li",null,[t(e,{to:"#中间件"},{default:p(()=>n[13]||(n[13]=[a("中间件")])),_:1})]),s("li",null,[t(e,{to:"#fallback-路由"},{default:p(()=>n[14]||(n[14]=[a("Fallback 路由")])),_:1})]),s("li",null,[t(e,{to:"#速率限制"},{default:p(()=>n[15]||(n[15]=[a("速率限制")])),_:1}),s("ul",null,[s("li",null,[t(e,{to:"#定义速率限制器"},{default:p(()=>n[16]||(n[16]=[a("定义速率限制器")])),_:1})]),s("li",null,[t(e,{to:"#将速率限制器附加到路由"},{default:p(()=>n[17]||(n[17]=[a("将速率限制器附加到路由")])),_:1})])])]),s("li",null,[t(e,{to:"#跨域资源共享-cors"},{default:p(()=>n[18]||(n[18]=[a("跨域资源共享 (CORS)")])),_:1})])])]),n[24]||(n[24]=o(`

简介

Goravel 路由模块可以使用 facades.Route() 进行操作。

HTTP 驱动

Goravel 默认使用 gin 作为 HTTP 驱动,如果想使用其他驱动,可以到 config/http.go 中进行配置,目前官方默认支持 ginfiber 两种驱动:

驱动地址
Ginhttps://github.com/goravel/gin
Fiberhttps://github.com/goravel/fiber

默认路由文件

所有路由文件都在 /routes 目录中进行定义。框架默认有一个示例路由 /routes/web.go,其中 func Web() 方法被注册到 app/providers/route_service_provider.go 文件中,以实现路由的绑定。

你可以在 routes 目录下新增路由文件,以进行更细颗粒的管理,然后在 app/providers/route_service_provider.go 文件中进行注册。

启动 HTTP 服务器

在根目录下 main.go 中启动 HTTP 服务器,facades.Route().Run() 将会自动获取 route.host 的配置。

package main
 
 import (
   "github.com/goravel/framework/facades"
diff --git a/assets/seeding.html-DlQZgxSO.js b/assets/seeding.html-DJGTroRp.js
similarity index 99%
rename from assets/seeding.html-DlQZgxSO.js
rename to assets/seeding.html-DJGTroRp.js
index b5014417..85b084ff 100644
--- a/assets/seeding.html-DlQZgxSO.js
+++ b/assets/seeding.html-DJGTroRp.js
@@ -1,4 +1,4 @@
-import{_ as p,c,b as s,e as a,f as t,d as e,a as r,r as o,o as d}from"./app-ELDWQP0J.js";const u={},m={class:"table-of-contents"};function k(v,n){const i=o("router-link"),l=o("RouteLink");return d(),c("div",null,[n[12]||(n[12]=s("h1",{id:"database-seeding",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#database-seeding"},[s("span",null,"Database: Seeding")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[a(i,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[e("Introduction")])),_:1})]),s("li",null,[a(i,{to:"#writing-seeders"},{default:t(()=>n[1]||(n[1]=[e("Writing Seeders")])),_:1})]),s("li",null,[a(i,{to:"#calling-additional-seeders"},{default:t(()=>n[2]||(n[2]=[e("Calling Additional Seeders")])),_:1})]),s("li",null,[a(i,{to:"#running-seeders"},{default:t(()=>n[3]||(n[3]=[e("Running Seeders")])),_:1}),s("ul",null,[s("li",null,[a(i,{to:"#forcing-seeders-to-run-in-production"},{default:t(()=>n[4]||(n[4]=[e("Forcing Seeders To Run In Production")])),_:1})])])])])]),n[13]||(n[13]=s("h2",{id:"introduction",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#introduction"},[s("span",null,"Introduction")])],-1)),n[14]||(n[14]=s("p",null,[e("Goravel includes the ability to seed your database with data using seed struct. All seed structs are stored in the "),s("code",null,"database/seeders"),e(" directory. By default, a "),s("code",null,"DatabaseSeeder"),e(" struct is defined for you.")],-1)),n[15]||(n[15]=s("h2",{id:"writing-seeders",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#writing-seeders"},[s("span",null,"Writing Seeders")])],-1)),s("p",null,[n[6]||(n[6]=e("To generate a seeder, run the ")),n[7]||(n[7]=s("code",null,"make:seeder",-1)),n[8]||(n[8]=e()),a(l,{to:"/digging-deeper/artisan-console.html"},{default:t(()=>n[5]||(n[5]=[e("Artisan command")])),_:1}),n[9]||(n[9]=e(". All seeders generated by the framework will be stored in the ")),n[10]||(n[10]=s("code",null,"database/seeders",-1)),n[11]||(n[11]=e(" directory:"))]),n[16]||(n[16]=r(`
go run . artisan make:seeder UserSeeder
+import{_ as p,c,b as s,e as a,f as t,d as e,a as r,r as o,o as d}from"./app-Ewo6p9aM.js";const u={},m={class:"table-of-contents"};function k(v,n){const i=o("router-link"),l=o("RouteLink");return d(),c("div",null,[n[12]||(n[12]=s("h1",{id:"database-seeding",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#database-seeding"},[s("span",null,"Database: Seeding")])],-1)),s("nav",m,[s("ul",null,[s("li",null,[a(i,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[e("Introduction")])),_:1})]),s("li",null,[a(i,{to:"#writing-seeders"},{default:t(()=>n[1]||(n[1]=[e("Writing Seeders")])),_:1})]),s("li",null,[a(i,{to:"#calling-additional-seeders"},{default:t(()=>n[2]||(n[2]=[e("Calling Additional Seeders")])),_:1})]),s("li",null,[a(i,{to:"#running-seeders"},{default:t(()=>n[3]||(n[3]=[e("Running Seeders")])),_:1}),s("ul",null,[s("li",null,[a(i,{to:"#forcing-seeders-to-run-in-production"},{default:t(()=>n[4]||(n[4]=[e("Forcing Seeders To Run In Production")])),_:1})])])])])]),n[13]||(n[13]=s("h2",{id:"introduction",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#introduction"},[s("span",null,"Introduction")])],-1)),n[14]||(n[14]=s("p",null,[e("Goravel includes the ability to seed your database with data using seed struct. All seed structs are stored in the "),s("code",null,"database/seeders"),e(" directory. By default, a "),s("code",null,"DatabaseSeeder"),e(" struct is defined for you.")],-1)),n[15]||(n[15]=s("h2",{id:"writing-seeders",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#writing-seeders"},[s("span",null,"Writing Seeders")])],-1)),s("p",null,[n[6]||(n[6]=e("To generate a seeder, run the ")),n[7]||(n[7]=s("code",null,"make:seeder",-1)),n[8]||(n[8]=e()),a(l,{to:"/digging-deeper/artisan-console.html"},{default:t(()=>n[5]||(n[5]=[e("Artisan command")])),_:1}),n[9]||(n[9]=e(". All seeders generated by the framework will be stored in the ")),n[10]||(n[10]=s("code",null,"database/seeders",-1)),n[11]||(n[11]=e(" directory:"))]),n[16]||(n[16]=r(`
go run . artisan make:seeder UserSeeder
 

By default, a seeder struct has two methods: Signature and Run. The Signature method sets the name of the seeder, while the Run method is triggered when the db:seed Artisan command is executed. You can use the Run method to insert data into your database in any way you prefer.

To illustrate, we can customize the DatabaseSeeder struct by adding a database insert statement to the Run method.

package seeders
 
 import (
diff --git a/assets/seeding.html-UfI7Zcx5.js b/assets/seeding.html-DXYzvnxo.js
similarity index 99%
rename from assets/seeding.html-UfI7Zcx5.js
rename to assets/seeding.html-DXYzvnxo.js
index 586be225..6957df0f 100644
--- a/assets/seeding.html-UfI7Zcx5.js
+++ b/assets/seeding.html-DXYzvnxo.js
@@ -1,4 +1,4 @@
-import{_ as c,c as r,b as n,e,f as t,a as l,d as a,r as i,o as d}from"./app-ELDWQP0J.js";const u={},k={class:"table-of-contents"};function v(m,s){const p=i("router-link"),o=i("RouteLink");return d(),r("div",null,[s[12]||(s[12]=n("h1",{id:"数据填充",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#数据填充"},[n("span",null,"数据填充")])],-1)),n("nav",k,[n("ul",null,[n("li",null,[e(p,{to:"#简介"},{default:t(()=>s[0]||(s[0]=[a("简介")])),_:1})]),n("li",null,[e(p,{to:"#编写-seeders"},{default:t(()=>s[1]||(s[1]=[a("编写 Seeders")])),_:1})]),n("li",null,[e(p,{to:"#调用其他-seeders"},{default:t(()=>s[2]||(s[2]=[a("调用其他 Seeders")])),_:1})]),n("li",null,[e(p,{to:"#运行-seeders"},{default:t(()=>s[3]||(s[3]=[a("运行 Seeders")])),_:1}),n("ul",null,[n("li",null,[e(p,{to:"#在生产环境中强制运行填充"},{default:t(()=>s[4]||(s[4]=[a("在生产环境中强制运行填充")])),_:1})])])])])]),s[13]||(s[13]=l('

简介

Goravel 内置了一个可为您的数据库填充测试数据的 struct。所有的填充 struct 都放在 database/seeds 目录下。Goravel 默认定义了一个 DatabaseSeeder struct。通过这个 struct,你可以用 facades.Seeder.Call() 方法来运行其他的 seed 类,从而控制数据填充的顺序。

编写 Seeders

',3)),n("p",null,[s[6]||(s[6]=a("运行 ")),e(o,{to:"/zh/digging-deeper/artisan-console.html"},{default:t(()=>s[5]||(s[5]=[a("Artisan 命令")])),_:1}),s[7]||(s[7]=a()),s[8]||(s[8]=n("code",null,"make:seeder",-1)),s[9]||(s[9]=a(" 可以生成 Seeder,框架生成的 seeders 都放在 ")),s[10]||(s[10]=n("code",null,"database/seeders",-1)),s[11]||(s[11]=a(" 目录下:"))]),s[14]||(s[14]=l(`
go run . artisan make:seeder UserSeeder
+import{_ as c,c as r,b as n,e,f as t,a as l,d as a,r as i,o as d}from"./app-Ewo6p9aM.js";const u={},k={class:"table-of-contents"};function v(m,s){const p=i("router-link"),o=i("RouteLink");return d(),r("div",null,[s[12]||(s[12]=n("h1",{id:"数据填充",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#数据填充"},[n("span",null,"数据填充")])],-1)),n("nav",k,[n("ul",null,[n("li",null,[e(p,{to:"#简介"},{default:t(()=>s[0]||(s[0]=[a("简介")])),_:1})]),n("li",null,[e(p,{to:"#编写-seeders"},{default:t(()=>s[1]||(s[1]=[a("编写 Seeders")])),_:1})]),n("li",null,[e(p,{to:"#调用其他-seeders"},{default:t(()=>s[2]||(s[2]=[a("调用其他 Seeders")])),_:1})]),n("li",null,[e(p,{to:"#运行-seeders"},{default:t(()=>s[3]||(s[3]=[a("运行 Seeders")])),_:1}),n("ul",null,[n("li",null,[e(p,{to:"#在生产环境中强制运行填充"},{default:t(()=>s[4]||(s[4]=[a("在生产环境中强制运行填充")])),_:1})])])])])]),s[13]||(s[13]=l('

简介

Goravel 内置了一个可为您的数据库填充测试数据的 struct。所有的填充 struct 都放在 database/seeds 目录下。Goravel 默认定义了一个 DatabaseSeeder struct。通过这个 struct,你可以用 facades.Seeder.Call() 方法来运行其他的 seed 类,从而控制数据填充的顺序。

编写 Seeders

',3)),n("p",null,[s[6]||(s[6]=a("运行 ")),e(o,{to:"/zh/digging-deeper/artisan-console.html"},{default:t(()=>s[5]||(s[5]=[a("Artisan 命令")])),_:1}),s[7]||(s[7]=a()),s[8]||(s[8]=n("code",null,"make:seeder",-1)),s[9]||(s[9]=a(" 可以生成 Seeder,框架生成的 seeders 都放在 ")),s[10]||(s[10]=n("code",null,"database/seeders",-1)),s[11]||(s[11]=a(" 目录下:"))]),s[14]||(s[14]=l(`
go run . artisan make:seeder UserSeeder
 

Seeder struct 只包含两个方法:Signature, RunSignature 方法定义 Seeder 的名称,Run 方法会在执行 db:seed 这个 Artisan command 时被调用。在 Run 方法里,您可以按需在数据库中插入数据。

如下所示,在默认的 DatabaseSeeder struct 中的 Run 方法中添加一条数据插入语句:

package seeders
 
 import (
diff --git a/assets/service-container.html-CpNN7JuX.js b/assets/service-container.html-BhMudo_s.js
similarity index 99%
rename from assets/service-container.html-CpNN7JuX.js
rename to assets/service-container.html-BhMudo_s.js
index 76b6baae..3a05d56a 100644
--- a/assets/service-container.html-CpNN7JuX.js
+++ b/assets/service-container.html-BhMudo_s.js
@@ -1,4 +1,4 @@
-import{_ as c,c as r,b as a,e,f as t,a as o,d as s,r as p,o as u}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function h(v,n){const i=p("router-link"),l=p("RouteLink");return u(),r("div",null,[n[19]||(n[19]=a("h1",{id:"service-container",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#service-container"},[a("span",null,"Service Container")])],-1)),a("nav",k,[a("ul",null,[a("li",null,[e(i,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[s("Introduction")])),_:1})]),a("li",null,[e(i,{to:"#binding"},{default:t(()=>n[1]||(n[1]=[s("Binding")])),_:1}),a("ul",null,[a("li",null,[e(i,{to:"#simple-bindings"},{default:t(()=>n[2]||(n[2]=[s("Simple Bindings")])),_:1})]),a("li",null,[e(i,{to:"#binding-a-singleton"},{default:t(()=>n[3]||(n[3]=[s("Binding A Singleton")])),_:1})]),a("li",null,[e(i,{to:"#binding-instances"},{default:t(()=>n[4]||(n[4]=[s("Binding Instances")])),_:1})]),a("li",null,[e(i,{to:"#binding-with-parameter"},{default:t(()=>n[5]||(n[5]=[s("Binding With Parameter")])),_:1})])])]),a("li",null,[e(i,{to:"#resolving"},{default:t(()=>n[6]||(n[6]=[s("Resolving")])),_:1}),a("ul",null,[a("li",null,[e(i,{to:"#the-make-method"},{default:t(()=>n[7]||(n[7]=[s("The Make Method")])),_:1})]),a("li",null,[e(i,{to:"#the-makewith-method"},{default:t(()=>n[8]||(n[8]=[s("The MakeWith Method")])),_:1})]),a("li",null,[e(i,{to:"#other-methods"},{default:t(()=>n[9]||(n[9]=[s("Other Methods")])),_:1})])])])])]),n[20]||(n[20]=o('

Introduction

The Goravel service container is a powerful tool for managing class dependencies and performing dependency injection. It contains all the modules of Goravel, and allows you to bind your own services to container and resolve them when needed. The service container provides powerful support for third-party packages around Goravel.

Binding

Simple Bindings

',4)),a("p",null,[n[11]||(n[11]=s("Almost all of your service container bindings will be registered within ")),e(l,{to:"/architecutre-concepts/service-providers.html"},{default:t(()=>n[10]||(n[10]=[s("service providers")])),_:1}),n[12]||(n[12]=s(". Within a service provider, you always have access to the container via the ")),n[13]||(n[13]=a("code",null,"app",-1)),n[14]||(n[14]=s(" parameter, then register a binding using the ")),n[15]||(n[15]=a("code",null,"Bind",-1)),n[16]||(n[16]=s(" method, passing the ")),n[17]||(n[17]=a("code",null,"key",-1)),n[18]||(n[18]=s(" that we wish to register along with a closure that returns an instance of the class:"))]),n[21]||(n[21]=o(`
package route
+import{_ as c,c as r,b as a,e,f as t,a as o,d as s,r as p,o as u}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function h(v,n){const i=p("router-link"),l=p("RouteLink");return u(),r("div",null,[n[19]||(n[19]=a("h1",{id:"service-container",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#service-container"},[a("span",null,"Service Container")])],-1)),a("nav",k,[a("ul",null,[a("li",null,[e(i,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[s("Introduction")])),_:1})]),a("li",null,[e(i,{to:"#binding"},{default:t(()=>n[1]||(n[1]=[s("Binding")])),_:1}),a("ul",null,[a("li",null,[e(i,{to:"#simple-bindings"},{default:t(()=>n[2]||(n[2]=[s("Simple Bindings")])),_:1})]),a("li",null,[e(i,{to:"#binding-a-singleton"},{default:t(()=>n[3]||(n[3]=[s("Binding A Singleton")])),_:1})]),a("li",null,[e(i,{to:"#binding-instances"},{default:t(()=>n[4]||(n[4]=[s("Binding Instances")])),_:1})]),a("li",null,[e(i,{to:"#binding-with-parameter"},{default:t(()=>n[5]||(n[5]=[s("Binding With Parameter")])),_:1})])])]),a("li",null,[e(i,{to:"#resolving"},{default:t(()=>n[6]||(n[6]=[s("Resolving")])),_:1}),a("ul",null,[a("li",null,[e(i,{to:"#the-make-method"},{default:t(()=>n[7]||(n[7]=[s("The Make Method")])),_:1})]),a("li",null,[e(i,{to:"#the-makewith-method"},{default:t(()=>n[8]||(n[8]=[s("The MakeWith Method")])),_:1})]),a("li",null,[e(i,{to:"#other-methods"},{default:t(()=>n[9]||(n[9]=[s("Other Methods")])),_:1})])])])])]),n[20]||(n[20]=o('

Introduction

The Goravel service container is a powerful tool for managing class dependencies and performing dependency injection. It contains all the modules of Goravel, and allows you to bind your own services to container and resolve them when needed. The service container provides powerful support for third-party packages around Goravel.

Binding

Simple Bindings

',4)),a("p",null,[n[11]||(n[11]=s("Almost all of your service container bindings will be registered within ")),e(l,{to:"/architecutre-concepts/service-providers.html"},{default:t(()=>n[10]||(n[10]=[s("service providers")])),_:1}),n[12]||(n[12]=s(". Within a service provider, you always have access to the container via the ")),n[13]||(n[13]=a("code",null,"app",-1)),n[14]||(n[14]=s(" parameter, then register a binding using the ")),n[15]||(n[15]=a("code",null,"Bind",-1)),n[16]||(n[16]=s(" method, passing the ")),n[17]||(n[17]=a("code",null,"key",-1)),n[18]||(n[18]=s(" that we wish to register along with a closure that returns an instance of the class:"))]),n[21]||(n[21]=o(`
package route
 
 import (
 	"github.com/goravel/framework/contracts/foundation"
diff --git a/assets/service-container.html-DFOd3-Bq.js b/assets/service-container.html-DCQmf82Z.js
similarity index 99%
rename from assets/service-container.html-DFOd3-Bq.js
rename to assets/service-container.html-DCQmf82Z.js
index 4ba1b457..ecd95f74 100644
--- a/assets/service-container.html-DFOd3-Bq.js
+++ b/assets/service-container.html-DCQmf82Z.js
@@ -1,4 +1,4 @@
-import{_ as c,c as u,b as a,e,f as t,a as o,d as s,r as l,o as d}from"./app-ELDWQP0J.js";const r={},k={class:"table-of-contents"};function v(m,n){const p=l("router-link"),i=l("RouteLink");return d(),u("div",null,[n[21]||(n[21]=a("h1",{id:"服务容器",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#服务容器"},[a("span",null,"服务容器")])],-1)),a("nav",k,[a("ul",null,[a("li",null,[e(p,{to:"#简介"},{default:t(()=>n[0]||(n[0]=[s("简介")])),_:1})]),a("li",null,[e(p,{to:"#绑定"},{default:t(()=>n[1]||(n[1]=[s("绑定")])),_:1}),a("ul",null,[a("li",null,[e(p,{to:"#简单绑定"},{default:t(()=>n[2]||(n[2]=[s("简单绑定")])),_:1})]),a("li",null,[e(p,{to:"#单例的绑定"},{default:t(()=>n[3]||(n[3]=[s("单例的绑定")])),_:1})]),a("li",null,[e(p,{to:"#绑定实例"},{default:t(()=>n[4]||(n[4]=[s("绑定实例")])),_:1})]),a("li",null,[e(p,{to:"#绑定时携带参数"},{default:t(()=>n[5]||(n[5]=[s("绑定时携带参数")])),_:1})])])]),a("li",null,[e(p,{to:"#解析"},{default:t(()=>n[6]||(n[6]=[s("解析")])),_:1}),a("ul",null,[a("li",null,[e(p,{to:"#make-方法"},{default:t(()=>n[7]||(n[7]=[s("Make 方法")])),_:1})]),a("li",null,[e(p,{to:"#makewith-方法"},{default:t(()=>n[8]||(n[8]=[s("MakeWith 方法")])),_:1})]),a("li",null,[e(p,{to:"#其他方法"},{default:t(()=>n[9]||(n[9]=[s("其他方法")])),_:1})])])])])]),n[22]||(n[22]=o('

简介

Goravel的服务容器是一个功能强大的工具,用于管理类依赖和实现依赖注入。它包含了框架所有模块,并允许您将自己的服务绑定到容器中,在需要时进行解析。服务容器为Goravel周边的第三方包提供了有力的支持。

绑定

简单绑定

',4)),a("p",null,[n[11]||(n[11]=s("几乎所有的服务容器绑定都会在 ")),e(i,{to:"/zh/architecutre-concepts/service-providers.html"},{default:t(()=>n[10]||(n[10]=[s("服务提供者")])),_:1}),n[12]||(n[12]=s(" 中注册,在服务提供者中,您可以通过 ")),n[13]||(n[13]=a("code",null,"app",-1)),n[14]||(n[14]=s(" 参数访问容器,然后通过容器的 ")),n[15]||(n[15]=a("code",null,"Bind",-1)),n[16]||(n[16]=s(" 方法注册绑定,")),n[17]||(n[17]=a("code",null,"Bind",-1)),n[18]||(n[18]=s(" 方法的第一个参数为要绑定 ")),n[19]||(n[19]=a("code",null,"key",-1)),n[20]||(n[20]=s(",第二个参数是一个返回类实例的闭包:"))]),n[23]||(n[23]=o(`
package route
+import{_ as c,c as u,b as a,e,f as t,a as o,d as s,r as l,o as d}from"./app-Ewo6p9aM.js";const r={},k={class:"table-of-contents"};function v(m,n){const p=l("router-link"),i=l("RouteLink");return d(),u("div",null,[n[21]||(n[21]=a("h1",{id:"服务容器",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#服务容器"},[a("span",null,"服务容器")])],-1)),a("nav",k,[a("ul",null,[a("li",null,[e(p,{to:"#简介"},{default:t(()=>n[0]||(n[0]=[s("简介")])),_:1})]),a("li",null,[e(p,{to:"#绑定"},{default:t(()=>n[1]||(n[1]=[s("绑定")])),_:1}),a("ul",null,[a("li",null,[e(p,{to:"#简单绑定"},{default:t(()=>n[2]||(n[2]=[s("简单绑定")])),_:1})]),a("li",null,[e(p,{to:"#单例的绑定"},{default:t(()=>n[3]||(n[3]=[s("单例的绑定")])),_:1})]),a("li",null,[e(p,{to:"#绑定实例"},{default:t(()=>n[4]||(n[4]=[s("绑定实例")])),_:1})]),a("li",null,[e(p,{to:"#绑定时携带参数"},{default:t(()=>n[5]||(n[5]=[s("绑定时携带参数")])),_:1})])])]),a("li",null,[e(p,{to:"#解析"},{default:t(()=>n[6]||(n[6]=[s("解析")])),_:1}),a("ul",null,[a("li",null,[e(p,{to:"#make-方法"},{default:t(()=>n[7]||(n[7]=[s("Make 方法")])),_:1})]),a("li",null,[e(p,{to:"#makewith-方法"},{default:t(()=>n[8]||(n[8]=[s("MakeWith 方法")])),_:1})]),a("li",null,[e(p,{to:"#其他方法"},{default:t(()=>n[9]||(n[9]=[s("其他方法")])),_:1})])])])])]),n[22]||(n[22]=o('

简介

Goravel的服务容器是一个功能强大的工具,用于管理类依赖和实现依赖注入。它包含了框架所有模块,并允许您将自己的服务绑定到容器中,在需要时进行解析。服务容器为Goravel周边的第三方包提供了有力的支持。

绑定

简单绑定

',4)),a("p",null,[n[11]||(n[11]=s("几乎所有的服务容器绑定都会在 ")),e(i,{to:"/zh/architecutre-concepts/service-providers.html"},{default:t(()=>n[10]||(n[10]=[s("服务提供者")])),_:1}),n[12]||(n[12]=s(" 中注册,在服务提供者中,您可以通过 ")),n[13]||(n[13]=a("code",null,"app",-1)),n[14]||(n[14]=s(" 参数访问容器,然后通过容器的 ")),n[15]||(n[15]=a("code",null,"Bind",-1)),n[16]||(n[16]=s(" 方法注册绑定,")),n[17]||(n[17]=a("code",null,"Bind",-1)),n[18]||(n[18]=s(" 方法的第一个参数为要绑定 ")),n[19]||(n[19]=a("code",null,"key",-1)),n[20]||(n[20]=s(",第二个参数是一个返回类实例的闭包:"))]),n[23]||(n[23]=o(`
package route
 
 import (
 	"github.com/goravel/framework/contracts/foundation"
diff --git a/assets/service-providers.html-fZyFpzuo.js b/assets/service-providers.html-C0Jn-Hxq.js
similarity index 98%
rename from assets/service-providers.html-fZyFpzuo.js
rename to assets/service-providers.html-C0Jn-Hxq.js
index 093bb6ca..cc0be7d9 100644
--- a/assets/service-providers.html-fZyFpzuo.js
+++ b/assets/service-providers.html-C0Jn-Hxq.js
@@ -1 +1 @@
-import{_ as p,c as n,b as t,e as o,f as i,a as s,r,o as d,d as l}from"./app-ELDWQP0J.js";const v={},h={class:"table-of-contents"};function m(g,e){const c=r("router-link"),a=r("CommentService");return d(),n("div",null,[e[1]||(e[1]=t("h1",{id:"服务提供者",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#服务提供者"},[t("span",null,"服务提供者")])],-1)),t("nav",h,[t("ul",null,[t("li",null,[o(c,{to:"#简介"},{default:i(()=>e[0]||(e[0]=[l("简介")])),_:1})])])]),e[2]||(e[2]=s('

简介

内核启动过程中最重要的是加载 服务提供者。应用下所有的服务提供者均被配置到了 config/app.go 文件中的 providers 数组中。

首先,内核会先调用所有服务提供者的 Register 方法,所有服务提供者均被注册后,再次调用所有服务提供者的 Boot 方法。

服务提供者是 Goravel 生命周期中的关键。服务提供者使框架可以包含各种组件,例如路由、数据库、队列、缓存等。

你也可以自定义自己的 provider,可以存放在 app/providers 下面,并注册到 config/app.go 中的 providers 数组中。

框架默认有一个空白的服务提供者 app/providers/app_service_provider.go,你可以在这里添加一些简单的引导逻辑。在大型项目中,你可以新建服务提供者以获得更细颗粒度的控制。

',6)),o(a)])}const f=p(v,[["render",m],["__file","service-providers.html.vue"]]),_=JSON.parse('{"path":"/zh/architecutre-concepts/service-providers.html","title":"服务提供者","lang":"zh-CN","frontmatter":{"description":"服务提供者 简介 内核启动过程中最重要的是加载 服务提供者。应用下所有的服务提供者均被配置到了 config/app.go 文件中的 providers 数组中。 首先,内核会先调用所有服务提供者的 Register 方法,所有服务提供者均被注册后,再次调用所有服务提供者的 Boot 方法。 服务提供者是 Goravel 生命周期中的关键。服务提供者使...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/architecutre-concepts/service-providers.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/architecutre-concepts/service-providers.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/architecutre-concepts/service-providers.html"}],["meta",{"property":"og:description","content":"服务提供者 简介 内核启动过程中最重要的是加载 服务提供者。应用下所有的服务提供者均被配置到了 config/app.go 文件中的 providers 数组中。 首先,内核会先调用所有服务提供者的 Register 方法,所有服务提供者均被注册后,再次调用所有服务提供者的 Boot 方法。 服务提供者是 Goravel 生命周期中的关键。服务提供者使..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"服务提供者\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"简介","slug":"简介","link":"#简介","children":[]}],"git":{},"filePathRelative":"zh/architecutre-concepts/service-providers.md","autoDesc":true}');export{f as comp,_ as data}; +import{_ as p,c as n,b as t,e as o,f as i,a as s,r,o as d,d as l}from"./app-Ewo6p9aM.js";const v={},h={class:"table-of-contents"};function m(g,e){const c=r("router-link"),a=r("CommentService");return d(),n("div",null,[e[1]||(e[1]=t("h1",{id:"服务提供者",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#服务提供者"},[t("span",null,"服务提供者")])],-1)),t("nav",h,[t("ul",null,[t("li",null,[o(c,{to:"#简介"},{default:i(()=>e[0]||(e[0]=[l("简介")])),_:1})])])]),e[2]||(e[2]=s('

简介

内核启动过程中最重要的是加载 服务提供者。应用下所有的服务提供者均被配置到了 config/app.go 文件中的 providers 数组中。

首先,内核会先调用所有服务提供者的 Register 方法,所有服务提供者均被注册后,再次调用所有服务提供者的 Boot 方法。

服务提供者是 Goravel 生命周期中的关键。服务提供者使框架可以包含各种组件,例如路由、数据库、队列、缓存等。

你也可以自定义自己的 provider,可以存放在 app/providers 下面,并注册到 config/app.go 中的 providers 数组中。

框架默认有一个空白的服务提供者 app/providers/app_service_provider.go,你可以在这里添加一些简单的引导逻辑。在大型项目中,你可以新建服务提供者以获得更细颗粒度的控制。

',6)),o(a)])}const f=p(v,[["render",m],["__file","service-providers.html.vue"]]),_=JSON.parse('{"path":"/zh/architecutre-concepts/service-providers.html","title":"服务提供者","lang":"zh-CN","frontmatter":{"description":"服务提供者 简介 内核启动过程中最重要的是加载 服务提供者。应用下所有的服务提供者均被配置到了 config/app.go 文件中的 providers 数组中。 首先,内核会先调用所有服务提供者的 Register 方法,所有服务提供者均被注册后,再次调用所有服务提供者的 Boot 方法。 服务提供者是 Goravel 生命周期中的关键。服务提供者使...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/architecutre-concepts/service-providers.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/architecutre-concepts/service-providers.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/architecutre-concepts/service-providers.html"}],["meta",{"property":"og:description","content":"服务提供者 简介 内核启动过程中最重要的是加载 服务提供者。应用下所有的服务提供者均被配置到了 config/app.go 文件中的 providers 数组中。 首先,内核会先调用所有服务提供者的 Register 方法,所有服务提供者均被注册后,再次调用所有服务提供者的 Boot 方法。 服务提供者是 Goravel 生命周期中的关键。服务提供者使..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"服务提供者\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"简介","slug":"简介","link":"#简介","children":[]}],"git":{},"filePathRelative":"zh/architecutre-concepts/service-providers.md","autoDesc":true}');export{f as comp,_ as data}; diff --git a/assets/service-providers.html-C4FpQXF4.js b/assets/service-providers.html-E7CB2W-O.js similarity index 98% rename from assets/service-providers.html-C4FpQXF4.js rename to assets/service-providers.html-E7CB2W-O.js index b02ca3e6..d9e5a19a 100644 --- a/assets/service-providers.html-C4FpQXF4.js +++ b/assets/service-providers.html-E7CB2W-O.js @@ -1 +1 @@ -import{_ as n,c as a,b as o,e as r,f as d,a as s,r as t,o as l,d as p}from"./app-ELDWQP0J.js";const v={},h={class:"table-of-contents"};function u(m,e){const i=t("router-link"),c=t("CommentService");return l(),a("div",null,[e[1]||(e[1]=o("h1",{id:"service-providers",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#service-providers"},[o("span",null,"Service Providers")])],-1)),o("nav",h,[o("ul",null,[o("li",null,[r(i,{to:"#introduction"},{default:d(()=>e[0]||(e[0]=[p("Introduction")])),_:1})])])]),e[2]||(e[2]=s('

Introduction

The most important thing in the kernel boot operation is to load the ServiceProvider. All ServiceProvider under the application are configured in the providers array in config/app.go.

First, the kernel will call the Register method of all service providers. After all service providers have been registered, the kernel will call the Boot method of all ServiceProvider again.

The ServiceProvider is the key to the life cycle of Goravel. They enable the framework to contain various components, such as routing, database, queue, cache, etc.

You can also customize your own provider, it can be stored under app/providers and registered in the providers array in config/app.go.

The framework comes with a blank service provider app/providers/app_service_provider.go where you can implement simple boot logic. In bigger projects, you have the option to create new service providers for more precise control.

',6)),r(c)])}const f=n(v,[["render",u],["__file","service-providers.html.vue"]]),S=JSON.parse('{"path":"/architecutre-concepts/service-providers.html","title":"Service Providers","lang":"en-US","frontmatter":{"description":"Service Providers Introduction The most important thing in the kernel boot operation is to load the ServiceProvider. All ServiceProvider under the application are configured in ...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/architecutre-concepts/service-providers.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/architecutre-concepts/service-providers.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/architecutre-concepts/service-providers.html"}],["meta",{"property":"og:description","content":"Service Providers Introduction The most important thing in the kernel boot operation is to load the ServiceProvider. All ServiceProvider under the application are configured in ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Service Providers\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"Introduction","slug":"introduction","link":"#introduction","children":[]}],"git":{},"filePathRelative":"architecutre-concepts/service-providers.md","autoDesc":true}');export{f as comp,S as data}; +import{_ as n,c as a,b as o,e as r,f as d,a as s,r as t,o as l,d as p}from"./app-Ewo6p9aM.js";const v={},h={class:"table-of-contents"};function u(m,e){const i=t("router-link"),c=t("CommentService");return l(),a("div",null,[e[1]||(e[1]=o("h1",{id:"service-providers",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#service-providers"},[o("span",null,"Service Providers")])],-1)),o("nav",h,[o("ul",null,[o("li",null,[r(i,{to:"#introduction"},{default:d(()=>e[0]||(e[0]=[p("Introduction")])),_:1})])])]),e[2]||(e[2]=s('

Introduction

The most important thing in the kernel boot operation is to load the ServiceProvider. All ServiceProvider under the application are configured in the providers array in config/app.go.

First, the kernel will call the Register method of all service providers. After all service providers have been registered, the kernel will call the Boot method of all ServiceProvider again.

The ServiceProvider is the key to the life cycle of Goravel. They enable the framework to contain various components, such as routing, database, queue, cache, etc.

You can also customize your own provider, it can be stored under app/providers and registered in the providers array in config/app.go.

The framework comes with a blank service provider app/providers/app_service_provider.go where you can implement simple boot logic. In bigger projects, you have the option to create new service providers for more precise control.

',6)),r(c)])}const f=n(v,[["render",u],["__file","service-providers.html.vue"]]),S=JSON.parse('{"path":"/architecutre-concepts/service-providers.html","title":"Service Providers","lang":"en-US","frontmatter":{"description":"Service Providers Introduction The most important thing in the kernel boot operation is to load the ServiceProvider. All ServiceProvider under the application are configured in ...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/architecutre-concepts/service-providers.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/architecutre-concepts/service-providers.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/architecutre-concepts/service-providers.html"}],["meta",{"property":"og:description","content":"Service Providers Introduction The most important thing in the kernel boot operation is to load the ServiceProvider. All ServiceProvider under the application are configured in ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Service Providers\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"Introduction","slug":"introduction","link":"#introduction","children":[]}],"git":{},"filePathRelative":"architecutre-concepts/service-providers.md","autoDesc":true}');export{f as comp,S as data}; diff --git a/assets/session.html-CRsI3TtN.js b/assets/session.html-AG3rrd3w.js similarity index 99% rename from assets/session.html-CRsI3TtN.js rename to assets/session.html-AG3rrd3w.js index 49e516f7..c6887fbd 100644 --- a/assets/session.html-CRsI3TtN.js +++ b/assets/session.html-AG3rrd3w.js @@ -1,4 +1,4 @@ -import{_ as l,c,b as s,e as a,f as t,a as u,r as o,o as r,d as i}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function g(h,n){const e=o("router-link"),p=o("CommentService");return r(),c("div",null,[n[21]||(n[21]=s("h1",{id:"session",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#session"},[s("span",null,"Session")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[i("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#configuration"},{default:t(()=>n[1]||(n[1]=[i("Configuration")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#register-middleware"},{default:t(()=>n[2]||(n[2]=[i("Register Middleware")])),_:1})])])]),s("li",null,[a(e,{to:"#interacting-with-the-session"},{default:t(()=>n[3]||(n[3]=[i("Interacting With The Session")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#retrieving-data"},{default:t(()=>n[4]||(n[4]=[i("Retrieving Data")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-all-data"},{default:t(()=>n[5]||(n[5]=[i("Retrieving All Data")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-a-subset-of-data"},{default:t(()=>n[6]||(n[6]=[i("Retrieving a Subset of Data")])),_:1})]),s("li",null,[a(e,{to:"#determining-if-an-item-exists-in-the-session"},{default:t(()=>n[7]||(n[7]=[i("Determining If An Item Exists In The Session")])),_:1})]),s("li",null,[a(e,{to:"#storing-data"},{default:t(()=>n[8]||(n[8]=[i("Storing Data")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-deleting-data"},{default:t(()=>n[9]||(n[9]=[i("Retrieving & Deleting Data")])),_:1})]),s("li",null,[a(e,{to:"#deleting-data"},{default:t(()=>n[10]||(n[10]=[i("Deleting Data")])),_:1})]),s("li",null,[a(e,{to:"#regenerating-the-session-id"},{default:t(()=>n[11]||(n[11]=[i("Regenerating The Session ID")])),_:1})]),s("li",null,[a(e,{to:"#flash-data"},{default:t(()=>n[12]||(n[12]=[i("Flash Data")])),_:1})])])]),s("li",null,[a(e,{to:"#interacting-with-session-manager"},{default:t(()=>n[13]||(n[13]=[i("Interacting With Session Manager")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#building-a-custom-session"},{default:t(()=>n[14]||(n[14]=[i("Building A Custom Session")])),_:1})]),s("li",null,[a(e,{to:"#add-custom-session-drivers"},{default:t(()=>n[15]||(n[15]=[i("Add Custom Session Drivers")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-driver-instance"},{default:t(()=>n[16]||(n[16]=[i("Retrieving driver instance")])),_:1})]),s("li",null,[a(e,{to:"#starting-a-new-session"},{default:t(()=>n[17]||(n[17]=[i("Starting A New Session")])),_:1})]),s("li",null,[a(e,{to:"#saving-the-session-data"},{default:t(()=>n[18]||(n[18]=[i("Saving The Session Data")])),_:1})]),s("li",null,[a(e,{to:"#attaching-the-session-to-the-request"},{default:t(()=>n[19]||(n[19]=[i("Attaching the Session to the Request")])),_:1})]),s("li",null,[a(e,{to:"#checking-if-request-has-session"},{default:t(()=>n[20]||(n[20]=[i("Checking if request has session")])),_:1})])])])])]),n[22]||(n[22]=u(`

Introduction

Session enables you to store user information across multiple requests, providing a stateful experience within the inherently stateless HTTP protocol. This user information is stored persistently on the server side. Goravel offers a unified interface for interacting with various persistent storage drivers.

Configuration

The session configuration file is located at config/session.go. The default driver is file, which stores sessions in the storage/framework/sessions directory. Goravel allows you to create a custom session driver by implementing the contracts/session/driver interface.

Register Middleware

By default, Goravel does not start a session automatically. However, it provides middleware to start a session. You can register the session middleware in the app/http/kernel.go file to apply it to all routes, or you can add it to specific routes:

import (
+import{_ as l,c,b as s,e as a,f as t,a as u,r as o,o as r,d as i}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function g(h,n){const e=o("router-link"),p=o("CommentService");return r(),c("div",null,[n[21]||(n[21]=s("h1",{id:"session",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#session"},[s("span",null,"Session")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[i("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#configuration"},{default:t(()=>n[1]||(n[1]=[i("Configuration")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#register-middleware"},{default:t(()=>n[2]||(n[2]=[i("Register Middleware")])),_:1})])])]),s("li",null,[a(e,{to:"#interacting-with-the-session"},{default:t(()=>n[3]||(n[3]=[i("Interacting With The Session")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#retrieving-data"},{default:t(()=>n[4]||(n[4]=[i("Retrieving Data")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-all-data"},{default:t(()=>n[5]||(n[5]=[i("Retrieving All Data")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-a-subset-of-data"},{default:t(()=>n[6]||(n[6]=[i("Retrieving a Subset of Data")])),_:1})]),s("li",null,[a(e,{to:"#determining-if-an-item-exists-in-the-session"},{default:t(()=>n[7]||(n[7]=[i("Determining If An Item Exists In The Session")])),_:1})]),s("li",null,[a(e,{to:"#storing-data"},{default:t(()=>n[8]||(n[8]=[i("Storing Data")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-deleting-data"},{default:t(()=>n[9]||(n[9]=[i("Retrieving & Deleting Data")])),_:1})]),s("li",null,[a(e,{to:"#deleting-data"},{default:t(()=>n[10]||(n[10]=[i("Deleting Data")])),_:1})]),s("li",null,[a(e,{to:"#regenerating-the-session-id"},{default:t(()=>n[11]||(n[11]=[i("Regenerating The Session ID")])),_:1})]),s("li",null,[a(e,{to:"#flash-data"},{default:t(()=>n[12]||(n[12]=[i("Flash Data")])),_:1})])])]),s("li",null,[a(e,{to:"#interacting-with-session-manager"},{default:t(()=>n[13]||(n[13]=[i("Interacting With Session Manager")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#building-a-custom-session"},{default:t(()=>n[14]||(n[14]=[i("Building A Custom Session")])),_:1})]),s("li",null,[a(e,{to:"#add-custom-session-drivers"},{default:t(()=>n[15]||(n[15]=[i("Add Custom Session Drivers")])),_:1})]),s("li",null,[a(e,{to:"#retrieving-driver-instance"},{default:t(()=>n[16]||(n[16]=[i("Retrieving driver instance")])),_:1})]),s("li",null,[a(e,{to:"#starting-a-new-session"},{default:t(()=>n[17]||(n[17]=[i("Starting A New Session")])),_:1})]),s("li",null,[a(e,{to:"#saving-the-session-data"},{default:t(()=>n[18]||(n[18]=[i("Saving The Session Data")])),_:1})]),s("li",null,[a(e,{to:"#attaching-the-session-to-the-request"},{default:t(()=>n[19]||(n[19]=[i("Attaching the Session to the Request")])),_:1})]),s("li",null,[a(e,{to:"#checking-if-request-has-session"},{default:t(()=>n[20]||(n[20]=[i("Checking if request has session")])),_:1})])])])])]),n[22]||(n[22]=u(`

Introduction

Session enables you to store user information across multiple requests, providing a stateful experience within the inherently stateless HTTP protocol. This user information is stored persistently on the server side. Goravel offers a unified interface for interacting with various persistent storage drivers.

Configuration

The session configuration file is located at config/session.go. The default driver is file, which stores sessions in the storage/framework/sessions directory. Goravel allows you to create a custom session driver by implementing the contracts/session/driver interface.

Register Middleware

By default, Goravel does not start a session automatically. However, it provides middleware to start a session. You can register the session middleware in the app/http/kernel.go file to apply it to all routes, or you can add it to specific routes:

import (
   "github.com/goravel/framework/contracts/http"
   "github.com/goravel/framework/session/middleware"
 )
diff --git a/assets/session.html-CfifO3t5.js b/assets/session.html-BO0crizQ.js
similarity index 99%
rename from assets/session.html-CfifO3t5.js
rename to assets/session.html-BO0crizQ.js
index 4f744a41..fc374f82 100644
--- a/assets/session.html-CfifO3t5.js
+++ b/assets/session.html-BO0crizQ.js
@@ -1,4 +1,4 @@
-import{_ as l,c,b as s,e as a,f as e,a as u,r as o,o as d,d as p}from"./app-ELDWQP0J.js";const r={},k={class:"table-of-contents"};function v(g,n){const t=o("router-link"),i=o("CommentService");return d(),c("div",null,[n[21]||(n[21]=s("h1",{id:"session",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#session"},[s("span",null,"Session")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#configuration"},{default:e(()=>n[1]||(n[1]=[p("Configuration")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#注册-middleware"},{default:e(()=>n[2]||(n[2]=[p("注册 Middleware")])),_:1})])])]),s("li",null,[a(t,{to:"#使用-session"},{default:e(()=>n[3]||(n[3]=[p("使用 Session")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#获取数据"},{default:e(()=>n[4]||(n[4]=[p("获取数据")])),_:1})]),s("li",null,[a(t,{to:"#获取所有数据"},{default:e(()=>n[5]||(n[5]=[p("获取所有数据")])),_:1})]),s("li",null,[a(t,{to:"#获取数据子集"},{default:e(()=>n[6]||(n[6]=[p("获取数据子集")])),_:1})]),s("li",null,[a(t,{to:"#确定会话中是否存在项目"},{default:e(()=>n[7]||(n[7]=[p("确定会话中是否存在项目")])),_:1})]),s("li",null,[a(t,{to:"#存储数据"},{default:e(()=>n[8]||(n[8]=[p("存储数据")])),_:1})]),s("li",null,[a(t,{to:"#检索并删除数据"},{default:e(()=>n[9]||(n[9]=[p("检索并删除数据")])),_:1})]),s("li",null,[a(t,{to:"#删除数据"},{default:e(()=>n[10]||(n[10]=[p("删除数据")])),_:1})]),s("li",null,[a(t,{to:"#重新生成会话-id"},{default:e(()=>n[11]||(n[11]=[p("重新生成会话 ID")])),_:1})]),s("li",null,[a(t,{to:"#闪存数据"},{default:e(()=>n[12]||(n[12]=[p("闪存数据")])),_:1})])])]),s("li",null,[a(t,{to:"#会话管理器"},{default:e(()=>n[13]||(n[13]=[p("会话管理器")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#构建自定义会话"},{default:e(()=>n[14]||(n[14]=[p("构建自定义会话")])),_:1})]),s("li",null,[a(t,{to:"#添加自定义会话驱动"},{default:e(()=>n[15]||(n[15]=[p("添加自定义会话驱动")])),_:1})]),s("li",null,[a(t,{to:"#获取驱动实例"},{default:e(()=>n[16]||(n[16]=[p("获取驱动实例")])),_:1})]),s("li",null,[a(t,{to:"#开始新会话"},{default:e(()=>n[17]||(n[17]=[p("开始新会话")])),_:1})]),s("li",null,[a(t,{to:"#保存会话数据"},{default:e(()=>n[18]||(n[18]=[p("保存会话数据")])),_:1})]),s("li",null,[a(t,{to:"#将会话附加到请求"},{default:e(()=>n[19]||(n[19]=[p("将会话附加到请求")])),_:1})]),s("li",null,[a(t,{to:"#检查请求是否有会话"},{default:e(()=>n[20]||(n[20]=[p("检查请求是否有会话")])),_:1})])])])])]),n[22]||(n[22]=u(`

简介

Session 使你可以在多个请求之间存储用户信息,为本质上无状态的 HTTP 协议提供有状态的体验。这些用户信息在服务器端持久存储。Goravel 提供了一个统一的接口,用于与各种持久存储驱动进行交互。

Configuration

session 配置文件位于 config/session.go。默认驱动是 file,它会把 session 存储在 storage/framework/sessions 目录中。Goravel 允许你通过实现 contracts/session/driver 接口来创建自定义 session 驱动。

注册 Middleware

Goravel 默认情况下未启动 Session 功能,但是框架提供了用于启动会话的中间件。你可以在 app/http/kernel.go 文件中注册 Session 中间件,以将其应用于所有路由,或者将其添加到特定路由中:

import (
+import{_ as l,c,b as s,e as a,f as e,a as u,r as o,o as d,d as p}from"./app-Ewo6p9aM.js";const r={},k={class:"table-of-contents"};function v(g,n){const t=o("router-link"),i=o("CommentService");return d(),c("div",null,[n[21]||(n[21]=s("h1",{id:"session",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#session"},[s("span",null,"Session")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#configuration"},{default:e(()=>n[1]||(n[1]=[p("Configuration")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#注册-middleware"},{default:e(()=>n[2]||(n[2]=[p("注册 Middleware")])),_:1})])])]),s("li",null,[a(t,{to:"#使用-session"},{default:e(()=>n[3]||(n[3]=[p("使用 Session")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#获取数据"},{default:e(()=>n[4]||(n[4]=[p("获取数据")])),_:1})]),s("li",null,[a(t,{to:"#获取所有数据"},{default:e(()=>n[5]||(n[5]=[p("获取所有数据")])),_:1})]),s("li",null,[a(t,{to:"#获取数据子集"},{default:e(()=>n[6]||(n[6]=[p("获取数据子集")])),_:1})]),s("li",null,[a(t,{to:"#确定会话中是否存在项目"},{default:e(()=>n[7]||(n[7]=[p("确定会话中是否存在项目")])),_:1})]),s("li",null,[a(t,{to:"#存储数据"},{default:e(()=>n[8]||(n[8]=[p("存储数据")])),_:1})]),s("li",null,[a(t,{to:"#检索并删除数据"},{default:e(()=>n[9]||(n[9]=[p("检索并删除数据")])),_:1})]),s("li",null,[a(t,{to:"#删除数据"},{default:e(()=>n[10]||(n[10]=[p("删除数据")])),_:1})]),s("li",null,[a(t,{to:"#重新生成会话-id"},{default:e(()=>n[11]||(n[11]=[p("重新生成会话 ID")])),_:1})]),s("li",null,[a(t,{to:"#闪存数据"},{default:e(()=>n[12]||(n[12]=[p("闪存数据")])),_:1})])])]),s("li",null,[a(t,{to:"#会话管理器"},{default:e(()=>n[13]||(n[13]=[p("会话管理器")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#构建自定义会话"},{default:e(()=>n[14]||(n[14]=[p("构建自定义会话")])),_:1})]),s("li",null,[a(t,{to:"#添加自定义会话驱动"},{default:e(()=>n[15]||(n[15]=[p("添加自定义会话驱动")])),_:1})]),s("li",null,[a(t,{to:"#获取驱动实例"},{default:e(()=>n[16]||(n[16]=[p("获取驱动实例")])),_:1})]),s("li",null,[a(t,{to:"#开始新会话"},{default:e(()=>n[17]||(n[17]=[p("开始新会话")])),_:1})]),s("li",null,[a(t,{to:"#保存会话数据"},{default:e(()=>n[18]||(n[18]=[p("保存会话数据")])),_:1})]),s("li",null,[a(t,{to:"#将会话附加到请求"},{default:e(()=>n[19]||(n[19]=[p("将会话附加到请求")])),_:1})]),s("li",null,[a(t,{to:"#检查请求是否有会话"},{default:e(()=>n[20]||(n[20]=[p("检查请求是否有会话")])),_:1})])])])])]),n[22]||(n[22]=u(`

简介

Session 使你可以在多个请求之间存储用户信息,为本质上无状态的 HTTP 协议提供有状态的体验。这些用户信息在服务器端持久存储。Goravel 提供了一个统一的接口,用于与各种持久存储驱动进行交互。

Configuration

session 配置文件位于 config/session.go。默认驱动是 file,它会把 session 存储在 storage/framework/sessions 目录中。Goravel 允许你通过实现 contracts/session/driver 接口来创建自定义 session 驱动。

注册 Middleware

Goravel 默认情况下未启动 Session 功能,但是框架提供了用于启动会话的中间件。你可以在 app/http/kernel.go 文件中注册 Session 中间件,以将其应用于所有路由,或者将其添加到特定路由中:

import (
   "github.com/goravel/framework/contracts/http"
   "github.com/goravel/framework/session/middleware"
 )
diff --git a/assets/setupDevtools-7MC2TMWH-bpP4unfq.js b/assets/setupDevtools-7MC2TMWH-D878vR7l.js
similarity index 93%
rename from assets/setupDevtools-7MC2TMWH-bpP4unfq.js
rename to assets/setupDevtools-7MC2TMWH-D878vR7l.js
index adb26dfc..bebc889a 100644
--- a/assets/setupDevtools-7MC2TMWH-bpP4unfq.js
+++ b/assets/setupDevtools-7MC2TMWH-D878vR7l.js
@@ -1 +1 @@
-import{s as T,w as E}from"./app-ELDWQP0J.js";var l="org.vuejs.vuepress",v="VuePress",I=v,r=l,N=v,i="client-data",a="Client Data",g=(p,n)=>{T({app:p,id:l,label:v,packageName:"@vuepress/client",homepage:"https://vuepress.vuejs.org",logo:"https://vuepress.vuejs.org/images/hero.png",componentStateTypes:[I]},t=>{const c=Object.entries(n),u=Object.keys(n),d=Object.values(n);t.on.inspectComponent(e=>{e.instanceData.state.push(...c.map(([s,o])=>({type:I,editable:!1,key:s,value:o.value})))}),t.addInspector({id:r,label:N,icon:"article"}),t.on.getInspectorTree(e=>{e.inspectorId===r&&(e.rootNodes=[{id:i,label:a,children:u.map(s=>({id:s,label:s}))}])}),t.on.getInspectorState(e=>{e.inspectorId===r&&(e.nodeId===i&&(e.state={[a]:c.map(([s,o])=>({key:s,value:o.value}))}),u.includes(e.nodeId)&&(e.state={[a]:[{key:e.nodeId,value:n[e.nodeId].value}]}))}),E(d,()=>{t.notifyComponentUpdate(),t.sendInspectorState(r)})})};export{g as setupDevtools};
+import{s as T,w as E}from"./app-Ewo6p9aM.js";var l="org.vuejs.vuepress",v="VuePress",I=v,r=l,N=v,i="client-data",a="Client Data",g=(p,n)=>{T({app:p,id:l,label:v,packageName:"@vuepress/client",homepage:"https://vuepress.vuejs.org",logo:"https://vuepress.vuejs.org/images/hero.png",componentStateTypes:[I]},t=>{const c=Object.entries(n),u=Object.keys(n),d=Object.values(n);t.on.inspectComponent(e=>{e.instanceData.state.push(...c.map(([s,o])=>({type:I,editable:!1,key:s,value:o.value})))}),t.addInspector({id:r,label:N,icon:"article"}),t.on.getInspectorTree(e=>{e.inspectorId===r&&(e.rootNodes=[{id:i,label:a,children:u.map(s=>({id:s,label:s}))}])}),t.on.getInspectorState(e=>{e.inspectorId===r&&(e.nodeId===i&&(e.state={[a]:c.map(([s,o])=>({key:s,value:o.value}))}),u.includes(e.nodeId)&&(e.state={[a]:[{key:e.nodeId,value:n[e.nodeId].value}]}))}),E(d,()=>{t.notifyComponentUpdate(),t.sendInspectorState(r)})})};export{g as setupDevtools};
diff --git a/assets/strings.html-BmWihGVZ.js b/assets/strings.html-D2jwoqQA.js
similarity index 99%
rename from assets/strings.html-BmWihGVZ.js
rename to assets/strings.html-D2jwoqQA.js
index 97649d5a..a8dff256 100644
--- a/assets/strings.html-BmWihGVZ.js
+++ b/assets/strings.html-D2jwoqQA.js
@@ -1,4 +1,4 @@
-import{_ as l,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function m(g,n){const t=o("router-link"),i=o("CommentService");return r(),c("div",null,[n[90]||(n[90]=s("h1",{id:"strings",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#strings"},[s("span",null,"Strings")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(t,{to:"#available-methods"},{default:e(()=>n[1]||(n[1]=[p("Available Methods")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#of"},{default:e(()=>n[2]||(n[2]=[p("Of")])),_:1})]),s("li",null,[a(t,{to:"#after"},{default:e(()=>n[3]||(n[3]=[p("After")])),_:1})]),s("li",null,[a(t,{to:"#afterlast"},{default:e(()=>n[4]||(n[4]=[p("AfterLast")])),_:1})]),s("li",null,[a(t,{to:"#append"},{default:e(()=>n[5]||(n[5]=[p("Append")])),_:1})]),s("li",null,[a(t,{to:"#basename"},{default:e(()=>n[6]||(n[6]=[p("Basename")])),_:1})]),s("li",null,[a(t,{to:"#before"},{default:e(()=>n[7]||(n[7]=[p("Before")])),_:1})]),s("li",null,[a(t,{to:"#beforelast"},{default:e(()=>n[8]||(n[8]=[p("BeforeLast")])),_:1})]),s("li",null,[a(t,{to:"#between"},{default:e(()=>n[9]||(n[9]=[p("Between")])),_:1})]),s("li",null,[a(t,{to:"#betweenfirst"},{default:e(()=>n[10]||(n[10]=[p("BetweenFirst")])),_:1})]),s("li",null,[a(t,{to:"#camel"},{default:e(()=>n[11]||(n[11]=[p("Camel")])),_:1})]),s("li",null,[a(t,{to:"#charat"},{default:e(()=>n[12]||(n[12]=[p("CharAt")])),_:1})]),s("li",null,[a(t,{to:"#chopend"},{default:e(()=>n[13]||(n[13]=[p("ChopEnd")])),_:1})]),s("li",null,[a(t,{to:"#chopstart"},{default:e(()=>n[14]||(n[14]=[p("ChopStart")])),_:1})]),s("li",null,[a(t,{to:"#contains"},{default:e(()=>n[15]||(n[15]=[p("Contains")])),_:1})]),s("li",null,[a(t,{to:"#containsall"},{default:e(()=>n[16]||(n[16]=[p("ContainsAll")])),_:1})]),s("li",null,[a(t,{to:"#dirname"},{default:e(()=>n[17]||(n[17]=[p("Dirname")])),_:1})]),s("li",null,[a(t,{to:"#endswith"},{default:e(()=>n[18]||(n[18]=[p("EndsWith")])),_:1})]),s("li",null,[a(t,{to:"#exactly"},{default:e(()=>n[19]||(n[19]=[p("Exactly")])),_:1})]),s("li",null,[a(t,{to:"#except"},{default:e(()=>n[20]||(n[20]=[p("Except")])),_:1})]),s("li",null,[a(t,{to:"#explode"},{default:e(()=>n[21]||(n[21]=[p("Explode")])),_:1})]),s("li",null,[a(t,{to:"#finish"},{default:e(()=>n[22]||(n[22]=[p("Finish")])),_:1})]),s("li",null,[a(t,{to:"#headline"},{default:e(()=>n[23]||(n[23]=[p("Headline")])),_:1})]),s("li",null,[a(t,{to:"#is"},{default:e(()=>n[24]||(n[24]=[p("Is")])),_:1})]),s("li",null,[a(t,{to:"#isempty"},{default:e(()=>n[25]||(n[25]=[p("IsEmpty")])),_:1})]),s("li",null,[a(t,{to:"#isnotempty"},{default:e(()=>n[26]||(n[26]=[p("IsNotEmpty")])),_:1})]),s("li",null,[a(t,{to:"#isascii"},{default:e(()=>n[27]||(n[27]=[p("IsAscii")])),_:1})]),s("li",null,[a(t,{to:"#isslice"},{default:e(()=>n[28]||(n[28]=[p("IsSlice")])),_:1})]),s("li",null,[a(t,{to:"#ismap"},{default:e(()=>n[29]||(n[29]=[p("IsMap")])),_:1})]),s("li",null,[a(t,{to:"#isulid"},{default:e(()=>n[30]||(n[30]=[p("IsUlid")])),_:1})]),s("li",null,[a(t,{to:"#isuuid"},{default:e(()=>n[31]||(n[31]=[p("IsUuid")])),_:1})]),s("li",null,[a(t,{to:"#kebab"},{default:e(()=>n[32]||(n[32]=[p("Kebab")])),_:1})]),s("li",null,[a(t,{to:"#lcfirst"},{default:e(()=>n[33]||(n[33]=[p("LcFirst")])),_:1})]),s("li",null,[a(t,{to:"#length"},{default:e(()=>n[34]||(n[34]=[p("Length")])),_:1})]),s("li",null,[a(t,{to:"#limit"},{default:e(()=>n[35]||(n[35]=[p("Limit")])),_:1})]),s("li",null,[a(t,{to:"#lower"},{default:e(()=>n[36]||(n[36]=[p("Lower")])),_:1})]),s("li",null,[a(t,{to:"#ltrim"},{default:e(()=>n[37]||(n[37]=[p("LTrim")])),_:1})]),s("li",null,[a(t,{to:"#mask"},{default:e(()=>n[38]||(n[38]=[p("Mask")])),_:1})]),s("li",null,[a(t,{to:"#match"},{default:e(()=>n[39]||(n[39]=[p("Match")])),_:1})]),s("li",null,[a(t,{to:"#matchall"},{default:e(()=>n[40]||(n[40]=[p("MatchAll")])),_:1})]),s("li",null,[a(t,{to:"#ismatch"},{default:e(()=>n[41]||(n[41]=[p("IsMatch")])),_:1})]),s("li",null,[a(t,{to:"#newline"},{default:e(()=>n[42]||(n[42]=[p("NewLine")])),_:1})]),s("li",null,[a(t,{to:"#padboth"},{default:e(()=>n[43]||(n[43]=[p("PadBoth")])),_:1})]),s("li",null,[a(t,{to:"#padleft"},{default:e(()=>n[44]||(n[44]=[p("PadLeft")])),_:1})]),s("li",null,[a(t,{to:"#padright"},{default:e(()=>n[45]||(n[45]=[p("PadRight")])),_:1})]),s("li",null,[a(t,{to:"#pipe"},{default:e(()=>n[46]||(n[46]=[p("Pipe")])),_:1})]),s("li",null,[a(t,{to:"#prepend"},{default:e(()=>n[47]||(n[47]=[p("Prepend")])),_:1})]),s("li",null,[a(t,{to:"#remove"},{default:e(()=>n[48]||(n[48]=[p("Remove")])),_:1})]),s("li",null,[a(t,{to:"#repeat"},{default:e(()=>n[49]||(n[49]=[p("Repeat")])),_:1})]),s("li",null,[a(t,{to:"#replace"},{default:e(()=>n[50]||(n[50]=[p("Replace")])),_:1})]),s("li",null,[a(t,{to:"#replaceend"},{default:e(()=>n[51]||(n[51]=[p("ReplaceEnd")])),_:1})]),s("li",null,[a(t,{to:"#replacefirst"},{default:e(()=>n[52]||(n[52]=[p("ReplaceFirst")])),_:1})]),s("li",null,[a(t,{to:"#replacelast"},{default:e(()=>n[53]||(n[53]=[p("ReplaceLast")])),_:1})]),s("li",null,[a(t,{to:"#replacematches"},{default:e(()=>n[54]||(n[54]=[p("ReplaceMatches")])),_:1})]),s("li",null,[a(t,{to:"#replacestart"},{default:e(()=>n[55]||(n[55]=[p("ReplaceStart")])),_:1})]),s("li",null,[a(t,{to:"#rtrim"},{default:e(()=>n[56]||(n[56]=[p("RTrim")])),_:1})]),s("li",null,[a(t,{to:"#snake"},{default:e(()=>n[57]||(n[57]=[p("Snake")])),_:1})]),s("li",null,[a(t,{to:"#split"},{default:e(()=>n[58]||(n[58]=[p("Split")])),_:1})]),s("li",null,[a(t,{to:"#squish"},{default:e(()=>n[59]||(n[59]=[p("Squish")])),_:1})]),s("li",null,[a(t,{to:"#start"},{default:e(()=>n[60]||(n[60]=[p("Start")])),_:1})]),s("li",null,[a(t,{to:"#startswith"},{default:e(()=>n[61]||(n[61]=[p("StartsWith")])),_:1})]),s("li",null,[a(t,{to:"#string"},{default:e(()=>n[62]||(n[62]=[p("String")])),_:1})]),s("li",null,[a(t,{to:"#studly"},{default:e(()=>n[63]||(n[63]=[p("Studly")])),_:1})]),s("li",null,[a(t,{to:"#substr"},{default:e(()=>n[64]||(n[64]=[p("Substr")])),_:1})]),s("li",null,[a(t,{to:"#swap"},{default:e(()=>n[65]||(n[65]=[p("Swap")])),_:1})]),s("li",null,[a(t,{to:"#tap"},{default:e(()=>n[66]||(n[66]=[p("Tap")])),_:1})]),s("li",null,[a(t,{to:"#test"},{default:e(()=>n[67]||(n[67]=[p("Test")])),_:1})]),s("li",null,[a(t,{to:"#title"},{default:e(()=>n[68]||(n[68]=[p("Title")])),_:1})]),s("li",null,[a(t,{to:"#trim"},{default:e(()=>n[69]||(n[69]=[p("Trim")])),_:1})]),s("li",null,[a(t,{to:"#ucfirst"},{default:e(()=>n[70]||(n[70]=[p("UcFirst")])),_:1})]),s("li",null,[a(t,{to:"#ucsplit"},{default:e(()=>n[71]||(n[71]=[p("UcSplit")])),_:1})]),s("li",null,[a(t,{to:"#unless"},{default:e(()=>n[72]||(n[72]=[p("Unless")])),_:1})]),s("li",null,[a(t,{to:"#upper"},{default:e(()=>n[73]||(n[73]=[p("Upper")])),_:1})]),s("li",null,[a(t,{to:"#when"},{default:e(()=>n[74]||(n[74]=[p("When")])),_:1})]),s("li",null,[a(t,{to:"#whencontains"},{default:e(()=>n[75]||(n[75]=[p("WhenContains")])),_:1})]),s("li",null,[a(t,{to:"#whencontainsall"},{default:e(()=>n[76]||(n[76]=[p("WhenContainsAll")])),_:1})]),s("li",null,[a(t,{to:"#whenempty"},{default:e(()=>n[77]||(n[77]=[p("WhenEmpty")])),_:1})]),s("li",null,[a(t,{to:"#whenisascii"},{default:e(()=>n[78]||(n[78]=[p("WhenIsAscii")])),_:1})]),s("li",null,[a(t,{to:"#whennotempty"},{default:e(()=>n[79]||(n[79]=[p("WhenNotEmpty")])),_:1})]),s("li",null,[a(t,{to:"#whenstartswith"},{default:e(()=>n[80]||(n[80]=[p("WhenStartsWith")])),_:1})]),s("li",null,[a(t,{to:"#whenendswith"},{default:e(()=>n[81]||(n[81]=[p("WhenEndsWith")])),_:1})]),s("li",null,[a(t,{to:"#whenexactly"},{default:e(()=>n[82]||(n[82]=[p("WhenExactly")])),_:1})]),s("li",null,[a(t,{to:"#whennotexactly"},{default:e(()=>n[83]||(n[83]=[p("WhenNotExactly")])),_:1})]),s("li",null,[a(t,{to:"#whenis"},{default:e(()=>n[84]||(n[84]=[p("WhenIs")])),_:1})]),s("li",null,[a(t,{to:"#whenisulid"},{default:e(()=>n[85]||(n[85]=[p("WhenIsUlid")])),_:1})]),s("li",null,[a(t,{to:"#whenisuuid"},{default:e(()=>n[86]||(n[86]=[p("WhenIsUuid")])),_:1})]),s("li",null,[a(t,{to:"#whentest"},{default:e(()=>n[87]||(n[87]=[p("WhenTest")])),_:1})]),s("li",null,[a(t,{to:"#wordcount"},{default:e(()=>n[88]||(n[88]=[p("WordCount")])),_:1})]),s("li",null,[a(t,{to:"#words"},{default:e(()=>n[89]||(n[89]=[p("Words")])),_:1})])])])])]),n[91]||(n[91]=u(`

Introduction

Goravel provides a fluent string manipulation library that allows you to easily manipulate strings. Fluent Strings allows you to combine multiple string operations through method chaining, where most of the methods returns an instance of support/str.String, letting you chain additional methods. To get the final string value after applying the chained operations, you can call the String method, which returns the underlying string value.

import "github.com/goravel/framework/support/str"
+import{_ as l,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function m(g,n){const t=o("router-link"),i=o("CommentService");return r(),c("div",null,[n[90]||(n[90]=s("h1",{id:"strings",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#strings"},[s("span",null,"Strings")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[p("Introduction")])),_:1})]),s("li",null,[a(t,{to:"#available-methods"},{default:e(()=>n[1]||(n[1]=[p("Available Methods")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#of"},{default:e(()=>n[2]||(n[2]=[p("Of")])),_:1})]),s("li",null,[a(t,{to:"#after"},{default:e(()=>n[3]||(n[3]=[p("After")])),_:1})]),s("li",null,[a(t,{to:"#afterlast"},{default:e(()=>n[4]||(n[4]=[p("AfterLast")])),_:1})]),s("li",null,[a(t,{to:"#append"},{default:e(()=>n[5]||(n[5]=[p("Append")])),_:1})]),s("li",null,[a(t,{to:"#basename"},{default:e(()=>n[6]||(n[6]=[p("Basename")])),_:1})]),s("li",null,[a(t,{to:"#before"},{default:e(()=>n[7]||(n[7]=[p("Before")])),_:1})]),s("li",null,[a(t,{to:"#beforelast"},{default:e(()=>n[8]||(n[8]=[p("BeforeLast")])),_:1})]),s("li",null,[a(t,{to:"#between"},{default:e(()=>n[9]||(n[9]=[p("Between")])),_:1})]),s("li",null,[a(t,{to:"#betweenfirst"},{default:e(()=>n[10]||(n[10]=[p("BetweenFirst")])),_:1})]),s("li",null,[a(t,{to:"#camel"},{default:e(()=>n[11]||(n[11]=[p("Camel")])),_:1})]),s("li",null,[a(t,{to:"#charat"},{default:e(()=>n[12]||(n[12]=[p("CharAt")])),_:1})]),s("li",null,[a(t,{to:"#chopend"},{default:e(()=>n[13]||(n[13]=[p("ChopEnd")])),_:1})]),s("li",null,[a(t,{to:"#chopstart"},{default:e(()=>n[14]||(n[14]=[p("ChopStart")])),_:1})]),s("li",null,[a(t,{to:"#contains"},{default:e(()=>n[15]||(n[15]=[p("Contains")])),_:1})]),s("li",null,[a(t,{to:"#containsall"},{default:e(()=>n[16]||(n[16]=[p("ContainsAll")])),_:1})]),s("li",null,[a(t,{to:"#dirname"},{default:e(()=>n[17]||(n[17]=[p("Dirname")])),_:1})]),s("li",null,[a(t,{to:"#endswith"},{default:e(()=>n[18]||(n[18]=[p("EndsWith")])),_:1})]),s("li",null,[a(t,{to:"#exactly"},{default:e(()=>n[19]||(n[19]=[p("Exactly")])),_:1})]),s("li",null,[a(t,{to:"#except"},{default:e(()=>n[20]||(n[20]=[p("Except")])),_:1})]),s("li",null,[a(t,{to:"#explode"},{default:e(()=>n[21]||(n[21]=[p("Explode")])),_:1})]),s("li",null,[a(t,{to:"#finish"},{default:e(()=>n[22]||(n[22]=[p("Finish")])),_:1})]),s("li",null,[a(t,{to:"#headline"},{default:e(()=>n[23]||(n[23]=[p("Headline")])),_:1})]),s("li",null,[a(t,{to:"#is"},{default:e(()=>n[24]||(n[24]=[p("Is")])),_:1})]),s("li",null,[a(t,{to:"#isempty"},{default:e(()=>n[25]||(n[25]=[p("IsEmpty")])),_:1})]),s("li",null,[a(t,{to:"#isnotempty"},{default:e(()=>n[26]||(n[26]=[p("IsNotEmpty")])),_:1})]),s("li",null,[a(t,{to:"#isascii"},{default:e(()=>n[27]||(n[27]=[p("IsAscii")])),_:1})]),s("li",null,[a(t,{to:"#isslice"},{default:e(()=>n[28]||(n[28]=[p("IsSlice")])),_:1})]),s("li",null,[a(t,{to:"#ismap"},{default:e(()=>n[29]||(n[29]=[p("IsMap")])),_:1})]),s("li",null,[a(t,{to:"#isulid"},{default:e(()=>n[30]||(n[30]=[p("IsUlid")])),_:1})]),s("li",null,[a(t,{to:"#isuuid"},{default:e(()=>n[31]||(n[31]=[p("IsUuid")])),_:1})]),s("li",null,[a(t,{to:"#kebab"},{default:e(()=>n[32]||(n[32]=[p("Kebab")])),_:1})]),s("li",null,[a(t,{to:"#lcfirst"},{default:e(()=>n[33]||(n[33]=[p("LcFirst")])),_:1})]),s("li",null,[a(t,{to:"#length"},{default:e(()=>n[34]||(n[34]=[p("Length")])),_:1})]),s("li",null,[a(t,{to:"#limit"},{default:e(()=>n[35]||(n[35]=[p("Limit")])),_:1})]),s("li",null,[a(t,{to:"#lower"},{default:e(()=>n[36]||(n[36]=[p("Lower")])),_:1})]),s("li",null,[a(t,{to:"#ltrim"},{default:e(()=>n[37]||(n[37]=[p("LTrim")])),_:1})]),s("li",null,[a(t,{to:"#mask"},{default:e(()=>n[38]||(n[38]=[p("Mask")])),_:1})]),s("li",null,[a(t,{to:"#match"},{default:e(()=>n[39]||(n[39]=[p("Match")])),_:1})]),s("li",null,[a(t,{to:"#matchall"},{default:e(()=>n[40]||(n[40]=[p("MatchAll")])),_:1})]),s("li",null,[a(t,{to:"#ismatch"},{default:e(()=>n[41]||(n[41]=[p("IsMatch")])),_:1})]),s("li",null,[a(t,{to:"#newline"},{default:e(()=>n[42]||(n[42]=[p("NewLine")])),_:1})]),s("li",null,[a(t,{to:"#padboth"},{default:e(()=>n[43]||(n[43]=[p("PadBoth")])),_:1})]),s("li",null,[a(t,{to:"#padleft"},{default:e(()=>n[44]||(n[44]=[p("PadLeft")])),_:1})]),s("li",null,[a(t,{to:"#padright"},{default:e(()=>n[45]||(n[45]=[p("PadRight")])),_:1})]),s("li",null,[a(t,{to:"#pipe"},{default:e(()=>n[46]||(n[46]=[p("Pipe")])),_:1})]),s("li",null,[a(t,{to:"#prepend"},{default:e(()=>n[47]||(n[47]=[p("Prepend")])),_:1})]),s("li",null,[a(t,{to:"#remove"},{default:e(()=>n[48]||(n[48]=[p("Remove")])),_:1})]),s("li",null,[a(t,{to:"#repeat"},{default:e(()=>n[49]||(n[49]=[p("Repeat")])),_:1})]),s("li",null,[a(t,{to:"#replace"},{default:e(()=>n[50]||(n[50]=[p("Replace")])),_:1})]),s("li",null,[a(t,{to:"#replaceend"},{default:e(()=>n[51]||(n[51]=[p("ReplaceEnd")])),_:1})]),s("li",null,[a(t,{to:"#replacefirst"},{default:e(()=>n[52]||(n[52]=[p("ReplaceFirst")])),_:1})]),s("li",null,[a(t,{to:"#replacelast"},{default:e(()=>n[53]||(n[53]=[p("ReplaceLast")])),_:1})]),s("li",null,[a(t,{to:"#replacematches"},{default:e(()=>n[54]||(n[54]=[p("ReplaceMatches")])),_:1})]),s("li",null,[a(t,{to:"#replacestart"},{default:e(()=>n[55]||(n[55]=[p("ReplaceStart")])),_:1})]),s("li",null,[a(t,{to:"#rtrim"},{default:e(()=>n[56]||(n[56]=[p("RTrim")])),_:1})]),s("li",null,[a(t,{to:"#snake"},{default:e(()=>n[57]||(n[57]=[p("Snake")])),_:1})]),s("li",null,[a(t,{to:"#split"},{default:e(()=>n[58]||(n[58]=[p("Split")])),_:1})]),s("li",null,[a(t,{to:"#squish"},{default:e(()=>n[59]||(n[59]=[p("Squish")])),_:1})]),s("li",null,[a(t,{to:"#start"},{default:e(()=>n[60]||(n[60]=[p("Start")])),_:1})]),s("li",null,[a(t,{to:"#startswith"},{default:e(()=>n[61]||(n[61]=[p("StartsWith")])),_:1})]),s("li",null,[a(t,{to:"#string"},{default:e(()=>n[62]||(n[62]=[p("String")])),_:1})]),s("li",null,[a(t,{to:"#studly"},{default:e(()=>n[63]||(n[63]=[p("Studly")])),_:1})]),s("li",null,[a(t,{to:"#substr"},{default:e(()=>n[64]||(n[64]=[p("Substr")])),_:1})]),s("li",null,[a(t,{to:"#swap"},{default:e(()=>n[65]||(n[65]=[p("Swap")])),_:1})]),s("li",null,[a(t,{to:"#tap"},{default:e(()=>n[66]||(n[66]=[p("Tap")])),_:1})]),s("li",null,[a(t,{to:"#test"},{default:e(()=>n[67]||(n[67]=[p("Test")])),_:1})]),s("li",null,[a(t,{to:"#title"},{default:e(()=>n[68]||(n[68]=[p("Title")])),_:1})]),s("li",null,[a(t,{to:"#trim"},{default:e(()=>n[69]||(n[69]=[p("Trim")])),_:1})]),s("li",null,[a(t,{to:"#ucfirst"},{default:e(()=>n[70]||(n[70]=[p("UcFirst")])),_:1})]),s("li",null,[a(t,{to:"#ucsplit"},{default:e(()=>n[71]||(n[71]=[p("UcSplit")])),_:1})]),s("li",null,[a(t,{to:"#unless"},{default:e(()=>n[72]||(n[72]=[p("Unless")])),_:1})]),s("li",null,[a(t,{to:"#upper"},{default:e(()=>n[73]||(n[73]=[p("Upper")])),_:1})]),s("li",null,[a(t,{to:"#when"},{default:e(()=>n[74]||(n[74]=[p("When")])),_:1})]),s("li",null,[a(t,{to:"#whencontains"},{default:e(()=>n[75]||(n[75]=[p("WhenContains")])),_:1})]),s("li",null,[a(t,{to:"#whencontainsall"},{default:e(()=>n[76]||(n[76]=[p("WhenContainsAll")])),_:1})]),s("li",null,[a(t,{to:"#whenempty"},{default:e(()=>n[77]||(n[77]=[p("WhenEmpty")])),_:1})]),s("li",null,[a(t,{to:"#whenisascii"},{default:e(()=>n[78]||(n[78]=[p("WhenIsAscii")])),_:1})]),s("li",null,[a(t,{to:"#whennotempty"},{default:e(()=>n[79]||(n[79]=[p("WhenNotEmpty")])),_:1})]),s("li",null,[a(t,{to:"#whenstartswith"},{default:e(()=>n[80]||(n[80]=[p("WhenStartsWith")])),_:1})]),s("li",null,[a(t,{to:"#whenendswith"},{default:e(()=>n[81]||(n[81]=[p("WhenEndsWith")])),_:1})]),s("li",null,[a(t,{to:"#whenexactly"},{default:e(()=>n[82]||(n[82]=[p("WhenExactly")])),_:1})]),s("li",null,[a(t,{to:"#whennotexactly"},{default:e(()=>n[83]||(n[83]=[p("WhenNotExactly")])),_:1})]),s("li",null,[a(t,{to:"#whenis"},{default:e(()=>n[84]||(n[84]=[p("WhenIs")])),_:1})]),s("li",null,[a(t,{to:"#whenisulid"},{default:e(()=>n[85]||(n[85]=[p("WhenIsUlid")])),_:1})]),s("li",null,[a(t,{to:"#whenisuuid"},{default:e(()=>n[86]||(n[86]=[p("WhenIsUuid")])),_:1})]),s("li",null,[a(t,{to:"#whentest"},{default:e(()=>n[87]||(n[87]=[p("WhenTest")])),_:1})]),s("li",null,[a(t,{to:"#wordcount"},{default:e(()=>n[88]||(n[88]=[p("WordCount")])),_:1})]),s("li",null,[a(t,{to:"#words"},{default:e(()=>n[89]||(n[89]=[p("Words")])),_:1})])])])])]),n[91]||(n[91]=u(`

Introduction

Goravel provides a fluent string manipulation library that allows you to easily manipulate strings. Fluent Strings allows you to combine multiple string operations through method chaining, where most of the methods returns an instance of support/str.String, letting you chain additional methods. To get the final string value after applying the chained operations, you can call the String method, which returns the underlying string value.

import "github.com/goravel/framework/support/str"
 
 str.Of("  Goravel  ").Trim().Lower().UpperFirst().String() // "Goravel"
 

Available Methods

Of

The Of method creates a new fluent string instance from a given string.

import "github.com/goravel/framework/support/str"
diff --git a/assets/strings.html-nXI4uHZR.js b/assets/strings.html-yF0zvrgw.js
similarity index 99%
rename from assets/strings.html-nXI4uHZR.js
rename to assets/strings.html-yF0zvrgw.js
index afd48dc9..c6f67d41 100644
--- a/assets/strings.html-nXI4uHZR.js
+++ b/assets/strings.html-yF0zvrgw.js
@@ -1,4 +1,4 @@
-import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function m(g,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[90]||(n[90]=s("h1",{id:"strings",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#strings"},[s("span",null,"Strings")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#可用方法"},{default:e(()=>n[1]||(n[1]=[p("可用方法")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#of"},{default:e(()=>n[2]||(n[2]=[p("Of")])),_:1})]),s("li",null,[a(t,{to:"#after"},{default:e(()=>n[3]||(n[3]=[p("After")])),_:1})]),s("li",null,[a(t,{to:"#afterlast"},{default:e(()=>n[4]||(n[4]=[p("AfterLast")])),_:1})]),s("li",null,[a(t,{to:"#append"},{default:e(()=>n[5]||(n[5]=[p("Append")])),_:1})]),s("li",null,[a(t,{to:"#basename"},{default:e(()=>n[6]||(n[6]=[p("Basename")])),_:1})]),s("li",null,[a(t,{to:"#before"},{default:e(()=>n[7]||(n[7]=[p("Before")])),_:1})]),s("li",null,[a(t,{to:"#beforelast"},{default:e(()=>n[8]||(n[8]=[p("BeforeLast")])),_:1})]),s("li",null,[a(t,{to:"#between"},{default:e(()=>n[9]||(n[9]=[p("Between")])),_:1})]),s("li",null,[a(t,{to:"#betweenfirst"},{default:e(()=>n[10]||(n[10]=[p("BetweenFirst")])),_:1})]),s("li",null,[a(t,{to:"#camel"},{default:e(()=>n[11]||(n[11]=[p("Camel")])),_:1})]),s("li",null,[a(t,{to:"#charat"},{default:e(()=>n[12]||(n[12]=[p("CharAt")])),_:1})]),s("li",null,[a(t,{to:"#chopend"},{default:e(()=>n[13]||(n[13]=[p("ChopEnd")])),_:1})]),s("li",null,[a(t,{to:"#chopstart"},{default:e(()=>n[14]||(n[14]=[p("ChopStart")])),_:1})]),s("li",null,[a(t,{to:"#contains"},{default:e(()=>n[15]||(n[15]=[p("Contains")])),_:1})]),s("li",null,[a(t,{to:"#containsall"},{default:e(()=>n[16]||(n[16]=[p("ContainsAll")])),_:1})]),s("li",null,[a(t,{to:"#dirname"},{default:e(()=>n[17]||(n[17]=[p("Dirname")])),_:1})]),s("li",null,[a(t,{to:"#endswith"},{default:e(()=>n[18]||(n[18]=[p("EndsWith")])),_:1})]),s("li",null,[a(t,{to:"#exactly"},{default:e(()=>n[19]||(n[19]=[p("Exactly")])),_:1})]),s("li",null,[a(t,{to:"#except"},{default:e(()=>n[20]||(n[20]=[p("Except")])),_:1})]),s("li",null,[a(t,{to:"#explode"},{default:e(()=>n[21]||(n[21]=[p("Explode")])),_:1})]),s("li",null,[a(t,{to:"#finish"},{default:e(()=>n[22]||(n[22]=[p("Finish")])),_:1})]),s("li",null,[a(t,{to:"#headline"},{default:e(()=>n[23]||(n[23]=[p("Headline")])),_:1})]),s("li",null,[a(t,{to:"#is"},{default:e(()=>n[24]||(n[24]=[p("Is")])),_:1})]),s("li",null,[a(t,{to:"#isempty"},{default:e(()=>n[25]||(n[25]=[p("IsEmpty")])),_:1})]),s("li",null,[a(t,{to:"#isnotempty"},{default:e(()=>n[26]||(n[26]=[p("IsNotEmpty")])),_:1})]),s("li",null,[a(t,{to:"#isascii"},{default:e(()=>n[27]||(n[27]=[p("IsAscii")])),_:1})]),s("li",null,[a(t,{to:"#isslice"},{default:e(()=>n[28]||(n[28]=[p("IsSlice")])),_:1})]),s("li",null,[a(t,{to:"#ismap"},{default:e(()=>n[29]||(n[29]=[p("IsMap")])),_:1})]),s("li",null,[a(t,{to:"#isulid"},{default:e(()=>n[30]||(n[30]=[p("IsUlid")])),_:1})]),s("li",null,[a(t,{to:"#isuuid"},{default:e(()=>n[31]||(n[31]=[p("IsUuid")])),_:1})]),s("li",null,[a(t,{to:"#kebab"},{default:e(()=>n[32]||(n[32]=[p("Kebab")])),_:1})]),s("li",null,[a(t,{to:"#lcfirst"},{default:e(()=>n[33]||(n[33]=[p("LcFirst")])),_:1})]),s("li",null,[a(t,{to:"#length"},{default:e(()=>n[34]||(n[34]=[p("Length")])),_:1})]),s("li",null,[a(t,{to:"#limit"},{default:e(()=>n[35]||(n[35]=[p("Limit")])),_:1})]),s("li",null,[a(t,{to:"#lower"},{default:e(()=>n[36]||(n[36]=[p("Lower")])),_:1})]),s("li",null,[a(t,{to:"#ltrim"},{default:e(()=>n[37]||(n[37]=[p("LTrim")])),_:1})]),s("li",null,[a(t,{to:"#mask"},{default:e(()=>n[38]||(n[38]=[p("Mask")])),_:1})]),s("li",null,[a(t,{to:"#match"},{default:e(()=>n[39]||(n[39]=[p("Match")])),_:1})]),s("li",null,[a(t,{to:"#matchall"},{default:e(()=>n[40]||(n[40]=[p("MatchAll")])),_:1})]),s("li",null,[a(t,{to:"#ismatch"},{default:e(()=>n[41]||(n[41]=[p("IsMatch")])),_:1})]),s("li",null,[a(t,{to:"#newline"},{default:e(()=>n[42]||(n[42]=[p("NewLine")])),_:1})]),s("li",null,[a(t,{to:"#padboth"},{default:e(()=>n[43]||(n[43]=[p("PadBoth")])),_:1})]),s("li",null,[a(t,{to:"#padleft"},{default:e(()=>n[44]||(n[44]=[p("PadLeft")])),_:1})]),s("li",null,[a(t,{to:"#padright"},{default:e(()=>n[45]||(n[45]=[p("PadRight")])),_:1})]),s("li",null,[a(t,{to:"#pipe"},{default:e(()=>n[46]||(n[46]=[p("Pipe")])),_:1})]),s("li",null,[a(t,{to:"#prepend"},{default:e(()=>n[47]||(n[47]=[p("Prepend")])),_:1})]),s("li",null,[a(t,{to:"#remove"},{default:e(()=>n[48]||(n[48]=[p("Remove")])),_:1})]),s("li",null,[a(t,{to:"#repeat"},{default:e(()=>n[49]||(n[49]=[p("Repeat")])),_:1})]),s("li",null,[a(t,{to:"#replace"},{default:e(()=>n[50]||(n[50]=[p("Replace")])),_:1})]),s("li",null,[a(t,{to:"#replaceend"},{default:e(()=>n[51]||(n[51]=[p("ReplaceEnd")])),_:1})]),s("li",null,[a(t,{to:"#replacefirst"},{default:e(()=>n[52]||(n[52]=[p("ReplaceFirst")])),_:1})]),s("li",null,[a(t,{to:"#replacelast"},{default:e(()=>n[53]||(n[53]=[p("ReplaceLast")])),_:1})]),s("li",null,[a(t,{to:"#replacematches"},{default:e(()=>n[54]||(n[54]=[p("ReplaceMatches")])),_:1})]),s("li",null,[a(t,{to:"#replacestart"},{default:e(()=>n[55]||(n[55]=[p("ReplaceStart")])),_:1})]),s("li",null,[a(t,{to:"#rtrim"},{default:e(()=>n[56]||(n[56]=[p("RTrim")])),_:1})]),s("li",null,[a(t,{to:"#snake"},{default:e(()=>n[57]||(n[57]=[p("Snake")])),_:1})]),s("li",null,[a(t,{to:"#split"},{default:e(()=>n[58]||(n[58]=[p("Split")])),_:1})]),s("li",null,[a(t,{to:"#squish"},{default:e(()=>n[59]||(n[59]=[p("Squish")])),_:1})]),s("li",null,[a(t,{to:"#start"},{default:e(()=>n[60]||(n[60]=[p("Start")])),_:1})]),s("li",null,[a(t,{to:"#startswith"},{default:e(()=>n[61]||(n[61]=[p("StartsWith")])),_:1})]),s("li",null,[a(t,{to:"#string"},{default:e(()=>n[62]||(n[62]=[p("String")])),_:1})]),s("li",null,[a(t,{to:"#studly"},{default:e(()=>n[63]||(n[63]=[p("Studly")])),_:1})]),s("li",null,[a(t,{to:"#substr"},{default:e(()=>n[64]||(n[64]=[p("Substr")])),_:1})]),s("li",null,[a(t,{to:"#swap"},{default:e(()=>n[65]||(n[65]=[p("Swap")])),_:1})]),s("li",null,[a(t,{to:"#tap"},{default:e(()=>n[66]||(n[66]=[p("Tap")])),_:1})]),s("li",null,[a(t,{to:"#test"},{default:e(()=>n[67]||(n[67]=[p("Test")])),_:1})]),s("li",null,[a(t,{to:"#title"},{default:e(()=>n[68]||(n[68]=[p("Title")])),_:1})]),s("li",null,[a(t,{to:"#trim"},{default:e(()=>n[69]||(n[69]=[p("Trim")])),_:1})]),s("li",null,[a(t,{to:"#ucfirst"},{default:e(()=>n[70]||(n[70]=[p("UcFirst")])),_:1})]),s("li",null,[a(t,{to:"#ucsplit"},{default:e(()=>n[71]||(n[71]=[p("UcSplit")])),_:1})]),s("li",null,[a(t,{to:"#unless"},{default:e(()=>n[72]||(n[72]=[p("Unless")])),_:1})]),s("li",null,[a(t,{to:"#upper"},{default:e(()=>n[73]||(n[73]=[p("Upper")])),_:1})]),s("li",null,[a(t,{to:"#when"},{default:e(()=>n[74]||(n[74]=[p("When")])),_:1})]),s("li",null,[a(t,{to:"#whencontains"},{default:e(()=>n[75]||(n[75]=[p("WhenContains")])),_:1})]),s("li",null,[a(t,{to:"#whencontainsall"},{default:e(()=>n[76]||(n[76]=[p("WhenContainsAll")])),_:1})]),s("li",null,[a(t,{to:"#whenempty"},{default:e(()=>n[77]||(n[77]=[p("WhenEmpty")])),_:1})]),s("li",null,[a(t,{to:"#whenisascii"},{default:e(()=>n[78]||(n[78]=[p("WhenIsAscii")])),_:1})]),s("li",null,[a(t,{to:"#whennotempty"},{default:e(()=>n[79]||(n[79]=[p("WhenNotEmpty")])),_:1})]),s("li",null,[a(t,{to:"#whenstartswith"},{default:e(()=>n[80]||(n[80]=[p("WhenStartsWith")])),_:1})]),s("li",null,[a(t,{to:"#whenendswith"},{default:e(()=>n[81]||(n[81]=[p("WhenEndsWith")])),_:1})]),s("li",null,[a(t,{to:"#whenexactly"},{default:e(()=>n[82]||(n[82]=[p("WhenExactly")])),_:1})]),s("li",null,[a(t,{to:"#whennotexactly"},{default:e(()=>n[83]||(n[83]=[p("WhenNotExactly")])),_:1})]),s("li",null,[a(t,{to:"#whenis"},{default:e(()=>n[84]||(n[84]=[p("WhenIs")])),_:1})]),s("li",null,[a(t,{to:"#whenisulid"},{default:e(()=>n[85]||(n[85]=[p("WhenIsUlid")])),_:1})]),s("li",null,[a(t,{to:"#whenisuuid"},{default:e(()=>n[86]||(n[86]=[p("WhenIsUuid")])),_:1})]),s("li",null,[a(t,{to:"#whentest"},{default:e(()=>n[87]||(n[87]=[p("WhenTest")])),_:1})]),s("li",null,[a(t,{to:"#wordcount"},{default:e(()=>n[88]||(n[88]=[p("WordCount")])),_:1})]),s("li",null,[a(t,{to:"#words"},{default:e(()=>n[89]||(n[89]=[p("Words")])),_:1})])])])])]),n[91]||(n[91]=u(`

简介

Goravel 提供了一个流畅的字符串操作库,允许你轻松地操作字符串。可以使用 String 方法创建一个 string 实例,允许你调用各种方法,每个方法都会返回当前字符串实例,允许您将多个方法链接在一起。

import "github.com/goravel/framework/support/str"
+import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function m(g,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[90]||(n[90]=s("h1",{id:"strings",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#strings"},[s("span",null,"Strings")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#可用方法"},{default:e(()=>n[1]||(n[1]=[p("可用方法")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#of"},{default:e(()=>n[2]||(n[2]=[p("Of")])),_:1})]),s("li",null,[a(t,{to:"#after"},{default:e(()=>n[3]||(n[3]=[p("After")])),_:1})]),s("li",null,[a(t,{to:"#afterlast"},{default:e(()=>n[4]||(n[4]=[p("AfterLast")])),_:1})]),s("li",null,[a(t,{to:"#append"},{default:e(()=>n[5]||(n[5]=[p("Append")])),_:1})]),s("li",null,[a(t,{to:"#basename"},{default:e(()=>n[6]||(n[6]=[p("Basename")])),_:1})]),s("li",null,[a(t,{to:"#before"},{default:e(()=>n[7]||(n[7]=[p("Before")])),_:1})]),s("li",null,[a(t,{to:"#beforelast"},{default:e(()=>n[8]||(n[8]=[p("BeforeLast")])),_:1})]),s("li",null,[a(t,{to:"#between"},{default:e(()=>n[9]||(n[9]=[p("Between")])),_:1})]),s("li",null,[a(t,{to:"#betweenfirst"},{default:e(()=>n[10]||(n[10]=[p("BetweenFirst")])),_:1})]),s("li",null,[a(t,{to:"#camel"},{default:e(()=>n[11]||(n[11]=[p("Camel")])),_:1})]),s("li",null,[a(t,{to:"#charat"},{default:e(()=>n[12]||(n[12]=[p("CharAt")])),_:1})]),s("li",null,[a(t,{to:"#chopend"},{default:e(()=>n[13]||(n[13]=[p("ChopEnd")])),_:1})]),s("li",null,[a(t,{to:"#chopstart"},{default:e(()=>n[14]||(n[14]=[p("ChopStart")])),_:1})]),s("li",null,[a(t,{to:"#contains"},{default:e(()=>n[15]||(n[15]=[p("Contains")])),_:1})]),s("li",null,[a(t,{to:"#containsall"},{default:e(()=>n[16]||(n[16]=[p("ContainsAll")])),_:1})]),s("li",null,[a(t,{to:"#dirname"},{default:e(()=>n[17]||(n[17]=[p("Dirname")])),_:1})]),s("li",null,[a(t,{to:"#endswith"},{default:e(()=>n[18]||(n[18]=[p("EndsWith")])),_:1})]),s("li",null,[a(t,{to:"#exactly"},{default:e(()=>n[19]||(n[19]=[p("Exactly")])),_:1})]),s("li",null,[a(t,{to:"#except"},{default:e(()=>n[20]||(n[20]=[p("Except")])),_:1})]),s("li",null,[a(t,{to:"#explode"},{default:e(()=>n[21]||(n[21]=[p("Explode")])),_:1})]),s("li",null,[a(t,{to:"#finish"},{default:e(()=>n[22]||(n[22]=[p("Finish")])),_:1})]),s("li",null,[a(t,{to:"#headline"},{default:e(()=>n[23]||(n[23]=[p("Headline")])),_:1})]),s("li",null,[a(t,{to:"#is"},{default:e(()=>n[24]||(n[24]=[p("Is")])),_:1})]),s("li",null,[a(t,{to:"#isempty"},{default:e(()=>n[25]||(n[25]=[p("IsEmpty")])),_:1})]),s("li",null,[a(t,{to:"#isnotempty"},{default:e(()=>n[26]||(n[26]=[p("IsNotEmpty")])),_:1})]),s("li",null,[a(t,{to:"#isascii"},{default:e(()=>n[27]||(n[27]=[p("IsAscii")])),_:1})]),s("li",null,[a(t,{to:"#isslice"},{default:e(()=>n[28]||(n[28]=[p("IsSlice")])),_:1})]),s("li",null,[a(t,{to:"#ismap"},{default:e(()=>n[29]||(n[29]=[p("IsMap")])),_:1})]),s("li",null,[a(t,{to:"#isulid"},{default:e(()=>n[30]||(n[30]=[p("IsUlid")])),_:1})]),s("li",null,[a(t,{to:"#isuuid"},{default:e(()=>n[31]||(n[31]=[p("IsUuid")])),_:1})]),s("li",null,[a(t,{to:"#kebab"},{default:e(()=>n[32]||(n[32]=[p("Kebab")])),_:1})]),s("li",null,[a(t,{to:"#lcfirst"},{default:e(()=>n[33]||(n[33]=[p("LcFirst")])),_:1})]),s("li",null,[a(t,{to:"#length"},{default:e(()=>n[34]||(n[34]=[p("Length")])),_:1})]),s("li",null,[a(t,{to:"#limit"},{default:e(()=>n[35]||(n[35]=[p("Limit")])),_:1})]),s("li",null,[a(t,{to:"#lower"},{default:e(()=>n[36]||(n[36]=[p("Lower")])),_:1})]),s("li",null,[a(t,{to:"#ltrim"},{default:e(()=>n[37]||(n[37]=[p("LTrim")])),_:1})]),s("li",null,[a(t,{to:"#mask"},{default:e(()=>n[38]||(n[38]=[p("Mask")])),_:1})]),s("li",null,[a(t,{to:"#match"},{default:e(()=>n[39]||(n[39]=[p("Match")])),_:1})]),s("li",null,[a(t,{to:"#matchall"},{default:e(()=>n[40]||(n[40]=[p("MatchAll")])),_:1})]),s("li",null,[a(t,{to:"#ismatch"},{default:e(()=>n[41]||(n[41]=[p("IsMatch")])),_:1})]),s("li",null,[a(t,{to:"#newline"},{default:e(()=>n[42]||(n[42]=[p("NewLine")])),_:1})]),s("li",null,[a(t,{to:"#padboth"},{default:e(()=>n[43]||(n[43]=[p("PadBoth")])),_:1})]),s("li",null,[a(t,{to:"#padleft"},{default:e(()=>n[44]||(n[44]=[p("PadLeft")])),_:1})]),s("li",null,[a(t,{to:"#padright"},{default:e(()=>n[45]||(n[45]=[p("PadRight")])),_:1})]),s("li",null,[a(t,{to:"#pipe"},{default:e(()=>n[46]||(n[46]=[p("Pipe")])),_:1})]),s("li",null,[a(t,{to:"#prepend"},{default:e(()=>n[47]||(n[47]=[p("Prepend")])),_:1})]),s("li",null,[a(t,{to:"#remove"},{default:e(()=>n[48]||(n[48]=[p("Remove")])),_:1})]),s("li",null,[a(t,{to:"#repeat"},{default:e(()=>n[49]||(n[49]=[p("Repeat")])),_:1})]),s("li",null,[a(t,{to:"#replace"},{default:e(()=>n[50]||(n[50]=[p("Replace")])),_:1})]),s("li",null,[a(t,{to:"#replaceend"},{default:e(()=>n[51]||(n[51]=[p("ReplaceEnd")])),_:1})]),s("li",null,[a(t,{to:"#replacefirst"},{default:e(()=>n[52]||(n[52]=[p("ReplaceFirst")])),_:1})]),s("li",null,[a(t,{to:"#replacelast"},{default:e(()=>n[53]||(n[53]=[p("ReplaceLast")])),_:1})]),s("li",null,[a(t,{to:"#replacematches"},{default:e(()=>n[54]||(n[54]=[p("ReplaceMatches")])),_:1})]),s("li",null,[a(t,{to:"#replacestart"},{default:e(()=>n[55]||(n[55]=[p("ReplaceStart")])),_:1})]),s("li",null,[a(t,{to:"#rtrim"},{default:e(()=>n[56]||(n[56]=[p("RTrim")])),_:1})]),s("li",null,[a(t,{to:"#snake"},{default:e(()=>n[57]||(n[57]=[p("Snake")])),_:1})]),s("li",null,[a(t,{to:"#split"},{default:e(()=>n[58]||(n[58]=[p("Split")])),_:1})]),s("li",null,[a(t,{to:"#squish"},{default:e(()=>n[59]||(n[59]=[p("Squish")])),_:1})]),s("li",null,[a(t,{to:"#start"},{default:e(()=>n[60]||(n[60]=[p("Start")])),_:1})]),s("li",null,[a(t,{to:"#startswith"},{default:e(()=>n[61]||(n[61]=[p("StartsWith")])),_:1})]),s("li",null,[a(t,{to:"#string"},{default:e(()=>n[62]||(n[62]=[p("String")])),_:1})]),s("li",null,[a(t,{to:"#studly"},{default:e(()=>n[63]||(n[63]=[p("Studly")])),_:1})]),s("li",null,[a(t,{to:"#substr"},{default:e(()=>n[64]||(n[64]=[p("Substr")])),_:1})]),s("li",null,[a(t,{to:"#swap"},{default:e(()=>n[65]||(n[65]=[p("Swap")])),_:1})]),s("li",null,[a(t,{to:"#tap"},{default:e(()=>n[66]||(n[66]=[p("Tap")])),_:1})]),s("li",null,[a(t,{to:"#test"},{default:e(()=>n[67]||(n[67]=[p("Test")])),_:1})]),s("li",null,[a(t,{to:"#title"},{default:e(()=>n[68]||(n[68]=[p("Title")])),_:1})]),s("li",null,[a(t,{to:"#trim"},{default:e(()=>n[69]||(n[69]=[p("Trim")])),_:1})]),s("li",null,[a(t,{to:"#ucfirst"},{default:e(()=>n[70]||(n[70]=[p("UcFirst")])),_:1})]),s("li",null,[a(t,{to:"#ucsplit"},{default:e(()=>n[71]||(n[71]=[p("UcSplit")])),_:1})]),s("li",null,[a(t,{to:"#unless"},{default:e(()=>n[72]||(n[72]=[p("Unless")])),_:1})]),s("li",null,[a(t,{to:"#upper"},{default:e(()=>n[73]||(n[73]=[p("Upper")])),_:1})]),s("li",null,[a(t,{to:"#when"},{default:e(()=>n[74]||(n[74]=[p("When")])),_:1})]),s("li",null,[a(t,{to:"#whencontains"},{default:e(()=>n[75]||(n[75]=[p("WhenContains")])),_:1})]),s("li",null,[a(t,{to:"#whencontainsall"},{default:e(()=>n[76]||(n[76]=[p("WhenContainsAll")])),_:1})]),s("li",null,[a(t,{to:"#whenempty"},{default:e(()=>n[77]||(n[77]=[p("WhenEmpty")])),_:1})]),s("li",null,[a(t,{to:"#whenisascii"},{default:e(()=>n[78]||(n[78]=[p("WhenIsAscii")])),_:1})]),s("li",null,[a(t,{to:"#whennotempty"},{default:e(()=>n[79]||(n[79]=[p("WhenNotEmpty")])),_:1})]),s("li",null,[a(t,{to:"#whenstartswith"},{default:e(()=>n[80]||(n[80]=[p("WhenStartsWith")])),_:1})]),s("li",null,[a(t,{to:"#whenendswith"},{default:e(()=>n[81]||(n[81]=[p("WhenEndsWith")])),_:1})]),s("li",null,[a(t,{to:"#whenexactly"},{default:e(()=>n[82]||(n[82]=[p("WhenExactly")])),_:1})]),s("li",null,[a(t,{to:"#whennotexactly"},{default:e(()=>n[83]||(n[83]=[p("WhenNotExactly")])),_:1})]),s("li",null,[a(t,{to:"#whenis"},{default:e(()=>n[84]||(n[84]=[p("WhenIs")])),_:1})]),s("li",null,[a(t,{to:"#whenisulid"},{default:e(()=>n[85]||(n[85]=[p("WhenIsUlid")])),_:1})]),s("li",null,[a(t,{to:"#whenisuuid"},{default:e(()=>n[86]||(n[86]=[p("WhenIsUuid")])),_:1})]),s("li",null,[a(t,{to:"#whentest"},{default:e(()=>n[87]||(n[87]=[p("WhenTest")])),_:1})]),s("li",null,[a(t,{to:"#wordcount"},{default:e(()=>n[88]||(n[88]=[p("WordCount")])),_:1})]),s("li",null,[a(t,{to:"#words"},{default:e(()=>n[89]||(n[89]=[p("Words")])),_:1})])])])])]),n[91]||(n[91]=u(`

简介

Goravel 提供了一个流畅的字符串操作库,允许你轻松地操作字符串。可以使用 String 方法创建一个 string 实例,允许你调用各种方法,每个方法都会返回当前字符串实例,允许您将多个方法链接在一起。

import "github.com/goravel/framework/support/str"
 
 str.Of("  Goravel  ").Trim().Lower().UpperFirst().String() // "Goravel"
 

可用方法

Of

Of 方法从给定的字符串创建一个新的流畅字符串实例。

import "github.com/goravel/framework/support/str"
diff --git a/assets/t-shirt-DgVZ0NNq.js b/assets/t-shirt-DgVZ0NNq.js
new file mode 100644
index 00000000..7f439d9c
--- /dev/null
+++ b/assets/t-shirt-DgVZ0NNq.js
@@ -0,0 +1 @@
+const t="/t-shirt.jpg";export{t as _};
diff --git a/assets/task-scheduling.html-C99X9QwO.js b/assets/task-scheduling.html-11gBtef7.js
similarity index 99%
rename from assets/task-scheduling.html-C99X9QwO.js
rename to assets/task-scheduling.html-11gBtef7.js
index 099c9c1e..9fac8c57 100644
--- a/assets/task-scheduling.html-C99X9QwO.js
+++ b/assets/task-scheduling.html-11gBtef7.js
@@ -1,4 +1,4 @@
-import{_ as u,c as r,b as s,e,f as t,a as l,d as a,r as p,o as d}from"./app-ELDWQP0J.js";const k={},h={class:"table-of-contents"};function v(m,n){const o=p("router-link"),i=p("RouteLink"),c=p("CommentService");return d(),r("div",null,[n[14]||(n[14]=s("h1",{id:"task-scheduling",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#task-scheduling"},[s("span",null,"Task Scheduling")])],-1)),s("nav",h,[s("ul",null,[s("li",null,[e(o,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[e(o,{to:"#defining-schedules"},{default:t(()=>n[1]||(n[1]=[a("Defining Schedules")])),_:1}),s("ul",null,[s("li",null,[e(o,{to:"#scheduling-artisan-commands"},{default:t(()=>n[2]||(n[2]=[a("Scheduling Artisan Commands")])),_:1})]),s("li",null,[e(o,{to:"#logging-level"},{default:t(()=>n[3]||(n[3]=[a("Logging Level")])),_:1})]),s("li",null,[e(o,{to:"#schedule-frequency-options"},{default:t(()=>n[4]||(n[4]=[a("Schedule Frequency Options")])),_:1})]),s("li",null,[e(o,{to:"#preventing-task-overlaps"},{default:t(()=>n[5]||(n[5]=[a("Preventing Task Overlaps")])),_:1})]),s("li",null,[e(o,{to:"#running-tasks-on-one-server"},{default:t(()=>n[6]||(n[6]=[a("Running Tasks On One Server")])),_:1})])])]),s("li",null,[e(o,{to:"#running-the-scheduler"},{default:t(()=>n[7]||(n[7]=[a("Running The Scheduler")])),_:1})]),s("li",null,[e(o,{to:"#stopping-the-scheduler"},{default:t(()=>n[8]||(n[8]=[a("Stopping The Scheduler")])),_:1})])])]),n[15]||(n[15]=l(`

Introduction

In the past, you might need to create a cron configuration entry for each task that needed scheduling on your server. However, this approach can quickly become a pain as your task schedule is not in source control, and you have to SSH into your server to view or add/edit cron entries.

Goravel's command scheduler offers a fresh approach to managing scheduled tasks on your server. With the scheduler, you can easily and clearly define your command schedule within your Goravel application. Using the scheduler, you only need to create a single cron entry on your server.

Defining Schedules

To schedule tasks for your application, you can define them in the Schedule method in app\\console\\kernel.go. Let's consider an example to understand this better. In this case, we want to schedule a closure that will run every day at midnight. Inside this closure, we will execute a database query to clear a table:

package console
+import{_ as u,c as r,b as s,e,f as t,a as l,d as a,r as p,o as d}from"./app-Ewo6p9aM.js";const k={},h={class:"table-of-contents"};function v(m,n){const o=p("router-link"),i=p("RouteLink"),c=p("CommentService");return d(),r("div",null,[n[14]||(n[14]=s("h1",{id:"task-scheduling",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#task-scheduling"},[s("span",null,"Task Scheduling")])],-1)),s("nav",h,[s("ul",null,[s("li",null,[e(o,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[e(o,{to:"#defining-schedules"},{default:t(()=>n[1]||(n[1]=[a("Defining Schedules")])),_:1}),s("ul",null,[s("li",null,[e(o,{to:"#scheduling-artisan-commands"},{default:t(()=>n[2]||(n[2]=[a("Scheduling Artisan Commands")])),_:1})]),s("li",null,[e(o,{to:"#logging-level"},{default:t(()=>n[3]||(n[3]=[a("Logging Level")])),_:1})]),s("li",null,[e(o,{to:"#schedule-frequency-options"},{default:t(()=>n[4]||(n[4]=[a("Schedule Frequency Options")])),_:1})]),s("li",null,[e(o,{to:"#preventing-task-overlaps"},{default:t(()=>n[5]||(n[5]=[a("Preventing Task Overlaps")])),_:1})]),s("li",null,[e(o,{to:"#running-tasks-on-one-server"},{default:t(()=>n[6]||(n[6]=[a("Running Tasks On One Server")])),_:1})])])]),s("li",null,[e(o,{to:"#running-the-scheduler"},{default:t(()=>n[7]||(n[7]=[a("Running The Scheduler")])),_:1})]),s("li",null,[e(o,{to:"#stopping-the-scheduler"},{default:t(()=>n[8]||(n[8]=[a("Stopping The Scheduler")])),_:1})])])]),n[15]||(n[15]=l(`

Introduction

In the past, you might need to create a cron configuration entry for each task that needed scheduling on your server. However, this approach can quickly become a pain as your task schedule is not in source control, and you have to SSH into your server to view or add/edit cron entries.

Goravel's command scheduler offers a fresh approach to managing scheduled tasks on your server. With the scheduler, you can easily and clearly define your command schedule within your Goravel application. Using the scheduler, you only need to create a single cron entry on your server.

Defining Schedules

To schedule tasks for your application, you can define them in the Schedule method in app\\console\\kernel.go. Let's consider an example to understand this better. In this case, we want to schedule a closure that will run every day at midnight. Inside this closure, we will execute a database query to clear a table:

package console
 
 import (
   "github.com/goravel/framework/contracts/console"
diff --git a/assets/task-scheduling.html-CQ8MoYQs.js b/assets/task-scheduling.html-BbpiH0gg.js
similarity index 99%
rename from assets/task-scheduling.html-CQ8MoYQs.js
rename to assets/task-scheduling.html-BbpiH0gg.js
index 2c257e6a..f506c21e 100644
--- a/assets/task-scheduling.html-CQ8MoYQs.js
+++ b/assets/task-scheduling.html-BbpiH0gg.js
@@ -1,4 +1,4 @@
-import{_ as u,c as d,b as s,e as t,f as e,a as o,d as a,r as l,o as r}from"./app-ELDWQP0J.js";const k={},v={class:"table-of-contents"};function m(g,n){const p=l("router-link"),c=l("RouteLink"),i=l("CommentService");return r(),d("div",null,[n[14]||(n[14]=s("h1",{id:"任务调度",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#任务调度"},[s("span",null,"任务调度")])],-1)),s("nav",v,[s("ul",null,[s("li",null,[t(p,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[a("简介")])),_:1})]),s("li",null,[t(p,{to:"#定义调度"},{default:e(()=>n[1]||(n[1]=[a("定义调度")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#artisan-命令调度"},{default:e(()=>n[2]||(n[2]=[a("Artisan 命令调度")])),_:1})]),s("li",null,[t(p,{to:"#日志级别"},{default:e(()=>n[3]||(n[3]=[a("日志级别")])),_:1})]),s("li",null,[t(p,{to:"#调度频率选项"},{default:e(()=>n[4]||(n[4]=[a("调度频率选项")])),_:1})]),s("li",null,[t(p,{to:"#避免任务重复"},{default:e(()=>n[5]||(n[5]=[a("避免任务重复")])),_:1})]),s("li",null,[t(p,{to:"#任务只运行在一台服务器上"},{default:e(()=>n[6]||(n[6]=[a("任务只运行在一台服务器上")])),_:1})])])]),s("li",null,[t(p,{to:"#运行调度程序"},{default:e(()=>n[7]||(n[7]=[a("运行调度程序")])),_:1})]),s("li",null,[t(p,{to:"#关闭调度程序"},{default:e(()=>n[8]||(n[8]=[a("关闭调度程序")])),_:1})])])]),n[15]||(n[15]=o(`

简介

过去,你可能需要在服务器上为每一个调度任务去创建 Cron 条目。因为这些任务的调度不是通过代码控制的,你要查看或新增任务调度都需要通过 SSH 远程登录到服务器上去操作,所以这种方式很快会让人变得痛苦不堪。

Goravel 的命令行调度器允许你在 Goravel 中清晰明了地定义命令调度。在使用这个任务调度器时,你只需要在你的服务器上创建单个 Cron 入口。

定义调度

你可以在 app\\console\\kernel.goSchedule 方法中定义所有的调度任务。在开始之前,我们来看一个例子:我们计划每天午夜执行一个 闭包,这个 闭包 会执行一次数据库语句去清空一张表:

package console
+import{_ as u,c as d,b as s,e as t,f as e,a as o,d as a,r as l,o as r}from"./app-Ewo6p9aM.js";const k={},v={class:"table-of-contents"};function m(g,n){const p=l("router-link"),c=l("RouteLink"),i=l("CommentService");return r(),d("div",null,[n[14]||(n[14]=s("h1",{id:"任务调度",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#任务调度"},[s("span",null,"任务调度")])],-1)),s("nav",v,[s("ul",null,[s("li",null,[t(p,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[a("简介")])),_:1})]),s("li",null,[t(p,{to:"#定义调度"},{default:e(()=>n[1]||(n[1]=[a("定义调度")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#artisan-命令调度"},{default:e(()=>n[2]||(n[2]=[a("Artisan 命令调度")])),_:1})]),s("li",null,[t(p,{to:"#日志级别"},{default:e(()=>n[3]||(n[3]=[a("日志级别")])),_:1})]),s("li",null,[t(p,{to:"#调度频率选项"},{default:e(()=>n[4]||(n[4]=[a("调度频率选项")])),_:1})]),s("li",null,[t(p,{to:"#避免任务重复"},{default:e(()=>n[5]||(n[5]=[a("避免任务重复")])),_:1})]),s("li",null,[t(p,{to:"#任务只运行在一台服务器上"},{default:e(()=>n[6]||(n[6]=[a("任务只运行在一台服务器上")])),_:1})])])]),s("li",null,[t(p,{to:"#运行调度程序"},{default:e(()=>n[7]||(n[7]=[a("运行调度程序")])),_:1})]),s("li",null,[t(p,{to:"#关闭调度程序"},{default:e(()=>n[8]||(n[8]=[a("关闭调度程序")])),_:1})])])]),n[15]||(n[15]=o(`

简介

过去,你可能需要在服务器上为每一个调度任务去创建 Cron 条目。因为这些任务的调度不是通过代码控制的,你要查看或新增任务调度都需要通过 SSH 远程登录到服务器上去操作,所以这种方式很快会让人变得痛苦不堪。

Goravel 的命令行调度器允许你在 Goravel 中清晰明了地定义命令调度。在使用这个任务调度器时,你只需要在你的服务器上创建单个 Cron 入口。

定义调度

你可以在 app\\console\\kernel.goSchedule 方法中定义所有的调度任务。在开始之前,我们来看一个例子:我们计划每天午夜执行一个 闭包,这个 闭包 会执行一次数据库语句去清空一张表:

package console
 
 import (
   "github.com/goravel/framework/contracts/console"
diff --git a/assets/v1.1.html-B6iPtN3Y.js b/assets/v1.1.html-Bjnqtk-K.js
similarity index 99%
rename from assets/v1.1.html-B6iPtN3Y.js
rename to assets/v1.1.html-Bjnqtk-K.js
index 392ff8f2..52a0475e 100644
--- a/assets/v1.1.html-B6iPtN3Y.js
+++ b/assets/v1.1.html-Bjnqtk-K.js
@@ -1,4 +1,4 @@
-import{_ as p,c,b as e,e as s,f as t,a as d,d as n,r as l,o as u}from"./app-ELDWQP0J.js";const h={},f={class:"table-of-contents"};function g(v,a){const o=l("router-link"),r=l("RouteLink"),i=l("CommentService");return u(),c("div",null,[a[12]||(a[12]=e("h1",{id:"从-v1-0-升级到-v1-1",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#从-v1-0-升级到-v1-1"},[e("span",null,"从 v1.0 升级到 v1.1")])],-1)),e("nav",f,[e("ul",null,[e("li",null,[s(o,{to:"#高影响变化"},{default:t(()=>a[0]||(a[0]=[n("高影响变化")])),_:1})]),e("li",null,[s(o,{to:"#中影响变化"},{default:t(()=>a[1]||(a[1]=[n("中影响变化")])),_:1})]),e("li",null,[s(o,{to:"#低影响变化"},{default:t(()=>a[2]||(a[2]=[n("低影响变化")])),_:1})]),e("li",null,[s(o,{to:"#升级指南"},{default:t(()=>a[3]||(a[3]=[n("升级指南")])),_:1}),e("ul",null,[e("li",null,[s(o,{to:"#更新依赖"},{default:t(()=>a[4]||(a[4]=[n("更新依赖")])),_:1})]),e("li",null,[s(o,{to:"#更新-providers"},{default:t(()=>a[5]||(a[5]=[n("更新 Providers")])),_:1})]),e("li",null,[s(o,{to:"#新增-config"},{default:t(()=>a[6]||(a[6]=[n("新增 Config")])),_:1})]),e("li",null,[s(o,{to:"#facades-cache-新增方法"},{default:t(()=>a[7]||(a[7]=[n("facades.Cache 新增方法")])),_:1})]),e("li",null,[s(o,{to:"#新增-facades-auth"},{default:t(()=>a[8]||(a[8]=[n("新增 facades.Auth")])),_:1})])])])])]),a[13]||(a[13]=d(`

高影响变化

中影响变化

低影响变化

升级指南

预计升级时间:1 分钟

更新依赖

影响可能性:高

go.mod 中更新依赖:

github.com/goravel/framework v1.1.1
+import{_ as p,c,b as e,e as s,f as t,a as d,d as n,r as l,o as u}from"./app-Ewo6p9aM.js";const h={},f={class:"table-of-contents"};function g(v,a){const o=l("router-link"),r=l("RouteLink"),i=l("CommentService");return u(),c("div",null,[a[12]||(a[12]=e("h1",{id:"从-v1-0-升级到-v1-1",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#从-v1-0-升级到-v1-1"},[e("span",null,"从 v1.0 升级到 v1.1")])],-1)),e("nav",f,[e("ul",null,[e("li",null,[s(o,{to:"#高影响变化"},{default:t(()=>a[0]||(a[0]=[n("高影响变化")])),_:1})]),e("li",null,[s(o,{to:"#中影响变化"},{default:t(()=>a[1]||(a[1]=[n("中影响变化")])),_:1})]),e("li",null,[s(o,{to:"#低影响变化"},{default:t(()=>a[2]||(a[2]=[n("低影响变化")])),_:1})]),e("li",null,[s(o,{to:"#升级指南"},{default:t(()=>a[3]||(a[3]=[n("升级指南")])),_:1}),e("ul",null,[e("li",null,[s(o,{to:"#更新依赖"},{default:t(()=>a[4]||(a[4]=[n("更新依赖")])),_:1})]),e("li",null,[s(o,{to:"#更新-providers"},{default:t(()=>a[5]||(a[5]=[n("更新 Providers")])),_:1})]),e("li",null,[s(o,{to:"#新增-config"},{default:t(()=>a[6]||(a[6]=[n("新增 Config")])),_:1})]),e("li",null,[s(o,{to:"#facades-cache-新增方法"},{default:t(()=>a[7]||(a[7]=[n("facades.Cache 新增方法")])),_:1})]),e("li",null,[s(o,{to:"#新增-facades-auth"},{default:t(()=>a[8]||(a[8]=[n("新增 facades.Auth")])),_:1})])])])])]),a[13]||(a[13]=d(`

高影响变化

中影响变化

低影响变化

升级指南

预计升级时间:1 分钟

更新依赖

影响可能性:高

go.mod 中更新依赖:

github.com/goravel/framework v1.1.1
 

更新 Providers

影响可能性:高

config.app.go 中新增 Auth Provider:

"github.com/goravel/framework/auth"
 
 "providers": []contracts.ServiceProvider{
diff --git a/assets/v1.1.html-D_yWCxPz.js b/assets/v1.1.html-DEdzSCtL.js
similarity index 99%
rename from assets/v1.1.html-D_yWCxPz.js
rename to assets/v1.1.html-DEdzSCtL.js
index 94a02124..b7654352 100644
--- a/assets/v1.1.html-D_yWCxPz.js
+++ b/assets/v1.1.html-DEdzSCtL.js
@@ -1,4 +1,4 @@
-import{_ as o,c as d,a as r,b as p,d as a,e as n,f as c,r as s,o as l}from"./app-ELDWQP0J.js";const h={};function g(u,e){const t=s("RouteLink"),i=s("CommentService");return l(),d("div",null,[e[3]||(e[3]=r(`

Upgrading To v1.1 From v1.0

High Impact Changes

Medium Impact Changes

Low Impact Changes

Upgrade Guide

Estimated Upgrade Time: 1 Minutes

Updating Dependencies

Likelihood Of Impact: High

Update dependencies in the go.mod file:

github.com/goravel/framework v1.1.1
+import{_ as o,c as d,a as r,b as p,d as a,e as n,f as c,r as s,o as l}from"./app-Ewo6p9aM.js";const h={};function g(u,e){const t=s("RouteLink"),i=s("CommentService");return l(),d("div",null,[e[3]||(e[3]=r(`

Upgrading To v1.1 From v1.0

High Impact Changes

Medium Impact Changes

Low Impact Changes

Upgrade Guide

Estimated Upgrade Time: 1 Minutes

Updating Dependencies

Likelihood Of Impact: High

Update dependencies in the go.mod file:

github.com/goravel/framework v1.1.1
 

Update Providers

Likelihood Of Impact: High

Add Auth Provider in the config.app.go file:

"github.com/goravel/framework/auth"
 
 "providers": []contracts.ServiceProvider{
diff --git a/assets/v1.10.html-XUJL9iAA.js b/assets/v1.10.html-B8rfcGOk.js
similarity index 99%
rename from assets/v1.10.html-XUJL9iAA.js
rename to assets/v1.10.html-B8rfcGOk.js
index 5669b689..97d01f05 100644
--- a/assets/v1.10.html-XUJL9iAA.js
+++ b/assets/v1.10.html-B8rfcGOk.js
@@ -1,4 +1,4 @@
-import{_ as d,c as u,b as t,e as l,f as a,a as p,d as e,r,o as E}from"./app-ELDWQP0J.js";const c={},f={class:"table-of-contents"};function m(g,n){const o=r("router-link"),s=r("RouteLink"),i=r("CommentService");return E(),u("div",null,[n[90]||(n[90]=t("h1",{id:"从-v1-9-升级到-v1-10",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#从-v1-9-升级到-v1-10"},[t("span",null,"从 v1.9 升级到 v1.10")])],-1)),t("nav",f,[t("ul",null,[t("li",null,[l(o,{to:"#令人兴奋的新功能-🎉"},{default:a(()=>n[0]||(n[0]=[e("令人兴奋的新功能 🎉")])),_:1})]),t("li",null,[l(o,{to:"#功能增强-🚀"},{default:a(()=>n[1]||(n[1]=[e("功能增强 🚀")])),_:1})]),t("li",null,[l(o,{to:"#破坏性变化-🛠"},{default:a(()=>n[2]||(n[2]=[e("破坏性变化 🛠")])),_:1})]),t("li",null,[l(o,{to:"#升级指南"},{default:a(()=>n[3]||(n[3]=[e("升级指南")])),_:1}),t("ul",null,[t("li",null,[l(o,{to:"#更新依赖"},{default:a(()=>n[4]||(n[4]=[e("更新依赖")])),_:1})]),t("li",null,[l(o,{to:"#加密解密"},{default:a(()=>n[5]||(n[5]=[e("加密解密")])),_:1})]),t("li",null,[l(o,{to:"#哈希"},{default:a(()=>n[6]||(n[6]=[e("哈希")])),_:1})]),t("li",null,[l(o,{to:"#新增路由限流器"},{default:a(()=>n[7]||(n[7]=[e("新增路由限流器")])),_:1})]),t("li",null,[l(o,{to:"#优化-http-启动方式"},{default:a(()=>n[8]||(n[8]=[e("优化 HTTP 启动方式")])),_:1})]),t("li",null,[l(o,{to:"#优化-grpc-启动方式"},{default:a(()=>n[9]||(n[9]=[e("优化 GRPC 启动方式")])),_:1})]),t("li",null,[l(o,{to:"#增加控制日志输出到控制台的配置"},{default:a(()=>n[10]||(n[10]=[e("增加控制日志输出到控制台的配置")])),_:1})]),t("li",null,[l(o,{to:"#request-修改、新增方法"},{default:a(()=>n[11]||(n[11]=[e("Request 修改、新增方法")])),_:1})]),t("li",null,[l(o,{to:"#队列支持延迟调度"},{default:a(()=>n[12]||(n[12]=[e("队列支持延迟调度")])),_:1})]),t("li",null,[l(o,{to:"#orm-connection-支持配置表名前缀与单复数"},{default:a(()=>n[13]||(n[13]=[e("ORM Connection 支持配置表名前缀与单复数")])),_:1})]),t("li",null,[l(o,{to:"#新增-docker-compose-yml-文件"},{default:a(()=>n[14]||(n[14]=[e("新增 docker-compose.yml 文件")])),_:1})]),t("li",null,[l(o,{to:"#优化-orm"},{default:a(()=>n[15]||(n[15]=[e("优化 Orm")])),_:1})]),t("li",null,[l(o,{to:"#迁移文件中支持执行多条-sql-语句"},{default:a(()=>n[16]||(n[16]=[e("迁移文件中支持执行多条 SQL 语句")])),_:1})]),t("li",null,[l(o,{to:"#文件系统新增-minio-驱动"},{default:a(()=>n[17]||(n[17]=[e("文件系统新增 minio 驱动")])),_:1})]),t("li",null,[l(o,{to:"#contracts-http-增加-net-http-的-status-映射"},{default:a(()=>n[18]||(n[18]=[e("contracts/http 增加 net/http 的 Status 映射")])),_:1})]),t("li",null,[l(o,{to:"#app-key-必填"},{default:a(()=>n[19]||(n[19]=[e("APP_KEY 必填")])),_:1})]),t("li",null,[l(o,{to:"#表单验证中方法新增-ctx-参数"},{default:a(()=>n[20]||(n[20]=[e("表单验证中方法新增 ctx 参数")])),_:1})]),t("li",null,[l(o,{to:"#facades-auth-parse-新增-payload-返回"},{default:a(()=>n[21]||(n[21]=[e("facades.Auth.Parse 新增 payload 返回")])),_:1})]),t("li",null,[l(o,{to:"#orm-的部分方法新增返回值"},{default:a(()=>n[22]||(n[22]=[e("Orm 的部分方法新增返回值")])),_:1})]),t("li",null,[l(o,{to:"#facades-orm-新增模型事件"},{default:a(()=>n[23]||(n[23]=[e("facades.Orm 新增模型事件")])),_:1})]),t("li",null,[l(o,{to:"#facades-cache-新增、优化方法"},{default:a(()=>n[24]||(n[24]=[e("facades.Cache 新增、优化方法")])),_:1})]),t("li",null,[l(o,{to:"#facades-route-支持-fallback-路由"},{default:a(()=>n[25]||(n[25]=[e("facades.Route 支持 Fallback 路由")])),_:1})]),t("li",null,[l(o,{to:"#facades-orm-支持原生表达式"},{default:a(()=>n[26]||(n[26]=[e("facades.Orm 支持原生表达式")])),_:1})])])])])]),n[91]||(n[91]=p(`

令人兴奋的新功能 🎉

功能增强 🚀

破坏性变化 🛠

升级指南

预计升级时间:20 分钟

更新依赖

go.mod 中更新依赖:

go get -u github.com/goravel/framework@v1.10.1 && go mod tidy
+import{_ as d,c as u,b as t,e as l,f as a,a as p,d as e,r,o as E}from"./app-Ewo6p9aM.js";const c={},f={class:"table-of-contents"};function m(g,n){const o=r("router-link"),s=r("RouteLink"),i=r("CommentService");return E(),u("div",null,[n[90]||(n[90]=t("h1",{id:"从-v1-9-升级到-v1-10",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#从-v1-9-升级到-v1-10"},[t("span",null,"从 v1.9 升级到 v1.10")])],-1)),t("nav",f,[t("ul",null,[t("li",null,[l(o,{to:"#令人兴奋的新功能-🎉"},{default:a(()=>n[0]||(n[0]=[e("令人兴奋的新功能 🎉")])),_:1})]),t("li",null,[l(o,{to:"#功能增强-🚀"},{default:a(()=>n[1]||(n[1]=[e("功能增强 🚀")])),_:1})]),t("li",null,[l(o,{to:"#破坏性变化-🛠"},{default:a(()=>n[2]||(n[2]=[e("破坏性变化 🛠")])),_:1})]),t("li",null,[l(o,{to:"#升级指南"},{default:a(()=>n[3]||(n[3]=[e("升级指南")])),_:1}),t("ul",null,[t("li",null,[l(o,{to:"#更新依赖"},{default:a(()=>n[4]||(n[4]=[e("更新依赖")])),_:1})]),t("li",null,[l(o,{to:"#加密解密"},{default:a(()=>n[5]||(n[5]=[e("加密解密")])),_:1})]),t("li",null,[l(o,{to:"#哈希"},{default:a(()=>n[6]||(n[6]=[e("哈希")])),_:1})]),t("li",null,[l(o,{to:"#新增路由限流器"},{default:a(()=>n[7]||(n[7]=[e("新增路由限流器")])),_:1})]),t("li",null,[l(o,{to:"#优化-http-启动方式"},{default:a(()=>n[8]||(n[8]=[e("优化 HTTP 启动方式")])),_:1})]),t("li",null,[l(o,{to:"#优化-grpc-启动方式"},{default:a(()=>n[9]||(n[9]=[e("优化 GRPC 启动方式")])),_:1})]),t("li",null,[l(o,{to:"#增加控制日志输出到控制台的配置"},{default:a(()=>n[10]||(n[10]=[e("增加控制日志输出到控制台的配置")])),_:1})]),t("li",null,[l(o,{to:"#request-修改、新增方法"},{default:a(()=>n[11]||(n[11]=[e("Request 修改、新增方法")])),_:1})]),t("li",null,[l(o,{to:"#队列支持延迟调度"},{default:a(()=>n[12]||(n[12]=[e("队列支持延迟调度")])),_:1})]),t("li",null,[l(o,{to:"#orm-connection-支持配置表名前缀与单复数"},{default:a(()=>n[13]||(n[13]=[e("ORM Connection 支持配置表名前缀与单复数")])),_:1})]),t("li",null,[l(o,{to:"#新增-docker-compose-yml-文件"},{default:a(()=>n[14]||(n[14]=[e("新增 docker-compose.yml 文件")])),_:1})]),t("li",null,[l(o,{to:"#优化-orm"},{default:a(()=>n[15]||(n[15]=[e("优化 Orm")])),_:1})]),t("li",null,[l(o,{to:"#迁移文件中支持执行多条-sql-语句"},{default:a(()=>n[16]||(n[16]=[e("迁移文件中支持执行多条 SQL 语句")])),_:1})]),t("li",null,[l(o,{to:"#文件系统新增-minio-驱动"},{default:a(()=>n[17]||(n[17]=[e("文件系统新增 minio 驱动")])),_:1})]),t("li",null,[l(o,{to:"#contracts-http-增加-net-http-的-status-映射"},{default:a(()=>n[18]||(n[18]=[e("contracts/http 增加 net/http 的 Status 映射")])),_:1})]),t("li",null,[l(o,{to:"#app-key-必填"},{default:a(()=>n[19]||(n[19]=[e("APP_KEY 必填")])),_:1})]),t("li",null,[l(o,{to:"#表单验证中方法新增-ctx-参数"},{default:a(()=>n[20]||(n[20]=[e("表单验证中方法新增 ctx 参数")])),_:1})]),t("li",null,[l(o,{to:"#facades-auth-parse-新增-payload-返回"},{default:a(()=>n[21]||(n[21]=[e("facades.Auth.Parse 新增 payload 返回")])),_:1})]),t("li",null,[l(o,{to:"#orm-的部分方法新增返回值"},{default:a(()=>n[22]||(n[22]=[e("Orm 的部分方法新增返回值")])),_:1})]),t("li",null,[l(o,{to:"#facades-orm-新增模型事件"},{default:a(()=>n[23]||(n[23]=[e("facades.Orm 新增模型事件")])),_:1})]),t("li",null,[l(o,{to:"#facades-cache-新增、优化方法"},{default:a(()=>n[24]||(n[24]=[e("facades.Cache 新增、优化方法")])),_:1})]),t("li",null,[l(o,{to:"#facades-route-支持-fallback-路由"},{default:a(()=>n[25]||(n[25]=[e("facades.Route 支持 Fallback 路由")])),_:1})]),t("li",null,[l(o,{to:"#facades-orm-支持原生表达式"},{default:a(()=>n[26]||(n[26]=[e("facades.Orm 支持原生表达式")])),_:1})])])])])]),n[91]||(n[91]=p(`

令人兴奋的新功能 🎉

功能增强 🚀

破坏性变化 🛠

升级指南

预计升级时间:20 分钟

更新依赖

go.mod 中更新依赖:

go get -u github.com/goravel/framework@v1.10.1 && go mod tidy
 

加密解密

Version: v1.10.0

新增 facades.Crypt

  1. config/app.go 文件 providers 新增 &crypt.ServiceProvider{},
`,15)),t("p",null,[l(s,{to:"/zh/security/encryption.html"},{default:a(()=>n[27]||(n[27]=[e("查看文档")])),_:1})]),n[92]||(n[92]=p('

哈希

Version: v1.10.0

新增 facades.Hash

  1. config/app.go 文件 providers 新增 &hash.ServiceProvider{},

  2. 新增 config/hashing.go 文件;

',4)),t("p",null,[l(s,{to:"/zh/security/hashing.html"},{default:a(()=>n[28]||(n[28]=[e("查看文档")])),_:1})]),n[93]||(n[93]=t("h3",{id:"新增路由限流器",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#新增路由限流器"},[t("span",null,"新增路由限流器")])],-1)),n[94]||(n[94]=t("p",null,"Version: v1.10.0",-1)),t("p",null,[l(s,{to:"/zh/the-basics/routing.html#%E9%80%9F%E7%8E%87%E9%99%90%E5%88%B6"},{default:a(()=>n[29]||(n[29]=[e("查看文档")])),_:1})]),n[95]||(n[95]=t("h3",{id:"优化-http-启动方式",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#优化-http-启动方式"},[t("span",null,"优化 HTTP 启动方式")])],-1)),n[96]||(n[96]=t("p",null,"Version: v1.10.0",-1)),t("ol",null,[n[35]||(n[35]=p('
  • 新增 config/http.go 配置文件,详见文件
  • facades.Route.Run 方法不再需要传参,默认读取 http.hosthttp.port(您无需修改代码,向下兼容);
  • facades.Route.RunTLS 方法不再需要传参,默认读取 http.tls.hosthttp.tls.porthttp.tls.ssl.certhttp.tls.ssl.key,如果用到,需修改代码;
  • ',3)),t("li",null,[n[31]||(n[31]=e("新增 ")),n[32]||(n[32]=t("code",null,"facades.Route.RunTLSWithCert",-1)),n[33]||(n[33]=e(" 方法,")),l(s,{to:"/zh/the-basics/routing.html#%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1%E5%99%A8"},{default:a(()=>n[30]||(n[30]=[e("详见文档")])),_:1}),n[34]||(n[34]=e(";"))]),n[36]||(n[36]=t("li",null,[e("移动配置 "),t("code",null,"app.url"),e(", "),t("code",null,"app.host"),e(" 到 "),t("code",null,"http.url"),e(", "),t("code",null,"http.host"),e(";")],-1))]),n[97]||(n[97]=p('

    优化 GRPC 启动方式

    Version: v1.10.0

    facades.Grpc.Run 方法不再需要传参,默认读取 grpc.hostgrpc.port(您无需修改代码,向下兼容);

    增加控制日志输出到控制台的配置

    Version: v1.10.0

    config/logging.go 文件中,single, daily channel 新增 print 配置,可以控制日志是否输出到控制台,详见文件

    Request 修改、新增方法

    Version: v1.10.0

    1. Input 方法由仅获取路由参数,修改为根据以下顺序获取数据:json, form, query, route。注意:json 只能获取一维数据,否则将返回空;
    2. 新增 Route 方法替代原有 Input 方法功能;
    3. QueryForm 方法默认值修改为不必填;
    4. 新增以下方法:
    ',9)),t("table",null,[n[57]||(n[57]=t("thead",null,[t("tr",null,[t("th",null,"方法名"),t("th",null,"作用")])],-1)),t("tbody",null,[t("tr",null,[n[38]||(n[38]=t("td",null,"Route",-1)),t("td",null,[l(s,{to:"/zh/the-basics/request.html#%E8%8E%B7%E5%8F%96%E8%B7%AF%E7%94%B1%E4%B8%AD%E7%9A%84%E5%8F%82%E6%95%B0"},{default:a(()=>n[37]||(n[37]=[e("获取路由中的参数")])),_:1})])]),t("tr",null,[n[40]||(n[40]=t("td",null,"RouteInt",-1)),t("td",null,[l(s,{to:"/zh/the-basics/request.html#%E8%8E%B7%E5%8F%96%E8%B7%AF%E7%94%B1%E4%B8%AD%E7%9A%84%E5%8F%82%E6%95%B0"},{default:a(()=>n[39]||(n[39]=[e("获取路由中的参数")])),_:1})])]),t("tr",null,[n[42]||(n[42]=t("td",null,"RouteInt64",-1)),t("td",null,[l(s,{to:"/zh/the-basics/request.html#%E8%8E%B7%E5%8F%96%E8%B7%AF%E7%94%B1%E4%B8%AD%E7%9A%84%E5%8F%82%E6%95%B0"},{default:a(()=>n[41]||(n[41]=[e("获取路由中的参数")])),_:1})])]),t("tr",null,[n[44]||(n[44]=t("td",null,"QueryInt",-1)),t("td",null,[l(s,{to:"/zh/the-basics/request.html#%E8%8E%B7%E5%8F%96%E8%B7%AF%E7%94%B1%E4%BC%A0%E5%85%A5%E7%9A%84%E5%8F%82%E6%95%B0"},{default:a(()=>n[43]||(n[43]=[e("获取路由传入的参数")])),_:1})])]),t("tr",null,[n[46]||(n[46]=t("td",null,"QueryInt64",-1)),t("td",null,[l(s,{to:"/zh/the-basics/request.html#%E8%8E%B7%E5%8F%96%E8%B7%AF%E7%94%B1%E4%BC%A0%E5%85%A5%E7%9A%84%E5%8F%82%E6%95%B0"},{default:a(()=>n[45]||(n[45]=[e("获取路由传入的参数")])),_:1})])]),t("tr",null,[n[48]||(n[48]=t("td",null,"QueryBool",-1)),t("td",null,[l(s,{to:"/zh/the-basics/request.html#%E8%8E%B7%E5%8F%96%E8%B7%AF%E7%94%B1%E4%BC%A0%E5%85%A5%E7%9A%84%E5%8F%82%E6%95%B0"},{default:a(()=>n[47]||(n[47]=[e("获取路由传入的参数")])),_:1})])]),t("tr",null,[n[50]||(n[50]=t("td",null,"InputInt",-1)),t("td",null,[l(s,{to:"/zh/the-basics/request.html#%E8%8E%B7%E5%8F%96%E8%B7%AF%E7%94%B1%E4%BC%A0%E5%85%A5%E7%9A%84%E5%8F%82%E6%95%B0"},{default:a(()=>n[49]||(n[49]=[e("获取路由传入的参数")])),_:1})])]),t("tr",null,[n[52]||(n[52]=t("td",null,"InputInt64",-1)),t("td",null,[l(s,{to:"/zh/the-basics/request.html#%E8%8E%B7%E5%8F%96%E8%B7%AF%E7%94%B1%E4%BC%A0%E5%85%A5%E7%9A%84%E5%8F%82%E6%95%B0"},{default:a(()=>n[51]||(n[51]=[e("获取路由传入的参数")])),_:1})])]),t("tr",null,[n[54]||(n[54]=t("td",null,"InputBool",-1)),t("td",null,[l(s,{to:"/zh/the-basics/request.html#%E8%8E%B7%E5%8F%96%E8%B7%AF%E7%94%B1%E4%BC%A0%E5%85%A5%E7%9A%84%E5%8F%82%E6%95%B0"},{default:a(()=>n[53]||(n[53]=[e("获取路由传入的参数")])),_:1})])]),t("tr",null,[n[56]||(n[56]=t("td",null,"Json",-1)),t("td",null,[l(s,{to:"/zh/the-basics/request.html#%E8%8E%B7%E5%8F%96-json"},{default:a(()=>n[55]||(n[55]=[e("获取路由传入的 Json")])),_:1})])])])]),n[98]||(n[98]=t("h3",{id:"队列支持延迟调度",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#队列支持延迟调度"},[t("span",null,"队列支持延迟调度")])],-1)),n[99]||(n[99]=t("p",null,"Version: v1.10.0",-1)),t("p",null,[n[59]||(n[59]=e("新增 ")),n[60]||(n[60]=t("code",null,"Delay",-1)),n[61]||(n[61]=e(" 方法,")),l(s,{to:"/zh/digging-deeper/queues.html#%E5%BB%B6%E8%BF%9F%E8%B0%83%E5%BA%A6"},{default:a(()=>n[58]||(n[58]=[e("详见文档")])),_:1})]),n[100]||(n[100]=t("h3",{id:"orm-connection-支持配置表名前缀与单复数",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#orm-connection-支持配置表名前缀与单复数"},[t("span",null,"ORM Connection 支持配置表名前缀与单复数")])],-1)),n[101]||(n[101]=t("p",null,"Version: v1.10.0",-1)),t("ol",null,[t("li",null,[n[63]||(n[63]=t("code",null,"Model",-1)),n[64]||(n[64]=e(" 支持指定表名,")),l(s,{to:"/zh/orm/getting-started.html#%E6%8C%87%E5%AE%9A%E8%A1%A8%E5%90%8D"},{default:a(()=>n[62]||(n[62]=[e("详见文档")])),_:1}),n[65]||(n[65]=e(";"))]),n[66]||(n[66]=t("li",null,[t("code",null,"config/database.go"),e(" 中的 "),t("code",null,"connection"),e(" 新增键值:")],-1))]),n[102]||(n[102]=p(`

    prefix:设置表名前缀; singular:设置表名使用单数还是复数;

    详见文件

    新增 docker-compose.yml 文件

    Version: v1.10.0

    您现在可以使用以下命令快速启动服务:

    docker-compose build
     docker-compose up
     

    优化 Orm

    Version: v1.10.0

    1. 新增以下方法:
    `,9)),t("table",null,[n[77]||(n[77]=t("thead",null,[t("tr",null,[t("th",null,"方法名"),t("th",null,"作用")])],-1)),t("tbody",null,[t("tr",null,[n[68]||(n[68]=t("td",null,"FirstOr",-1)),t("td",null,[l(s,{to:"/zh/orm/getting-started.html#%E6%9F%A5%E8%AF%A2%E4%B8%80%E6%9D%A1%E6%95%B0%E6%8D%AE"},{default:a(()=>n[67]||(n[67]=[e("查询或通过回调返回一条数据")])),_:1})])]),t("tr",null,[n[70]||(n[70]=t("td",null,"FirstOrCreate",-1)),t("td",null,[l(s,{to:"/zh/orm/getting-started.html#%E6%9F%A5%E8%AF%A2%E6%88%96%E5%88%9B%E5%BB%BA%E6%A8%A1%E5%9E%8B"},{default:a(()=>n[69]||(n[69]=[e("查询或创建模型")])),_:1})])]),t("tr",null,[n[72]||(n[72]=t("td",null,"FirstOrNew",-1)),t("td",null,[l(s,{to:"/zh/orm/getting-started.html#%E6%9F%A5%E8%AF%A2%E6%88%96%E5%88%9B%E5%BB%BA%E6%A8%A1%E5%9E%8B"},{default:a(()=>n[71]||(n[71]=[e("查询或实例化模型")])),_:1})])]),t("tr",null,[n[74]||(n[74]=t("td",null,"FirstOrFail",-1)),t("td",null,[l(s,{to:"/zh/orm/getting-started.html#%E6%9C%AA%E6%89%BE%E5%88%B0%E6%97%B6%E6%8A%9B%E5%87%BA%E9%94%99%E8%AF%AF"},{default:a(()=>n[73]||(n[73]=[e("未找到时抛出错误")])),_:1})])]),t("tr",null,[n[76]||(n[76]=t("td",null,"UpdateOrCreate",-1)),t("td",null,[l(s,{to:"/zh/orm/getting-started.html#%E6%9B%B4%E6%96%B0%E6%88%96%E5%88%9B%E5%BB%BA%E4%B8%80%E6%9D%A1%E6%95%B0%E6%8D%AE"},{default:a(()=>n[75]||(n[75]=[e("更新或创建一条数据")])),_:1})])])])]),n[103]||(n[103]=p(`
    1. 之前这样写报错,现在支持:
    query := facades.Orm.Query()
    diff --git a/assets/v1.10.html-D5RdiF4o.js b/assets/v1.10.html-DuxpMOWg.js
    similarity index 99%
    rename from assets/v1.10.html-D5RdiF4o.js
    rename to assets/v1.10.html-DuxpMOWg.js
    index 65ec61ac..8b9b02d1 100644
    --- a/assets/v1.10.html-D5RdiF4o.js
    +++ b/assets/v1.10.html-DuxpMOWg.js
    @@ -1,4 +1,4 @@
    -import{_ as p,c as u,b as t,e as o,f as a,a as s,d as n,r as l,o as m}from"./app-ELDWQP0J.js";const g={},c={class:"table-of-contents"};function h(f,e){const i=l("router-link"),r=l("RouteLink"),d=l("CommentService");return m(),u("div",null,[e[65]||(e[65]=t("h1",{id:"upgrading-to-v1-10-from-v1-9",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#upgrading-to-v1-10-from-v1-9"},[t("span",null,"Upgrading To v1.10 From v1.9")])],-1)),t("nav",c,[t("ul",null,[t("li",null,[o(i,{to:"#exciting-new-features-🎉"},{default:a(()=>e[0]||(e[0]=[n("Exciting New Features 🎉")])),_:1})]),t("li",null,[o(i,{to:"#enhancements-🚀"},{default:a(()=>e[1]||(e[1]=[n("Enhancements 🚀")])),_:1})]),t("li",null,[o(i,{to:"#breaking-changes-🛠"},{default:a(()=>e[2]||(e[2]=[n("Breaking Changes 🛠")])),_:1})]),t("li",null,[o(i,{to:"#upgrade-guide"},{default:a(()=>e[3]||(e[3]=[n("Upgrade Guide")])),_:1}),t("ul",null,[t("li",null,[o(i,{to:"#updating-dependencies"},{default:a(()=>e[4]||(e[4]=[n("Updating Dependencies")])),_:1})]),t("li",null,[o(i,{to:"#encryption"},{default:a(()=>e[5]||(e[5]=[n("Encryption")])),_:1})]),t("li",null,[o(i,{to:"#hashing"},{default:a(()=>e[6]||(e[6]=[n("Hashing")])),_:1})]),t("li",null,[o(i,{to:"#add-rate-limiting-for-routing"},{default:a(()=>e[7]||(e[7]=[n("Add Rate Limiting For Routing")])),_:1})]),t("li",null,[o(i,{to:"#optimize-http-startup-mode"},{default:a(()=>e[8]||(e[8]=[n("Optimize HTTP startup mode")])),_:1})]),t("li",null,[o(i,{to:"#optimize-grpc-startup-mode"},{default:a(()=>e[9]||(e[9]=[n("Optimize GRPC startup mode")])),_:1})]),t("li",null,[o(i,{to:"#add-configuration-to-control-log-output-to-console"},{default:a(()=>e[10]||(e[10]=[n("Add configuration to control log output to console")])),_:1})]),t("li",null,[o(i,{to:"#request-modify-and-add-methods"},{default:a(()=>e[11]||(e[11]=[n("Request modify and add methods")])),_:1})]),t("li",null,[o(i,{to:"#queue-support-delayed-dispatching"},{default:a(()=>e[12]||(e[12]=[n("Queue support delayed dispatching")])),_:1})]),t("li",null,[o(i,{to:"#the-connection-in-orm-supports-set-table-prefix-and-singular"},{default:a(()=>e[13]||(e[13]=[n("The Connection in ORM supports set table prefix and singular")])),_:1})]),t("li",null,[o(i,{to:"#add-docker-compose-yml-file"},{default:a(()=>e[14]||(e[14]=[n("Add docker-compose.yml file")])),_:1})]),t("li",null,[o(i,{to:"#optimize-orm"},{default:a(()=>e[15]||(e[15]=[n("Optimize Orm")])),_:1})]),t("li",null,[o(i,{to:"#support-multiple-sql-in-migration-file"},{default:a(()=>e[16]||(e[16]=[n("Support multiple SQL in migration file")])),_:1})]),t("li",null,[o(i,{to:"#add-minio-driver-for-file-storage"},{default:a(()=>e[17]||(e[17]=[n("Add minio driver for File Storage")])),_:1})]),t("li",null,[o(i,{to:"#contracts-http-add-status-mapping-of-net-http"},{default:a(()=>e[18]||(e[18]=[n("contracts/http add status mapping of net/http")])),_:1})]),t("li",null,[o(i,{to:"#app-key-required"},{default:a(()=>e[19]||(e[19]=[n("APP_KEY required")])),_:1})]),t("li",null,[o(i,{to:"#add-ctx-parameter-to-the-methods-under-form-request"},{default:a(()=>e[20]||(e[20]=[n("Add ctx parameter to the methods under Form Request")])),_:1})]),t("li",null,[o(i,{to:"#facades-auth-parse-add-payload-returns"},{default:a(()=>e[21]||(e[21]=[n("facades.Auth.Parse add payload returns")])),_:1})]),t("li",null,[o(i,{to:"#some-methods-of-orm-add-new-return-values"},{default:a(()=>e[22]||(e[22]=[n("Some methods of Orm add new return values")])),_:1})])])])])]),e[66]||(e[66]=s(`

    Exciting New Features 🎉

    Enhancements 🚀

    Breaking Changes 🛠

    Upgrade Guide

    Estimated Upgrade Time: 20 Minutes

    Updating Dependencies

    Update dependencies in the go.mod file:

    go get -u github.com/goravel/framework@v1.10.0 && go mod tidy
    +import{_ as p,c as u,b as t,e as o,f as a,a as s,d as n,r as l,o as m}from"./app-Ewo6p9aM.js";const g={},c={class:"table-of-contents"};function h(f,e){const i=l("router-link"),r=l("RouteLink"),d=l("CommentService");return m(),u("div",null,[e[65]||(e[65]=t("h1",{id:"upgrading-to-v1-10-from-v1-9",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#upgrading-to-v1-10-from-v1-9"},[t("span",null,"Upgrading To v1.10 From v1.9")])],-1)),t("nav",c,[t("ul",null,[t("li",null,[o(i,{to:"#exciting-new-features-🎉"},{default:a(()=>e[0]||(e[0]=[n("Exciting New Features 🎉")])),_:1})]),t("li",null,[o(i,{to:"#enhancements-🚀"},{default:a(()=>e[1]||(e[1]=[n("Enhancements 🚀")])),_:1})]),t("li",null,[o(i,{to:"#breaking-changes-🛠"},{default:a(()=>e[2]||(e[2]=[n("Breaking Changes 🛠")])),_:1})]),t("li",null,[o(i,{to:"#upgrade-guide"},{default:a(()=>e[3]||(e[3]=[n("Upgrade Guide")])),_:1}),t("ul",null,[t("li",null,[o(i,{to:"#updating-dependencies"},{default:a(()=>e[4]||(e[4]=[n("Updating Dependencies")])),_:1})]),t("li",null,[o(i,{to:"#encryption"},{default:a(()=>e[5]||(e[5]=[n("Encryption")])),_:1})]),t("li",null,[o(i,{to:"#hashing"},{default:a(()=>e[6]||(e[6]=[n("Hashing")])),_:1})]),t("li",null,[o(i,{to:"#add-rate-limiting-for-routing"},{default:a(()=>e[7]||(e[7]=[n("Add Rate Limiting For Routing")])),_:1})]),t("li",null,[o(i,{to:"#optimize-http-startup-mode"},{default:a(()=>e[8]||(e[8]=[n("Optimize HTTP startup mode")])),_:1})]),t("li",null,[o(i,{to:"#optimize-grpc-startup-mode"},{default:a(()=>e[9]||(e[9]=[n("Optimize GRPC startup mode")])),_:1})]),t("li",null,[o(i,{to:"#add-configuration-to-control-log-output-to-console"},{default:a(()=>e[10]||(e[10]=[n("Add configuration to control log output to console")])),_:1})]),t("li",null,[o(i,{to:"#request-modify-and-add-methods"},{default:a(()=>e[11]||(e[11]=[n("Request modify and add methods")])),_:1})]),t("li",null,[o(i,{to:"#queue-support-delayed-dispatching"},{default:a(()=>e[12]||(e[12]=[n("Queue support delayed dispatching")])),_:1})]),t("li",null,[o(i,{to:"#the-connection-in-orm-supports-set-table-prefix-and-singular"},{default:a(()=>e[13]||(e[13]=[n("The Connection in ORM supports set table prefix and singular")])),_:1})]),t("li",null,[o(i,{to:"#add-docker-compose-yml-file"},{default:a(()=>e[14]||(e[14]=[n("Add docker-compose.yml file")])),_:1})]),t("li",null,[o(i,{to:"#optimize-orm"},{default:a(()=>e[15]||(e[15]=[n("Optimize Orm")])),_:1})]),t("li",null,[o(i,{to:"#support-multiple-sql-in-migration-file"},{default:a(()=>e[16]||(e[16]=[n("Support multiple SQL in migration file")])),_:1})]),t("li",null,[o(i,{to:"#add-minio-driver-for-file-storage"},{default:a(()=>e[17]||(e[17]=[n("Add minio driver for File Storage")])),_:1})]),t("li",null,[o(i,{to:"#contracts-http-add-status-mapping-of-net-http"},{default:a(()=>e[18]||(e[18]=[n("contracts/http add status mapping of net/http")])),_:1})]),t("li",null,[o(i,{to:"#app-key-required"},{default:a(()=>e[19]||(e[19]=[n("APP_KEY required")])),_:1})]),t("li",null,[o(i,{to:"#add-ctx-parameter-to-the-methods-under-form-request"},{default:a(()=>e[20]||(e[20]=[n("Add ctx parameter to the methods under Form Request")])),_:1})]),t("li",null,[o(i,{to:"#facades-auth-parse-add-payload-returns"},{default:a(()=>e[21]||(e[21]=[n("facades.Auth.Parse add payload returns")])),_:1})]),t("li",null,[o(i,{to:"#some-methods-of-orm-add-new-return-values"},{default:a(()=>e[22]||(e[22]=[n("Some methods of Orm add new return values")])),_:1})])])])])]),e[66]||(e[66]=s(`

    Exciting New Features 🎉

    Enhancements 🚀

    Breaking Changes 🛠

    Upgrade Guide

    Estimated Upgrade Time: 20 Minutes

    Updating Dependencies

    Update dependencies in the go.mod file:

    go get -u github.com/goravel/framework@v1.10.0 && go mod tidy
     

    Encryption

    Version: v1.10.0

    Add facades.Crypt:

    1. add &crypt.ServiceProvider{} to the providers item in the config/app.go file;
    `,15)),t("p",null,[o(r,{to:"/security/encryption.html"},{default:a(()=>e[23]||(e[23]=[n("For Detail")])),_:1})]),e[67]||(e[67]=s('

    Hashing

    Version: v1.10.0

    Add facades.Hash:

    1. add &hash.ServiceProvider{} to the providers item in the config/app.go file;

    2. Add config/hashing.go file;

    ',4)),t("p",null,[o(r,{to:"/security/hashing.html"},{default:a(()=>e[24]||(e[24]=[n("For Detail")])),_:1})]),e[68]||(e[68]=t("h3",{id:"add-rate-limiting-for-routing",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#add-rate-limiting-for-routing"},[t("span",null,"Add Rate Limiting For Routing")])],-1)),e[69]||(e[69]=t("p",null,"Version: v1.10.0",-1)),t("p",null,[o(r,{to:"/the-basics/routing.html#Rate-Limiting"},{default:a(()=>e[25]||(e[25]=[n("For Detail")])),_:1})]),e[70]||(e[70]=t("h3",{id:"optimize-http-startup-mode",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#optimize-http-startup-mode"},[t("span",null,"Optimize HTTP startup mode")])],-1)),e[71]||(e[71]=t("p",null,"Version: v1.10.0",-1)),t("ol",null,[e[31]||(e[31]=s('
  • Add config/http.go configuration, For Detail;
  • The facades.Route.Run method no longer needs to pass parameters, by default use http.host and http.port(you don't need to modify the code, it's backward compatible);
  • The facades.Route.RunTLS method no longer needs to pass parameters, by default use http.tls.host, http.tls.port, http.tls.ssl.cert and http.tls.ssl.key, if you are using it, you need to modify the code;
  • ',3)),t("li",null,[e[27]||(e[27]=n("Add ")),e[28]||(e[28]=t("code",null,"facades.Route.RunTLSWithCert",-1)),e[29]||(e[29]=n(" method, ")),o(r,{to:"/the-basics/routing.html#start-server"},{default:a(()=>e[26]||(e[26]=[n("For Detail")])),_:1}),e[30]||(e[30]=n(";"))]),e[32]||(e[32]=t("li",null,[n("Move "),t("code",null,"app.url"),n(", "),t("code",null,"app.host"),n(" to "),t("code",null,"http.url"),n(", "),t("code",null,"http.host"),n(";")],-1))]),e[72]||(e[72]=s('

    Optimize GRPC startup mode

    Version: v1.10.0

    The facades.Grpc.Run method no longer needs to pass parameters, by default use grpc.host and grpc.port(you don't need to modify the code, it's backward compatible);

    Add configuration to control log output to console

    Version: v1.10.0

    Add print configuration to single, daily channel in the config/logging.go file, it can control log output to console, For Detail;

    Request modify and add methods

    Version: v1.10.0

    1. The Input method is changed from only getting routing parameters to getting data according to the following order: json, form, query, route。Note: json can only get one-dimensional data, otherwise it will return empty;
    2. Add Route method to replace the original Input method;
    3. The default value of Query and Form methods are modified to be unnecessary;
    4. Add methods as shown below:
    ',9)),t("table",null,[e[53]||(e[53]=t("thead",null,[t("tr",null,[t("th",null,"Method"),t("th",null,"Action")])],-1)),t("tbody",null,[t("tr",null,[e[34]||(e[34]=t("td",null,"Route",-1)),t("td",null,[o(r,{to:"/the-basics/request.html#Retrieving-An-Input-Value"},{default:a(()=>e[33]||(e[33]=[n("Retrieving An Route Value")])),_:1})])]),t("tr",null,[e[36]||(e[36]=t("td",null,"RouteInt",-1)),t("td",null,[o(r,{to:"/the-basics/request.html#Retrieving-An-Input-Value"},{default:a(()=>e[35]||(e[35]=[n("Retrieving An Route Value")])),_:1})])]),t("tr",null,[e[38]||(e[38]=t("td",null,"RouteInt64",-1)),t("td",null,[o(r,{to:"/the-basics/request.html#Retrieving-An-Input-Value"},{default:a(()=>e[37]||(e[37]=[n("Retrieving An Route Value")])),_:1})])]),t("tr",null,[e[40]||(e[40]=t("td",null,"QueryInt",-1)),t("td",null,[o(r,{to:"/the-basics/request.html#Retrieving-Input-From-The-Query-String"},{default:a(()=>e[39]||(e[39]=[n("Retrieving Input From The Query String")])),_:1})])]),t("tr",null,[e[42]||(e[42]=t("td",null,"QueryInt64",-1)),t("td",null,[o(r,{to:"/the-basics/request.html#Retrieving-Input-From-The-Query-String"},{default:a(()=>e[41]||(e[41]=[n("Retrieving Input From The Query String")])),_:1})])]),t("tr",null,[e[44]||(e[44]=t("td",null,"QueryBool",-1)),t("td",null,[o(r,{to:"/the-basics/request.html#Retrieving-Input-From-The-Query-String"},{default:a(()=>e[43]||(e[43]=[n("Retrieving Input From The Query String")])),_:1})])]),t("tr",null,[e[46]||(e[46]=t("td",null,"InputInt",-1)),t("td",null,[o(r,{to:"/the-basics/request.html#Retrieving-An-Input-Value"},{default:a(()=>e[45]||(e[45]=[n("Retrieving An Input Value")])),_:1})])]),t("tr",null,[e[48]||(e[48]=t("td",null,"InputInt64",-1)),t("td",null,[o(r,{to:"/the-basics/request.html#Retrieving-An-Input-Value"},{default:a(()=>e[47]||(e[47]=[n("Retrieving An Input Value")])),_:1})])]),t("tr",null,[e[50]||(e[50]=t("td",null,"InputBool",-1)),t("td",null,[o(r,{to:"/the-basics/request.html#Retrieving-An-Input-Value"},{default:a(()=>e[49]||(e[49]=[n("Retrieving An Input Value")])),_:1})])]),t("tr",null,[e[52]||(e[52]=t("td",null,"Json",-1)),t("td",null,[o(r,{to:"/the-basics/request.html#Retrieving-Json"},{default:a(()=>e[51]||(e[51]=[n("Retrieving Json")])),_:1})])])])]),e[73]||(e[73]=t("h3",{id:"queue-support-delayed-dispatching",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#queue-support-delayed-dispatching"},[t("span",null,"Queue support delayed dispatching")])],-1)),e[74]||(e[74]=t("p",null,"Version: v1.10.0",-1)),t("p",null,[e[55]||(e[55]=n("Add ")),e[56]||(e[56]=t("code",null,"Delay",-1)),e[57]||(e[57]=n(" method, ")),o(r,{to:"/digging-deeper/queues.html#Delayed-Dispatching"},{default:a(()=>e[54]||(e[54]=[n("For Detail")])),_:1})]),e[75]||(e[75]=t("h3",{id:"the-connection-in-orm-supports-set-table-prefix-and-singular",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#the-connection-in-orm-supports-set-table-prefix-and-singular"},[t("span",null,"The Connection in ORM supports set table prefix and singular")])],-1)),e[76]||(e[76]=t("p",null,"Version: v1.10.0",-1)),t("ol",null,[t("li",null,[e[59]||(e[59]=t("code",null,"Model",-1)),e[60]||(e[60]=n(" supports specify table name, ")),o(r,{to:"/orm/getting-started.html#%E6%8C%87%E5%AE%9A%E8%A1%A8%E5%90%8D"},{default:a(()=>e[58]||(e[58]=[n("For Detail")])),_:1}),e[61]||(e[61]=n(";"))]),e[62]||(e[62]=t("li",null,[n("Add new keys to "),t("code",null,"connection"),n(" of "),t("code",null,"config/database.go"),n(":")],-1))]),e[77]||(e[77]=s(`

    prefix: Set prefix for table name; singular: Set the table name to use singular or plural;

    For Detail

    Add docker-compose.yml file

    Version: v1.10.0

    You can quickly start the service with the following command:

    docker-compose build
     docker-compose up
     

    Optimize Orm

    Version: v1.10.0

    1. Add the following methods:
    FunctionsAction
    FirstOrQuery or return data through callback
    FirstOrNewRetrieving Or New Models
    FirstOrFailNot Found Error
    UpdateOrCreateUpdate or create
    1. An error was reported like this before, but now it's supported:
    query := facades.Orm.Query()
    diff --git a/assets/v1.11.html-Cb3xxHwa.js b/assets/v1.11.html-8qQFbcw6.js
    similarity index 99%
    rename from assets/v1.11.html-Cb3xxHwa.js
    rename to assets/v1.11.html-8qQFbcw6.js
    index 69f4aede..dcd4cd93 100644
    --- a/assets/v1.11.html-Cb3xxHwa.js
    +++ b/assets/v1.11.html-8qQFbcw6.js
    @@ -1,4 +1,4 @@
    -import{_ as u,c as p,b as t,e as a,f as s,a as d,d as n,r as o,o as h}from"./app-ELDWQP0J.js";const c={},m={class:"table-of-contents"};function g(f,e){const l=o("router-link"),i=o("RouteLink"),r=o("CommentService");return h(),p("div",null,[e[70]||(e[70]=t("h1",{id:"upgrading-to-v1-11-from-v1-10",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#upgrading-to-v1-11-from-v1-10"},[t("span",null,"Upgrading To v1.11 From v1.10")])],-1)),t("nav",m,[t("ul",null,[t("li",null,[a(l,{to:"#v1-11-3"},{default:s(()=>e[0]||(e[0]=[n("v1.11.3")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#bug-fixes-🐛"},{default:s(()=>e[1]||(e[1]=[n("Bug Fixes 🐛")])),_:1})])])]),t("li",null,[a(l,{to:"#v1-11-2"},{default:s(()=>e[2]||(e[2]=[n("v1.11.2")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#bug-fixes-🐛-1"},{default:s(()=>e[3]||(e[3]=[n("Bug Fixes 🐛")])),_:1})])])]),t("li",null,[a(l,{to:"#v1-11-1"},{default:s(()=>e[4]||(e[4]=[n("v1.11.1")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#exciting-new-features-🎉"},{default:s(()=>e[5]||(e[5]=[n("Exciting New Features 🎉")])),_:1})]),t("li",null,[a(l,{to:"#bug-fixes-🐛-2"},{default:s(()=>e[6]||(e[6]=[n("Bug Fixes 🐛")])),_:1})])])]),t("li",null,[a(l,{to:"#v1-11-0"},{default:s(()=>e[7]||(e[7]=[n("v1.11.0")])),_:1})]),t("li",null,[a(l,{to:"#exciting-new-features-🎉-1"},{default:s(()=>e[8]||(e[8]=[n("Exciting New Features 🎉")])),_:1})]),t("li",null,[a(l,{to:"#enhancements-🚀"},{default:s(()=>e[9]||(e[9]=[n("Enhancements 🚀")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#breaking-changes-🛠"},{default:s(()=>e[10]||(e[10]=[n("Breaking Changes 🛠")])),_:1})]),t("li",null,[a(l,{to:"#bug-fixes-🐛-3"},{default:s(()=>e[11]||(e[11]=[n("Bug Fixes 🐛")])),_:1})])])]),t("li",null,[a(l,{to:"#upgrade-guide"},{default:s(()=>e[12]||(e[12]=[n("Upgrade Guide")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#updating-dependencies"},{default:s(()=>e[13]||(e[13]=[n("Updating Dependencies")])),_:1})]),t("li",null,[a(l,{to:"#_2-remove-deprecated-methods"},{default:s(()=>e[14]||(e[14]=[n("2. Remove deprecated methods")])),_:1})])])]),t("li",null,[a(l,{to:"#new-content"},{default:s(()=>e[15]||(e[15]=[n("New Content")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#orm-add-model-events"},{default:s(()=>e[16]||(e[16]=[n("Orm add model events")])),_:1})]),t("li",null,[a(l,{to:"#cache-add-and-optimize-methods"},{default:s(()=>e[17]||(e[17]=[n("Cache add and optimize methods")])),_:1})]),t("li",null,[a(l,{to:"#route-supports-fallback-route"},{default:s(()=>e[18]||(e[18]=[n("Route supports Fallback route")])),_:1})]),t("li",null,[a(l,{to:"#orm-adds-new-methods"},{default:s(()=>e[19]||(e[19]=[n("Orm adds new methods")])),_:1})]),t("li",null,[a(l,{to:"#optimize-facades-config-add"},{default:s(()=>e[20]||(e[20]=[n("Optimize facades.Config.Add()")])),_:1})]),t("li",null,[a(l,{to:"#change-sqlite-driver"},{default:s(()=>e[21]||(e[21]=[n("Change Sqlite driver")])),_:1})]),t("li",null,[a(l,{to:"#contracts-http-add-method-mapping-of-net-http"},{default:s(()=>e[22]||(e[22]=[n("contracts/http add method mapping of net/http")])),_:1})]),t("li",null,[a(l,{to:"#route-add-resource-routing"},{default:s(()=>e[23]||(e[23]=[n("Route Add Resource Routing")])),_:1})]),t("li",null,[a(l,{to:"#request-add-new-methods"},{default:s(()=>e[24]||(e[24]=[n("Request Add New Methods")])),_:1})]),t("li",null,[a(l,{to:"#storage-add-new-methods"},{default:s(()=>e[25]||(e[25]=[n("Storage Add New Methods")])),_:1})]),t("li",null,[a(l,{to:"#file-add-new-methods"},{default:s(()=>e[26]||(e[26]=[n("File Add New Methods")])),_:1})]),t("li",null,[a(l,{to:"#fix-the-error-of-incorrect-windows-path-for-filesystem"},{default:s(()=>e[27]||(e[27]=[n("Fix The Error Of Incorrect Windows Path For Filesystem")])),_:1})]),t("li",null,[a(l,{to:"#fix-the-panic-of-the-header-method-for-request"},{default:s(()=>e[28]||(e[28]=[n("Fix The Panic Of The Header Method For Request")])),_:1})]),t("li",null,[a(l,{to:"#fix-the-data-error-of-using-request-input-and-request-bind-at-the-same-time"},{default:s(()=>e[29]||(e[29]=[n("Fix The Data Error Of Using Request.Input() And Request.Bind() At The Same Time")])),_:1})]),t("li",null,[a(l,{to:"#the-problem-of-process-interruption-caused-by-panic-in-schedule"},{default:s(()=>e[30]||(e[30]=[n("The problem of process interruption caused by panic in Schedule")])),_:1})]),t("li",null,[a(l,{to:"#the-problem-that-dailyat-in-schedule-will-be-executed-every-minute"},{default:s(()=>e[31]||(e[31]=[n("The problem that DailyAt in Schedule will be executed every minute")])),_:1})])])])])]),e[71]||(e[71]=d(`

    v1.11.3

    Bug Fixes 🐛

    v1.11.2

    Bug Fixes 🐛

    v1.11.1

    Exciting New Features 🎉

    Bug Fixes 🐛

    v1.11.0

    Exciting New Features 🎉

    Enhancements 🚀

    Breaking Changes 🛠

    Bug Fixes 🐛

    • The problem that the hashing configuration does not take effect under some situations(1.11.0)
    • Non-thread safety problems in RateLimiter(1.11.0)

    Upgrade Guide

    Please upgrade the framework step by step according to the content in this section.

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Update dependencies in the go.mod file:

    go get -u github.com/goravel/framework@v1.11.0 && go mod tidy
    +import{_ as u,c as p,b as t,e as a,f as s,a as d,d as n,r as o,o as h}from"./app-Ewo6p9aM.js";const c={},m={class:"table-of-contents"};function g(f,e){const l=o("router-link"),i=o("RouteLink"),r=o("CommentService");return h(),p("div",null,[e[70]||(e[70]=t("h1",{id:"upgrading-to-v1-11-from-v1-10",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#upgrading-to-v1-11-from-v1-10"},[t("span",null,"Upgrading To v1.11 From v1.10")])],-1)),t("nav",m,[t("ul",null,[t("li",null,[a(l,{to:"#v1-11-3"},{default:s(()=>e[0]||(e[0]=[n("v1.11.3")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#bug-fixes-🐛"},{default:s(()=>e[1]||(e[1]=[n("Bug Fixes 🐛")])),_:1})])])]),t("li",null,[a(l,{to:"#v1-11-2"},{default:s(()=>e[2]||(e[2]=[n("v1.11.2")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#bug-fixes-🐛-1"},{default:s(()=>e[3]||(e[3]=[n("Bug Fixes 🐛")])),_:1})])])]),t("li",null,[a(l,{to:"#v1-11-1"},{default:s(()=>e[4]||(e[4]=[n("v1.11.1")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#exciting-new-features-🎉"},{default:s(()=>e[5]||(e[5]=[n("Exciting New Features 🎉")])),_:1})]),t("li",null,[a(l,{to:"#bug-fixes-🐛-2"},{default:s(()=>e[6]||(e[6]=[n("Bug Fixes 🐛")])),_:1})])])]),t("li",null,[a(l,{to:"#v1-11-0"},{default:s(()=>e[7]||(e[7]=[n("v1.11.0")])),_:1})]),t("li",null,[a(l,{to:"#exciting-new-features-🎉-1"},{default:s(()=>e[8]||(e[8]=[n("Exciting New Features 🎉")])),_:1})]),t("li",null,[a(l,{to:"#enhancements-🚀"},{default:s(()=>e[9]||(e[9]=[n("Enhancements 🚀")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#breaking-changes-🛠"},{default:s(()=>e[10]||(e[10]=[n("Breaking Changes 🛠")])),_:1})]),t("li",null,[a(l,{to:"#bug-fixes-🐛-3"},{default:s(()=>e[11]||(e[11]=[n("Bug Fixes 🐛")])),_:1})])])]),t("li",null,[a(l,{to:"#upgrade-guide"},{default:s(()=>e[12]||(e[12]=[n("Upgrade Guide")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#updating-dependencies"},{default:s(()=>e[13]||(e[13]=[n("Updating Dependencies")])),_:1})]),t("li",null,[a(l,{to:"#_2-remove-deprecated-methods"},{default:s(()=>e[14]||(e[14]=[n("2. Remove deprecated methods")])),_:1})])])]),t("li",null,[a(l,{to:"#new-content"},{default:s(()=>e[15]||(e[15]=[n("New Content")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#orm-add-model-events"},{default:s(()=>e[16]||(e[16]=[n("Orm add model events")])),_:1})]),t("li",null,[a(l,{to:"#cache-add-and-optimize-methods"},{default:s(()=>e[17]||(e[17]=[n("Cache add and optimize methods")])),_:1})]),t("li",null,[a(l,{to:"#route-supports-fallback-route"},{default:s(()=>e[18]||(e[18]=[n("Route supports Fallback route")])),_:1})]),t("li",null,[a(l,{to:"#orm-adds-new-methods"},{default:s(()=>e[19]||(e[19]=[n("Orm adds new methods")])),_:1})]),t("li",null,[a(l,{to:"#optimize-facades-config-add"},{default:s(()=>e[20]||(e[20]=[n("Optimize facades.Config.Add()")])),_:1})]),t("li",null,[a(l,{to:"#change-sqlite-driver"},{default:s(()=>e[21]||(e[21]=[n("Change Sqlite driver")])),_:1})]),t("li",null,[a(l,{to:"#contracts-http-add-method-mapping-of-net-http"},{default:s(()=>e[22]||(e[22]=[n("contracts/http add method mapping of net/http")])),_:1})]),t("li",null,[a(l,{to:"#route-add-resource-routing"},{default:s(()=>e[23]||(e[23]=[n("Route Add Resource Routing")])),_:1})]),t("li",null,[a(l,{to:"#request-add-new-methods"},{default:s(()=>e[24]||(e[24]=[n("Request Add New Methods")])),_:1})]),t("li",null,[a(l,{to:"#storage-add-new-methods"},{default:s(()=>e[25]||(e[25]=[n("Storage Add New Methods")])),_:1})]),t("li",null,[a(l,{to:"#file-add-new-methods"},{default:s(()=>e[26]||(e[26]=[n("File Add New Methods")])),_:1})]),t("li",null,[a(l,{to:"#fix-the-error-of-incorrect-windows-path-for-filesystem"},{default:s(()=>e[27]||(e[27]=[n("Fix The Error Of Incorrect Windows Path For Filesystem")])),_:1})]),t("li",null,[a(l,{to:"#fix-the-panic-of-the-header-method-for-request"},{default:s(()=>e[28]||(e[28]=[n("Fix The Panic Of The Header Method For Request")])),_:1})]),t("li",null,[a(l,{to:"#fix-the-data-error-of-using-request-input-and-request-bind-at-the-same-time"},{default:s(()=>e[29]||(e[29]=[n("Fix The Data Error Of Using Request.Input() And Request.Bind() At The Same Time")])),_:1})]),t("li",null,[a(l,{to:"#the-problem-of-process-interruption-caused-by-panic-in-schedule"},{default:s(()=>e[30]||(e[30]=[n("The problem of process interruption caused by panic in Schedule")])),_:1})]),t("li",null,[a(l,{to:"#the-problem-that-dailyat-in-schedule-will-be-executed-every-minute"},{default:s(()=>e[31]||(e[31]=[n("The problem that DailyAt in Schedule will be executed every minute")])),_:1})])])])])]),e[71]||(e[71]=d(`

    v1.11.3

    Bug Fixes 🐛

    v1.11.2

    Bug Fixes 🐛

    v1.11.1

    Exciting New Features 🎉

    Bug Fixes 🐛

    v1.11.0

    Exciting New Features 🎉

    Enhancements 🚀

    Breaking Changes 🛠

    Bug Fixes 🐛

    • The problem that the hashing configuration does not take effect under some situations(1.11.0)
    • Non-thread safety problems in RateLimiter(1.11.0)

    Upgrade Guide

    Please upgrade the framework step by step according to the content in this section.

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Update dependencies in the go.mod file:

    go get -u github.com/goravel/framework@v1.11.0 && go mod tidy
     
    go get -u github.com/goravel/framework@v1.11.0 && go mod tidy
     

    2. Remove deprecated methods

    import (
       "github.com/goravel/framework/database"
    diff --git a/assets/v1.11.html-CC8y2mBf.js b/assets/v1.11.html-BrYBsgIm.js
    similarity index 99%
    rename from assets/v1.11.html-CC8y2mBf.js
    rename to assets/v1.11.html-BrYBsgIm.js
    index c1a84941..dd06240c 100644
    --- a/assets/v1.11.html-CC8y2mBf.js
    +++ b/assets/v1.11.html-BrYBsgIm.js
    @@ -1,4 +1,4 @@
    -import{_ as r,c as p,b as e,e as t,f as a,a as u,d as l,r as d,o as c}from"./app-ELDWQP0J.js";const h={},E={class:"table-of-contents"};function v(g,n){const s=d("router-link"),i=d("RouteLink"),o=d("CommentService");return c(),p("div",null,[n[70]||(n[70]=e("h1",{id:"从-v1-10-升级到-v1-11",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#从-v1-10-升级到-v1-11"},[e("span",null,"从 v1.10 升级到 v1.11")])],-1)),e("nav",E,[e("ul",null,[e("li",null,[t(s,{to:"#v1-11-3"},{default:a(()=>n[0]||(n[0]=[l("v1.11.3")])),_:1}),e("ul",null,[e("li",null,[t(s,{to:"#bug-修复-🐛"},{default:a(()=>n[1]||(n[1]=[l("Bug 修复 🐛")])),_:1})])])]),e("li",null,[t(s,{to:"#v1-11-2"},{default:a(()=>n[2]||(n[2]=[l("v1.11.2")])),_:1}),e("ul",null,[e("li",null,[t(s,{to:"#bug-修复-🐛-1"},{default:a(()=>n[3]||(n[3]=[l("Bug 修复 🐛")])),_:1})])])]),e("li",null,[t(s,{to:"#v1-11-1"},{default:a(()=>n[4]||(n[4]=[l("v1.11.1")])),_:1}),e("ul",null,[e("li",null,[t(s,{to:"#功能增强-🚀"},{default:a(()=>n[5]||(n[5]=[l("功能增强 🚀")])),_:1})]),e("li",null,[t(s,{to:"#bug-修复-🐛-2"},{default:a(()=>n[6]||(n[6]=[l("Bug 修复 🐛")])),_:1})])])]),e("li",null,[t(s,{to:"#v1-11-0"},{default:a(()=>n[7]||(n[7]=[l("v1.11.0")])),_:1}),e("ul",null,[e("li",null,[t(s,{to:"#令人兴奋的新功能-🎉"},{default:a(()=>n[8]||(n[8]=[l("令人兴奋的新功能 🎉")])),_:1})]),e("li",null,[t(s,{to:"#功能增强-🚀-1"},{default:a(()=>n[9]||(n[9]=[l("功能增强 🚀")])),_:1})]),e("li",null,[t(s,{to:"#破坏性变化-🛠"},{default:a(()=>n[10]||(n[10]=[l("破坏性变化 🛠")])),_:1})]),e("li",null,[t(s,{to:"#bug-修复-🐛-3"},{default:a(()=>n[11]||(n[11]=[l("Bug 修复 🐛")])),_:1})])])]),e("li",null,[t(s,{to:"#升级指南"},{default:a(()=>n[12]||(n[12]=[l("升级指南")])),_:1}),e("ul",null,[e("li",null,[t(s,{to:"#_1-更新依赖"},{default:a(()=>n[13]||(n[13]=[l("1. 更新依赖")])),_:1})]),e("li",null,[t(s,{to:"#_2-优化、移除废弃的方法"},{default:a(()=>n[14]||(n[14]=[l("2. 优化、移除废弃的方法")])),_:1})])])]),e("li",null,[t(s,{to:"#新增内容"},{default:a(()=>n[15]||(n[15]=[l("新增内容")])),_:1}),e("ul",null,[e("li",null,[t(s,{to:"#orm-新增模型事件"},{default:a(()=>n[16]||(n[16]=[l("Orm 新增模型事件")])),_:1})]),e("li",null,[t(s,{to:"#cache-新增、优化方法"},{default:a(()=>n[17]||(n[17]=[l("Cache 新增、优化方法")])),_:1})]),e("li",null,[t(s,{to:"#route-支持-fallback-路由"},{default:a(()=>n[18]||(n[18]=[l("Route 支持 Fallback 路由")])),_:1})]),e("li",null,[t(s,{to:"#orm-新增方法"},{default:a(()=>n[19]||(n[19]=[l("Orm 新增方法")])),_:1})]),e("li",null,[t(s,{to:"#优化-facades-config-add-方法"},{default:a(()=>n[20]||(n[20]=[l("优化 facades.Config.Add() 方法")])),_:1})]),e("li",null,[t(s,{to:"#修改-sqlite-驱动"},{default:a(()=>n[21]||(n[21]=[l("修改 Sqlite 驱动")])),_:1})]),e("li",null,[t(s,{to:"#contracts-http-增加-net-http-的-method-映射"},{default:a(()=>n[22]||(n[22]=[l("contracts/http 增加 net/http 的 Method 映射")])),_:1})]),e("li",null,[t(s,{to:"#route-新增资源路由"},{default:a(()=>n[23]||(n[23]=[l("Route 新增资源路由")])),_:1})]),e("li",null,[t(s,{to:"#request-新增方法"},{default:a(()=>n[24]||(n[24]=[l("Request 新增方法")])),_:1})]),e("li",null,[t(s,{to:"#storage-新增方法"},{default:a(()=>n[25]||(n[25]=[l("Storage 新增方法")])),_:1})]),e("li",null,[t(s,{to:"#file-新增方法"},{default:a(()=>n[26]||(n[26]=[l("File 新增方法")])),_:1})]),e("li",null,[t(s,{to:"#修复文件储存-windows-路径错误的问题"},{default:a(()=>n[27]||(n[27]=[l("修复文件储存 windows 路径错误的问题")])),_:1})]),e("li",null,[t(s,{to:"#修复-request-模块-header-panic-问题"},{default:a(()=>n[28]||(n[28]=[l("修复 Request 模块 Header panic 问题")])),_:1})]),e("li",null,[t(s,{to:"#同时使用-request-input-与-request-bind-方法数据错误的问题"},{default:a(()=>n[29]||(n[29]=[l("同时使用 Request.Input() 与 Request.Bind() 方法数据错误的问题")])),_:1})]),e("li",null,[t(s,{to:"#schedule-中-panic-导致进程中断的问题"},{default:a(()=>n[30]||(n[30]=[l("Schedule 中 panic 导致进程中断的问题")])),_:1})]),e("li",null,[t(s,{to:"#schedule-中-dailyat-每分钟都会执行的问题"},{default:a(()=>n[31]||(n[31]=[l("Schedule 中 DailyAt 每分钟都会执行的问题")])),_:1})])])])])]),n[71]||(n[71]=u(`

    v1.11.3

    Bug 修复 🐛

    v1.11.2

    Bug 修复 🐛

    v1.11.1

    功能增强 🚀

    Bug 修复 🐛

    v1.11.0

    令人兴奋的新功能 🎉

    功能增强 🚀

    破坏性变化 🛠

    Bug 修复 🐛

    • Hash 配置在某种情况下不生效的问题(1.11.0)
    • RateLimiter 非线程安全的问题(1.11.0)

    升级指南

    请根据本节内容,一步步进行框架升级。

    预计升级时间:1 分钟

    1. 更新依赖

    go.mod 中更新依赖:

    go get -u github.com/goravel/framework@v1.11.0 && go mod tidy
    +import{_ as r,c as p,b as e,e as t,f as a,a as u,d as l,r as d,o as c}from"./app-Ewo6p9aM.js";const h={},E={class:"table-of-contents"};function v(g,n){const s=d("router-link"),i=d("RouteLink"),o=d("CommentService");return c(),p("div",null,[n[70]||(n[70]=e("h1",{id:"从-v1-10-升级到-v1-11",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#从-v1-10-升级到-v1-11"},[e("span",null,"从 v1.10 升级到 v1.11")])],-1)),e("nav",E,[e("ul",null,[e("li",null,[t(s,{to:"#v1-11-3"},{default:a(()=>n[0]||(n[0]=[l("v1.11.3")])),_:1}),e("ul",null,[e("li",null,[t(s,{to:"#bug-修复-🐛"},{default:a(()=>n[1]||(n[1]=[l("Bug 修复 🐛")])),_:1})])])]),e("li",null,[t(s,{to:"#v1-11-2"},{default:a(()=>n[2]||(n[2]=[l("v1.11.2")])),_:1}),e("ul",null,[e("li",null,[t(s,{to:"#bug-修复-🐛-1"},{default:a(()=>n[3]||(n[3]=[l("Bug 修复 🐛")])),_:1})])])]),e("li",null,[t(s,{to:"#v1-11-1"},{default:a(()=>n[4]||(n[4]=[l("v1.11.1")])),_:1}),e("ul",null,[e("li",null,[t(s,{to:"#功能增强-🚀"},{default:a(()=>n[5]||(n[5]=[l("功能增强 🚀")])),_:1})]),e("li",null,[t(s,{to:"#bug-修复-🐛-2"},{default:a(()=>n[6]||(n[6]=[l("Bug 修复 🐛")])),_:1})])])]),e("li",null,[t(s,{to:"#v1-11-0"},{default:a(()=>n[7]||(n[7]=[l("v1.11.0")])),_:1}),e("ul",null,[e("li",null,[t(s,{to:"#令人兴奋的新功能-🎉"},{default:a(()=>n[8]||(n[8]=[l("令人兴奋的新功能 🎉")])),_:1})]),e("li",null,[t(s,{to:"#功能增强-🚀-1"},{default:a(()=>n[9]||(n[9]=[l("功能增强 🚀")])),_:1})]),e("li",null,[t(s,{to:"#破坏性变化-🛠"},{default:a(()=>n[10]||(n[10]=[l("破坏性变化 🛠")])),_:1})]),e("li",null,[t(s,{to:"#bug-修复-🐛-3"},{default:a(()=>n[11]||(n[11]=[l("Bug 修复 🐛")])),_:1})])])]),e("li",null,[t(s,{to:"#升级指南"},{default:a(()=>n[12]||(n[12]=[l("升级指南")])),_:1}),e("ul",null,[e("li",null,[t(s,{to:"#_1-更新依赖"},{default:a(()=>n[13]||(n[13]=[l("1. 更新依赖")])),_:1})]),e("li",null,[t(s,{to:"#_2-优化、移除废弃的方法"},{default:a(()=>n[14]||(n[14]=[l("2. 优化、移除废弃的方法")])),_:1})])])]),e("li",null,[t(s,{to:"#新增内容"},{default:a(()=>n[15]||(n[15]=[l("新增内容")])),_:1}),e("ul",null,[e("li",null,[t(s,{to:"#orm-新增模型事件"},{default:a(()=>n[16]||(n[16]=[l("Orm 新增模型事件")])),_:1})]),e("li",null,[t(s,{to:"#cache-新增、优化方法"},{default:a(()=>n[17]||(n[17]=[l("Cache 新增、优化方法")])),_:1})]),e("li",null,[t(s,{to:"#route-支持-fallback-路由"},{default:a(()=>n[18]||(n[18]=[l("Route 支持 Fallback 路由")])),_:1})]),e("li",null,[t(s,{to:"#orm-新增方法"},{default:a(()=>n[19]||(n[19]=[l("Orm 新增方法")])),_:1})]),e("li",null,[t(s,{to:"#优化-facades-config-add-方法"},{default:a(()=>n[20]||(n[20]=[l("优化 facades.Config.Add() 方法")])),_:1})]),e("li",null,[t(s,{to:"#修改-sqlite-驱动"},{default:a(()=>n[21]||(n[21]=[l("修改 Sqlite 驱动")])),_:1})]),e("li",null,[t(s,{to:"#contracts-http-增加-net-http-的-method-映射"},{default:a(()=>n[22]||(n[22]=[l("contracts/http 增加 net/http 的 Method 映射")])),_:1})]),e("li",null,[t(s,{to:"#route-新增资源路由"},{default:a(()=>n[23]||(n[23]=[l("Route 新增资源路由")])),_:1})]),e("li",null,[t(s,{to:"#request-新增方法"},{default:a(()=>n[24]||(n[24]=[l("Request 新增方法")])),_:1})]),e("li",null,[t(s,{to:"#storage-新增方法"},{default:a(()=>n[25]||(n[25]=[l("Storage 新增方法")])),_:1})]),e("li",null,[t(s,{to:"#file-新增方法"},{default:a(()=>n[26]||(n[26]=[l("File 新增方法")])),_:1})]),e("li",null,[t(s,{to:"#修复文件储存-windows-路径错误的问题"},{default:a(()=>n[27]||(n[27]=[l("修复文件储存 windows 路径错误的问题")])),_:1})]),e("li",null,[t(s,{to:"#修复-request-模块-header-panic-问题"},{default:a(()=>n[28]||(n[28]=[l("修复 Request 模块 Header panic 问题")])),_:1})]),e("li",null,[t(s,{to:"#同时使用-request-input-与-request-bind-方法数据错误的问题"},{default:a(()=>n[29]||(n[29]=[l("同时使用 Request.Input() 与 Request.Bind() 方法数据错误的问题")])),_:1})]),e("li",null,[t(s,{to:"#schedule-中-panic-导致进程中断的问题"},{default:a(()=>n[30]||(n[30]=[l("Schedule 中 panic 导致进程中断的问题")])),_:1})]),e("li",null,[t(s,{to:"#schedule-中-dailyat-每分钟都会执行的问题"},{default:a(()=>n[31]||(n[31]=[l("Schedule 中 DailyAt 每分钟都会执行的问题")])),_:1})])])])])]),n[71]||(n[71]=u(`

    v1.11.3

    Bug 修复 🐛

    v1.11.2

    Bug 修复 🐛

    v1.11.1

    功能增强 🚀

    Bug 修复 🐛

    v1.11.0

    令人兴奋的新功能 🎉

    功能增强 🚀

    破坏性变化 🛠

    Bug 修复 🐛

    • Hash 配置在某种情况下不生效的问题(1.11.0)
    • RateLimiter 非线程安全的问题(1.11.0)

    升级指南

    请根据本节内容,一步步进行框架升级。

    预计升级时间:1 分钟

    1. 更新依赖

    go.mod 中更新依赖:

    go get -u github.com/goravel/framework@v1.11.0 && go mod tidy
     

    2. 优化、移除废弃的方法

    import (
       "github.com/goravel/framework/database"
       "github.com/goravel/framework/database/gorm"
    diff --git a/assets/v1.12.html-Cicrako9.js b/assets/v1.12.html-Bjnsh028.js
    similarity index 99%
    rename from assets/v1.12.html-Cicrako9.js
    rename to assets/v1.12.html-Bjnsh028.js
    index 46778a17..dc7ba60d 100644
    --- a/assets/v1.12.html-Cicrako9.js
    +++ b/assets/v1.12.html-Bjnsh028.js
    @@ -1,4 +1,4 @@
    -import{_ as d,c as l,a as i,b as a,d as n,e as t,f as o,r as p,o as r}from"./app-ELDWQP0J.js";const c={};function u(h,e){const s=p("RouteLink");return r(),l("div",null,[e[15]||(e[15]=i(`

    Upgrading To v1.12 From v1.11

    v1.12.6

    Bug Fixes 🐛

    v1.12.5

    Bug Fixes 🐛

    v1.12.4

    Bug Fixes 🐛

    v1.12.3

    Bug Fixes 🐛

    v1.12.2

    Bug Fixes 🐛

    v1.12.1

    Bug Fixes 🐛

    v1.12.0

    Exciting New Features 🎉

    Enhancements 🚀

    Breaking Changes 🛠

    Upgrade Guide

    Please upgrade the framework step by step according to the content in this section.

    Estimated Upgrade Time: 30 Minutes

    1. Updating Dependencies

    Update dependencies in the go.mod file:

    go get -u github.com/goravel/framework@v1.12.0 && go mod tidy
    +import{_ as d,c as l,a as i,b as a,d as n,e as t,f as o,r as p,o as r}from"./app-Ewo6p9aM.js";const c={};function u(h,e){const s=p("RouteLink");return r(),l("div",null,[e[15]||(e[15]=i(`

    Upgrading To v1.12 From v1.11

    v1.12.6

    Bug Fixes 🐛

    v1.12.5

    Bug Fixes 🐛

    v1.12.4

    Bug Fixes 🐛

    v1.12.3

    Bug Fixes 🐛

    v1.12.2

    Bug Fixes 🐛

    v1.12.1

    Bug Fixes 🐛

    v1.12.0

    Exciting New Features 🎉

    Enhancements 🚀

    Breaking Changes 🛠

    Upgrade Guide

    Please upgrade the framework step by step according to the content in this section.

    Estimated Upgrade Time: 30 Minutes

    1. Updating Dependencies

    Update dependencies in the go.mod file:

    go get -u github.com/goravel/framework@v1.12.0 && go mod tidy
     

    There is an error after running go mod tidy, the error will be solved after performing the following upgrade steps.

    2. Modify bootstrap/app.go

    // Before
     app := foundation.Application{}
     
    diff --git a/assets/v1.12.html-C-58BhZu.js b/assets/v1.12.html-zH8DdV-e.js
    similarity index 99%
    rename from assets/v1.12.html-C-58BhZu.js
    rename to assets/v1.12.html-zH8DdV-e.js
    index 8862e6d6..260bb7a5 100644
    --- a/assets/v1.12.html-C-58BhZu.js
    +++ b/assets/v1.12.html-zH8DdV-e.js
    @@ -1,4 +1,4 @@
    -import{_ as o,c as p,a as i,b as n,d as s,e as t,f as l,r as d,o as c}from"./app-ELDWQP0J.js";const r={};function u(h,a){const e=d("RouteLink");return c(),p("div",null,[a[18]||(a[18]=i(`

    从 v1.11 升级到 v1.12

    v1.12.6

    Bug 修复 🐛

    v1.12.5

    Bug 修复 🐛

    v1.12.4

    Bug 修复 🐛

    v1.12.3

    Bug 修复 🐛

    v1.12.2

    Bug 修复 🐛

    v1.12.1

    Bug 修复 🐛

    v1.12.0

    令人兴奋的新功能 🎉

    功能增强 🚀

    破坏性变化 🛠

    升级指南

    请根据本节内容,一步步进行框架升级。

    预计升级时间:30 分钟

    1. 更新依赖

    go.mod 中更新依赖:

    go get -u github.com/goravel/framework@v1.12.0 && go mod tidy
    +import{_ as o,c as p,a as i,b as n,d as s,e as t,f as l,r as d,o as c}from"./app-Ewo6p9aM.js";const r={};function u(h,a){const e=d("RouteLink");return c(),p("div",null,[a[18]||(a[18]=i(`

    从 v1.11 升级到 v1.12

    v1.12.6

    Bug 修复 🐛

    v1.12.5

    Bug 修复 🐛

    v1.12.4

    Bug 修复 🐛

    v1.12.3

    Bug 修复 🐛

    v1.12.2

    Bug 修复 🐛

    v1.12.1

    Bug 修复 🐛

    v1.12.0

    令人兴奋的新功能 🎉

    功能增强 🚀

    破坏性变化 🛠

    升级指南

    请根据本节内容,一步步进行框架升级。

    预计升级时间:30 分钟

    1. 更新依赖

    go.mod 中更新依赖:

    go get -u github.com/goravel/framework@v1.12.0 && go mod tidy
     

    go mod tidy 将会抛出一个错误,执行完下面升级步骤即可解决。

    2. 修改 bootstrap/app.go

    // 修改前
     app := foundation.Application{}
     
    diff --git a/assets/v1.13.html-wSZ9KRJY.js b/assets/v1.13.html-DKjd5VZ6.js
    similarity index 99%
    rename from assets/v1.13.html-wSZ9KRJY.js
    rename to assets/v1.13.html-DKjd5VZ6.js
    index ab2af167..11b5c26a 100644
    --- a/assets/v1.13.html-wSZ9KRJY.js
    +++ b/assets/v1.13.html-DKjd5VZ6.js
    @@ -1,4 +1,4 @@
    -import{_ as r,c as l,a as i,b as n,e as s,f as t,r as p,o as c,d as o}from"./app-ELDWQP0J.js";const d={};function u(h,e){const a=p("RouteLink");return c(),l("div",null,[e[11]||(e[11]=i(`

    Upgrading To v1.13 From v1.12

    Exciting New Features 🎉

    Enhancements 🚀

    v1.13.4

    Breaking Changes 🛠

    Bug Fixes 🐛

    v1.13.2

    v1.13.4

    v1.13.5

    v1.13.6 v1.13.7

    v1.13.8

    v1.13.9

    v1.13.10

    Upgrade Guide

    Please upgrade the framework step by step according to the content in this section.

    Estimated Upgrade Time: 10 Minutes

    1. Updating Dependencies

    Update dependencies in the go.mod file:

    go get -u github.com/goravel/framework@v1.13.9 && go get -u github.com/goravel/gin
    +import{_ as r,c as l,a as i,b as n,e as s,f as t,r as p,o as c,d as o}from"./app-Ewo6p9aM.js";const d={};function u(h,e){const a=p("RouteLink");return c(),l("div",null,[e[11]||(e[11]=i(`

    Upgrading To v1.13 From v1.12

    Exciting New Features 🎉

    Enhancements 🚀

    v1.13.4

    Breaking Changes 🛠

    Bug Fixes 🐛

    v1.13.2

    v1.13.4

    v1.13.5

    v1.13.6 v1.13.7

    v1.13.8

    v1.13.9

    v1.13.10

    Upgrade Guide

    Please upgrade the framework step by step according to the content in this section.

    Estimated Upgrade Time: 10 Minutes

    1. Updating Dependencies

    Update dependencies in the go.mod file:

    go get -u github.com/goravel/framework@v1.13.9 && go get -u github.com/goravel/gin
     

    2. Add New Files

    tests

    database/seeders/database_seeder.go

    app/providers/database_service_provider.go

    3. Register New Providers

    Note the order:

    import (
       "github.com/goravel/framework/testing"
       "github.com/goravel/gin"
    diff --git a/assets/v1.13.html-CTxZq6lE.js b/assets/v1.13.html-TufMrOde.js
    similarity index 99%
    rename from assets/v1.13.html-CTxZq6lE.js
    rename to assets/v1.13.html-TufMrOde.js
    index 127d254c..3d7e4ff7 100644
    --- a/assets/v1.13.html-CTxZq6lE.js
    +++ b/assets/v1.13.html-TufMrOde.js
    @@ -1,4 +1,4 @@
    -import{_ as o,c as i,a as p,b as s,e,f as t,r,o as c,d as l}from"./app-ELDWQP0J.js";const u={};function d(h,n){const a=r("RouteLink");return c(),i("div",null,[n[11]||(n[11]=p(`

    从 v1.12 升级到 v1.13

    令人兴奋的新功能 🎉

    功能增强 🚀

    v1.13.4

    破坏性变化 🛠

    Bug 修复 🐛

    v1.13.2

    v1.13.4

    v1.13.5

    v1.13.6 v1.13.7

    v1.13.8

    v1.13.9

    v1.13.10

    升级指南

    请根据本节内容,一步步进行框架升级。

    预计升级时间:10 分钟

    1. 更新依赖

    go.mod 中更新依赖:

    go get -u github.com/goravel/framework@v1.13.9 && go get -u github.com/goravel/gin
    +import{_ as o,c as i,a as p,b as s,e,f as t,r,o as c,d as l}from"./app-Ewo6p9aM.js";const u={};function d(h,n){const a=r("RouteLink");return c(),i("div",null,[n[11]||(n[11]=p(`

    从 v1.12 升级到 v1.13

    令人兴奋的新功能 🎉

    功能增强 🚀

    v1.13.4

    破坏性变化 🛠

    Bug 修复 🐛

    v1.13.2

    v1.13.4

    v1.13.5

    v1.13.6 v1.13.7

    v1.13.8

    v1.13.9

    v1.13.10

    升级指南

    请根据本节内容,一步步进行框架升级。

    预计升级时间:10 分钟

    1. 更新依赖

    go.mod 中更新依赖:

    go get -u github.com/goravel/framework@v1.13.9 && go get -u github.com/goravel/gin
     

    2. 新增文件

    tests

    database/seeders/database_seeder.go

    app/providers/database_service_provider.go

    3. 注册新的 Provider

    注意顺序:

    import (
       "github.com/goravel/framework/testing"
       "github.com/goravel/gin"
    diff --git a/assets/v1.14.html-DPlnarKn.js b/assets/v1.14.html-BdTzwT9L.js
    similarity index 99%
    rename from assets/v1.14.html-DPlnarKn.js
    rename to assets/v1.14.html-BdTzwT9L.js
    index f4a3d31d..4d6936b2 100644
    --- a/assets/v1.14.html-DPlnarKn.js
    +++ b/assets/v1.14.html-BdTzwT9L.js
    @@ -1,4 +1,4 @@
    -import{_ as p,c as o,a as t,b as n,e as l,f as i,d as a,r,o as c}from"./app-ELDWQP0J.js";const d={};function u(v,s){const e=r("RouteLink");return c(),o("div",null,[s[23]||(s[23]=t(`

    从 v1.13 升级到 v1.14

    令人兴奋的新功能 🎉

    功能增强 🚀

    破坏性变化 🛠

    v1.14.1

    v1.14.2

    v1.14.3

    同时升级:goravel/gin: v1.2.2, goravel/fiber: v1.2.2

    v1.14.4

    同时升级:goravel/gin: v1.2.3

    v1.14.5

    同时升级:goravel/gin: v1.2.4, goravel/fiber: v1.2.3

    v1.14.7

    同时升级:goravel/gin: v1.2.5, goravel/fiber: v1.2.4

    v1.14.8

    v1.14.9

    升级指南

    Goravel v1.14 基于 Golang 1.21 进行开发与测试,与其他低 Golang 版本一般情况下可以兼容运行。请根据本节内容,一步步进行框架升级。

    预计升级时间:10 分钟

    1. 更新依赖

    go get -u github.com/goravel/framework@v1.14.7
    +import{_ as p,c as o,a as t,b as n,e as l,f as i,d as a,r,o as c}from"./app-Ewo6p9aM.js";const d={};function u(v,s){const e=r("RouteLink");return c(),o("div",null,[s[23]||(s[23]=t(`

    从 v1.13 升级到 v1.14

    令人兴奋的新功能 🎉

    功能增强 🚀

    破坏性变化 🛠

    v1.14.1

    v1.14.2

    v1.14.3

    同时升级:goravel/gin: v1.2.2, goravel/fiber: v1.2.2

    v1.14.4

    同时升级:goravel/gin: v1.2.3

    v1.14.5

    同时升级:goravel/gin: v1.2.4, goravel/fiber: v1.2.3

    v1.14.7

    同时升级:goravel/gin: v1.2.5, goravel/fiber: v1.2.4

    v1.14.8

    v1.14.9

    升级指南

    Goravel v1.14 基于 Golang 1.21 进行开发与测试,与其他低 Golang 版本一般情况下可以兼容运行。请根据本节内容,一步步进行框架升级。

    预计升级时间:10 分钟

    1. 更新依赖

    go get -u github.com/goravel/framework@v1.14.7
     
     // 如果使用 gin
     go get -u github.com/goravel/gin@v1.2.5
    diff --git a/assets/v1.14.html-bMdPR76k.js b/assets/v1.14.html-lTdRYbaU.js
    similarity index 99%
    rename from assets/v1.14.html-bMdPR76k.js
    rename to assets/v1.14.html-lTdRYbaU.js
    index d8b016fc..5524062b 100644
    --- a/assets/v1.14.html-bMdPR76k.js
    +++ b/assets/v1.14.html-lTdRYbaU.js
    @@ -1,4 +1,4 @@
    -import{_ as o,c as p,a as l,b as e,e as i,f as t,d as s,r as d,o as r}from"./app-ELDWQP0J.js";const c={};function u(m,n){const a=d("RouteLink");return r(),p("div",null,[n[23]||(n[23]=l(`

    Upgrading To v1.14 From v1.13

    Exciting New Features 🎉

    Enhancements 🚀

    Breaking Changes 🛠

    v1.14.1

    v1.14.2

    v1.14.3

    Upgrade the related packages: goravel/gin: v1.2.2, goravel/fiber: v1.2.2

    v1.14.4

    Upgrade the related packages: goravel/gin: v1.2.3

    v1.14.5

    Upgrade the related packages: goravel/gin: v1.2.4, goravel/fiber: v1.2.3

    v1.14.7

    Upgrade the related packages: goravel/gin: v1.2.5, goravel/fiber: v1.2.4

    v1.14.8

    v1.14.9

    Upgrade Guide

    Goravel v1.14 is developed and tested based on Golang 1.21, and generally compatible with other lower Golang versions. Please upgrade the framework step by step according to the content in this section.

    Estimated Upgrade Time: 10 Minutes

    1. Updating Dependencies

    go get -u github.com/goravel/framework@v1.14.7
    +import{_ as o,c as p,a as l,b as e,e as i,f as t,d as s,r as d,o as r}from"./app-Ewo6p9aM.js";const c={};function u(m,n){const a=d("RouteLink");return r(),p("div",null,[n[23]||(n[23]=l(`

    Upgrading To v1.14 From v1.13

    Exciting New Features 🎉

    Enhancements 🚀

    Breaking Changes 🛠

    v1.14.1

    v1.14.2

    v1.14.3

    Upgrade the related packages: goravel/gin: v1.2.2, goravel/fiber: v1.2.2

    v1.14.4

    Upgrade the related packages: goravel/gin: v1.2.3

    v1.14.5

    Upgrade the related packages: goravel/gin: v1.2.4, goravel/fiber: v1.2.3

    v1.14.7

    Upgrade the related packages: goravel/gin: v1.2.5, goravel/fiber: v1.2.4

    v1.14.8

    v1.14.9

    Upgrade Guide

    Goravel v1.14 is developed and tested based on Golang 1.21, and generally compatible with other lower Golang versions. Please upgrade the framework step by step according to the content in this section.

    Estimated Upgrade Time: 10 Minutes

    1. Updating Dependencies

    go get -u github.com/goravel/framework@v1.14.7
     
     // If using gin
     go get -u github.com/goravel/gin@v1.2.5
    diff --git a/assets/v1.15.html-BMHEbFXP.js b/assets/v1.15.html-BI41-PdG.js
    similarity index 99%
    rename from assets/v1.15.html-BMHEbFXP.js
    rename to assets/v1.15.html-BI41-PdG.js
    index 2c327e93..1e909825 100644
    --- a/assets/v1.15.html-BMHEbFXP.js
    +++ b/assets/v1.15.html-BI41-PdG.js
    @@ -1,4 +1,4 @@
    -import{_ as c,c as u,a as p,b as s,e,f as o,d as a,r as i,o as r}from"./app-ELDWQP0J.js";const d={};function m(h,n){const t=i("RouteLink"),l=i("CommentService");return r(),u("div",null,[n[12]||(n[12]=p(`

    Upgrading To v1.15 From v1.14

    Exciting New Features 🎉

    Enhancements 🚀

    Breaking Changes 🛠

    Upgrade Guide

    Estimated Upgrade Time: 10 Minutes

    As Golang v1.21 is no longer maintained, the Golang version of Goravel supports has been upgraded from 1.21 to 1.22. Please update the version in the go.mod file.

    1. Updating Dependencies

    go get -u github.com/goravel/framework@v1.15.2
    +import{_ as c,c as u,a as p,b as s,e,f as o,d as a,r as i,o as r}from"./app-Ewo6p9aM.js";const d={};function m(h,n){const t=i("RouteLink"),l=i("CommentService");return r(),u("div",null,[n[12]||(n[12]=p(`

    Upgrading To v1.15 From v1.14

    Exciting New Features 🎉

    Enhancements 🚀

    Breaking Changes 🛠

    Upgrade Guide

    Estimated Upgrade Time: 10 Minutes

    As Golang v1.21 is no longer maintained, the Golang version of Goravel supports has been upgraded from 1.21 to 1.22. Please update the version in the go.mod file.

    1. Updating Dependencies

    go get -u github.com/goravel/framework@v1.15.2
     
     // If using gin
     go get -u github.com/goravel/gin@v1.3.2
    diff --git a/assets/v1.15.html-D9dirphE.js b/assets/v1.15.html-BrvVMvb6.js
    similarity index 99%
    rename from assets/v1.15.html-D9dirphE.js
    rename to assets/v1.15.html-BrvVMvb6.js
    index 821c12ab..7c6757d7 100644
    --- a/assets/v1.15.html-D9dirphE.js
    +++ b/assets/v1.15.html-BrvVMvb6.js
    @@ -1,4 +1,4 @@
    -import{_ as c,c as u,a as o,b as s,e,f as p,d as a,r as l,o as r}from"./app-ELDWQP0J.js";const d={};function k(m,n){const t=l("RouteLink"),i=l("CommentService");return r(),u("div",null,[n[13]||(n[13]=o(`

    从 v1.14 升级到 v1.15

    令人兴奋的新功能 🎉

    功能增强 🚀

    破坏性变化 🛠

    升级指南

    预计升级时间:10 分钟

    随着 Golang v1.21 不再被维护,Goravel v1.15 默认支持 Golang 版本由 1.21 升级为 1.22,请在 go.mod 文件中更新版本。

    1. 更新依赖

    go get -u github.com/goravel/framework@v1.15.2
    +import{_ as c,c as u,a as o,b as s,e,f as p,d as a,r as l,o as r}from"./app-Ewo6p9aM.js";const d={};function k(m,n){const t=l("RouteLink"),i=l("CommentService");return r(),u("div",null,[n[13]||(n[13]=o(`

    从 v1.14 升级到 v1.15

    令人兴奋的新功能 🎉

    功能增强 🚀

    破坏性变化 🛠

    升级指南

    预计升级时间:10 分钟

    随着 Golang v1.21 不再被维护,Goravel v1.15 默认支持 Golang 版本由 1.21 升级为 1.22,请在 go.mod 文件中更新版本。

    1. 更新依赖

    go get -u github.com/goravel/framework@v1.15.2
     
     // 如果使用 gin
     go get -u github.com/goravel/gin@v1.3.2
    diff --git a/assets/v1.2.html-D0LqRqm7.js b/assets/v1.2.html-BwNn_ayr.js
    similarity index 99%
    rename from assets/v1.2.html-D0LqRqm7.js
    rename to assets/v1.2.html-BwNn_ayr.js
    index 3cfe022e..da1d3c1f 100644
    --- a/assets/v1.2.html-D0LqRqm7.js
    +++ b/assets/v1.2.html-BwNn_ayr.js
    @@ -1,4 +1,4 @@
    -import{_ as o,c as p,b as n,e as a,f as t,a as c,d as s,r as i,o as u}from"./app-ELDWQP0J.js";const v={},h={class:"table-of-contents"};function m(g,e){const l=i("router-link"),r=i("RouteLink"),d=i("CommentService");return u(),p("div",null,[e[7]||(e[7]=n("h1",{id:"从-v1-1-升级到-v1-2",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#从-v1-1-升级到-v1-2"},[n("span",null,"从 v1.1 升级到 v1.2")])],-1)),n("nav",h,[n("ul",null,[n("li",null,[a(l,{to:"#高影响变化"},{default:t(()=>e[0]||(e[0]=[s("高影响变化")])),_:1})]),n("li",null,[a(l,{to:"#升级指南"},{default:t(()=>e[1]||(e[1]=[s("升级指南")])),_:1}),n("ul",null,[n("li",null,[a(l,{to:"#更新依赖"},{default:t(()=>e[2]||(e[2]=[s("更新依赖")])),_:1})]),n("li",null,[a(l,{to:"#auth-支持-context"},{default:t(()=>e[3]||(e[3]=[s("Auth 支持 Context")])),_:1})])])])])]),e[8]||(e[8]=c(`

    高影响变化

    升级指南

    预计升级时间:1 分钟

    更新依赖

    影响可能性:高

    go.mod 中更新依赖:

    github.com/goravel/framework v1.2.1
    +import{_ as o,c as p,b as n,e as a,f as t,a as c,d as s,r as i,o as u}from"./app-Ewo6p9aM.js";const v={},h={class:"table-of-contents"};function m(g,e){const l=i("router-link"),r=i("RouteLink"),d=i("CommentService");return u(),p("div",null,[e[7]||(e[7]=n("h1",{id:"从-v1-1-升级到-v1-2",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#从-v1-1-升级到-v1-2"},[n("span",null,"从 v1.1 升级到 v1.2")])],-1)),n("nav",h,[n("ul",null,[n("li",null,[a(l,{to:"#高影响变化"},{default:t(()=>e[0]||(e[0]=[s("高影响变化")])),_:1})]),n("li",null,[a(l,{to:"#升级指南"},{default:t(()=>e[1]||(e[1]=[s("升级指南")])),_:1}),n("ul",null,[n("li",null,[a(l,{to:"#更新依赖"},{default:t(()=>e[2]||(e[2]=[s("更新依赖")])),_:1})]),n("li",null,[a(l,{to:"#auth-支持-context"},{default:t(()=>e[3]||(e[3]=[s("Auth 支持 Context")])),_:1})])])])])]),e[8]||(e[8]=c(`

    高影响变化

    升级指南

    预计升级时间:1 分钟

    更新依赖

    影响可能性:高

    go.mod 中更新依赖:

    github.com/goravel/framework v1.2.1
     

    Auth 支持 Context

    影响可能性:高

    // Old
     facades.Auth.Parse(token string) error
     
    diff --git a/assets/v1.2.html-DHj4lNME.js b/assets/v1.2.html-mXqGWCTf.js
    similarity index 99%
    rename from assets/v1.2.html-DHj4lNME.js
    rename to assets/v1.2.html-mXqGWCTf.js
    index 54502d78..4bd6dc32 100644
    --- a/assets/v1.2.html-DHj4lNME.js
    +++ b/assets/v1.2.html-mXqGWCTf.js
    @@ -1,4 +1,4 @@
    -import{_ as r,c as l,a as d,b as p,d as n,e as a,f as c,r as s,o}from"./app-ELDWQP0J.js";const u={};function g(h,e){const t=s("RouteLink"),i=s("CommentService");return o(),l("div",null,[e[3]||(e[3]=d(`

    Upgrading To v1.2 From v1.1

    High Impact Changes

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Likelihood Of Impact: High

    Update dependencies in the go.mod file:

    github.com/goravel/framework v1.2.1
    +import{_ as r,c as l,a as d,b as p,d as n,e as a,f as c,r as s,o}from"./app-Ewo6p9aM.js";const u={};function g(h,e){const t=s("RouteLink"),i=s("CommentService");return o(),l("div",null,[e[3]||(e[3]=d(`

    Upgrading To v1.2 From v1.1

    High Impact Changes

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Likelihood Of Impact: High

    Update dependencies in the go.mod file:

    github.com/goravel/framework v1.2.1
     

    Auth Support Context

    Likelihood Of Impact: High

    // Old
     facades.Auth.Parse(token string) error
     
    diff --git a/assets/v1.3.html-Bi-V8sdS.js b/assets/v1.3.html-CbKsK0o_.js
    similarity index 98%
    rename from assets/v1.3.html-Bi-V8sdS.js
    rename to assets/v1.3.html-CbKsK0o_.js
    index fcd7eb91..6cc98046 100644
    --- a/assets/v1.3.html-Bi-V8sdS.js
    +++ b/assets/v1.3.html-CbKsK0o_.js
    @@ -1,2 +1,2 @@
    -import{_ as s,c as l,a as p,b as a,e as n,f as o,r as i,o as c,d as r}from"./app-ELDWQP0J.js";const g={};function u(m,e){const t=i("RouteLink"),d=i("CommentService");return c(),l("div",null,[e[2]||(e[2]=p(`

    Upgrading To v1.3 From v1.2

    Medium Impact Changes

    Low Impact Changes

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Likelihood Of Impact: High

    Update dependencies in the go.mod file:

    github.com/goravel/framework v1.3.1
    +import{_ as s,c as l,a as p,b as a,e as n,f as o,r as i,o as c,d as r}from"./app-Ewo6p9aM.js";const g={};function u(m,e){const t=i("RouteLink"),d=i("CommentService");return c(),l("div",null,[e[2]||(e[2]=p(`

    Upgrading To v1.3 From v1.2

    Medium Impact Changes

    Low Impact Changes

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Likelihood Of Impact: High

    Update dependencies in the go.mod file:

    github.com/goravel/framework v1.3.1
     

    Add CORS Configuration

    Likelihood Of Impact: Medium

    config/cors.go

    `,14)),a("p",null,[n(t,{to:"/the-basics/routing.html#cross-origin-resource-sharing-cors"},{default:o(()=>e[0]||(e[0]=[r("For detail")])),_:1})]),e[3]||(e[3]=a("h3",{id:"add-dockerfile",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#add-dockerfile"},[a("span",null,"Add Dockerfile")])],-1)),e[4]||(e[4]=a("p",null,[a("strong",null,"Likelihood Of Impact: Low")],-1)),e[5]||(e[5]=a("p",null,[a("a",{href:"https://github.com/goravel/goravel/blob/v1.3.1/Dockerfile",target:"_blank",rel:"noopener noreferrer"},"Dockerfile")],-1)),a("p",null,[n(t,{to:"/getting-started/compile.html#docker"},{default:o(()=>e[1]||(e[1]=[r("For detail")])),_:1})]),n(d)])}const f=s(g,[["render",u],["__file","v1.3.html.vue"]]),v=JSON.parse('{"path":"/upgrade/v1.3.html","title":"Upgrading To v1.3 From v1.2","lang":"en-US","frontmatter":{"description":"Upgrading To v1.3 From v1.2 Medium Impact Changes Add CORS Configuration Low Impact Changes Add Dockerfile Upgrade Guide Estimated Upgrade Time: 1 Minutes Updating Dependencies ...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/upgrade/v1.3.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/upgrade/v1.3.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/v1.3.html"}],["meta",{"property":"og:description","content":"Upgrading To v1.3 From v1.2 Medium Impact Changes Add CORS Configuration Low Impact Changes Add Dockerfile Upgrade Guide Estimated Upgrade Time: 1 Minutes Updating Dependencies ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Upgrading To v1.3 From v1.2\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"Medium Impact Changes","slug":"medium-impact-changes","link":"#medium-impact-changes","children":[]},{"level":2,"title":"Low Impact Changes","slug":"low-impact-changes","link":"#low-impact-changes","children":[]},{"level":2,"title":"Upgrade Guide","slug":"upgrade-guide","link":"#upgrade-guide","children":[{"level":3,"title":"Updating Dependencies","slug":"updating-dependencies","link":"#updating-dependencies","children":[]},{"level":3,"title":"Add CORS Configuration","slug":"add-cors-configuration","link":"#add-cors-configuration","children":[]},{"level":3,"title":"Add Dockerfile","slug":"add-dockerfile","link":"#add-dockerfile","children":[]}]}],"git":{},"filePathRelative":"upgrade/v1.3.md","autoDesc":true}');export{f as comp,v as data}; diff --git a/assets/v1.3.html-Dy2IeiUA.js b/assets/v1.3.html-tHE7sKhD.js similarity index 98% rename from assets/v1.3.html-Dy2IeiUA.js rename to assets/v1.3.html-tHE7sKhD.js index 23e9a373..3b73c299 100644 --- a/assets/v1.3.html-Dy2IeiUA.js +++ b/assets/v1.3.html-tHE7sKhD.js @@ -1,2 +1,2 @@ -import{_ as p,c as d,b as t,e as l,f as o,a as c,r as a,o as u,d as n}from"./app-ELDWQP0J.js";const g={},f={class:"table-of-contents"};function h(v,e){const r=a("router-link"),s=a("RouteLink"),i=a("CommentService");return u(),d("div",null,[e[8]||(e[8]=t("h1",{id:"从-v1-2-升级到-v1-3",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#从-v1-2-升级到-v1-3"},[t("span",null,"从 v1.2 升级到 v1.3")])],-1)),t("nav",f,[t("ul",null,[t("li",null,[l(r,{to:"#中影响变化"},{default:o(()=>e[0]||(e[0]=[n("中影响变化")])),_:1})]),t("li",null,[l(r,{to:"#低影响变化"},{default:o(()=>e[1]||(e[1]=[n("低影响变化")])),_:1})]),t("li",null,[l(r,{to:"#升级指南"},{default:o(()=>e[2]||(e[2]=[n("升级指南")])),_:1}),t("ul",null,[t("li",null,[l(r,{to:"#更新依赖"},{default:o(()=>e[3]||(e[3]=[n("更新依赖")])),_:1})]),t("li",null,[l(r,{to:"#新增-cors-配置"},{default:o(()=>e[4]||(e[4]=[n("新增 CORS 配置")])),_:1})]),t("li",null,[l(r,{to:"#新增-dockerfile-文件"},{default:o(()=>e[5]||(e[5]=[n("新增 Dockerfile 文件")])),_:1})])])])])]),e[9]||(e[9]=c(`

    中影响变化

    低影响变化

    升级指南

    预计升级时间:1 分钟

    更新依赖

    影响可能性:高

    go.mod 中更新依赖:

    github.com/goravel/framework v1.3.1
    +import{_ as p,c as d,b as t,e as l,f as o,a as c,r as a,o as u,d as n}from"./app-Ewo6p9aM.js";const g={},f={class:"table-of-contents"};function h(v,e){const r=a("router-link"),s=a("RouteLink"),i=a("CommentService");return u(),d("div",null,[e[8]||(e[8]=t("h1",{id:"从-v1-2-升级到-v1-3",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#从-v1-2-升级到-v1-3"},[t("span",null,"从 v1.2 升级到 v1.3")])],-1)),t("nav",f,[t("ul",null,[t("li",null,[l(r,{to:"#中影响变化"},{default:o(()=>e[0]||(e[0]=[n("中影响变化")])),_:1})]),t("li",null,[l(r,{to:"#低影响变化"},{default:o(()=>e[1]||(e[1]=[n("低影响变化")])),_:1})]),t("li",null,[l(r,{to:"#升级指南"},{default:o(()=>e[2]||(e[2]=[n("升级指南")])),_:1}),t("ul",null,[t("li",null,[l(r,{to:"#更新依赖"},{default:o(()=>e[3]||(e[3]=[n("更新依赖")])),_:1})]),t("li",null,[l(r,{to:"#新增-cors-配置"},{default:o(()=>e[4]||(e[4]=[n("新增 CORS 配置")])),_:1})]),t("li",null,[l(r,{to:"#新增-dockerfile-文件"},{default:o(()=>e[5]||(e[5]=[n("新增 Dockerfile 文件")])),_:1})])])])])]),e[9]||(e[9]=c(`

    中影响变化

    低影响变化

    升级指南

    预计升级时间:1 分钟

    更新依赖

    影响可能性:高

    go.mod 中更新依赖:

    github.com/goravel/framework v1.3.1
     

    新增 CORS 配置

    影响可能性:中

    config/cors.go

    `,13)),t("p",null,[l(s,{to:"/zh/the-basics/routing.html#%E8%B7%A8%E5%9F%9F%E8%B5%84%E6%BA%90%E5%85%B1%E4%BA%AB-cors"},{default:o(()=>e[6]||(e[6]=[n("查看文档")])),_:1})]),e[10]||(e[10]=t("h3",{id:"新增-dockerfile-文件",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#新增-dockerfile-文件"},[t("span",null,"新增 Dockerfile 文件")])],-1)),e[11]||(e[11]=t("p",null,[t("strong",null,"影响可能性:低")],-1)),e[12]||(e[12]=t("p",null,[t("a",{href:"https://github.com/goravel/goravel/blob/v1.3.1/Dockerfile",target:"_blank",rel:"noopener noreferrer"},"Dockerfile")],-1)),t("p",null,[l(s,{to:"/zh/getting-started/compile.html#docker"},{default:o(()=>e[7]||(e[7]=[n("查看文档")])),_:1})]),l(i)])}const k=p(g,[["render",h],["__file","v1.3.html.vue"]]),b=JSON.parse('{"path":"/zh/upgrade/v1.3.html","title":"从 v1.2 升级到 v1.3","lang":"zh-CN","frontmatter":{"description":"从 v1.2 升级到 v1.3 中影响变化 新增 CORS 配置 低影响变化 新增 Dockerfile 文件 升级指南 预计升级时间:1 分钟 更新依赖 影响可能性:高 go.mod 中更新依赖: 新增 CORS 配置 影响可能性:中 config/cors.go 新增 Dockerfile 文件 影响可能性:低 Dockerfile","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/upgrade/v1.3.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/upgrade/v1.3.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/v1.3.html"}],["meta",{"property":"og:description","content":"从 v1.2 升级到 v1.3 中影响变化 新增 CORS 配置 低影响变化 新增 Dockerfile 文件 升级指南 预计升级时间:1 分钟 更新依赖 影响可能性:高 go.mod 中更新依赖: 新增 CORS 配置 影响可能性:中 config/cors.go 新增 Dockerfile 文件 影响可能性:低 Dockerfile"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"从 v1.2 升级到 v1.3\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"中影响变化","slug":"中影响变化","link":"#中影响变化","children":[]},{"level":2,"title":"低影响变化","slug":"低影响变化","link":"#低影响变化","children":[]},{"level":2,"title":"升级指南","slug":"升级指南","link":"#升级指南","children":[{"level":3,"title":"更新依赖","slug":"更新依赖","link":"#更新依赖","children":[]},{"level":3,"title":"新增 CORS 配置","slug":"新增-cors-配置","link":"#新增-cors-配置","children":[]},{"level":3,"title":"新增 Dockerfile 文件","slug":"新增-dockerfile-文件","link":"#新增-dockerfile-文件","children":[]}]}],"git":{},"filePathRelative":"zh/upgrade/v1.3.md","autoDesc":true}');export{k as comp,b as data}; diff --git a/assets/v1.4.html-DYbIWcYQ.js b/assets/v1.4.html-DgzhLqIa.js similarity index 99% rename from assets/v1.4.html-DYbIWcYQ.js rename to assets/v1.4.html-DgzhLqIa.js index f046896f..f736cba9 100644 --- a/assets/v1.4.html-DYbIWcYQ.js +++ b/assets/v1.4.html-DgzhLqIa.js @@ -1,2 +1,2 @@ -import{_ as s,c as g,b as t,e as r,f as a,a as d,d as o,r as l,o as h}from"./app-ELDWQP0J.js";const u={},c={class:"table-of-contents"};function m(v,e){const i=l("router-link"),n=l("RouteLink"),p=l("CommentService");return h(),g("div",null,[e[11]||(e[11]=t("h1",{id:"upgrading-to-v1-4-from-v1-3",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#upgrading-to-v1-4-from-v1-3"},[t("span",null,"Upgrading To v1.4 From v1.3")])],-1)),t("nav",c,[t("ul",null,[t("li",null,[r(i,{to:"#high-impact-changes"},{default:a(()=>e[0]||(e[0]=[o("High Impact Changes")])),_:1})]),t("li",null,[r(i,{to:"#low-impact-changes"},{default:a(()=>e[1]||(e[1]=[o("Low Impact Changes")])),_:1})]),t("li",null,[r(i,{to:"#upgrade-guide"},{default:a(()=>e[2]||(e[2]=[o("Upgrade Guide")])),_:1}),t("ul",null,[t("li",null,[r(i,{to:"#updating-dependencies"},{default:a(()=>e[3]||(e[3]=[o("Updating Dependencies")])),_:1})]),t("li",null,[r(i,{to:"#optimize-grpc-module"},{default:a(()=>e[4]||(e[4]=[o("Optimize Grpc Module")])),_:1})]),t("li",null,[r(i,{to:"#optimize-route-register"},{default:a(()=>e[5]||(e[5]=[o("Optimize Route Register")])),_:1})]),t("li",null,[r(i,{to:"#add-http-context-method"},{default:a(()=>e[6]||(e[6]=[o("Add http.Context Method")])),_:1})]),t("li",null,[r(i,{to:"#add-request-method"},{default:a(()=>e[7]||(e[7]=[o("Add Request Method")])),_:1})])])])])]),e[12]||(e[12]=d(`

    High Impact Changes

    Low Impact Changes

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Likelihood Of Impact: High

    Update dependencies in the go.mod file:

    github.com/goravel/framework v1.4.0
    +import{_ as s,c as g,b as t,e as r,f as a,a as d,d as o,r as l,o as h}from"./app-Ewo6p9aM.js";const u={},c={class:"table-of-contents"};function m(v,e){const i=l("router-link"),n=l("RouteLink"),p=l("CommentService");return h(),g("div",null,[e[11]||(e[11]=t("h1",{id:"upgrading-to-v1-4-from-v1-3",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#upgrading-to-v1-4-from-v1-3"},[t("span",null,"Upgrading To v1.4 From v1.3")])],-1)),t("nav",c,[t("ul",null,[t("li",null,[r(i,{to:"#high-impact-changes"},{default:a(()=>e[0]||(e[0]=[o("High Impact Changes")])),_:1})]),t("li",null,[r(i,{to:"#low-impact-changes"},{default:a(()=>e[1]||(e[1]=[o("Low Impact Changes")])),_:1})]),t("li",null,[r(i,{to:"#upgrade-guide"},{default:a(()=>e[2]||(e[2]=[o("Upgrade Guide")])),_:1}),t("ul",null,[t("li",null,[r(i,{to:"#updating-dependencies"},{default:a(()=>e[3]||(e[3]=[o("Updating Dependencies")])),_:1})]),t("li",null,[r(i,{to:"#optimize-grpc-module"},{default:a(()=>e[4]||(e[4]=[o("Optimize Grpc Module")])),_:1})]),t("li",null,[r(i,{to:"#optimize-route-register"},{default:a(()=>e[5]||(e[5]=[o("Optimize Route Register")])),_:1})]),t("li",null,[r(i,{to:"#add-http-context-method"},{default:a(()=>e[6]||(e[6]=[o("Add http.Context Method")])),_:1})]),t("li",null,[r(i,{to:"#add-request-method"},{default:a(()=>e[7]||(e[7]=[o("Add Request Method")])),_:1})])])])])]),e[12]||(e[12]=d(`

    High Impact Changes

    Low Impact Changes

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Likelihood Of Impact: High

    Update dependencies in the go.mod file:

    github.com/goravel/framework v1.4.0
     

    Optimize Grpc Module

    Likelihood Of Impact: High

    1. Add app/grpc/kernel.go file;
    2. Add app/grpc/interceptors folder;
    3. Add config/grpc.go file;
    4. Add routes/grpc.go file;
    5. Add register interceptor logic in app/providers/grpc_service_provider.go;
    6. Remove grpc_host in config/app.go;
    `,13)),t("p",null,[r(n,{to:"/the-basics/grpc.html"},{default:a(()=>e[8]||(e[8]=[o("For Detail")])),_:1})]),e[13]||(e[13]=d('

    Optimize Route Register

    Likelihood Of Impact: High

    Move routes.Web() to Boot() from Register() in app/providers/route_service_provider.go;

    Add http.Context Method

    Likelihood Of Impact: Low

    Add ctx.Context() Method.

    ',6)),t("p",null,[r(n,{to:"/the-basics/request.html#get-context"},{default:a(()=>e[9]||(e[9]=[o("For Detail")])),_:1})]),e[14]||(e[14]=t("h3",{id:"add-request-method",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#add-request-method"},[t("span",null,"Add Request Method")])],-1)),e[15]||(e[15]=t("p",null,[t("strong",null,"Likelihood Of Impact: Low")],-1)),e[16]||(e[16]=t("p",null,[o("Add "),t("code",null,"ctx.Request().AbortWithStatusJson"),o(" method.")],-1)),t("p",null,[r(n,{to:"/the-basics/request.html#abort-request"},{default:a(()=>e[10]||(e[10]=[o("For Detail")])),_:1})]),r(p)])}const b=s(u,[["render",m],["__file","v1.4.html.vue"]]),k=JSON.parse('{"path":"/upgrade/v1.4.html","title":"Upgrading To v1.4 From v1.3","lang":"en-US","frontmatter":{"description":"Upgrading To v1.4 From v1.3 High Impact Changes Optimize Grpc Module Optimize Route Register Low Impact Changes Add http.Context Method Add Request Method Upgrade Guide Estimate...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/upgrade/v1.4.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/upgrade/v1.4.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/v1.4.html"}],["meta",{"property":"og:description","content":"Upgrading To v1.4 From v1.3 High Impact Changes Optimize Grpc Module Optimize Route Register Low Impact Changes Add http.Context Method Add Request Method Upgrade Guide Estimate..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Upgrading To v1.4 From v1.3\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"High Impact Changes","slug":"high-impact-changes","link":"#high-impact-changes","children":[]},{"level":2,"title":"Low Impact Changes","slug":"low-impact-changes","link":"#low-impact-changes","children":[]},{"level":2,"title":"Upgrade Guide","slug":"upgrade-guide","link":"#upgrade-guide","children":[{"level":3,"title":"Updating Dependencies","slug":"updating-dependencies","link":"#updating-dependencies","children":[]},{"level":3,"title":"Optimize Grpc Module","slug":"optimize-grpc-module","link":"#optimize-grpc-module","children":[]},{"level":3,"title":"Optimize Route Register","slug":"optimize-route-register","link":"#optimize-route-register","children":[]},{"level":3,"title":"Add http.Context Method","slug":"add-http-context-method","link":"#add-http-context-method","children":[]},{"level":3,"title":"Add Request Method","slug":"add-request-method","link":"#add-request-method","children":[]}]}],"git":{},"filePathRelative":"upgrade/v1.4.md","autoDesc":true}');export{b as comp,k as data}; diff --git a/assets/v1.4.html-CQ3ogmB9.js b/assets/v1.4.html-DrNJQuWM.js similarity index 99% rename from assets/v1.4.html-CQ3ogmB9.js rename to assets/v1.4.html-DrNJQuWM.js index 7337c5c3..78aa8707 100644 --- a/assets/v1.4.html-CQ3ogmB9.js +++ b/assets/v1.4.html-DrNJQuWM.js @@ -1,2 +1,2 @@ -import{_ as g,c as d,b as t,e as o,f as l,a as s,d as r,r as p,o as u}from"./app-ELDWQP0J.js";const h={},c={class:"table-of-contents"};function v(f,e){const n=p("router-link"),a=p("RouteLink"),i=p("CommentService");return u(),d("div",null,[e[11]||(e[11]=t("h1",{id:"从-v1-3-升级到-v1-4",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#从-v1-3-升级到-v1-4"},[t("span",null,"从 v1.3 升级到 v1.4")])],-1)),t("nav",c,[t("ul",null,[t("li",null,[o(n,{to:"#高影响变化"},{default:l(()=>e[0]||(e[0]=[r("高影响变化")])),_:1})]),t("li",null,[o(n,{to:"#低影响变化"},{default:l(()=>e[1]||(e[1]=[r("低影响变化")])),_:1})]),t("li",null,[o(n,{to:"#升级指南"},{default:l(()=>e[2]||(e[2]=[r("升级指南")])),_:1}),t("ul",null,[t("li",null,[o(n,{to:"#更新依赖"},{default:l(()=>e[3]||(e[3]=[r("更新依赖")])),_:1})]),t("li",null,[o(n,{to:"#优化-grpc-模块"},{default:l(()=>e[4]||(e[4]=[r("优化 Grpc 模块")])),_:1})]),t("li",null,[o(n,{to:"#优化路由注册"},{default:l(()=>e[5]||(e[5]=[r("优化路由注册")])),_:1})]),t("li",null,[o(n,{to:"#http-context-新增方法"},{default:l(()=>e[6]||(e[6]=[r("http.Context 新增方法")])),_:1})]),t("li",null,[o(n,{to:"#request-新增方法"},{default:l(()=>e[7]||(e[7]=[r("Request 新增方法")])),_:1})])])])])]),e[12]||(e[12]=s(`

    高影响变化

    低影响变化

    升级指南

    预计升级时间:1 分钟

    更新依赖

    影响可能性:高

    go.mod 中更新依赖:

    github.com/goravel/framework v1.4.0
    +import{_ as g,c as d,b as t,e as o,f as l,a as s,d as r,r as p,o as u}from"./app-Ewo6p9aM.js";const h={},c={class:"table-of-contents"};function v(f,e){const n=p("router-link"),a=p("RouteLink"),i=p("CommentService");return u(),d("div",null,[e[11]||(e[11]=t("h1",{id:"从-v1-3-升级到-v1-4",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#从-v1-3-升级到-v1-4"},[t("span",null,"从 v1.3 升级到 v1.4")])],-1)),t("nav",c,[t("ul",null,[t("li",null,[o(n,{to:"#高影响变化"},{default:l(()=>e[0]||(e[0]=[r("高影响变化")])),_:1})]),t("li",null,[o(n,{to:"#低影响变化"},{default:l(()=>e[1]||(e[1]=[r("低影响变化")])),_:1})]),t("li",null,[o(n,{to:"#升级指南"},{default:l(()=>e[2]||(e[2]=[r("升级指南")])),_:1}),t("ul",null,[t("li",null,[o(n,{to:"#更新依赖"},{default:l(()=>e[3]||(e[3]=[r("更新依赖")])),_:1})]),t("li",null,[o(n,{to:"#优化-grpc-模块"},{default:l(()=>e[4]||(e[4]=[r("优化 Grpc 模块")])),_:1})]),t("li",null,[o(n,{to:"#优化路由注册"},{default:l(()=>e[5]||(e[5]=[r("优化路由注册")])),_:1})]),t("li",null,[o(n,{to:"#http-context-新增方法"},{default:l(()=>e[6]||(e[6]=[r("http.Context 新增方法")])),_:1})]),t("li",null,[o(n,{to:"#request-新增方法"},{default:l(()=>e[7]||(e[7]=[r("Request 新增方法")])),_:1})])])])])]),e[12]||(e[12]=s(`

    高影响变化

    低影响变化

    升级指南

    预计升级时间:1 分钟

    更新依赖

    影响可能性:高

    go.mod 中更新依赖:

    github.com/goravel/framework v1.4.0
     

    优化 Grpc 模块

    影响可能性:高

    1. 新增 app/grpc/kernel.go 文件;
    2. 新增 app/grpc/interceptors 目录;
    3. 新增 config/grpc.go 文件;
    4. 新增 routes/grpc.go 文件;
    5. app/providers/grpc_service_provider.go 新增注册拦截器逻辑;
    6. config/app.go 文件删除 grpc_host 键值;
    `,13)),t("p",null,[o(a,{to:"/zh/the-basics/grpc.html"},{default:l(()=>e[8]||(e[8]=[r("查看文档")])),_:1})]),e[13]||(e[13]=s('

    优化路由注册

    影响可能性:高

    app/providers/route_service_provider.go 文件中,将 routes.Web()Register() 移动到 Boot()

    http.Context 新增方法

    影响可能性:低

    新增 ctx.Context() 方法。

    ',6)),t("p",null,[o(a,{to:"/zh/the-basics/request.html#%E8%8E%B7%E5%8F%96-context"},{default:l(()=>e[9]||(e[9]=[r("查看文档")])),_:1})]),e[14]||(e[14]=t("h3",{id:"request-新增方法",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#request-新增方法"},[t("span",null,"Request 新增方法")])],-1)),e[15]||(e[15]=t("p",null,[t("strong",null,"影响可能性:低")],-1)),e[16]||(e[16]=t("p",null,[r("新增 "),t("code",null,"ctx.Request().AbortWithStatusJson"),r(" 方法。")],-1)),t("p",null,[o(a,{to:"/zh/the-basics/request.html#%E4%B8%AD%E6%96%AD%E8%AF%B7%E6%B1%82"},{default:l(()=>e[10]||(e[10]=[r("查看文档")])),_:1})]),o(i)])}const b=g(h,[["render",v],["__file","v1.4.html.vue"]]),k=JSON.parse('{"path":"/zh/upgrade/v1.4.html","title":"从 v1.3 升级到 v1.4","lang":"zh-CN","frontmatter":{"description":"从 v1.3 升级到 v1.4 高影响变化 优化 Grpc 模块 优化路由注册 低影响变化 http.Context 新增方法 Request 新增方法 升级指南 预计升级时间:1 分钟 更新依赖 影响可能性:高 go.mod 中更新依赖: 优化 Grpc 模块 影响可能性:高 新增 app/grpc/kernel.go 文件; 新增 app/grpc...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/upgrade/v1.4.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/upgrade/v1.4.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/v1.4.html"}],["meta",{"property":"og:description","content":"从 v1.3 升级到 v1.4 高影响变化 优化 Grpc 模块 优化路由注册 低影响变化 http.Context 新增方法 Request 新增方法 升级指南 预计升级时间:1 分钟 更新依赖 影响可能性:高 go.mod 中更新依赖: 优化 Grpc 模块 影响可能性:高 新增 app/grpc/kernel.go 文件; 新增 app/grpc..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"从 v1.3 升级到 v1.4\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"高影响变化","slug":"高影响变化","link":"#高影响变化","children":[]},{"level":2,"title":"低影响变化","slug":"低影响变化","link":"#低影响变化","children":[]},{"level":2,"title":"升级指南","slug":"升级指南","link":"#升级指南","children":[{"level":3,"title":"更新依赖","slug":"更新依赖","link":"#更新依赖","children":[]},{"level":3,"title":"优化 Grpc 模块","slug":"优化-grpc-模块","link":"#优化-grpc-模块","children":[]},{"level":3,"title":"优化路由注册","slug":"优化路由注册","link":"#优化路由注册","children":[]},{"level":3,"title":"http.Context 新增方法","slug":"http-context-新增方法","link":"#http-context-新增方法","children":[]},{"level":3,"title":"Request 新增方法","slug":"request-新增方法","link":"#request-新增方法","children":[]}]}],"git":{},"filePathRelative":"zh/upgrade/v1.4.md","autoDesc":true}');export{b as comp,k as data}; diff --git a/assets/v1.5.html-DE69oQdf.js b/assets/v1.5.html-Bmq8i0sU.js similarity index 98% rename from assets/v1.5.html-DE69oQdf.js rename to assets/v1.5.html-Bmq8i0sU.js index cfbbf202..33aed428 100644 --- a/assets/v1.5.html-DE69oQdf.js +++ b/assets/v1.5.html-Bmq8i0sU.js @@ -1,2 +1,2 @@ -import{_ as p,c as d,b as t,e as o,f as n,a as c,r,o as g,d as a}from"./app-ELDWQP0J.js";const v={},m={class:"table-of-contents"};function u(h,e){const l=r("router-link"),s=r("RouteLink"),i=r("CommentService");return g(),d("div",null,[e[5]||(e[5]=t("h1",{id:"从-v1-4-升级到-v1-5",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#从-v1-4-升级到-v1-5"},[t("span",null,"从 v1.4 升级到 v1.5")])],-1)),t("nav",m,[t("ul",null,[t("li",null,[o(l,{to:"#高影响变化"},{default:n(()=>e[0]||(e[0]=[a("高影响变化")])),_:1})]),t("li",null,[o(l,{to:"#升级指南"},{default:n(()=>e[1]||(e[1]=[a("升级指南")])),_:1}),t("ul",null,[t("li",null,[o(l,{to:"#更新依赖"},{default:n(()=>e[2]||(e[2]=[a("更新依赖")])),_:1})]),t("li",null,[o(l,{to:"#新增文件存储模块"},{default:n(()=>e[3]||(e[3]=[a("新增文件存储模块")])),_:1})])])])])]),e[6]||(e[6]=c(`

    高影响变化

    升级指南

    预计升级时间:1 分钟

    更新依赖

    影响可能性:高

    go.mod 中更新依赖:

    github.com/goravel/framework v1.5.0
    +import{_ as p,c as d,b as t,e as o,f as n,a as c,r,o as g,d as a}from"./app-Ewo6p9aM.js";const v={},m={class:"table-of-contents"};function u(h,e){const l=r("router-link"),s=r("RouteLink"),i=r("CommentService");return g(),d("div",null,[e[5]||(e[5]=t("h1",{id:"从-v1-4-升级到-v1-5",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#从-v1-4-升级到-v1-5"},[t("span",null,"从 v1.4 升级到 v1.5")])],-1)),t("nav",m,[t("ul",null,[t("li",null,[o(l,{to:"#高影响变化"},{default:n(()=>e[0]||(e[0]=[a("高影响变化")])),_:1})]),t("li",null,[o(l,{to:"#升级指南"},{default:n(()=>e[1]||(e[1]=[a("升级指南")])),_:1}),t("ul",null,[t("li",null,[o(l,{to:"#更新依赖"},{default:n(()=>e[2]||(e[2]=[a("更新依赖")])),_:1})]),t("li",null,[o(l,{to:"#新增文件存储模块"},{default:n(()=>e[3]||(e[3]=[a("新增文件存储模块")])),_:1})])])])])]),e[6]||(e[6]=c(`

    高影响变化

    升级指南

    预计升级时间:1 分钟

    更新依赖

    影响可能性:高

    go.mod 中更新依赖:

    github.com/goravel/framework v1.5.0
     

    新增文件存储模块

    影响可能性:高

    1. 新增 config/filesystems.go 文件;
    2. config/app.go 文件 providers 新增 &filesystem.ServiceProvider{}
    `,11)),t("p",null,[o(s,{to:"/zh/digging-deeper/filesystem.html"},{default:n(()=>e[4]||(e[4]=[a("查看文档")])),_:1})]),o(i)])}const b=p(v,[["render",u],["__file","v1.5.html.vue"]]),k=JSON.parse('{"path":"/zh/upgrade/v1.5.html","title":"从 v1.4 升级到 v1.5","lang":"zh-CN","frontmatter":{"description":"从 v1.4 升级到 v1.5 高影响变化 新增文件存储模块 升级指南 预计升级时间:1 分钟 更新依赖 影响可能性:高 go.mod 中更新依赖: 新增文件存储模块 影响可能性:高 新增 config/filesystems.go 文件; config/app.go 文件 providers 新增 &filesystem.ServiceProvide...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/upgrade/v1.5.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/upgrade/v1.5.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/v1.5.html"}],["meta",{"property":"og:description","content":"从 v1.4 升级到 v1.5 高影响变化 新增文件存储模块 升级指南 预计升级时间:1 分钟 更新依赖 影响可能性:高 go.mod 中更新依赖: 新增文件存储模块 影响可能性:高 新增 config/filesystems.go 文件; config/app.go 文件 providers 新增 &filesystem.ServiceProvide..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"从 v1.4 升级到 v1.5\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"高影响变化","slug":"高影响变化","link":"#高影响变化","children":[]},{"level":2,"title":"升级指南","slug":"升级指南","link":"#升级指南","children":[{"level":3,"title":"更新依赖","slug":"更新依赖","link":"#更新依赖","children":[]},{"level":3,"title":"新增文件存储模块","slug":"新增文件存储模块","link":"#新增文件存储模块","children":[]}]}],"git":{},"filePathRelative":"zh/upgrade/v1.5.md","autoDesc":true}');export{b as comp,k as data}; diff --git a/assets/v1.5.html-BMDUgiIu.js b/assets/v1.5.html-DIctImTe.js similarity index 98% rename from assets/v1.5.html-BMDUgiIu.js rename to assets/v1.5.html-DIctImTe.js index 4765ea55..14a77e7c 100644 --- a/assets/v1.5.html-BMDUgiIu.js +++ b/assets/v1.5.html-DIctImTe.js @@ -1,2 +1,2 @@ -import{_ as s,c as p,b as t,e as a,f as n,a as g,r as d,o as c,d as i}from"./app-ELDWQP0J.js";const u={},h={class:"table-of-contents"};function m(v,e){const o=d("router-link"),l=d("RouteLink"),r=d("CommentService");return c(),p("div",null,[e[5]||(e[5]=t("h1",{id:"upgrading-to-v1-5-from-v1-4",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#upgrading-to-v1-5-from-v1-4"},[t("span",null,"Upgrading To v1.5 From v1.4")])],-1)),t("nav",h,[t("ul",null,[t("li",null,[a(o,{to:"#high-impact-changes"},{default:n(()=>e[0]||(e[0]=[i("High Impact Changes")])),_:1})]),t("li",null,[a(o,{to:"#upgrade-guide"},{default:n(()=>e[1]||(e[1]=[i("Upgrade Guide")])),_:1}),t("ul",null,[t("li",null,[a(o,{to:"#updating-dependencies"},{default:n(()=>e[2]||(e[2]=[i("Updating Dependencies")])),_:1})]),t("li",null,[a(o,{to:"#add-file-storage-module"},{default:n(()=>e[3]||(e[3]=[i("Add File Storage Module")])),_:1})])])])])]),e[6]||(e[6]=g(`

    High Impact Changes

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Likelihood Of Impact: High

    Update dependencies in the go.mod file:

    github.com/goravel/framework v1.5.0
    +import{_ as s,c as p,b as t,e as a,f as n,a as g,r as d,o as c,d as i}from"./app-Ewo6p9aM.js";const u={},h={class:"table-of-contents"};function m(v,e){const o=d("router-link"),l=d("RouteLink"),r=d("CommentService");return c(),p("div",null,[e[5]||(e[5]=t("h1",{id:"upgrading-to-v1-5-from-v1-4",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#upgrading-to-v1-5-from-v1-4"},[t("span",null,"Upgrading To v1.5 From v1.4")])],-1)),t("nav",h,[t("ul",null,[t("li",null,[a(o,{to:"#high-impact-changes"},{default:n(()=>e[0]||(e[0]=[i("High Impact Changes")])),_:1})]),t("li",null,[a(o,{to:"#upgrade-guide"},{default:n(()=>e[1]||(e[1]=[i("Upgrade Guide")])),_:1}),t("ul",null,[t("li",null,[a(o,{to:"#updating-dependencies"},{default:n(()=>e[2]||(e[2]=[i("Updating Dependencies")])),_:1})]),t("li",null,[a(o,{to:"#add-file-storage-module"},{default:n(()=>e[3]||(e[3]=[i("Add File Storage Module")])),_:1})])])])])]),e[6]||(e[6]=g(`

    High Impact Changes

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Likelihood Of Impact: High

    Update dependencies in the go.mod file:

    github.com/goravel/framework v1.5.0
     

    Add File Storage Module

    Likelihood Of Impact: High

    1. Add config/filesystems.go file;
    2. Add &filesystem.ServiceProvider{} to the providers item in the config/app.go file;
    `,11)),t("p",null,[a(l,{to:"/digging-deeper/filesystem.html"},{default:n(()=>e[4]||(e[4]=[i("For Detail")])),_:1})]),a(r)])}const k=s(u,[["render",m],["__file","v1.5.html.vue"]]),U=JSON.parse('{"path":"/upgrade/v1.5.html","title":"Upgrading To v1.5 From v1.4","lang":"en-US","frontmatter":{"description":"Upgrading To v1.5 From v1.4 High Impact Changes Add File Storage Module Upgrade Guide Estimated Upgrade Time: 1 Minutes Updating Dependencies Likelihood Of Impact: High Update d...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/upgrade/v1.5.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/upgrade/v1.5.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/v1.5.html"}],["meta",{"property":"og:description","content":"Upgrading To v1.5 From v1.4 High Impact Changes Add File Storage Module Upgrade Guide Estimated Upgrade Time: 1 Minutes Updating Dependencies Likelihood Of Impact: High Update d..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Upgrading To v1.5 From v1.4\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"High Impact Changes","slug":"high-impact-changes","link":"#high-impact-changes","children":[]},{"level":2,"title":"Upgrade Guide","slug":"upgrade-guide","link":"#upgrade-guide","children":[{"level":3,"title":"Updating Dependencies","slug":"updating-dependencies","link":"#updating-dependencies","children":[]},{"level":3,"title":"Add File Storage Module","slug":"add-file-storage-module","link":"#add-file-storage-module","children":[]}]}],"git":{},"filePathRelative":"upgrade/v1.5.md","autoDesc":true}');export{k as comp,U as data}; diff --git a/assets/v1.6.html-DOXqmAiA.js b/assets/v1.6.html-BAAJlVdv.js similarity index 98% rename from assets/v1.6.html-DOXqmAiA.js rename to assets/v1.6.html-BAAJlVdv.js index a961ffb2..f54c7f53 100644 --- a/assets/v1.6.html-DOXqmAiA.js +++ b/assets/v1.6.html-BAAJlVdv.js @@ -1,2 +1,2 @@ -import{_ as p,c as s,b as t,e as a,f as n,a as g,r,o as u,d as o}from"./app-ELDWQP0J.js";const h={},c={class:"table-of-contents"};function m(v,e){const i=r("router-link"),d=r("RouteLink"),l=r("CommentService");return u(),s("div",null,[e[5]||(e[5]=t("h1",{id:"upgrading-to-v1-6-from-v1-5",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#upgrading-to-v1-6-from-v1-5"},[t("span",null,"Upgrading To v1.6 From v1.5")])],-1)),t("nav",c,[t("ul",null,[t("li",null,[a(i,{to:"#high-impact-changes"},{default:n(()=>e[0]||(e[0]=[o("High Impact Changes")])),_:1})]),t("li",null,[a(i,{to:"#upgrade-guide"},{default:n(()=>e[1]||(e[1]=[o("Upgrade Guide")])),_:1}),t("ul",null,[t("li",null,[a(i,{to:"#updating-dependencies"},{default:n(()=>e[2]||(e[2]=[o("Updating Dependencies")])),_:1})]),t("li",null,[a(i,{to:"#add-authorization-module"},{default:n(()=>e[3]||(e[3]=[o("Add Authorization Module")])),_:1})])])])])]),e[6]||(e[6]=g(`

    High Impact Changes

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Likelihood Of Impact: High

    Update dependencies in the go.mod file:

    github.com/goravel/framework v1.6.3
    +import{_ as p,c as s,b as t,e as a,f as n,a as g,r,o as u,d as o}from"./app-Ewo6p9aM.js";const h={},c={class:"table-of-contents"};function m(v,e){const i=r("router-link"),d=r("RouteLink"),l=r("CommentService");return u(),s("div",null,[e[5]||(e[5]=t("h1",{id:"upgrading-to-v1-6-from-v1-5",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#upgrading-to-v1-6-from-v1-5"},[t("span",null,"Upgrading To v1.6 From v1.5")])],-1)),t("nav",c,[t("ul",null,[t("li",null,[a(i,{to:"#high-impact-changes"},{default:n(()=>e[0]||(e[0]=[o("High Impact Changes")])),_:1})]),t("li",null,[a(i,{to:"#upgrade-guide"},{default:n(()=>e[1]||(e[1]=[o("Upgrade Guide")])),_:1}),t("ul",null,[t("li",null,[a(i,{to:"#updating-dependencies"},{default:n(()=>e[2]||(e[2]=[o("Updating Dependencies")])),_:1})]),t("li",null,[a(i,{to:"#add-authorization-module"},{default:n(()=>e[3]||(e[3]=[o("Add Authorization Module")])),_:1})])])])])]),e[6]||(e[6]=g(`

    High Impact Changes

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Likelihood Of Impact: High

    Update dependencies in the go.mod file:

    github.com/goravel/framework v1.6.3
     

    Add Authorization Module

    Likelihood Of Impact: High

    1. Add app/providers/auth_service_provider.go file;
    2. Add &providers.AuthServiceProvider{} to the providers item in the config/app.go file;
    `,11)),t("p",null,[a(d,{to:"/security/authorization.html"},{default:n(()=>e[4]||(e[4]=[o("For Detail")])),_:1})]),a(l)])}const k=p(h,[["render",m],["__file","v1.6.html.vue"]]),U=JSON.parse('{"path":"/upgrade/v1.6.html","title":"Upgrading To v1.6 From v1.5","lang":"en-US","frontmatter":{"description":"Upgrading To v1.6 From v1.5 High Impact Changes Add Authorization Module Upgrade Guide Estimated Upgrade Time: 1 Minutes Updating Dependencies Likelihood Of Impact: High Update ...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/upgrade/v1.6.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/upgrade/v1.6.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/v1.6.html"}],["meta",{"property":"og:description","content":"Upgrading To v1.6 From v1.5 High Impact Changes Add Authorization Module Upgrade Guide Estimated Upgrade Time: 1 Minutes Updating Dependencies Likelihood Of Impact: High Update ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Upgrading To v1.6 From v1.5\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"High Impact Changes","slug":"high-impact-changes","link":"#high-impact-changes","children":[]},{"level":2,"title":"Upgrade Guide","slug":"upgrade-guide","link":"#upgrade-guide","children":[{"level":3,"title":"Updating Dependencies","slug":"updating-dependencies","link":"#updating-dependencies","children":[]},{"level":3,"title":"Add Authorization Module","slug":"add-authorization-module","link":"#add-authorization-module","children":[]}]}],"git":{},"filePathRelative":"upgrade/v1.6.md","autoDesc":true}');export{k as comp,U as data}; diff --git a/assets/v1.6.html-DVu4nDqR.js b/assets/v1.6.html-DSYQNrKC.js similarity index 98% rename from assets/v1.6.html-DVu4nDqR.js rename to assets/v1.6.html-DSYQNrKC.js index dc2abb37..5e090aae 100644 --- a/assets/v1.6.html-DVu4nDqR.js +++ b/assets/v1.6.html-DSYQNrKC.js @@ -1,2 +1,2 @@ -import{_ as p,c as d,b as t,e as o,f as r,a as v,r as l,o as c,d as a}from"./app-ELDWQP0J.js";const u={},g={class:"table-of-contents"};function h(m,e){const n=l("router-link"),s=l("RouteLink"),i=l("CommentService");return c(),d("div",null,[e[5]||(e[5]=t("h1",{id:"从-v1-5-升级到-v1-6",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#从-v1-5-升级到-v1-6"},[t("span",null,"从 v1.5 升级到 v1.6")])],-1)),t("nav",g,[t("ul",null,[t("li",null,[o(n,{to:"#高影响变化"},{default:r(()=>e[0]||(e[0]=[a("高影响变化")])),_:1})]),t("li",null,[o(n,{to:"#升级指南"},{default:r(()=>e[1]||(e[1]=[a("升级指南")])),_:1}),t("ul",null,[t("li",null,[o(n,{to:"#更新依赖"},{default:r(()=>e[2]||(e[2]=[a("更新依赖")])),_:1})]),t("li",null,[o(n,{to:"#新增用户授权模块"},{default:r(()=>e[3]||(e[3]=[a("新增用户授权模块")])),_:1})])])])])]),e[6]||(e[6]=v(`

    高影响变化

    升级指南

    预计升级时间:1 分钟

    更新依赖

    影响可能性:高

    go.mod 中更新依赖:

    github.com/goravel/framework v1.6.3
    +import{_ as p,c as d,b as t,e as o,f as r,a as v,r as l,o as c,d as a}from"./app-Ewo6p9aM.js";const u={},g={class:"table-of-contents"};function h(m,e){const n=l("router-link"),s=l("RouteLink"),i=l("CommentService");return c(),d("div",null,[e[5]||(e[5]=t("h1",{id:"从-v1-5-升级到-v1-6",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#从-v1-5-升级到-v1-6"},[t("span",null,"从 v1.5 升级到 v1.6")])],-1)),t("nav",g,[t("ul",null,[t("li",null,[o(n,{to:"#高影响变化"},{default:r(()=>e[0]||(e[0]=[a("高影响变化")])),_:1})]),t("li",null,[o(n,{to:"#升级指南"},{default:r(()=>e[1]||(e[1]=[a("升级指南")])),_:1}),t("ul",null,[t("li",null,[o(n,{to:"#更新依赖"},{default:r(()=>e[2]||(e[2]=[a("更新依赖")])),_:1})]),t("li",null,[o(n,{to:"#新增用户授权模块"},{default:r(()=>e[3]||(e[3]=[a("新增用户授权模块")])),_:1})])])])])]),e[6]||(e[6]=v(`

    高影响变化

    升级指南

    预计升级时间:1 分钟

    更新依赖

    影响可能性:高

    go.mod 中更新依赖:

    github.com/goravel/framework v1.6.3
     

    新增用户授权模块

    影响可能性:高

    1. 新增 app/providers/auth_service_provider.go 文件;
    2. config/app.go 文件 providers 新增 &providers.AuthServiceProvider{}
    `,11)),t("p",null,[o(s,{to:"/zh/security/authorization.html"},{default:r(()=>e[4]||(e[4]=[a("查看文档")])),_:1})]),o(i)])}const _=p(u,[["render",h],["__file","v1.6.html.vue"]]),b=JSON.parse('{"path":"/zh/upgrade/v1.6.html","title":"从 v1.5 升级到 v1.6","lang":"zh-CN","frontmatter":{"description":"从 v1.5 升级到 v1.6 高影响变化 新增用户授权模块 升级指南 预计升级时间:1 分钟 更新依赖 影响可能性:高 go.mod 中更新依赖: 新增用户授权模块 影响可能性:高 新增 app/providers/auth_service_provider.go 文件; config/app.go 文件 providers 新增 &provider...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/upgrade/v1.6.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/upgrade/v1.6.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/v1.6.html"}],["meta",{"property":"og:description","content":"从 v1.5 升级到 v1.6 高影响变化 新增用户授权模块 升级指南 预计升级时间:1 分钟 更新依赖 影响可能性:高 go.mod 中更新依赖: 新增用户授权模块 影响可能性:高 新增 app/providers/auth_service_provider.go 文件; config/app.go 文件 providers 新增 &provider..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"从 v1.5 升级到 v1.6\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"高影响变化","slug":"高影响变化","link":"#高影响变化","children":[]},{"level":2,"title":"升级指南","slug":"升级指南","link":"#升级指南","children":[{"level":3,"title":"更新依赖","slug":"更新依赖","link":"#更新依赖","children":[]},{"level":3,"title":"新增用户授权模块","slug":"新增用户授权模块","link":"#新增用户授权模块","children":[]}]}],"git":{},"filePathRelative":"zh/upgrade/v1.6.md","autoDesc":true}');export{_ as comp,b as data}; diff --git a/assets/v1.7.html-mjf4FAYu.js b/assets/v1.7.html-BlUtLZrM.js similarity index 99% rename from assets/v1.7.html-mjf4FAYu.js rename to assets/v1.7.html-BlUtLZrM.js index 1aa22c5e..741a5bf4 100644 --- a/assets/v1.7.html-mjf4FAYu.js +++ b/assets/v1.7.html-BlUtLZrM.js @@ -1,2 +1,2 @@ -import{_ as p,c as d,b as t,e as l,f as a,a as s,r,o as v,d as n}from"./app-ELDWQP0J.js";const g={},h={class:"table-of-contents"};function c(m,e){const o=r("router-link"),i=r("RouteLink"),u=r("CommentService");return v(),d("div",null,[e[10]||(e[10]=t("h1",{id:"从-v1-6-升级到-v1-7",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#从-v1-6-升级到-v1-7"},[t("span",null,"从 v1.6 升级到 v1.7")])],-1)),t("nav",h,[t("ul",null,[t("li",null,[l(o,{to:"#高影响变化"},{default:a(()=>e[0]||(e[0]=[n("高影响变化")])),_:1})]),t("li",null,[l(o,{to:"#低影响变化"},{default:a(()=>e[1]||(e[1]=[n("低影响变化")])),_:1})]),t("li",null,[l(o,{to:"#升级指南"},{default:a(()=>e[2]||(e[2]=[n("升级指南")])),_:1}),t("ul",null,[t("li",null,[l(o,{to:"#更新依赖"},{default:a(()=>e[3]||(e[3]=[n("更新依赖")])),_:1})]),t("li",null,[l(o,{to:"#新增表单验证模块"},{default:a(()=>e[4]||(e[4]=[n("新增表单验证模块")])),_:1})]),t("li",null,[l(o,{to:"#修复-request-模板-bug"},{default:a(()=>e[5]||(e[5]=[n("修复 request 模板 BUG")])),_:1})]),t("li",null,[l(o,{to:"#修复表单验证模块-bug"},{default:a(()=>e[6]||(e[6]=[n("修复表单验证模块 BUG")])),_:1})]),t("li",null,[l(o,{to:"#优化队列模块-queue-名称"},{default:a(()=>e[7]||(e[7]=[n("优化队列模块 queue 名称")])),_:1})]),t("li",null,[l(o,{to:"#修复用户验证模块-bug"},{default:a(()=>e[8]||(e[8]=[n("修复用户验证模块 BUG")])),_:1})])])])])]),e[11]||(e[11]=s(`

    高影响变化

    低影响变化

    升级指南

    预计升级时间:1 分钟

    更新依赖

    影响可能性:高

    go.mod 中更新依赖:

    github.com/goravel/framework v1.7.3
    +import{_ as p,c as d,b as t,e as l,f as a,a as s,r,o as v,d as n}from"./app-Ewo6p9aM.js";const g={},h={class:"table-of-contents"};function c(m,e){const o=r("router-link"),i=r("RouteLink"),u=r("CommentService");return v(),d("div",null,[e[10]||(e[10]=t("h1",{id:"从-v1-6-升级到-v1-7",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#从-v1-6-升级到-v1-7"},[t("span",null,"从 v1.6 升级到 v1.7")])],-1)),t("nav",h,[t("ul",null,[t("li",null,[l(o,{to:"#高影响变化"},{default:a(()=>e[0]||(e[0]=[n("高影响变化")])),_:1})]),t("li",null,[l(o,{to:"#低影响变化"},{default:a(()=>e[1]||(e[1]=[n("低影响变化")])),_:1})]),t("li",null,[l(o,{to:"#升级指南"},{default:a(()=>e[2]||(e[2]=[n("升级指南")])),_:1}),t("ul",null,[t("li",null,[l(o,{to:"#更新依赖"},{default:a(()=>e[3]||(e[3]=[n("更新依赖")])),_:1})]),t("li",null,[l(o,{to:"#新增表单验证模块"},{default:a(()=>e[4]||(e[4]=[n("新增表单验证模块")])),_:1})]),t("li",null,[l(o,{to:"#修复-request-模板-bug"},{default:a(()=>e[5]||(e[5]=[n("修复 request 模板 BUG")])),_:1})]),t("li",null,[l(o,{to:"#修复表单验证模块-bug"},{default:a(()=>e[6]||(e[6]=[n("修复表单验证模块 BUG")])),_:1})]),t("li",null,[l(o,{to:"#优化队列模块-queue-名称"},{default:a(()=>e[7]||(e[7]=[n("优化队列模块 queue 名称")])),_:1})]),t("li",null,[l(o,{to:"#修复用户验证模块-bug"},{default:a(()=>e[8]||(e[8]=[n("修复用户验证模块 BUG")])),_:1})])])])])]),e[11]||(e[11]=s(`

    高影响变化

    低影响变化

    升级指南

    预计升级时间:1 分钟

    更新依赖

    影响可能性:高

    go.mod 中更新依赖:

    github.com/goravel/framework v1.7.3
     

    新增表单验证模块

    影响可能性:高

    版本:v1.7.0

    1. 新增 app/providers/validation_service_provider.go 文件;
    2. config/app.go 文件 providers 新增 &validation.ServiceProvider{},, &providers.ValidationServiceProvider{},
    `,14)),t("p",null,[l(i,{to:"/zh/the-basics/validation.html"},{default:a(()=>e[9]||(e[9]=[n("查看文档")])),_:1})]),e[12]||(e[12]=s('

    修复 request 模板 BUG

    影响可能性:高

    版本:v1.7.1

    1. 修复使用命令 go run . artisan make:request Test 创建 request 模板,import 路径错误的 BUG;

    修复表单验证模块 BUG

    影响可能性:高

    版本:v1.7.2

    1. 修复 facades.Validation 模块注册多个自定义 Rule 时不生效的 BUG;

    优化队列模块 queue 名称

    影响可能性:低

    版本:v1.7.2

    1. facades.Queue 模块的 queue 名称在实际执行时增加前缀,以便多项目时进行区分,前缀规则为:${app_name}_queues:${queue};
    2. 隐式优化,您无需修改任何代码;

    修复用户验证模块 BUG

    影响可能性:高

    版本:v1.7.3

    1. 修复当用户表主键为 string 类型时,调用 facades.Auth.User 方法提示错误 Unknown column 错误的 BUG;
    ',16)),l(u)])}const b=p(g,[["render",c],["__file","v1.7.html.vue"]]),E=JSON.parse('{"path":"/zh/upgrade/v1.7.html","title":"从 v1.6 升级到 v1.7","lang":"zh-CN","frontmatter":{"description":"从 v1.6 升级到 v1.7 高影响变化 新增表单验证模块(v1.7.0) 修复 request 模板 BUG(v1.7.1) 修复表单验证模块 BUG(v1.7.2) 修复用户验证模块 BUG(v1.7.3) 低影响变化 优化队列模块 queue 名称(v1.7.2) 升级指南 预计升级时间:1 分钟 更新依赖 影响可能性:高 go.mod 中更新...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://goravel.dev/upgrade/v1.7.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/zh/upgrade/v1.7.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/v1.7.html"}],["meta",{"property":"og:description","content":"从 v1.6 升级到 v1.7 高影响变化 新增表单验证模块(v1.7.0) 修复 request 模板 BUG(v1.7.1) 修复表单验证模块 BUG(v1.7.2) 修复用户验证模块 BUG(v1.7.3) 低影响变化 优化队列模块 queue 名称(v1.7.2) 升级指南 预计升级时间:1 分钟 更新依赖 影响可能性:高 go.mod 中更新..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"从 v1.6 升级到 v1.7\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"高影响变化","slug":"高影响变化","link":"#高影响变化","children":[]},{"level":2,"title":"低影响变化","slug":"低影响变化","link":"#低影响变化","children":[]},{"level":2,"title":"升级指南","slug":"升级指南","link":"#升级指南","children":[{"level":3,"title":"更新依赖","slug":"更新依赖","link":"#更新依赖","children":[]},{"level":3,"title":"新增表单验证模块","slug":"新增表单验证模块","link":"#新增表单验证模块","children":[]},{"level":3,"title":"修复 request 模板 BUG","slug":"修复-request-模板-bug","link":"#修复-request-模板-bug","children":[]},{"level":3,"title":"修复表单验证模块 BUG","slug":"修复表单验证模块-bug","link":"#修复表单验证模块-bug","children":[]},{"level":3,"title":"优化队列模块 queue 名称","slug":"优化队列模块-queue-名称","link":"#优化队列模块-queue-名称","children":[]},{"level":3,"title":"修复用户验证模块 BUG","slug":"修复用户验证模块-bug","link":"#修复用户验证模块-bug","children":[]}]}],"git":{},"filePathRelative":"zh/upgrade/v1.7.md","autoDesc":true}');export{b as comp,E as data}; diff --git a/assets/v1.7.html-CA3uanBR.js b/assets/v1.7.html-OCSm9Wzu.js similarity index 99% rename from assets/v1.7.html-CA3uanBR.js rename to assets/v1.7.html-OCSm9Wzu.js index 024088e8..420bdb35 100644 --- a/assets/v1.7.html-CA3uanBR.js +++ b/assets/v1.7.html-OCSm9Wzu.js @@ -1,2 +1,2 @@ -import{_ as p,c as s,b as t,e as a,f as i,a as d,r as n,o as m,d as o}from"./app-ELDWQP0J.js";const h={},g={class:"table-of-contents"};function c(v,e){const l=n("router-link"),r=n("RouteLink"),u=n("CommentService");return m(),s("div",null,[e[10]||(e[10]=t("h1",{id:"upgrading-to-v1-7-from-v1-6",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#upgrading-to-v1-7-from-v1-6"},[t("span",null,"Upgrading To v1.7 From v1.6")])],-1)),t("nav",g,[t("ul",null,[t("li",null,[a(l,{to:"#high-impact-changes"},{default:i(()=>e[0]||(e[0]=[o("High Impact Changes")])),_:1})]),t("li",null,[a(l,{to:"#low-impact-changes"},{default:i(()=>e[1]||(e[1]=[o("Low Impact Changes")])),_:1})]),t("li",null,[a(l,{to:"#upgrade-guide"},{default:i(()=>e[2]||(e[2]=[o("Upgrade Guide")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#updating-dependencies"},{default:i(()=>e[3]||(e[3]=[o("Updating Dependencies")])),_:1})]),t("li",null,[a(l,{to:"#add-validation-module"},{default:i(()=>e[4]||(e[4]=[o("Add Validation module")])),_:1})]),t("li",null,[a(l,{to:"#fix-request-template-bug"},{default:i(()=>e[5]||(e[5]=[o("Fix request template BUG")])),_:1})]),t("li",null,[a(l,{to:"#fix-validation-module-bug"},{default:i(()=>e[6]||(e[6]=[o("Fix Validation module BUG")])),_:1})]),t("li",null,[a(l,{to:"#optimize-the-queue-name-of-the-queue-module"},{default:i(()=>e[7]||(e[7]=[o("Optimize the queue name of the queue module")])),_:1})]),t("li",null,[a(l,{to:"#fix-auth-module-bug"},{default:i(()=>e[8]||(e[8]=[o("Fix Auth module BUG")])),_:1})])])])])]),e[11]||(e[11]=d(`

    High Impact Changes

    Low Impact Changes

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Likelihood Of Impact: High

    Update dependencies in the go.mod file:

    github.com/goravel/framework v1.7.3
    +import{_ as p,c as s,b as t,e as a,f as i,a as d,r as n,o as m,d as o}from"./app-Ewo6p9aM.js";const h={},g={class:"table-of-contents"};function c(v,e){const l=n("router-link"),r=n("RouteLink"),u=n("CommentService");return m(),s("div",null,[e[10]||(e[10]=t("h1",{id:"upgrading-to-v1-7-from-v1-6",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#upgrading-to-v1-7-from-v1-6"},[t("span",null,"Upgrading To v1.7 From v1.6")])],-1)),t("nav",g,[t("ul",null,[t("li",null,[a(l,{to:"#high-impact-changes"},{default:i(()=>e[0]||(e[0]=[o("High Impact Changes")])),_:1})]),t("li",null,[a(l,{to:"#low-impact-changes"},{default:i(()=>e[1]||(e[1]=[o("Low Impact Changes")])),_:1})]),t("li",null,[a(l,{to:"#upgrade-guide"},{default:i(()=>e[2]||(e[2]=[o("Upgrade Guide")])),_:1}),t("ul",null,[t("li",null,[a(l,{to:"#updating-dependencies"},{default:i(()=>e[3]||(e[3]=[o("Updating Dependencies")])),_:1})]),t("li",null,[a(l,{to:"#add-validation-module"},{default:i(()=>e[4]||(e[4]=[o("Add Validation module")])),_:1})]),t("li",null,[a(l,{to:"#fix-request-template-bug"},{default:i(()=>e[5]||(e[5]=[o("Fix request template BUG")])),_:1})]),t("li",null,[a(l,{to:"#fix-validation-module-bug"},{default:i(()=>e[6]||(e[6]=[o("Fix Validation module BUG")])),_:1})]),t("li",null,[a(l,{to:"#optimize-the-queue-name-of-the-queue-module"},{default:i(()=>e[7]||(e[7]=[o("Optimize the queue name of the queue module")])),_:1})]),t("li",null,[a(l,{to:"#fix-auth-module-bug"},{default:i(()=>e[8]||(e[8]=[o("Fix Auth module BUG")])),_:1})])])])])]),e[11]||(e[11]=d(`

    High Impact Changes

    Low Impact Changes

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Likelihood Of Impact: High

    Update dependencies in the go.mod file:

    github.com/goravel/framework v1.7.3
     

    Add Validation module

    Likelihood Of Impact: High

    Version: v1.7.0

    1. Add app/providers/validation_service_provider.go file;
    2. Add &validation.ServiceProvider{}, &providers.ValidationServiceProvider{}, to the providers item in the config/app.go file;
    `,14)),t("p",null,[a(r,{to:"/the-basics/validation.html"},{default:i(()=>e[9]||(e[9]=[o("For Detail")])),_:1})]),e[12]||(e[12]=d('

    Fix request template BUG

    Likelihood Of Impact: High

    Version: v1.7.1

    1. Fix import path BUG of the request template that created by go run . artisan make:request Test;

    Fix Validation module BUG

    Likelihood Of Impact: High

    Version: v1.7.2

    1. Fix the BUG that does not take effect when the facades.Validation module registers multiple custom Rule;

    Optimize the queue name of the queue module

    Likelihood Of Impact: Low

    Version: v1.7.2

    1. Add a prefix to the queue name of the facades.Queue module during actual execution, in order to distinguish between multiple projects, the prefix rule: ${app_name}_queues:${queue};
    2. Implicit optimization, you don't need to modify any code;

    Fix Auth module BUG

    Likelihood Of Impact: High

    Version: v1.7.3

    1. Fix the BUG that calling facades.Auth.User method returns Unknown column error when the primary key of user table is string type;
    ',16)),a(u)])}const x=p(h,[["render",c],["__file","v1.7.html.vue"]]),b=JSON.parse('{"path":"/upgrade/v1.7.html","title":"Upgrading To v1.7 From v1.6","lang":"en-US","frontmatter":{"description":"Upgrading To v1.7 From v1.6 High Impact Changes Add Validation Module(v1.7.0) Fix request template BUG(v1.7.1) Fix Validation module BUG(v1.7.2) Fix Auth module BUG(v1.7.3) Low ...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/upgrade/v1.7.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/upgrade/v1.7.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/upgrade/v1.7.html"}],["meta",{"property":"og:description","content":"Upgrading To v1.7 From v1.6 High Impact Changes Add Validation Module(v1.7.0) Fix request template BUG(v1.7.1) Fix Validation module BUG(v1.7.2) Fix Auth module BUG(v1.7.3) Low ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Upgrading To v1.7 From v1.6\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"High Impact Changes","slug":"high-impact-changes","link":"#high-impact-changes","children":[]},{"level":2,"title":"Low Impact Changes","slug":"low-impact-changes","link":"#low-impact-changes","children":[]},{"level":2,"title":"Upgrade Guide","slug":"upgrade-guide","link":"#upgrade-guide","children":[{"level":3,"title":"Updating Dependencies","slug":"updating-dependencies","link":"#updating-dependencies","children":[]},{"level":3,"title":"Add Validation module","slug":"add-validation-module","link":"#add-validation-module","children":[]},{"level":3,"title":"Fix request template BUG","slug":"fix-request-template-bug","link":"#fix-request-template-bug","children":[]},{"level":3,"title":"Fix Validation module BUG","slug":"fix-validation-module-bug","link":"#fix-validation-module-bug","children":[]},{"level":3,"title":"Optimize the queue name of the queue module","slug":"optimize-the-queue-name-of-the-queue-module","link":"#optimize-the-queue-name-of-the-queue-module","children":[]},{"level":3,"title":"Fix Auth module BUG","slug":"fix-auth-module-bug","link":"#fix-auth-module-bug","children":[]}]}],"git":{},"filePathRelative":"upgrade/v1.7.md","autoDesc":true}');export{x as comp,b as data}; diff --git a/assets/v1.8.html-DVq3pEBb.js b/assets/v1.8.html-BZG1T2FE.js similarity index 99% rename from assets/v1.8.html-DVq3pEBb.js rename to assets/v1.8.html-BZG1T2FE.js index 43b370d4..1fc9ddc3 100644 --- a/assets/v1.8.html-DVq3pEBb.js +++ b/assets/v1.8.html-BZG1T2FE.js @@ -1,4 +1,4 @@ -import{_ as p,c as u,b as n,e as s,f as t,a as o,d as a,r,o as m}from"./app-ELDWQP0J.js";const c={},g={class:"table-of-contents"};function h(v,e){const i=r("router-link"),l=r("RouteLink"),d=r("CommentService");return m(),u("div",null,[e[43]||(e[43]=n("h1",{id:"upgrading-to-v1-8-from-v1-7",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#upgrading-to-v1-8-from-v1-7"},[n("span",null,"Upgrading To v1.8 From v1.7")])],-1)),n("nav",g,[n("ul",null,[n("li",null,[s(i,{to:"#exciting-new-features-🎉"},{default:t(()=>e[0]||(e[0]=[a("Exciting New Features 🎉")])),_:1})]),n("li",null,[s(i,{to:"#enhancements-🚀"},{default:t(()=>e[1]||(e[1]=[a("Enhancements 🚀")])),_:1})]),n("li",null,[s(i,{to:"#breaking-changes-🛠"},{default:t(()=>e[2]||(e[2]=[a("Breaking Changes 🛠")])),_:1})]),n("li",null,[s(i,{to:"#bug-fixes-🐛"},{default:t(()=>e[3]||(e[3]=[a("Bug Fixes 🐛")])),_:1})]),n("li",null,[s(i,{to:"#upgrade-guide"},{default:t(()=>e[4]||(e[4]=[a("Upgrade Guide")])),_:1}),n("ul",null,[n("li",null,[s(i,{to:"#updating-dependencies"},{default:t(()=>e[5]||(e[5]=[a("Updating Dependencies")])),_:1})]),n("li",null,[s(i,{to:"#add-model-association-for-orm"},{default:t(()=>e[6]||(e[6]=[a("Add model association for Orm")])),_:1})]),n("li",null,[s(i,{to:"#add-methods-for-request"},{default:t(()=>e[7]||(e[7]=[a("Add methods for Request")])),_:1})]),n("li",null,[s(i,{to:"#add-methods-for-response"},{default:t(()=>e[8]||(e[8]=[a("Add-methods-for-Response")])),_:1})]),n("li",null,[s(i,{to:"#optimize-import-order"},{default:t(()=>e[9]||(e[9]=[a("Optimize import order")])),_:1})]),n("li",null,[s(i,{to:"#optimize-database-migrate"},{default:t(()=>e[10]||(e[10]=[a("Optimize database migrate")])),_:1})]),n("li",null,[s(i,{to:"#mock-validator-change-name"},{default:t(()=>e[11]||(e[11]=[a("mock.Validator Change Name")])),_:1})]),n("li",null,[s(i,{to:"#support-mysql-change-name"},{default:t(()=>e[12]||(e[12]=[a("support.Mysql Change Name")])),_:1})]),n("li",null,[s(i,{to:"#database-newgorminstance-is-about-to-be-deprecated"},{default:t(()=>e[13]||(e[13]=[a("database.NewGormInstance is about to be deprecated")])),_:1})]),n("li",null,[s(i,{to:"#fix-orm-concurrency-safety-issue"},{default:t(()=>e[14]||(e[14]=[a("Fix Orm concurrency safety issue")])),_:1})]),n("li",null,[s(i,{to:"#fix-mail-module-can-t-send-mail-by-25-and-465-ports"},{default:t(()=>e[15]||(e[15]=[a("Fix Mail module can't send mail by 25 and 465 ports")])),_:1})]),n("li",null,[s(i,{to:"#route-supports-https"},{default:t(()=>e[16]||(e[16]=[a("Route supports HTTPS")])),_:1})])])])])]),e[44]||(e[44]=o(`

    Exciting New Features 🎉

    Enhancements 🚀

    Breaking Changes 🛠

    Bug Fixes 🐛

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Update dependencies in the go.mod file:

    go get -u github.com/goravel/framework@v1.8.3
    +import{_ as p,c as u,b as n,e as s,f as t,a as o,d as a,r,o as m}from"./app-Ewo6p9aM.js";const c={},g={class:"table-of-contents"};function h(v,e){const i=r("router-link"),l=r("RouteLink"),d=r("CommentService");return m(),u("div",null,[e[43]||(e[43]=n("h1",{id:"upgrading-to-v1-8-from-v1-7",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#upgrading-to-v1-8-from-v1-7"},[n("span",null,"Upgrading To v1.8 From v1.7")])],-1)),n("nav",g,[n("ul",null,[n("li",null,[s(i,{to:"#exciting-new-features-🎉"},{default:t(()=>e[0]||(e[0]=[a("Exciting New Features 🎉")])),_:1})]),n("li",null,[s(i,{to:"#enhancements-🚀"},{default:t(()=>e[1]||(e[1]=[a("Enhancements 🚀")])),_:1})]),n("li",null,[s(i,{to:"#breaking-changes-🛠"},{default:t(()=>e[2]||(e[2]=[a("Breaking Changes 🛠")])),_:1})]),n("li",null,[s(i,{to:"#bug-fixes-🐛"},{default:t(()=>e[3]||(e[3]=[a("Bug Fixes 🐛")])),_:1})]),n("li",null,[s(i,{to:"#upgrade-guide"},{default:t(()=>e[4]||(e[4]=[a("Upgrade Guide")])),_:1}),n("ul",null,[n("li",null,[s(i,{to:"#updating-dependencies"},{default:t(()=>e[5]||(e[5]=[a("Updating Dependencies")])),_:1})]),n("li",null,[s(i,{to:"#add-model-association-for-orm"},{default:t(()=>e[6]||(e[6]=[a("Add model association for Orm")])),_:1})]),n("li",null,[s(i,{to:"#add-methods-for-request"},{default:t(()=>e[7]||(e[7]=[a("Add methods for Request")])),_:1})]),n("li",null,[s(i,{to:"#add-methods-for-response"},{default:t(()=>e[8]||(e[8]=[a("Add-methods-for-Response")])),_:1})]),n("li",null,[s(i,{to:"#optimize-import-order"},{default:t(()=>e[9]||(e[9]=[a("Optimize import order")])),_:1})]),n("li",null,[s(i,{to:"#optimize-database-migrate"},{default:t(()=>e[10]||(e[10]=[a("Optimize database migrate")])),_:1})]),n("li",null,[s(i,{to:"#mock-validator-change-name"},{default:t(()=>e[11]||(e[11]=[a("mock.Validator Change Name")])),_:1})]),n("li",null,[s(i,{to:"#support-mysql-change-name"},{default:t(()=>e[12]||(e[12]=[a("support.Mysql Change Name")])),_:1})]),n("li",null,[s(i,{to:"#database-newgorminstance-is-about-to-be-deprecated"},{default:t(()=>e[13]||(e[13]=[a("database.NewGormInstance is about to be deprecated")])),_:1})]),n("li",null,[s(i,{to:"#fix-orm-concurrency-safety-issue"},{default:t(()=>e[14]||(e[14]=[a("Fix Orm concurrency safety issue")])),_:1})]),n("li",null,[s(i,{to:"#fix-mail-module-can-t-send-mail-by-25-and-465-ports"},{default:t(()=>e[15]||(e[15]=[a("Fix Mail module can't send mail by 25 and 465 ports")])),_:1})]),n("li",null,[s(i,{to:"#route-supports-https"},{default:t(()=>e[16]||(e[16]=[a("Route supports HTTPS")])),_:1})])])])])]),e[44]||(e[44]=o(`

    Exciting New Features 🎉

    Enhancements 🚀

    Breaking Changes 🛠

    Bug Fixes 🐛

    Upgrade Guide

    Estimated Upgrade Time: 1 Minutes

    Updating Dependencies

    Update dependencies in the go.mod file:

    go get -u github.com/goravel/framework@v1.8.3
     

    Add model association for Orm

    Version: v1.8.0

    Add methods for Orm, to handle model association:

    `,16)),n("table",null,[e[29]||(e[29]=n("thead",null,[n("tr",null,[n("th",null,"Method"),n("th",null,"Action")])],-1)),n("tbody",null,[n("tr",null,[e[18]||(e[18]=n("td",null,"Association",-1)),n("td",null,[s(l,{to:"/orm/relationships.html#querying-associations"},{default:t(()=>e[17]||(e[17]=[a("Association")])),_:1})])]),n("tr",null,[e[20]||(e[20]=n("td",null,"DB",-1)),n("td",null,[s(l,{to:"/orm/getting-started.html#generic-database-interface-sqldb"},{default:t(()=>e[19]||(e[19]=[a("Generic Database Interface sql.DB")])),_:1})])]),n("tr",null,[e[22]||(e[22]=n("td",null,"Load",-1)),n("td",null,[s(l,{to:"/orm/relationships.html#lazy-eager-loading"},{default:t(()=>e[21]||(e[21]=[a("Lazy Eager Loading")])),_:1})])]),n("tr",null,[e[24]||(e[24]=n("td",null,"LoadMissing",-1)),n("td",null,[s(l,{to:"/orm/relationships.html#lazy-eager-loading"},{default:t(()=>e[23]||(e[23]=[a("Lazy Eager Loading(not exist)")])),_:1})])]),n("tr",null,[e[26]||(e[26]=n("td",null,"Omit",-1)),n("td",null,[s(l,{to:"/orm/relationships.html#create-or-update-associations"},{default:t(()=>e[25]||(e[25]=[a("Omit associations")])),_:1})])]),n("tr",null,[e[28]||(e[28]=n("td",null,"With",-1)),n("td",null,[s(l,{to:"/orm/relationships.html#Eager-Loading"},{default:t(()=>e[27]||(e[27]=[a("Eager Loading")])),_:1})])])])]),e[45]||(e[45]=n("h3",{id:"add-methods-for-request",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#add-methods-for-request"},[n("span",null,"Add methods for Request")])],-1)),e[46]||(e[46]=n("p",null,"Version: v1.8.0",-1)),e[47]||(e[47]=n("p",null,[a("Add methods for "),n("code",null,"ctx.Request()"),a(", to enrich the format of "),n("code",null,"Query"),a(" parameters:")],-1)),n("table",null,[e[34]||(e[34]=n("thead",null,[n("tr",null,[n("th",null,"Method"),n("th",null,"Action")])],-1)),n("tbody",null,[n("tr",null,[e[31]||(e[31]=n("td",null,[n("code",null,"QueryArray")],-1)),n("td",null,[s(l,{to:"/the-basics/request.html#Retrieving-Input-From-The-Query-String"},{default:t(()=>e[30]||(e[30]=[a("Get the array parameters")])),_:1})])]),n("tr",null,[e[33]||(e[33]=n("td",null,[n("code",null,"QueryMap")],-1)),n("td",null,[s(l,{to:"/the-basics/request.html#Retrieving-Input-From-The-Query-String"},{default:t(()=>e[32]||(e[32]=[a("Get the map parameters")])),_:1})])])])]),e[48]||(e[48]=n("h3",{id:"add-methods-for-response",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#add-methods-for-response"},[n("span",null,"Add-methods-for-Response")])],-1)),e[49]||(e[49]=n("p",null,"Version: v1.8.0",-1)),e[50]||(e[50]=n("p",null,[a("Add "),n("code",null,"Origin"),a(" method to "),n("code",null,"ctx.Response()"),a(", you can get all information of "),n("code",null,"Response"),a(" in the HTTP middleware.")],-1)),n("p",null,[s(l,{to:"/the-basics/response.html#Get-Response"},{default:t(()=>e[35]||(e[35]=[a("Detail")])),_:1})]),e[51]||(e[51]=o(`

    Optimize import order

    Version: v1.8.0

    The import order in the bootstrap/app.go file change to:

    package bootstrap
     
     import (
    diff --git a/assets/v1.8.html-CaCOiXQ8.js b/assets/v1.8.html-kjkSDe_F.js
    similarity index 99%
    rename from assets/v1.8.html-CaCOiXQ8.js
    rename to assets/v1.8.html-kjkSDe_F.js
    index 97571af0..a79bf25c 100644
    --- a/assets/v1.8.html-CaCOiXQ8.js
    +++ b/assets/v1.8.html-kjkSDe_F.js
    @@ -1,4 +1,4 @@
    -import{_ as d,c as u,b as s,e,f as a,a as o,d as l,r,o as m}from"./app-ELDWQP0J.js";const v={},c={class:"table-of-contents"};function g(b,n){const t=r("router-link"),i=r("RouteLink"),p=r("CommentService");return m(),u("div",null,[n[43]||(n[43]=s("h1",{id:"从-v1-7-升级到-v1-8",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#从-v1-7-升级到-v1-8"},[s("span",null,"从 v1.7 升级到 v1.8")])],-1)),s("nav",c,[s("ul",null,[s("li",null,[e(t,{to:"#令人兴奋的新功能-🎉"},{default:a(()=>n[0]||(n[0]=[l("令人兴奋的新功能 🎉")])),_:1})]),s("li",null,[e(t,{to:"#功能增强-🚀"},{default:a(()=>n[1]||(n[1]=[l("功能增强 🚀")])),_:1})]),s("li",null,[e(t,{to:"#破坏性变化-🛠"},{default:a(()=>n[2]||(n[2]=[l("破坏性变化 🛠")])),_:1})]),s("li",null,[e(t,{to:"#bug-修复-🐛"},{default:a(()=>n[3]||(n[3]=[l("Bug 修复 🐛")])),_:1})]),s("li",null,[e(t,{to:"#升级指南"},{default:a(()=>n[4]||(n[4]=[l("升级指南")])),_:1}),s("ul",null,[s("li",null,[e(t,{to:"#更新依赖"},{default:a(()=>n[5]||(n[5]=[l("更新依赖")])),_:1})]),s("li",null,[e(t,{to:"#orm-新增模型关联"},{default:a(()=>n[6]||(n[6]=[l("Orm 新增模型关联")])),_:1})]),s("li",null,[e(t,{to:"#request-新增方法"},{default:a(()=>n[7]||(n[7]=[l("Request 新增方法")])),_:1})]),s("li",null,[e(t,{to:"#response-新增方法"},{default:a(()=>n[8]||(n[8]=[l("Response 新增方法")])),_:1})]),s("li",null,[e(t,{to:"#优化-import-顺序"},{default:a(()=>n[9]||(n[9]=[l("优化 import 顺序")])),_:1})]),s("li",null,[e(t,{to:"#优化数据库迁移"},{default:a(()=>n[10]||(n[10]=[l("优化数据库迁移")])),_:1})]),s("li",null,[e(t,{to:"#mock-validator-改名"},{default:a(()=>n[11]||(n[11]=[l("mock.Validator 改名")])),_:1})]),s("li",null,[e(t,{to:"#support-mysql-改名"},{default:a(()=>n[12]||(n[12]=[l("support.Mysql 改名")])),_:1})]),s("li",null,[e(t,{to:"#即将废弃-database-newgorminstance"},{default:a(()=>n[13]||(n[13]=[l("即将废弃 database.NewGormInstance")])),_:1})]),s("li",null,[e(t,{to:"#修复-orm-并发安全的问题"},{default:a(()=>n[14]||(n[14]=[l("修复 Orm 并发安全的问题")])),_:1})]),s("li",null,[e(t,{to:"#修复-mail-不能使用-25-465-端口发送邮件的问题"},{default:a(()=>n[15]||(n[15]=[l("修复 Mail 不能使用 25,465 端口发送邮件的问题")])),_:1})]),s("li",null,[e(t,{to:"#route-支持-https"},{default:a(()=>n[16]||(n[16]=[l("Route 支持 HTTPS")])),_:1})])])])])]),n[44]||(n[44]=o(`

    令人兴奋的新功能 🎉

    功能增强 🚀

    破坏性变化 🛠

    Bug 修复 🐛

    升级指南

    预计升级时间:1 分钟

    更新依赖

    go.mod 中更新依赖:

    go get -u github.com/goravel/framework@v1.8.3
    +import{_ as d,c as u,b as s,e,f as a,a as o,d as l,r,o as m}from"./app-Ewo6p9aM.js";const v={},c={class:"table-of-contents"};function g(b,n){const t=r("router-link"),i=r("RouteLink"),p=r("CommentService");return m(),u("div",null,[n[43]||(n[43]=s("h1",{id:"从-v1-7-升级到-v1-8",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#从-v1-7-升级到-v1-8"},[s("span",null,"从 v1.7 升级到 v1.8")])],-1)),s("nav",c,[s("ul",null,[s("li",null,[e(t,{to:"#令人兴奋的新功能-🎉"},{default:a(()=>n[0]||(n[0]=[l("令人兴奋的新功能 🎉")])),_:1})]),s("li",null,[e(t,{to:"#功能增强-🚀"},{default:a(()=>n[1]||(n[1]=[l("功能增强 🚀")])),_:1})]),s("li",null,[e(t,{to:"#破坏性变化-🛠"},{default:a(()=>n[2]||(n[2]=[l("破坏性变化 🛠")])),_:1})]),s("li",null,[e(t,{to:"#bug-修复-🐛"},{default:a(()=>n[3]||(n[3]=[l("Bug 修复 🐛")])),_:1})]),s("li",null,[e(t,{to:"#升级指南"},{default:a(()=>n[4]||(n[4]=[l("升级指南")])),_:1}),s("ul",null,[s("li",null,[e(t,{to:"#更新依赖"},{default:a(()=>n[5]||(n[5]=[l("更新依赖")])),_:1})]),s("li",null,[e(t,{to:"#orm-新增模型关联"},{default:a(()=>n[6]||(n[6]=[l("Orm 新增模型关联")])),_:1})]),s("li",null,[e(t,{to:"#request-新增方法"},{default:a(()=>n[7]||(n[7]=[l("Request 新增方法")])),_:1})]),s("li",null,[e(t,{to:"#response-新增方法"},{default:a(()=>n[8]||(n[8]=[l("Response 新增方法")])),_:1})]),s("li",null,[e(t,{to:"#优化-import-顺序"},{default:a(()=>n[9]||(n[9]=[l("优化 import 顺序")])),_:1})]),s("li",null,[e(t,{to:"#优化数据库迁移"},{default:a(()=>n[10]||(n[10]=[l("优化数据库迁移")])),_:1})]),s("li",null,[e(t,{to:"#mock-validator-改名"},{default:a(()=>n[11]||(n[11]=[l("mock.Validator 改名")])),_:1})]),s("li",null,[e(t,{to:"#support-mysql-改名"},{default:a(()=>n[12]||(n[12]=[l("support.Mysql 改名")])),_:1})]),s("li",null,[e(t,{to:"#即将废弃-database-newgorminstance"},{default:a(()=>n[13]||(n[13]=[l("即将废弃 database.NewGormInstance")])),_:1})]),s("li",null,[e(t,{to:"#修复-orm-并发安全的问题"},{default:a(()=>n[14]||(n[14]=[l("修复 Orm 并发安全的问题")])),_:1})]),s("li",null,[e(t,{to:"#修复-mail-不能使用-25-465-端口发送邮件的问题"},{default:a(()=>n[15]||(n[15]=[l("修复 Mail 不能使用 25,465 端口发送邮件的问题")])),_:1})]),s("li",null,[e(t,{to:"#route-支持-https"},{default:a(()=>n[16]||(n[16]=[l("Route 支持 HTTPS")])),_:1})])])])])]),n[44]||(n[44]=o(`

    令人兴奋的新功能 🎉

    功能增强 🚀

    破坏性变化 🛠

    Bug 修复 🐛

    升级指南

    预计升级时间:1 分钟

    更新依赖

    go.mod 中更新依赖:

    go get -u github.com/goravel/framework@v1.8.3
     

    Orm 新增模型关联

    Version: v1.8.0

    Orm 新增方法,以处理模型关联等操作:

    `,16)),s("table",null,[n[29]||(n[29]=s("thead",null,[s("tr",null,[s("th",null,"方法名"),s("th",null,"作用")])],-1)),s("tbody",null,[s("tr",null,[n[18]||(n[18]=s("td",null,"Association",-1)),s("td",null,[e(i,{to:"/zh/orm/relationships.html#querying-associations"},{default:a(()=>n[17]||(n[17]=[l("关联操作")])),_:1})])]),s("tr",null,[n[20]||(n[20]=s("td",null,"DB",-1)),s("td",null,[e(i,{to:"/zh/orm/getting-started.html#generic-database-interface-sqldb"},{default:a(()=>n[19]||(n[19]=[l("获取通用数据库接口")])),_:1})])]),s("tr",null,[n[22]||(n[22]=s("td",null,"Load",-1)),s("td",null,[e(i,{to:"/zh/orm/relationships.html#lazy-eager-loading"},{default:a(()=>n[21]||(n[21]=[l("延迟预加载")])),_:1})])]),s("tr",null,[n[24]||(n[24]=s("td",null,"LoadMissing",-1)),s("td",null,[e(i,{to:"/zh/orm/relationships.html#lazy-eager-loading"},{default:a(()=>n[23]||(n[23]=[l("延迟预加载(不存在)")])),_:1})])]),s("tr",null,[n[26]||(n[26]=s("td",null,"Omit",-1)),s("td",null,[e(i,{to:"/zh/orm/relationships.html#create-or-update-associations"},{default:a(()=>n[25]||(n[25]=[l("忽略关联")])),_:1})])]),s("tr",null,[n[28]||(n[28]=s("td",null,"With",-1)),s("td",null,[e(i,{to:"/zh/orm/relationships.html#Eager-Loading"},{default:a(()=>n[27]||(n[27]=[l("预加载")])),_:1})])])])]),n[45]||(n[45]=s("h3",{id:"request-新增方法",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#request-新增方法"},[s("span",null,"Request 新增方法")])],-1)),n[46]||(n[46]=s("p",null,"Version: v1.8.0",-1)),n[47]||(n[47]=s("p",null,[s("code",null,"ctx.Request()"),l(" 新增方法,以丰富 "),s("code",null,"Query"),l(" 传参的格式:")],-1)),s("table",null,[n[34]||(n[34]=s("thead",null,[s("tr",null,[s("th",null,"方法名"),s("th",null,"作用")])],-1)),s("tbody",null,[s("tr",null,[n[31]||(n[31]=s("td",null,[s("code",null,"QueryArray")],-1)),s("td",null,[e(i,{to:"/zh/the-basics/request.html#%E8%8E%B7%E5%8F%96%E9%93%BE%E6%8E%A5%E4%BC%A0%E5%85%A5%E7%9A%84%E5%8F%82%E6%95%B0"},{default:a(()=>n[30]||(n[30]=[l("获取链接传入的数组参数")])),_:1})])]),s("tr",null,[n[33]||(n[33]=s("td",null,[s("code",null,"QueryMap")],-1)),s("td",null,[e(i,{to:"/zh/the-basics/request.html#%E8%8E%B7%E5%8F%96%E9%93%BE%E6%8E%A5%E4%BC%A0%E5%85%A5%E7%9A%84%E5%8F%82%E6%95%B0"},{default:a(()=>n[32]||(n[32]=[l("获取链接传入的 Map 参数")])),_:1})])])])]),n[48]||(n[48]=s("h3",{id:"response-新增方法",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#response-新增方法"},[s("span",null,"Response 新增方法")])],-1)),n[49]||(n[49]=s("p",null,"Version: v1.8.0",-1)),n[50]||(n[50]=s("p",null,[s("code",null,"ctx.Response()"),l(" 新增 "),s("code",null,"Origin"),l(" 方法,可以在 HTTP 中间件中获取 "),s("code",null,"Response"),l(" 的所有信息。")],-1)),s("p",null,[e(i,{to:"/zh/the-basics/response.html#%E8%8E%B7%E5%8F%96%E5%93%8D%E5%BA%94"},{default:a(()=>n[35]||(n[35]=[l("查看文档")])),_:1})]),n[51]||(n[51]=o(`

    优化 import 顺序

    Version: v1.8.0

    bootstrap/app.go 文件中 import 顺序修改为:

    package bootstrap
     
     import (
    diff --git a/assets/v1.9.html-DPjMtyff.js b/assets/v1.9.html-BjVeexcL.js
    similarity index 99%
    rename from assets/v1.9.html-DPjMtyff.js
    rename to assets/v1.9.html-BjVeexcL.js
    index a015fa20..3b03bb82 100644
    --- a/assets/v1.9.html-DPjMtyff.js
    +++ b/assets/v1.9.html-BjVeexcL.js
    @@ -1,4 +1,4 @@
    -import{_ as p,c as u,b as a,e as t,f as s,a as r,d as n,r as l,o as m}from"./app-ELDWQP0J.js";const g={},h={class:"table-of-contents"};function v(f,e){const i=l("router-link"),d=l("RouteLink"),o=l("CommentService");return m(),u("div",null,[e[36]||(e[36]=a("h1",{id:"upgrading-to-v1-9-from-v1-8",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#upgrading-to-v1-9-from-v1-8"},[a("span",null,"Upgrading To v1.9 From v1.8")])],-1)),a("nav",h,[a("ul",null,[a("li",null,[t(i,{to:"#enhancements-🚀"},{default:s(()=>e[0]||(e[0]=[n("Enhancements 🚀")])),_:1})]),a("li",null,[t(i,{to:"#breaking-changes-🛠"},{default:s(()=>e[1]||(e[1]=[n("Breaking Changes 🛠")])),_:1})]),a("li",null,[t(i,{to:"#bug-fixes-🐛"},{default:s(()=>e[2]||(e[2]=[n("Bug Fixes 🐛")])),_:1})]),a("li",null,[t(i,{to:"#dependency-updates-⬆️"},{default:s(()=>e[3]||(e[3]=[n("Dependency Updates ⬆️")])),_:1})]),a("li",null,[t(i,{to:"#upgrade-guide"},{default:s(()=>e[4]||(e[4]=[n("Upgrade Guide")])),_:1}),a("ul",null,[a("li",null,[t(i,{to:"#updating-dependencies"},{default:s(()=>e[5]||(e[5]=[n("Updating Dependencies")])),_:1})]),a("li",null,[t(i,{to:"#add-database-read-write-separation"},{default:s(()=>e[6]||(e[6]=[n("Add database read-write separation")])),_:1})]),a("li",null,[t(i,{to:"#add-database-pool-configuration"},{default:s(()=>e[7]||(e[7]=[n("Add database pool configuration")])),_:1})]),a("li",null,[t(i,{to:"#custom-env-path"},{default:s(()=>e[8]||(e[8]=[n("Custom .env path")])),_:1})]),a("li",null,[t(i,{to:"#cache-add-memory-driver"},{default:s(()=>e[9]||(e[9]=[n("Cache add memory driver")])),_:1})]),a("li",null,[t(i,{to:"#orm-add-paginate-method"},{default:s(()=>e[10]||(e[10]=[n("Orm add Paginate method")])),_:1})]),a("li",null,[t(i,{to:"#add-make-command"},{default:s(()=>e[11]||(e[11]=[n("Add make command")])),_:1})]),a("li",null,[t(i,{to:"#add-new-methods-for-response"},{default:s(()=>e[12]||(e[12]=[n("Add new methods for Response")])),_:1})]),a("li",null,[t(i,{to:"#add-return-for-request-prepareforvalidation-method"},{default:s(()=>e[13]||(e[13]=[n("Add return for Request PrepareForValidation method")])),_:1})]),a("li",null,[t(i,{to:"#file-gets-the-wrong-file-type"},{default:s(()=>e[14]||(e[14]=[n("File gets the wrong file type")])),_:1})]),a("li",null,[t(i,{to:"#fix-template-error-on-make-event-and-make-listener-command"},{default:s(()=>e[15]||(e[15]=[n("Fix template error on make:event and make:listener command")])),_:1})]),a("li",null,[t(i,{to:"#fix-some-types-cannot-obtain-suffixes-when-save-file"},{default:s(()=>e[16]||(e[16]=[n("Fix some types cannot obtain suffixes when save file")])),_:1})])])])])]),e[37]||(e[37]=r(`

    Enhancements 🚀

    Breaking Changes 🛠

    Bug Fixes 🐛

    Dependency Updates ⬆️

    • build(deps): bump github.com/gin-gonic/gin from v1.7.3 to v1.8.2

    Upgrade Guide

    Estimated Upgrade Time: 10 Minutes

    Updating Dependencies

    Update dependencies in the go.mod file:

    go get -u github.com/goravel/framework@v1.9.0
    +import{_ as p,c as u,b as a,e as t,f as s,a as r,d as n,r as l,o as m}from"./app-Ewo6p9aM.js";const g={},h={class:"table-of-contents"};function v(f,e){const i=l("router-link"),d=l("RouteLink"),o=l("CommentService");return m(),u("div",null,[e[36]||(e[36]=a("h1",{id:"upgrading-to-v1-9-from-v1-8",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#upgrading-to-v1-9-from-v1-8"},[a("span",null,"Upgrading To v1.9 From v1.8")])],-1)),a("nav",h,[a("ul",null,[a("li",null,[t(i,{to:"#enhancements-🚀"},{default:s(()=>e[0]||(e[0]=[n("Enhancements 🚀")])),_:1})]),a("li",null,[t(i,{to:"#breaking-changes-🛠"},{default:s(()=>e[1]||(e[1]=[n("Breaking Changes 🛠")])),_:1})]),a("li",null,[t(i,{to:"#bug-fixes-🐛"},{default:s(()=>e[2]||(e[2]=[n("Bug Fixes 🐛")])),_:1})]),a("li",null,[t(i,{to:"#dependency-updates-⬆️"},{default:s(()=>e[3]||(e[3]=[n("Dependency Updates ⬆️")])),_:1})]),a("li",null,[t(i,{to:"#upgrade-guide"},{default:s(()=>e[4]||(e[4]=[n("Upgrade Guide")])),_:1}),a("ul",null,[a("li",null,[t(i,{to:"#updating-dependencies"},{default:s(()=>e[5]||(e[5]=[n("Updating Dependencies")])),_:1})]),a("li",null,[t(i,{to:"#add-database-read-write-separation"},{default:s(()=>e[6]||(e[6]=[n("Add database read-write separation")])),_:1})]),a("li",null,[t(i,{to:"#add-database-pool-configuration"},{default:s(()=>e[7]||(e[7]=[n("Add database pool configuration")])),_:1})]),a("li",null,[t(i,{to:"#custom-env-path"},{default:s(()=>e[8]||(e[8]=[n("Custom .env path")])),_:1})]),a("li",null,[t(i,{to:"#cache-add-memory-driver"},{default:s(()=>e[9]||(e[9]=[n("Cache add memory driver")])),_:1})]),a("li",null,[t(i,{to:"#orm-add-paginate-method"},{default:s(()=>e[10]||(e[10]=[n("Orm add Paginate method")])),_:1})]),a("li",null,[t(i,{to:"#add-make-command"},{default:s(()=>e[11]||(e[11]=[n("Add make command")])),_:1})]),a("li",null,[t(i,{to:"#add-new-methods-for-response"},{default:s(()=>e[12]||(e[12]=[n("Add new methods for Response")])),_:1})]),a("li",null,[t(i,{to:"#add-return-for-request-prepareforvalidation-method"},{default:s(()=>e[13]||(e[13]=[n("Add return for Request PrepareForValidation method")])),_:1})]),a("li",null,[t(i,{to:"#file-gets-the-wrong-file-type"},{default:s(()=>e[14]||(e[14]=[n("File gets the wrong file type")])),_:1})]),a("li",null,[t(i,{to:"#fix-template-error-on-make-event-and-make-listener-command"},{default:s(()=>e[15]||(e[15]=[n("Fix template error on make:event and make:listener command")])),_:1})]),a("li",null,[t(i,{to:"#fix-some-types-cannot-obtain-suffixes-when-save-file"},{default:s(()=>e[16]||(e[16]=[n("Fix some types cannot obtain suffixes when save file")])),_:1})])])])])]),e[37]||(e[37]=r(`

    Enhancements 🚀

    Breaking Changes 🛠

    Bug Fixes 🐛

    Dependency Updates ⬆️

    • build(deps): bump github.com/gin-gonic/gin from v1.7.3 to v1.8.2

    Upgrade Guide

    Estimated Upgrade Time: 10 Minutes

    Updating Dependencies

    Update dependencies in the go.mod file:

    go get -u github.com/goravel/framework@v1.9.0
     

    Add database read-write separation

    Version: v1.9.0

    `,15)),a("p",null,[e[18]||(e[18]=n("Database supports read-write separation,")),t(d,{to:"/orm/getting-started.html#read--write-connections"},{default:s(()=>e[17]||(e[17]=[n("For Detail")])),_:1}),e[19]||(e[19]=n("."))]),e[38]||(e[38]=r(`

    Add database pool configuration

    Version: v1.9.0

    Add pool configuration for the database configuration file: config/database.go, For Detail.

    Custom .env path

    Version: v1.9.0

    // Develop
     go run . --env=../.env
     
    diff --git a/assets/v1.9.html-kYWrJkbl.js b/assets/v1.9.html-CfwQEdWO.js
    similarity index 99%
    rename from assets/v1.9.html-kYWrJkbl.js
    rename to assets/v1.9.html-CfwQEdWO.js
    index 87a28b8e..511dc9d6 100644
    --- a/assets/v1.9.html-kYWrJkbl.js
    +++ b/assets/v1.9.html-CfwQEdWO.js
    @@ -1,4 +1,4 @@
    -import{_ as p,c as u,b as n,e as a,f as s,a as r,d as l,r as o,o as m}from"./app-ELDWQP0J.js";const v={},E={class:"table-of-contents"};function h(g,e){const t=o("router-link"),i=o("RouteLink"),d=o("CommentService");return m(),u("div",null,[e[36]||(e[36]=n("h1",{id:"从-v1-8-升级到-v1-9",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#从-v1-8-升级到-v1-9"},[n("span",null,"从 v1.8 升级到 v1.9")])],-1)),n("nav",E,[n("ul",null,[n("li",null,[a(t,{to:"#功能增强-🚀"},{default:s(()=>e[0]||(e[0]=[l("功能增强 🚀")])),_:1})]),n("li",null,[a(t,{to:"#破坏性变化-🛠"},{default:s(()=>e[1]||(e[1]=[l("破坏性变化 🛠")])),_:1})]),n("li",null,[a(t,{to:"#bug-修复-🐛"},{default:s(()=>e[2]||(e[2]=[l("Bug 修复 🐛")])),_:1})]),n("li",null,[a(t,{to:"#升级依赖-⬆️"},{default:s(()=>e[3]||(e[3]=[l("升级依赖 ⬆️")])),_:1})]),n("li",null,[a(t,{to:"#升级指南"},{default:s(()=>e[4]||(e[4]=[l("升级指南")])),_:1}),n("ul",null,[n("li",null,[a(t,{to:"#更新依赖"},{default:s(()=>e[5]||(e[5]=[l("更新依赖")])),_:1})]),n("li",null,[a(t,{to:"#新增数据库读写分离"},{default:s(()=>e[6]||(e[6]=[l("新增数据库读写分离")])),_:1})]),n("li",null,[a(t,{to:"#新增数据库连接池配置"},{default:s(()=>e[7]||(e[7]=[l("新增数据库连接池配置")])),_:1})]),n("li",null,[a(t,{to:"#自定义-env-路径"},{default:s(()=>e[8]||(e[8]=[l("自定义 .env 路径")])),_:1})]),n("li",null,[a(t,{to:"#cache-新增-memory-驱动"},{default:s(()=>e[9]||(e[9]=[l("Cache 新增 Memory 驱动")])),_:1})]),n("li",null,[a(t,{to:"#orm-新增分页方法"},{default:s(()=>e[10]||(e[10]=[l("Orm 新增分页方法")])),_:1})]),n("li",null,[a(t,{to:"#新增-make-命令"},{default:s(()=>e[11]||(e[11]=[l("新增 make 命令")])),_:1})]),n("li",null,[a(t,{to:"#response-新增方法"},{default:s(()=>e[12]||(e[12]=[l("Response 新增方法")])),_:1})]),n("li",null,[a(t,{to:"#request-prepareforvalidation-方法新增-error-返回"},{default:s(()=>e[13]||(e[13]=[l("Request PrepareForValidation 方法新增 error 返回")])),_:1})]),n("li",null,[a(t,{to:"#file-获取错误的文件类型"},{default:s(()=>e[14]||(e[14]=[l("File 获取错误的文件类型")])),_:1})]),n("li",null,[a(t,{to:"#修复-make-event-和-make-listener-命令生成模板有误的问题"},{default:s(()=>e[15]||(e[15]=[l("修复 make:event 和 make:listener 命令生成模板有误的问题")])),_:1})]),n("li",null,[a(t,{to:"#修复保存文件时有些类型无法获取后缀的问题"},{default:s(()=>e[16]||(e[16]=[l("修复保存文件时有些类型无法获取后缀的问题")])),_:1})])])])])]),e[37]||(e[37]=r(`

    功能增强 🚀

    破坏性变化 🛠

    Bug 修复 🐛

    升级依赖 ⬆️

    • build(deps): bump github.com/gin-gonic/gin from v1.7.3 to v1.8.2

    升级指南

    预计升级时间:10 分钟

    更新依赖

    go.mod 中更新依赖:

    go get -u github.com/goravel/framework@v1.9.0
    +import{_ as p,c as u,b as n,e as a,f as s,a as r,d as l,r as o,o as m}from"./app-Ewo6p9aM.js";const v={},E={class:"table-of-contents"};function h(g,e){const t=o("router-link"),i=o("RouteLink"),d=o("CommentService");return m(),u("div",null,[e[36]||(e[36]=n("h1",{id:"从-v1-8-升级到-v1-9",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#从-v1-8-升级到-v1-9"},[n("span",null,"从 v1.8 升级到 v1.9")])],-1)),n("nav",E,[n("ul",null,[n("li",null,[a(t,{to:"#功能增强-🚀"},{default:s(()=>e[0]||(e[0]=[l("功能增强 🚀")])),_:1})]),n("li",null,[a(t,{to:"#破坏性变化-🛠"},{default:s(()=>e[1]||(e[1]=[l("破坏性变化 🛠")])),_:1})]),n("li",null,[a(t,{to:"#bug-修复-🐛"},{default:s(()=>e[2]||(e[2]=[l("Bug 修复 🐛")])),_:1})]),n("li",null,[a(t,{to:"#升级依赖-⬆️"},{default:s(()=>e[3]||(e[3]=[l("升级依赖 ⬆️")])),_:1})]),n("li",null,[a(t,{to:"#升级指南"},{default:s(()=>e[4]||(e[4]=[l("升级指南")])),_:1}),n("ul",null,[n("li",null,[a(t,{to:"#更新依赖"},{default:s(()=>e[5]||(e[5]=[l("更新依赖")])),_:1})]),n("li",null,[a(t,{to:"#新增数据库读写分离"},{default:s(()=>e[6]||(e[6]=[l("新增数据库读写分离")])),_:1})]),n("li",null,[a(t,{to:"#新增数据库连接池配置"},{default:s(()=>e[7]||(e[7]=[l("新增数据库连接池配置")])),_:1})]),n("li",null,[a(t,{to:"#自定义-env-路径"},{default:s(()=>e[8]||(e[8]=[l("自定义 .env 路径")])),_:1})]),n("li",null,[a(t,{to:"#cache-新增-memory-驱动"},{default:s(()=>e[9]||(e[9]=[l("Cache 新增 Memory 驱动")])),_:1})]),n("li",null,[a(t,{to:"#orm-新增分页方法"},{default:s(()=>e[10]||(e[10]=[l("Orm 新增分页方法")])),_:1})]),n("li",null,[a(t,{to:"#新增-make-命令"},{default:s(()=>e[11]||(e[11]=[l("新增 make 命令")])),_:1})]),n("li",null,[a(t,{to:"#response-新增方法"},{default:s(()=>e[12]||(e[12]=[l("Response 新增方法")])),_:1})]),n("li",null,[a(t,{to:"#request-prepareforvalidation-方法新增-error-返回"},{default:s(()=>e[13]||(e[13]=[l("Request PrepareForValidation 方法新增 error 返回")])),_:1})]),n("li",null,[a(t,{to:"#file-获取错误的文件类型"},{default:s(()=>e[14]||(e[14]=[l("File 获取错误的文件类型")])),_:1})]),n("li",null,[a(t,{to:"#修复-make-event-和-make-listener-命令生成模板有误的问题"},{default:s(()=>e[15]||(e[15]=[l("修复 make:event 和 make:listener 命令生成模板有误的问题")])),_:1})]),n("li",null,[a(t,{to:"#修复保存文件时有些类型无法获取后缀的问题"},{default:s(()=>e[16]||(e[16]=[l("修复保存文件时有些类型无法获取后缀的问题")])),_:1})])])])])]),e[37]||(e[37]=r(`

    功能增强 🚀

    破坏性变化 🛠

    Bug 修复 🐛

    升级依赖 ⬆️

    • build(deps): bump github.com/gin-gonic/gin from v1.7.3 to v1.8.2

    升级指南

    预计升级时间:10 分钟

    更新依赖

    go.mod 中更新依赖:

    go get -u github.com/goravel/framework@v1.9.0
     

    新增数据库读写分离

    Version: v1.9.0

    `,15)),n("p",null,[e[18]||(e[18]=l("数据库支持读写分离配置,")),a(i,{to:"/zh/orm/getting-started.html#%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB"},{default:s(()=>e[17]||(e[17]=[l("详见文档")])),_:1}),e[19]||(e[19]=l("。"))]),e[38]||(e[38]=r(`

    新增数据库连接池配置

    Version: v1.9.0

    数据库配置文件 config/database.go 新增连接池配置 pool详见文件

    自定义 .env 路径

    Version: v1.9.0

    // 编译前
     go run . --env=../.env
     
    diff --git a/assets/validation.html-C8BhQ8Dc.js b/assets/validation.html-CiLImEXn.js
    similarity index 99%
    rename from assets/validation.html-C8BhQ8Dc.js
    rename to assets/validation.html-CiLImEXn.js
    index 8230b76f..3357c9fd 100644
    --- a/assets/validation.html-C8BhQ8Dc.js
    +++ b/assets/validation.html-CiLImEXn.js
    @@ -1,4 +1,4 @@
    -import{_ as u,c as d,b as s,e as t,f as e,a as l,d as a,r as o,o as r}from"./app-ELDWQP0J.js";const k={},v={class:"table-of-contents"};function m(b,n){const p=o("router-link"),i=o("RouteLink"),c=o("CommentService");return r(),d("div",null,[n[35]||(n[35]=s("h1",{id:"表单验证",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#表单验证"},[s("span",null,"表单验证")])],-1)),s("nav",v,[s("ul",null,[s("li",null,[t(p,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[a("简介")])),_:1})]),s("li",null,[t(p,{to:"#快速验证"},{default:e(()=>n[1]||(n[1]=[a("快速验证")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#定义路由"},{default:e(()=>n[2]||(n[2]=[a("定义路由")])),_:1})]),s("li",null,[t(p,{to:"#创建控制器"},{default:e(()=>n[3]||(n[3]=[a("创建控制器")])),_:1})]),s("li",null,[t(p,{to:"#编写验证逻辑"},{default:e(()=>n[4]||(n[4]=[a("编写验证逻辑")])),_:1})]),s("li",null,[t(p,{to:"#嵌套字段"},{default:e(()=>n[5]||(n[5]=[a("嵌套字段")])),_:1})]),s("li",null,[t(p,{to:"#slice-验证"},{default:e(()=>n[6]||(n[6]=[a("Slice 验证")])),_:1})])])]),s("li",null,[t(p,{to:"#验证表单请求"},{default:e(()=>n[7]||(n[7]=[a("验证表单请求")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#创建表单请求验证"},{default:e(()=>n[8]||(n[8]=[a("创建表单请求验证")])),_:1})]),s("li",null,[t(p,{to:"#表单请求授权验证"},{default:e(()=>n[9]||(n[9]=[a("表单请求授权验证")])),_:1})]),s("li",null,[t(p,{to:"#过滤输入数据"},{default:e(()=>n[10]||(n[10]=[a("过滤输入数据")])),_:1})]),s("li",null,[t(p,{to:"#自定义错误消息"},{default:e(()=>n[11]||(n[11]=[a("自定义错误消息")])),_:1})]),s("li",null,[t(p,{to:"#自定义验证属性"},{default:e(()=>n[12]||(n[12]=[a("自定义验证属性")])),_:1})]),s("li",null,[t(p,{to:"#准备验证输入"},{default:e(()=>n[13]||(n[13]=[a("准备验证输入")])),_:1})])])]),s("li",null,[t(p,{to:"#手动创建验证器"},{default:e(()=>n[14]||(n[14]=[a("手动创建验证器")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#自定义错误消息-1"},{default:e(()=>n[15]||(n[15]=[a("自定义错误消息")])),_:1})]),s("li",null,[t(p,{to:"#为给定属性指定自定义消息"},{default:e(()=>n[16]||(n[16]=[a("为给定属性指定自定义消息")])),_:1})]),s("li",null,[t(p,{to:"#指定自定义属性值"},{default:e(()=>n[17]||(n[17]=[a("指定自定义属性值")])),_:1})]),s("li",null,[t(p,{to:"#验证前格式化数据"},{default:e(()=>n[18]||(n[18]=[a("验证前格式化数据")])),_:1})])])]),s("li",null,[t(p,{to:"#处理验证字段"},{default:e(()=>n[19]||(n[19]=[a("处理验证字段")])),_:1})]),s("li",null,[t(p,{to:"#处理错误信息"},{default:e(()=>n[20]||(n[20]=[a("处理错误信息")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#检索特定字段的一个错误信息-随机"},{default:e(()=>n[21]||(n[21]=[a("检索特定字段的一个错误信息(随机)")])),_:1})]),s("li",null,[t(p,{to:"#检索特定字段的所有错误信息"},{default:e(()=>n[22]||(n[22]=[a("检索特定字段的所有错误信息")])),_:1})]),s("li",null,[t(p,{to:"#检索所有字段的所有错误信息"},{default:e(()=>n[23]||(n[23]=[a("检索所有字段的所有错误信息")])),_:1})]),s("li",null,[t(p,{to:"#判断特定字段是否含有错误信息"},{default:e(()=>n[24]||(n[24]=[a("判断特定字段是否含有错误信息")])),_:1})])])]),s("li",null,[t(p,{to:"#可用的验证规则"},{default:e(()=>n[25]||(n[25]=[a("可用的验证规则")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#规则使用注意事项"},{default:e(()=>n[26]||(n[26]=[a("规则使用注意事项")])),_:1})])])]),s("li",null,[t(p,{to:"#自定义验证规则"},{default:e(()=>n[27]||(n[27]=[a("自定义验证规则")])),_:1})]),s("li",null,[t(p,{to:"#可用的过滤器"},{default:e(()=>n[28]||(n[28]=[a("可用的过滤器")])),_:1})]),s("li",null,[t(p,{to:"#自定义过滤规则"},{default:e(()=>n[29]||(n[29]=[a("自定义过滤规则")])),_:1})])])]),n[36]||(n[36]=l(`

    简介

    Goravel 提供了几种不同的方法来验证传入应用程序的数据。最常见的做法是在所有传入的 HTTP 请求中使用 Validate 方法。Goravel 包含了各种方便的验证规则。

    快速验证

    让我们来看一个表单验证并将错误消息展示给用户的完整示例,这将会对你如何使用 Goravel 验证传入的请求数据有一个很好的理解。

    定义路由

    首先,假设我们在 routes/web.go 路由文件中定义了下面这些路由:

    import "goravel/app/http/controllers"
    +import{_ as u,c as d,b as s,e as t,f as e,a as l,d as a,r as o,o as r}from"./app-Ewo6p9aM.js";const k={},v={class:"table-of-contents"};function m(b,n){const p=o("router-link"),i=o("RouteLink"),c=o("CommentService");return r(),d("div",null,[n[35]||(n[35]=s("h1",{id:"表单验证",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#表单验证"},[s("span",null,"表单验证")])],-1)),s("nav",v,[s("ul",null,[s("li",null,[t(p,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[a("简介")])),_:1})]),s("li",null,[t(p,{to:"#快速验证"},{default:e(()=>n[1]||(n[1]=[a("快速验证")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#定义路由"},{default:e(()=>n[2]||(n[2]=[a("定义路由")])),_:1})]),s("li",null,[t(p,{to:"#创建控制器"},{default:e(()=>n[3]||(n[3]=[a("创建控制器")])),_:1})]),s("li",null,[t(p,{to:"#编写验证逻辑"},{default:e(()=>n[4]||(n[4]=[a("编写验证逻辑")])),_:1})]),s("li",null,[t(p,{to:"#嵌套字段"},{default:e(()=>n[5]||(n[5]=[a("嵌套字段")])),_:1})]),s("li",null,[t(p,{to:"#slice-验证"},{default:e(()=>n[6]||(n[6]=[a("Slice 验证")])),_:1})])])]),s("li",null,[t(p,{to:"#验证表单请求"},{default:e(()=>n[7]||(n[7]=[a("验证表单请求")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#创建表单请求验证"},{default:e(()=>n[8]||(n[8]=[a("创建表单请求验证")])),_:1})]),s("li",null,[t(p,{to:"#表单请求授权验证"},{default:e(()=>n[9]||(n[9]=[a("表单请求授权验证")])),_:1})]),s("li",null,[t(p,{to:"#过滤输入数据"},{default:e(()=>n[10]||(n[10]=[a("过滤输入数据")])),_:1})]),s("li",null,[t(p,{to:"#自定义错误消息"},{default:e(()=>n[11]||(n[11]=[a("自定义错误消息")])),_:1})]),s("li",null,[t(p,{to:"#自定义验证属性"},{default:e(()=>n[12]||(n[12]=[a("自定义验证属性")])),_:1})]),s("li",null,[t(p,{to:"#准备验证输入"},{default:e(()=>n[13]||(n[13]=[a("准备验证输入")])),_:1})])])]),s("li",null,[t(p,{to:"#手动创建验证器"},{default:e(()=>n[14]||(n[14]=[a("手动创建验证器")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#自定义错误消息-1"},{default:e(()=>n[15]||(n[15]=[a("自定义错误消息")])),_:1})]),s("li",null,[t(p,{to:"#为给定属性指定自定义消息"},{default:e(()=>n[16]||(n[16]=[a("为给定属性指定自定义消息")])),_:1})]),s("li",null,[t(p,{to:"#指定自定义属性值"},{default:e(()=>n[17]||(n[17]=[a("指定自定义属性值")])),_:1})]),s("li",null,[t(p,{to:"#验证前格式化数据"},{default:e(()=>n[18]||(n[18]=[a("验证前格式化数据")])),_:1})])])]),s("li",null,[t(p,{to:"#处理验证字段"},{default:e(()=>n[19]||(n[19]=[a("处理验证字段")])),_:1})]),s("li",null,[t(p,{to:"#处理错误信息"},{default:e(()=>n[20]||(n[20]=[a("处理错误信息")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#检索特定字段的一个错误信息-随机"},{default:e(()=>n[21]||(n[21]=[a("检索特定字段的一个错误信息(随机)")])),_:1})]),s("li",null,[t(p,{to:"#检索特定字段的所有错误信息"},{default:e(()=>n[22]||(n[22]=[a("检索特定字段的所有错误信息")])),_:1})]),s("li",null,[t(p,{to:"#检索所有字段的所有错误信息"},{default:e(()=>n[23]||(n[23]=[a("检索所有字段的所有错误信息")])),_:1})]),s("li",null,[t(p,{to:"#判断特定字段是否含有错误信息"},{default:e(()=>n[24]||(n[24]=[a("判断特定字段是否含有错误信息")])),_:1})])])]),s("li",null,[t(p,{to:"#可用的验证规则"},{default:e(()=>n[25]||(n[25]=[a("可用的验证规则")])),_:1}),s("ul",null,[s("li",null,[t(p,{to:"#规则使用注意事项"},{default:e(()=>n[26]||(n[26]=[a("规则使用注意事项")])),_:1})])])]),s("li",null,[t(p,{to:"#自定义验证规则"},{default:e(()=>n[27]||(n[27]=[a("自定义验证规则")])),_:1})]),s("li",null,[t(p,{to:"#可用的过滤器"},{default:e(()=>n[28]||(n[28]=[a("可用的过滤器")])),_:1})]),s("li",null,[t(p,{to:"#自定义过滤规则"},{default:e(()=>n[29]||(n[29]=[a("自定义过滤规则")])),_:1})])])]),n[36]||(n[36]=l(`

    简介

    Goravel 提供了几种不同的方法来验证传入应用程序的数据。最常见的做法是在所有传入的 HTTP 请求中使用 Validate 方法。Goravel 包含了各种方便的验证规则。

    快速验证

    让我们来看一个表单验证并将错误消息展示给用户的完整示例,这将会对你如何使用 Goravel 验证传入的请求数据有一个很好的理解。

    定义路由

    首先,假设我们在 routes/web.go 路由文件中定义了下面这些路由:

    import "goravel/app/http/controllers"
     
     postController := controllers.NewPostController()
     facades.Route().Get("/post/create", postController.Create)
    diff --git a/assets/validation.html-BsamCfrc.js b/assets/validation.html-cWEjgQJ2.js
    similarity index 99%
    rename from assets/validation.html-BsamCfrc.js
    rename to assets/validation.html-cWEjgQJ2.js
    index 812f8612..c3d1df73 100644
    --- a/assets/validation.html-BsamCfrc.js
    +++ b/assets/validation.html-cWEjgQJ2.js
    @@ -1,4 +1,4 @@
    -import{_ as u,c as r,b as s,e as t,f as e,a as p,d as a,r as i,o as d}from"./app-ELDWQP0J.js";const k={},v={class:"table-of-contents"};function m(g,n){const o=i("router-link"),l=i("RouteLink"),c=i("CommentService");return d(),r("div",null,[n[35]||(n[35]=s("h1",{id:"validation",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#validation"},[s("span",null,"Validation")])],-1)),s("nav",v,[s("ul",null,[s("li",null,[t(o,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[t(o,{to:"#validation-quickstart"},{default:e(()=>n[1]||(n[1]=[a("Validation Quickstart")])),_:1}),s("ul",null,[s("li",null,[t(o,{to:"#defining-the-routes"},{default:e(()=>n[2]||(n[2]=[a("Defining The Routes")])),_:1})]),s("li",null,[t(o,{to:"#creating-the-controller"},{default:e(()=>n[3]||(n[3]=[a("Creating The Controller")])),_:1})]),s("li",null,[t(o,{to:"#writing-the-validation-logic"},{default:e(()=>n[4]||(n[4]=[a("Writing The Validation Logic")])),_:1})]),s("li",null,[t(o,{to:"#nested-attributes"},{default:e(()=>n[5]||(n[5]=[a("Nested Attributes")])),_:1})]),s("li",null,[t(o,{to:"#slice-validation"},{default:e(()=>n[6]||(n[6]=[a("Slice Validation")])),_:1})])])]),s("li",null,[t(o,{to:"#form-request-validation"},{default:e(()=>n[7]||(n[7]=[a("Form Request Validation")])),_:1}),s("ul",null,[s("li",null,[t(o,{to:"#creating-form-requests"},{default:e(()=>n[8]||(n[8]=[a("Creating Form Requests")])),_:1})]),s("li",null,[t(o,{to:"#authorizing-form-requests"},{default:e(()=>n[9]||(n[9]=[a("Authorizing Form Requests")])),_:1})]),s("li",null,[t(o,{to:"#filter-input-data"},{default:e(()=>n[10]||(n[10]=[a("Filter Input Data")])),_:1})]),s("li",null,[t(o,{to:"#customizing-the-error-messages"},{default:e(()=>n[11]||(n[11]=[a("Customizing The Error Messages")])),_:1})]),s("li",null,[t(o,{to:"#customizing-the-validation-attributes"},{default:e(()=>n[12]||(n[12]=[a("Customizing The Validation Attributes")])),_:1})]),s("li",null,[t(o,{to:"#preparing-input-for-validation"},{default:e(()=>n[13]||(n[13]=[a("Preparing Input For Validation")])),_:1})])])]),s("li",null,[t(o,{to:"#manually-creating-validators"},{default:e(()=>n[14]||(n[14]=[a("Manually Creating Validators")])),_:1}),s("ul",null,[s("li",null,[t(o,{to:"#customizing-the-error-messages-1"},{default:e(()=>n[15]||(n[15]=[a("Customizing The Error Messages")])),_:1})]),s("li",null,[t(o,{to:"#specifying-a-custom-message-for-a-given-attribute"},{default:e(()=>n[16]||(n[16]=[a("Specifying A Custom Message For A Given Attribute")])),_:1})]),s("li",null,[t(o,{to:"#specifying-custom-attribute-values"},{default:e(()=>n[17]||(n[17]=[a("Specifying Custom Attribute Values")])),_:1})]),s("li",null,[t(o,{to:"#format-data-before-validation"},{default:e(()=>n[18]||(n[18]=[a("Format Data Before Validation")])),_:1})])])]),s("li",null,[t(o,{to:"#working-with-validated-input"},{default:e(()=>n[19]||(n[19]=[a("Working With Validated Input")])),_:1})]),s("li",null,[t(o,{to:"#working-with-error-messages"},{default:e(()=>n[20]||(n[20]=[a("Working With Error Messages")])),_:1}),s("ul",null,[s("li",null,[t(o,{to:"#retrieving-one-error-message-for-a-field-random"},{default:e(()=>n[21]||(n[21]=[a("Retrieving one Error Message For A Field (Random)")])),_:1})]),s("li",null,[t(o,{to:"#retrieving-all-error-messages-for-a-field"},{default:e(()=>n[22]||(n[22]=[a("Retrieving All Error Messages For A Field")])),_:1})]),s("li",null,[t(o,{to:"#retrieving-all-error-messages-for-all-fields"},{default:e(()=>n[23]||(n[23]=[a("Retrieving All Error Messages For All Fields")])),_:1})]),s("li",null,[t(o,{to:"#determining-if-error-messages-exist-for-a-field"},{default:e(()=>n[24]||(n[24]=[a("Determining If Error Messages Exist For A Field")])),_:1})])])]),s("li",null,[t(o,{to:"#available-validation-rules"},{default:e(()=>n[25]||(n[25]=[a("Available Validation Rules")])),_:1}),s("ul",null,[s("li",null,[t(o,{to:"#points-for-using-rules"},{default:e(()=>n[26]||(n[26]=[a("Points For Using Rules")])),_:1})])])]),s("li",null,[t(o,{to:"#custom-validation-rules"},{default:e(()=>n[27]||(n[27]=[a("Custom Validation Rules")])),_:1})]),s("li",null,[t(o,{to:"#available-validation-filters"},{default:e(()=>n[28]||(n[28]=[a("Available Validation Filters")])),_:1})]),s("li",null,[t(o,{to:"#custom-filter"},{default:e(()=>n[29]||(n[29]=[a("Custom filter")])),_:1})])])]),n[36]||(n[36]=p(`

    Introduction

    Goravel provides several different approaches to validate your application's incoming data. It is most common to use the Validate method available on all incoming HTTP requests. Goravel includes a wide variety of convenient validation rules.

    Validation Quickstart

    Let's take a closer look at a complete example of how to validate a form and return error messages to the user. This overview will provide you with a general understanding of how to validate incoming request data using Goravel.

    Defining The Routes

    First, let's assume we have the following routes defined in our routes/web.go file:

    import "goravel/app/http/controllers"
    +import{_ as u,c as r,b as s,e as t,f as e,a as p,d as a,r as i,o as d}from"./app-Ewo6p9aM.js";const k={},v={class:"table-of-contents"};function m(g,n){const o=i("router-link"),l=i("RouteLink"),c=i("CommentService");return d(),r("div",null,[n[35]||(n[35]=s("h1",{id:"validation",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#validation"},[s("span",null,"Validation")])],-1)),s("nav",v,[s("ul",null,[s("li",null,[t(o,{to:"#introduction"},{default:e(()=>n[0]||(n[0]=[a("Introduction")])),_:1})]),s("li",null,[t(o,{to:"#validation-quickstart"},{default:e(()=>n[1]||(n[1]=[a("Validation Quickstart")])),_:1}),s("ul",null,[s("li",null,[t(o,{to:"#defining-the-routes"},{default:e(()=>n[2]||(n[2]=[a("Defining The Routes")])),_:1})]),s("li",null,[t(o,{to:"#creating-the-controller"},{default:e(()=>n[3]||(n[3]=[a("Creating The Controller")])),_:1})]),s("li",null,[t(o,{to:"#writing-the-validation-logic"},{default:e(()=>n[4]||(n[4]=[a("Writing The Validation Logic")])),_:1})]),s("li",null,[t(o,{to:"#nested-attributes"},{default:e(()=>n[5]||(n[5]=[a("Nested Attributes")])),_:1})]),s("li",null,[t(o,{to:"#slice-validation"},{default:e(()=>n[6]||(n[6]=[a("Slice Validation")])),_:1})])])]),s("li",null,[t(o,{to:"#form-request-validation"},{default:e(()=>n[7]||(n[7]=[a("Form Request Validation")])),_:1}),s("ul",null,[s("li",null,[t(o,{to:"#creating-form-requests"},{default:e(()=>n[8]||(n[8]=[a("Creating Form Requests")])),_:1})]),s("li",null,[t(o,{to:"#authorizing-form-requests"},{default:e(()=>n[9]||(n[9]=[a("Authorizing Form Requests")])),_:1})]),s("li",null,[t(o,{to:"#filter-input-data"},{default:e(()=>n[10]||(n[10]=[a("Filter Input Data")])),_:1})]),s("li",null,[t(o,{to:"#customizing-the-error-messages"},{default:e(()=>n[11]||(n[11]=[a("Customizing The Error Messages")])),_:1})]),s("li",null,[t(o,{to:"#customizing-the-validation-attributes"},{default:e(()=>n[12]||(n[12]=[a("Customizing The Validation Attributes")])),_:1})]),s("li",null,[t(o,{to:"#preparing-input-for-validation"},{default:e(()=>n[13]||(n[13]=[a("Preparing Input For Validation")])),_:1})])])]),s("li",null,[t(o,{to:"#manually-creating-validators"},{default:e(()=>n[14]||(n[14]=[a("Manually Creating Validators")])),_:1}),s("ul",null,[s("li",null,[t(o,{to:"#customizing-the-error-messages-1"},{default:e(()=>n[15]||(n[15]=[a("Customizing The Error Messages")])),_:1})]),s("li",null,[t(o,{to:"#specifying-a-custom-message-for-a-given-attribute"},{default:e(()=>n[16]||(n[16]=[a("Specifying A Custom Message For A Given Attribute")])),_:1})]),s("li",null,[t(o,{to:"#specifying-custom-attribute-values"},{default:e(()=>n[17]||(n[17]=[a("Specifying Custom Attribute Values")])),_:1})]),s("li",null,[t(o,{to:"#format-data-before-validation"},{default:e(()=>n[18]||(n[18]=[a("Format Data Before Validation")])),_:1})])])]),s("li",null,[t(o,{to:"#working-with-validated-input"},{default:e(()=>n[19]||(n[19]=[a("Working With Validated Input")])),_:1})]),s("li",null,[t(o,{to:"#working-with-error-messages"},{default:e(()=>n[20]||(n[20]=[a("Working With Error Messages")])),_:1}),s("ul",null,[s("li",null,[t(o,{to:"#retrieving-one-error-message-for-a-field-random"},{default:e(()=>n[21]||(n[21]=[a("Retrieving one Error Message For A Field (Random)")])),_:1})]),s("li",null,[t(o,{to:"#retrieving-all-error-messages-for-a-field"},{default:e(()=>n[22]||(n[22]=[a("Retrieving All Error Messages For A Field")])),_:1})]),s("li",null,[t(o,{to:"#retrieving-all-error-messages-for-all-fields"},{default:e(()=>n[23]||(n[23]=[a("Retrieving All Error Messages For All Fields")])),_:1})]),s("li",null,[t(o,{to:"#determining-if-error-messages-exist-for-a-field"},{default:e(()=>n[24]||(n[24]=[a("Determining If Error Messages Exist For A Field")])),_:1})])])]),s("li",null,[t(o,{to:"#available-validation-rules"},{default:e(()=>n[25]||(n[25]=[a("Available Validation Rules")])),_:1}),s("ul",null,[s("li",null,[t(o,{to:"#points-for-using-rules"},{default:e(()=>n[26]||(n[26]=[a("Points For Using Rules")])),_:1})])])]),s("li",null,[t(o,{to:"#custom-validation-rules"},{default:e(()=>n[27]||(n[27]=[a("Custom Validation Rules")])),_:1})]),s("li",null,[t(o,{to:"#available-validation-filters"},{default:e(()=>n[28]||(n[28]=[a("Available Validation Filters")])),_:1})]),s("li",null,[t(o,{to:"#custom-filter"},{default:e(()=>n[29]||(n[29]=[a("Custom filter")])),_:1})])])]),n[36]||(n[36]=p(`

    Introduction

    Goravel provides several different approaches to validate your application's incoming data. It is most common to use the Validate method available on all incoming HTTP requests. Goravel includes a wide variety of convenient validation rules.

    Validation Quickstart

    Let's take a closer look at a complete example of how to validate a form and return error messages to the user. This overview will provide you with a general understanding of how to validate incoming request data using Goravel.

    Defining The Routes

    First, let's assume we have the following routes defined in our routes/web.go file:

    import "goravel/app/http/controllers"
     
     postController := controllers.NewPostController()
     facades.Route().Get("/post/create", postController.Create)
    diff --git a/assets/views.html-KoNxbrdS.js b/assets/views.html-BMnAtMFZ.js
    similarity index 99%
    rename from assets/views.html-KoNxbrdS.js
    rename to assets/views.html-BMnAtMFZ.js
    index 9878c387..971cc5bc 100644
    --- a/assets/views.html-KoNxbrdS.js
    +++ b/assets/views.html-BMnAtMFZ.js
    @@ -1,4 +1,4 @@
    -import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(m,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[7]||(n[7]=s("h1",{id:"视图",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#视图"},[s("span",null,"视图")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#创建和渲染视图"},{default:e(()=>n[1]||(n[1]=[p("创建和渲染视图")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#嵌套视图目录"},{default:e(()=>n[2]||(n[2]=[p("嵌套视图目录")])),_:1})]),s("li",null,[a(t,{to:"#使用第一个可用视图"},{default:e(()=>n[3]||(n[3]=[p("使用第一个可用视图")])),_:1})]),s("li",null,[a(t,{to:"#判断视图文件是否存在"},{default:e(()=>n[4]||(n[4]=[p("判断视图文件是否存在")])),_:1})])])]),s("li",null,[a(t,{to:"#向视图传递数据"},{default:e(()=>n[5]||(n[5]=[p("向视图传递数据")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#与所有视图共享数据"},{default:e(()=>n[6]||(n[6]=[p("与所有视图共享数据")])),_:1})])])])])]),n[8]||(n[8]=u(`

    简介

    当然,直接从路由和控制器返回整个 HTML 文档字符串是不切实际的。值得庆幸的是,视图提供了一种方便的方式来将我们所有的 HTML 放在单独的文件中。视图将你的控制器 / 应用程序逻辑与你的表现逻辑分开并存储在 resources/views 目录中。

    创建和渲染视图

    使用框架默认模版 html/template 时,可以通过在应用程序 resources/views 目录中放置具有 .tmpl 扩展名的文件来创建视图。

    // resources/views/welcome.tmpl
    +import{_ as i,c,b as s,e as a,f as e,a as u,r as o,o as r,d as p}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(m,n){const t=o("router-link"),l=o("CommentService");return r(),c("div",null,[n[7]||(n[7]=s("h1",{id:"视图",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#视图"},[s("span",null,"视图")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(t,{to:"#简介"},{default:e(()=>n[0]||(n[0]=[p("简介")])),_:1})]),s("li",null,[a(t,{to:"#创建和渲染视图"},{default:e(()=>n[1]||(n[1]=[p("创建和渲染视图")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#嵌套视图目录"},{default:e(()=>n[2]||(n[2]=[p("嵌套视图目录")])),_:1})]),s("li",null,[a(t,{to:"#使用第一个可用视图"},{default:e(()=>n[3]||(n[3]=[p("使用第一个可用视图")])),_:1})]),s("li",null,[a(t,{to:"#判断视图文件是否存在"},{default:e(()=>n[4]||(n[4]=[p("判断视图文件是否存在")])),_:1})])])]),s("li",null,[a(t,{to:"#向视图传递数据"},{default:e(()=>n[5]||(n[5]=[p("向视图传递数据")])),_:1}),s("ul",null,[s("li",null,[a(t,{to:"#与所有视图共享数据"},{default:e(()=>n[6]||(n[6]=[p("与所有视图共享数据")])),_:1})])])])])]),n[8]||(n[8]=u(`

    简介

    当然,直接从路由和控制器返回整个 HTML 文档字符串是不切实际的。值得庆幸的是,视图提供了一种方便的方式来将我们所有的 HTML 放在单独的文件中。视图将你的控制器 / 应用程序逻辑与你的表现逻辑分开并存储在 resources/views 目录中。

    创建和渲染视图

    使用框架默认模版 html/template 时,可以通过在应用程序 resources/views 目录中放置具有 .tmpl 扩展名的文件来创建视图。

    // resources/views/welcome.tmpl
     {{ define "welcome.tmpl" }}
     <html>
       <body>
    diff --git a/assets/views.html-CNh0d9Px.js b/assets/views.html-DEPOesR0.js
    similarity index 99%
    rename from assets/views.html-CNh0d9Px.js
    rename to assets/views.html-DEPOesR0.js
    index 660299e3..16d447c8 100644
    --- a/assets/views.html-CNh0d9Px.js
    +++ b/assets/views.html-DEPOesR0.js
    @@ -1,4 +1,4 @@
    -import{_ as l,c,b as s,e as a,f as t,a as u,r as p,o as r,d as i}from"./app-ELDWQP0J.js";const d={},k={class:"table-of-contents"};function v(m,n){const e=p("router-link"),o=p("CommentService");return r(),c("div",null,[n[7]||(n[7]=s("h1",{id:"views",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#views"},[s("span",null,"Views")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[i("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#creating-rendering-views"},{default:t(()=>n[1]||(n[1]=[i("Creating & Rendering Views")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#nested-view-directories"},{default:t(()=>n[2]||(n[2]=[i("Nested View Directories")])),_:1})]),s("li",null,[a(e,{to:"#creating-the-first-available-view"},{default:t(()=>n[3]||(n[3]=[i("Creating The First Available View")])),_:1})]),s("li",null,[a(e,{to:"#determining-if-a-view-exists"},{default:t(()=>n[4]||(n[4]=[i("Determining If A View Exists")])),_:1})])])]),s("li",null,[a(e,{to:"#passing-data-to-views"},{default:t(()=>n[5]||(n[5]=[i("Passing Data To Views")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#sharing-data-with-all-views"},{default:t(()=>n[6]||(n[6]=[i("Sharing Data With All Views")])),_:1})])])])])]),n[8]||(n[8]=u(`

    Introduction

    Of course, it's not practical to return entire HTML document strings directly from your routes and controllers. Thankfully, views provide a convenient way to place all of our HTML in separate files. Views separate your controller / application logic from your presentation logic and are stored in the resources/views directory.

    Creating & Rendering Views

    When using the Goravel default template html/template, you can create views by adding a file with the .tmpl extension in the application resources/views directory.

    // resources/views/welcome.tmpl
    +import{_ as l,c,b as s,e as a,f as t,a as u,r as p,o as r,d as i}from"./app-Ewo6p9aM.js";const d={},k={class:"table-of-contents"};function v(m,n){const e=p("router-link"),o=p("CommentService");return r(),c("div",null,[n[7]||(n[7]=s("h1",{id:"views",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#views"},[s("span",null,"Views")])],-1)),s("nav",k,[s("ul",null,[s("li",null,[a(e,{to:"#introduction"},{default:t(()=>n[0]||(n[0]=[i("Introduction")])),_:1})]),s("li",null,[a(e,{to:"#creating-rendering-views"},{default:t(()=>n[1]||(n[1]=[i("Creating & Rendering Views")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#nested-view-directories"},{default:t(()=>n[2]||(n[2]=[i("Nested View Directories")])),_:1})]),s("li",null,[a(e,{to:"#creating-the-first-available-view"},{default:t(()=>n[3]||(n[3]=[i("Creating The First Available View")])),_:1})]),s("li",null,[a(e,{to:"#determining-if-a-view-exists"},{default:t(()=>n[4]||(n[4]=[i("Determining If A View Exists")])),_:1})])])]),s("li",null,[a(e,{to:"#passing-data-to-views"},{default:t(()=>n[5]||(n[5]=[i("Passing Data To Views")])),_:1}),s("ul",null,[s("li",null,[a(e,{to:"#sharing-data-with-all-views"},{default:t(()=>n[6]||(n[6]=[i("Sharing Data With All Views")])),_:1})])])])])]),n[8]||(n[8]=u(`

    Introduction

    Of course, it's not practical to return entire HTML document strings directly from your routes and controllers. Thankfully, views provide a convenient way to place all of our HTML in separate files. Views separate your controller / application logic from your presentation logic and are stored in the resources/views directory.

    Creating & Rendering Views

    When using the Goravel default template html/template, you can create views by adding a file with the .tmpl extension in the application resources/views directory.

    // resources/views/welcome.tmpl
     {{ define "welcome.tmpl" }}
     <html>
       <body>
    diff --git a/digging-deeper/artisan-console.html b/digging-deeper/artisan-console.html
    index 0e5f2a03..5be8b630 100644
    --- a/digging-deeper/artisan-console.html
    +++ b/digging-deeper/artisan-console.html
    @@ -36,8 +36,8 @@
     gtag('js', new Date());
     gtag('config', 'G-HJQNEG5H69');Artisan Console | Goravel
         
    -    
    -    
    +    
    +    
       
       
         
    - + diff --git a/digging-deeper/cache.html b/digging-deeper/cache.html index 1b26dedd..a26550fb 100644 --- a/digging-deeper/cache.html +++ b/digging-deeper/cache.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Cache | Goravel - - + +
    - + diff --git a/digging-deeper/color.html b/digging-deeper/color.html index 941796af..913e70c1 100644 --- a/digging-deeper/color.html +++ b/digging-deeper/color.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Color | Goravel - - + +
    - + diff --git a/digging-deeper/event.html b/digging-deeper/event.html index 7793be50..9939d619 100644 --- a/digging-deeper/event.html +++ b/digging-deeper/event.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Events | Goravel - - + +
    - + diff --git a/digging-deeper/filesystem.html b/digging-deeper/filesystem.html index 56faff9b..95fa2819 100644 --- a/digging-deeper/filesystem.html +++ b/digging-deeper/filesystem.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');File Storage | Goravel - - + +
    - + diff --git a/digging-deeper/helpers.html b/digging-deeper/helpers.html index 13440000..375b029a 100644 --- a/digging-deeper/helpers.html +++ b/digging-deeper/helpers.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Helpers | Goravel - - + +
    - + diff --git a/digging-deeper/index.html b/digging-deeper/index.html index 50527bcc..842dadbd 100644 --- a/digging-deeper/index.html +++ b/digging-deeper/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Goravel - - + + - + diff --git a/digging-deeper/localization.html b/digging-deeper/localization.html index 4bf7378b..a19e057a 100644 --- a/digging-deeper/localization.html +++ b/digging-deeper/localization.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Localization | Goravel - - + + - + diff --git a/digging-deeper/mail.html b/digging-deeper/mail.html index b939164b..5af01500 100644 --- a/digging-deeper/mail.html +++ b/digging-deeper/mail.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Mail | Goravel - - + +
    - + diff --git a/digging-deeper/package-development.html b/digging-deeper/package-development.html index 372ebf19..a19ac1cb 100644 --- a/digging-deeper/package-development.html +++ b/digging-deeper/package-development.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Package Development | Goravel - - + +
    - + diff --git a/digging-deeper/queues.html b/digging-deeper/queues.html index 2efb2751..cb1fe28c 100644 --- a/digging-deeper/queues.html +++ b/digging-deeper/queues.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Queues | Goravel - - + +
    - + diff --git a/digging-deeper/strings.html b/digging-deeper/strings.html index a12de619..b6dfedf6 100644 --- a/digging-deeper/strings.html +++ b/digging-deeper/strings.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Strings | Goravel - - + +
    - + diff --git a/digging-deeper/task-scheduling.html b/digging-deeper/task-scheduling.html index b161dc94..5300661a 100644 --- a/digging-deeper/task-scheduling.html +++ b/digging-deeper/task-scheduling.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Task Scheduling | Goravel - - + +
    - + diff --git a/getting-started/compile.html b/getting-started/compile.html index 474cd2b3..f4d8e88c 100644 --- a/getting-started/compile.html +++ b/getting-started/compile.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Compile | Goravel - - + + - + diff --git a/getting-started/configuration.html b/getting-started/configuration.html index f67829bf..eb0c22c1 100644 --- a/getting-started/configuration.html +++ b/getting-started/configuration.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Configuration | Goravel - - + +
    - + diff --git a/getting-started/directory-structure.html b/getting-started/directory-structure.html index 810c631d..d24ec638 100644 --- a/getting-started/directory-structure.html +++ b/getting-started/directory-structure.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Directory Structure | Goravel - - + +
    - + diff --git a/getting-started/index.html b/getting-started/index.html index 20af66bc..e9820050 100644 --- a/getting-started/index.html +++ b/getting-started/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Getting Started | Goravel - - + + - + diff --git a/getting-started/installation.html b/getting-started/installation.html index 506472bc..ef2e0c8c 100644 --- a/getting-started/installation.html +++ b/getting-started/installation.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Installation | Goravel - - + +
    - + diff --git a/index.html b/index.html index eacb49b9..b8b2adcd 100644 --- a/index.html +++ b/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Goravel - - + + -
    - +
    + diff --git a/orm/factories.html b/orm/factories.html index 05f179a7..07d77a96 100644 --- a/orm/factories.html +++ b/orm/factories.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Factories | Goravel - - + +
    - + diff --git a/orm/getting-started.html b/orm/getting-started.html index 66fed4ec..d51ce30c 100644 --- a/orm/getting-started.html +++ b/orm/getting-started.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Getting Started | Goravel - - + +
    - + diff --git a/orm/index.html b/orm/index.html index 70f2d530..8af9f156 100644 --- a/orm/index.html +++ b/orm/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');ORM | Goravel - - + + - + diff --git a/orm/migrations.html b/orm/migrations.html index 32f628aa..e4ce1681 100644 --- a/orm/migrations.html +++ b/orm/migrations.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Migrations | Goravel - - + +
    - + diff --git a/orm/relationships.html b/orm/relationships.html index 5f194ca5..f8407dad 100644 --- a/orm/relationships.html +++ b/orm/relationships.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Relationships | Goravel - - + +
    - + diff --git a/orm/seeding.html b/orm/seeding.html index 7ea2440a..647ed624 100644 --- a/orm/seeding.html +++ b/orm/seeding.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Database: Seeding | Goravel - - + +
    - + diff --git a/prologue/contributions.html b/prologue/contributions.html index 3f597cbe..13110cd1 100644 --- a/prologue/contributions.html +++ b/prologue/contributions.html @@ -31,16 +31,16 @@ document.documentElement.dataset.theme = 'dark' } - Contribution Guide | Goravel +gtag('config', 'G-HJQNEG5H69');Contribution Guide | Goravel - - + + -
    - +
    + diff --git a/prologue/packages.html b/prologue/packages.html index 49b2d5ce..a03522fa 100644 --- a/prologue/packages.html +++ b/prologue/packages.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Excellent Extend Packages | Goravel - - + +
    - + diff --git a/prologue/privacy-policy.html b/prologue/privacy-policy.html index 81cf4008..7bd67b12 100644 --- a/prologue/privacy-policy.html +++ b/prologue/privacy-policy.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Privacy Policy | Goravel - - + +
    - + diff --git a/security/authentication.html b/security/authentication.html index 0f720a96..1745466e 100644 --- a/security/authentication.html +++ b/security/authentication.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Authentication | Goravel - - + +
    - + diff --git a/security/authorization.html b/security/authorization.html index bbb082b6..17beffce 100644 --- a/security/authorization.html +++ b/security/authorization.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Authorization | Goravel - - + +
    - + diff --git a/security/encryption.html b/security/encryption.html index c94e9733..1a527105 100644 --- a/security/encryption.html +++ b/security/encryption.html @@ -36,13 +36,13 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Encryption | Goravel - - + +
    - + diff --git a/security/hashing.html b/security/hashing.html index 05a91470..783581cf 100644 --- a/security/hashing.html +++ b/security/hashing.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Hashing | Goravel - - + +
    - + diff --git a/t-shirt.jpg b/t-shirt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c91e9fdfb731daf1545660775ae347f2cbcdab10 GIT binary patch literal 27701 zcmeFZd03L|);10}C8=pasX0#pW;sBqIiQ9jj!X_@rCBDFmYNOrSXgOEnnO;JCMqDH zSeBGpKH1=qWhsJ|+N5Qv&1q)i@5Y|}y!(6h-tXS;dwj?5ukZG_l;L)`u4`Ruo$FlZ z^5^}ZPeEq5z4RCmC?EiY0)asDKw$7fkP`3+41CO8KU+aM^B`Hu93`+B2%-a4(gFXx z2{H!mPyx?fzitDbLzI+NRMqCGL+1lGNVGu^u#yr)SxH4jSs8dY6?h+{tfR8f)Xqb7 z5iv^5ECFVpmRB*)+_U}~oYecy!eLY5A$92DCAxb0mR8FUNE8~gYPF-2v)5Xjw-4Tz zK&DVbLc_vo(VMr#Y>lNel6EEU-m`aK%HbpF8Ap$0vhq(B6c!bioMKm2ae4e|flze* zLWAVurN*Y_>o;z;wRd#h>XP=!DRP?&%b8&mwD*`^MWWVD=Dif<^_iAQA}J%S;f>&b)g4QEh=G=nSI(km}g!^{WW!S z2huzEro>+8Vhi+B%lC?@&CTpTo7kcM)y)2!*niDy2;>D)pS!fx)wLIEYilnyS`1u9 zRz`};YK7I@wc?L!_1xv5xP1S-egZ!PJYPd&q0T}R9UT*Y2b6>V|M>d(5Tpzu{2T;n zD1iZEQqlprgJ$#z$XF1U$K|MSD~p&=0*wHo{lAy~udT#_pFK1BNW>qji>PEm|KIqR zYvBH~_m@3ZvJjyE(O`$Ir127VZ33P3+{c+eMU5SMIMeupx{0}%h2TK`=^#XRitJ+{ z1eBn>qJvfzVLQS!##!2cU_{*ie}n9+B=-F9KAoe!r!Ik=9K0R%CO!aL|2h}1uGaWE zuytE+aAxlG2v=i)7ha8sgMt2G1T0shW%7tprWIG&sF2FFsxn8vQcZ^woD3azlpK(3 z*S=wvtMxxxOcp}vr}UTA{^#Ep?MMUdPM|(3(Nd#DJ25glyj~tGqaIPoe8#TX>!6jY z8P3OF?l~)713H)6i!>^XT3_5kktll|zMmI@1UsIVk*~-_GGe67+aTIblPM8}7`c*2 zNlcBsHO*5zI-eR_*}86dm5}@BcL^!~I5_r>M5pudC=uP)Z*Ywg{^p zsC=S;Np7udb;RGOsLtHjf@9g?)o*q*@;zL+`6vx>vIy1!~rTMjTKv3lTG-BDkS4ifkoo)@i)@RK>@Z%t-am=0* zTXIwM+2^mdtviu0L*rEx3Aiwc$$xqP4*u->ADq_wn(h_7Z6K%T^IJvFj~g*CYnrO% z7N)ULjR#=RR6Fh7K$q41EY(n7mnIGWz40Nns)iHlly{TzeKp3`g7|i(Mh=Y@736ua z%<4Ka%~DrzZnXO2Pmn(NWY3QRX8vjatx@-->Xtv=zKn$g(;2oO%AbDMTzx0E6m-xW zyV%Z`cwp+p=m){+gJ&nPixb}B30iz%*~8B7LDL-TgZquKYEyiblc?$70GImvVBKzP zZq4_RK-T~Q{vHgZ`CzEeY^3Eg zO^mbV%$=xw?S=+cB68YuDIVvR&ot*3P6=Z<^DE^Hfj9a?}#= zc9Xshq&P^f)@XljUVsUC>5#f(&MC>rED zJY)@X*xe{YOvyr2vOxcC{FMD?j)=Pq!hWN@Ssrbg6xfQ7sBaa`sAW+EPNHJXVv(m= z`iXDUuBs(px|*H%roeg>rDaFu1;9=DI@#%Hpb?~|S-rb; z@{e5&t%P{GY!H-~#qN$H^dxRiwW=cKfdqlA$6{;mwFOR#c$l~7QXSMaUcO^&|tOhnAhc|`};7#uh0ntp?# z-Pz*w=%@xt=8)+Y^7JT?WZw-dXkh-kE%=|jk3=%mEtJywnFb%g!3$0`@spp)1Z(8; zLe>Pc@7#S+b15i&5S0}@#%DHP0Zu)`!yl4g=8M&=EMkF>2woe=(gqd`4nR*JAZ92% zD}4Rsmd%s;HDM7$>(WOOL(K&);BONz%Zg|AY|ERZc^mp~p{}p|VBa`gZB`z(`eWVc z9iKYYw=9cQ>c1!+z6~Kf4EH*)si0y@!gbzb>*15IS40-=FqYpZMCcam;tB4*U@6;Z z;+;u7_GWgZYFZTR*`)t`Drr1XvYp}}K;ohA&)?Gi&WNqHi?V#ae|2^Lg^H86i`A;A zpOkc6kztxf4U$3was1AGL9!6`xu~W<525bFzd7l~Kjr`4Z}J^B9o<=FRb#y*uDwL( zvco0xbJ&q+_D+!w;z`K%juqQ*Cl;T7EVf;$H#_k`K5sVV_X4nD?I2Q8FJ6@xh#mxa zI$&M1Z7e}HmNquFsE5Z-ZXfB(bU*ry{o>8R2KoFL|1V|Stsm;dDY7J0lh=BmxN(8i zD~cSa8?PEC@YDv>2R_tvNp)r2xAQ)xZd<>7z@X2qb^gK*rH_2)LRdpRX=q z$hX053q9R7(4S{=BOT8fqRf0J{rs?+ocGhb@oD}jx;4vc^c8BSEdoRqXp{Qru^{0R zv3)60BQL|-dPVZ!fkF`~yX#Bzk&Gtic~x{`%q=Qe$bUqs zzmO~VXa9fi&G{Ep40-}l1yVL0bjxCe+~PMXX1gT9iyF1S+?vgxT)jc$j4>CJ(`zr9 zV-6&xg^L5g7G7iB8$H@6%w08AY1sJ+2yde>hgE<}iL-QO;~;Y>mjezh1^aTlVcM~} zF|1Y6Q9}f%&3qMtpXaao#;PcbECBI1B(}2Rd*=tj26u8c*91qbpvbQ0dlZ^+wNif% z5r++>sMg-{)|JHjRB`G@=`{qZ@D>TN4G>Ljt<>DDAs)yC@4^;*uD0Jr<82sd`xTcSi^0Ur~VY;x^RE2Z+GkfsGfov$U6*OtrxeKkqm?+Sz5lU)Wi5) z-omyn=?O46u&L0ZM&rrX_axWpX-U(W5wvAjE#b(sqUmnCsoSUe>G7LG*!XXf*6V^F z$%$ik*3)d7;%YAw&b_+b)4TVjdJw7V(L{*!nxQN~2c5RZ)Me|%1u6UF8o|S-Wa>6U zOMP}8c=3YRQuyt|4a?!q--&%iSDvhVyzy<^*Q7_?(LxAu72G%cokf<+j}rk9hze76|$wiammVrm`<1B_;6Kk zA3a^+fi}CZYt{&3OD|}zdSP+`RK0gUi`?{&;ok*^z8%D8U-X3UezH3dq zLB)it>%?aRs_(I3oC$g~Z*%a=L`~nY;I4jg-kq(2DKT%$PQ5@6uH6(7XY$YZ1^1r= z|2pDum%$|SF9!Bvp@F!qelq!|rvbr9*D$dj8c`WfLzrz|^cnSOOk`Fcc$A0MNWy0i zo*9PbA_9FKMJ2at78$co>COt%7?@Te{m>aCv!Q_$4Cw{tO(OMT)qVW}ILf>>z~L11 z1#&scRV*(Y$dOGT(3CA<4Go|!V&ET?2#tWyZFuS%2m_mNdXS7T-D2xZ%~ius+rqDG z@DR~w(rs6LvGMU;6FtwluOJctn`y_qwXR^Cy*s2e^|!j$fO#ri0fh#(6PmPI?-0_m zoVP1Cru4ILh04c!WN7>UJ^Usc9?D{ayyJJX4v`zkxtrg(PN)x!wUHK?9VtFN9(ok+ zIrP?H=A|{39O;GNd+(>@Q+#IxkQ)XzTRMHCY4)WyTk6M{#@e^3@1??4r|$KzR^X3O zFl`7hzbL;9tBwO84=|MI$f**}yiRVLAIlQ~v1zDK0gmbFcw_>wMtV3$DGBf)NG8$G z7Y`}QFDh9;%cX1rtO*Q+QPt!jQ+P{wsIW826TE!gnE7CBy_J7R>Sb5~b^7@P^HO-e zs(tjMhTJ!zMUc7x6XS+xSkZ^m;V%52ppb{I*?1>C?%tb%;GR|)ul6=_$m-F?D=n^V zbeYCKLw|qcwEmGD*k(&SiPgDn)tlB|a=67)eb22LY$RF7p!#|3?19(oOW&!Gir>gh zmao(Bbk{!>#9$44$9|)~IE-BwUE1@4wf9*}MQ)FZp0l*wi5uS_>}M`#<(D+P_gCTa z{;(5(OPhm?bE_6mO~hvO`r$x;F#+Dq52v(HaoTXO22epmK|_X(Bbk1^WC5&UFxd|x z?s~pJvZeYlTw>D2ZdZ!_t_j*ub~VK{n-;%>eeYKO7NcrRg~=>3js5EGXW=})=-W*h zmkgmiXE>I>>WgzR|B=DnP>^quJV>`i3mMtmwxfm19&MCS2h)!Kv4x6l{7(mj>a)Y{ zd%D}!A1V`c^9X1p!4dAg!MCPcdSU1!<%nhV!a~=!*#5ZspCI3kda=20+9H|XOdDaC zwLN<59?#aSiNRsWURc$Lp7lXw*6oaLAKg~rFWyYCS__L<2r!baV0XFb1`uf^zZ3~7 zxIsEosP57SmIW&~Nsbf%jDK?)3WEghr!(IN!F8)yxyF@~>Ipvv5Yq?`5s=bq8!GRs#Nqoy`Yar~PVy5J?8fIt5eKt8)tZEzT&3c4k(7O* zmroa8a@!nWQ1_d2TGC*!ub(egWiDKL%$-xhpIIsaIJf|# z$W`nyq)*r|0ZMj09mrK$mlvK`XE7qtBsE58ut0*d7lVHk)(x|6U@k1(ksTzlMV1$i zkK_{%drt9{4{-%;&P=nyFdd77`?h)N6~*2-JBtb7XvFazf76^1(Udl@upW9a$v>>k zU)SpYc%D6M_N;HBAZKjV8fdI?aQG#o=`G$W-iP=w&@HXS0`?`lS;lDt80k*5y3l}a4(p#JwIkD_=wobTEI3w?s`J_` z6<8`QQ?XJREKL|Q7%2neK;}j$C6b-sBUTIcC6>nr)^F}WlE8oS9l)}cXu(YcZFm$m z6_eqOj72lsnj+ljd8HWIs0>mrdm}p~zT{3fvMny(WeL<~Kn_Sb5a$*2P>k>FQrA{HV_{ z-2M}^s&AbVFS32N;|{_@uflGSm#yev@-?yg5^IV98Peufk$q_aF917#K)j`_|76C7 za;XHRH}a8e*k+}AByqXGFhxKA+^em2zR#|DeVdHuY*GLl;;#YzNBWcQsD}m{oR#dI zq-483PKr65B{zj0wyHyn)NpFNc&n7wv8s_ZL6m1`6Ehz1q%R54W@}STD4_UCc`i17 zkcJFFC*w|ru)f0@=jl+9?jK!txX@VliM_P{32=7v-whHNhsfk(I2T?|d*VFpE2(xuMx0 z=0c7d8r-wl{?HnEcnDXL+LIHHeA5I2lN`QbFxbb)?!amwWLz&|d0^8;`?G7m4!pTU zYYNCyW)Uw-qgU3b2H)=KtFgLEUiAG;&~*tzbuIz>cRBgidsd$YouTzErs_D6uPMn<>9Z!TFSG*nO>Kr1%L1rtyU|g_DL_qIHlAtUA*m>T1$AmioLdS=7t~a+Cp#19(569=MlJl7goidILGC zl9&jjCR^qrpU<03@`u7}7+f?xWF_Ybo9a6o+a)&37UAAp(a$WfFLa%BTe25$^e=*lCTx8Tx z%}xPGsf)$1PfsZOxTdjfjzl00hrJ?^!3Z7@Isj-k=X{a@R?5WC4-dc%;8-KUq~uOa z!S#z=gAo7Y8D=Gmw;PWk_V=IE=r^!=-l>1dIjcv-XG7&Fy^b!%jT5M~A zCkM+YZ;XG0=d`o2p)vM$j6xrn9FBl*GC)xUtwJ1LOZ3sW7`{mq;0d|BQ&N&B-PB;| zZbLeJ$~zSooIRzh%gH*&qiOo-!7?tK7H=q!n+JfV3@F#D0t>!Gx|R9Eo??%Zq@*5O z9=hPakYW(5YcH$>%1{$_hvesKRNWrp(Lx5Et z+R~+ehJC|~X&VHOc~HNszw*@1v3zsMwHdy7auBRT4^|^Bjnz9d*=E1^MjR#vcTJ>O zxV=xwyQqrXxS3Kgk5-es`1vDe)&;+7Po#SABVUVe#n(t1Y9Q2D%Z1CtabBoy-DF|3 z)gQDD`0vR}E>B>UTBXzi^0I#8XsF_esJ00^3f&7UnC7TcNcf$|QC{dNp$V$<0S4|U z1)rptt&R8?O2oo7wuLy8q78ef$kXhLL2ys6llXbrR>)Rzy}xn|%25Ckb`T<++4(nL zQNtEm7dU@g9l9{Q=)(g8eqZ~}glli7YCw6NV!0v4$ucu^Ca|#AVtt*xwSB7V(e4H2 zeJ%D&XM&1|jVUwYuxGwY5)D{6DH>N3E1k|mOKq>!*gm|yz<6J(=Jo*PBn`(G11+1o zw_0qp|91N|P1sIzP$w5)ylYqM+;Jn{tC%FSpWi;#{$Y38V?OFpu}D01FaGMPw!3c% z7gb7|G1co=-?r)Q^`;{=Ba^}C>)XtL+Q9kxXdNqGHR^`PJ^kGVBwqMxWXDU5#H`2v}|eOSjj>u(GRQQ<#J&2Rzq9> z&PsXrqBk3n%_qtUeYHrBLqz*2tBdA&TdPpLvxM7tCB{KMln?5mXc%6oT^cBgkqyxR}1a?PG8o~2HtDZG{O z-%+Mu_10UpGjXrk?2(`+a1h*gUNG_r2^c6yU|{A&|b@{+OBlm}@b?wLXmosc(Ah$ymSFT*DKYq7q4W)F~y=CKs3&no zXLLQ`+!n2BldMD5?15eTw@UV3-lc94oiJ!S&v38cip}m1UY4gzXAjzcUqB=~dJ|tT z$K|D4Urj9Z83~wKpq7`Nc6U$mef6ogEPx4C-}w_%zT?}$pP>5M*DKJesa28CH@T5h z=E|XQ-%kO2(!DDiXF5d!;k5^qNFWHyGDDtfo@+iikLOi-=9FF?VY1D_X`SOW;NWh!(AYv2j)60vpro=;HH|Ym+Sf^Hs(df%+>{pYVxMcX5n+yhYx)!VBH~iHir3v zj90B*`Sk`b@pt$YyTDKOJ1u65zds$A`axwKDqPk7@)6ZiU+8*j@E&U2^^cu91@n!s zpW7u)j0=2n<5@aY&*rjwpnPLn=~eI-Sv%E{zxu8pwy~NRE0stY1-+@ad{nDrb767)1@R^{y1*XtZscyveajsD>g{r!{pmMSi(|MP=^qd)ZRN|Q)Ks~+Gis>U!2 z-^ufut_GN+MMDL~G{PoS=ao$r*%w!>(Z6KUDN58xMCc_JRc2qZ@xvYhQeM^0Lu*m{ zWvfWK&um@8M3lU*%QXew;O$x_|um zt!jxGOIMa9TxM0(MtDdsXtnd;-h&mi=28w-z->8dQUIixDELh-haES^54FMG`@>DR zt={95VR`#Fg`EqT7Pf_MkVKLd^ayrNHd8?Khp-5=NFd`VV9o^-8yE>ZRnR~N7XUn) zX~~vt7SrNlJ$Mdcu)So7IH(J^5ndcSJkoHjlcT239c5pp@(g-Zw`E~s*A7)F%aNfi ze%l|Y(2q4KkRbkc<0c?6xl4+x)^ZycKk?EyF zcC0Ep-@Kh+PP)<6rxTe(w(+jyz4pyw`OB~ru|Gg}rBQvyY9%4=DJ2U{gvjHq{5NZa z$KI#<{P0|2JT3nTI(63P-PUi1mi}nI^a1{Y-QeIQxNAka%#G30?Ob*Uwca88cj@U> z-37~*XLpsq`)2)n!dQ0Rh*Thy#rs?gi2=Nf$?cpkV~@KoOr2d6#t6&KIcfJp)y25t z?Rw3G@V1GR;jV<=YCo2(xiPS(B!9<4@BQUh4jgLHa_rYFvV6$_e+GUReuF1GROkYZ zI8!xptj~@^$HN z*2?A#L@P`rd!A$Yrp-GCJ^Oldj-%{G__mC#2I|U(hm+4@58?9dEVd?IGGX13Pjyb~ zcC6XFvH5Y&*HA>!;E(cxOA9W2&nY4Au7Qi$D&5{Y{P?@|<+9y_yDs0eN8*fljkU(= z*W1P#-S>cfnkEuIYOg7oB^sPJBfPdi9hWpC5>R+F3S)f>Ig# zy=(Jsj=O)bTW#F2Z2GK6ow?un%Q@@m+)Vj=-;de}cN4mIPdgTs7G~RK3NDw19^bV6 zhND4Z^<@7=w6)+3`t$X2wq5;EzP0yU$>*WkSz2>K)}qU@u7(%HHo?n1L-iYyYHogssa+BE#BSlr z7oBIlYF!UpJG=eT+RNOm=hz9432O}(*_OIH6K&+g^!}I6^-izvR|~Ggele*V3cX}M zp5&$d@)YRcg}d&ATkr0kvN@MO@f>P5OR>GyK{}{EA*!K7jQecfno&8twCL5xZpgjB zt8|mgdbx>L^70-v=X~~VD4!jBJkwj7>UZNpZTqC39?N3ER#aaZPF6wm7l$*PMp^A`RZNK|GHArbLNrG5zodK?rjuw_JZJb75n#_ zo8HB17VQuk)@bog!Wm153G8n=WM>e74yAG2`V@UexCl zy~w^JNl5SEz2>TyG^5vzZhw?f(0kf(Oted^K5&SUR@>cuJgFqzk6L^0P3KGvtTjYW zR}?SVBMwdIhFISmT4yBL<~nKhVPYw4(cRs3*n3Sv^UE0{w&$nfJ=6}5Qz{>E36+8E zxh7dBa5gczV;8?aTb4-a-;?{O%4OM_z`pTv@oLQ#>H5XH_ZP>S*k0rE;HQKt7iJgE z+VnPuh+~2P2RVW2=Kf$ret-T%R$m0T$Y1XIPpNOfCfMd4WryG89b%G4w;k8s=^mqO ziBvoMcqOeA$R_~3J=hm#X$zAE$13E>Tss^d zWk-Ty&8I{w`_En_aHe`7(>3P25ZZZX1qq-i{V9a`H2*#@QdR)S(gAtQ%QR+qPE|RKvQxOhz#XzHMh4Xe+@{ zz==D*Am#iht8y;`B=2@EsYWdjyOk&+w2Dhs$o7hglih)Kv}9PP-aKx5LTNX){|X1=E4ynPH*C2!1@wMm0QC#sSs%67&*-*`}0j7 z@VG!-ZW_Llkqjm?Zv~4k4SK2KA`MlZAOyaerc1Nn zm4{eJhUVHTSOe74sKK3}Mlx*YFC#=v1_c(}vV;LNP}+$~fCbQz*q@ONRshw` zLj^r{$ZRyxHe44Of9fq|$DR6DWqKEd;KEdtxHDGF3BP}#SOaj*2T@OJSP5~K^|kaz z?O*LHi=vrMR-Dzg`wr}We}SLWwrp_IaA(r>H!caRwj;uGxJ_N8i2NmvUtUO1_s@jJ z9*IirzRx?c&hgPjBn&Ep{HeF;5-Lf$;w?1UM zzqJ1#t+4pihVG@+tYiIZgDZj_@6p<`@AwIrR>??-Rnv#6-Fe5hA9c0$@hCNFNKM_n zVAIz!=u|az&8j@HtZR?)2JeF|)Y^dx^&}krTFn~mF8g`Ywe8~2@$mB+c5v+a3obe# z-J}aYP#5XUcl3NMYY7-wRDB1Be8!E}VxspjLLFUZqE z2OKliK7(;Q8RWtiBZj$@n`2ez)~=WGdYvw%a4p-LA!V0i>|SG+gz_};{4y*oBAQjT zOtpb)AXoQ6gX5J--j9>ze$g^&^Cl=z+Xm{|k?aj+jM9Pnjt|v$9`j6d*W=QzO2zbn zHAizh@}%{=GroZleP(%8J11q7bAKy4gSkrA1bVuOPBrLYm4&k7w`z9iU!~O%tDGiK zb*2j<$mtF(gof5UoMszpO7MI;lB=@JDcV08XV)Ek?EY9og)Y|G_P3i0XagHSFuQzK z`aO(IXi_&`-A_?pzE&mi57Rf=n&M%TJsoz5^bRm0ZUEzNZr^xTO-w)CU|s%B6LTJs*aC&1jSJFqSO4n zg!usm(aRGkXT~31#5SQ{PK|F_^Jb~uE7UqY<$*ijd|IbPQJZt$sbhNEw(c;-sSV3H zAYB7eqe0h$;WM5(>s2nX%^*9jpi+<;b8?tJYE_DQl|I&$VSi+oP{4u8D0eDEW_qb@ zb}CNvQ`OaCkS}G7ad8-WH}Cv?KGTEx+=ZGY57*i&(y?Lxn9?7p{c8D)-Gf=aIVM*+ zRvC@e?)nV(C}-ENCh+OU^e%+N!Qxl!rv~#H#R&7k%97h_1P|H%L>6{MY_}yWLM^7~ z6b`fo;N~?=3-3KSGIB|jt_YfHx{+72`Crf3%EAf%#b z%+cr0zA2H7%Ye=EA>kLf0DVsD>*2;Pq((hyL`1~J&TC(wMXsx!&+aH{hGm=UVnNl? zMm=@zO}DR$rbfiP?1t1O?i(1-ZA{DmzCNy~EtvcUy>01LPVQS z;?8t+fvpboir$5!3FGIFeD}v+_KA!n6c<4eoR&$#9tnsL6PSLcRJvq!3G3t?+X<_L1Au^N;>m7 zkj<;sRulYH9cLNGp;xU@E5;n*nXbLtYkz}=LcEfmL#o*MOMUASEMCn2@)I;&WBq%; zt|HRDTu{mh3LT%w8l;>aC5!R! zqi+|{7Fx%(jtRiG)DBaQn2I`zY8GyVYY^502T3XL!S0S};r$*}RTb|JHdDKl;!pQW z3cz5gY>|G`YJz}%tRA|#pQ$@iaWN1qe0&%mEkvr={HhoMLOi^xw0Ew4LVQXUKx7voHSBSAb9h!@E7 z7X>`)(|#po`IA^68jTw9fxeeBZ}Z5pFC;(DU7XFbBczxjCMvLr#y?U6vBtG~z)Kw& z*lny_3MvsS3>AYMr$i(zd<{9kz}#j)TEDC@Kl-IB643iXZ`!!^qtEPI_DrA82rI41 zF!boQPLo^EbqAT?AU;rLzR}{AdmTWh5MV6$$ND=0j6#})t7-<|KwEAv;#||KeT#VG z5{mc6VS7glMUBTs)*o9U<-@K8y=H?Bg}e@CC6!86l`Mpo>=G354H1zzIIJK-wOvz=T!kZ`@x z;1Vxp_QLShVoo}Yu$%8c5$~ZJ4_qg z=9pXOXeRkqa<$nVl_EO(5Hwfa0Q3cbzUSWz0t;Uh6g^2MV)gRZjvhiBQuP^rScA`! z?YEPbwW2O#0!**VJ?Rx-Cm#Axxj(cob+FdSgxb_h-C}IZHxJZdBJ#_OJ$y~Lb^->W zu9{s!0t0fPJ^%*H9TdgV1SX`W{obdGFOuaVddc|8EbQBvlp$r5)7 zReY8aRD{iRsgQL>0)?<(5FHr+bT25v7(oR<2bqh{$a(`Y=BP_F zPlv$xhHhDF1R$|_Mozbz?{8LyGeJart0_;p=Tgd+H%3%^s%hV#3c=5k4_WdW1Rl-k8sFS3wM7g%e(+K&3hlcJO_lM@QPuLZ~mmjt|)`4zq zF(w%EP`h~X1x#VDC_%~rgnVZZ5JH^uX+TZ|AWXo${*rBsoI%+I!I)&J&@VKIz_YQn zKB!%DTPg%T*GNl#^~C1qm&{kF5I`BH6+JURoizZY$E{>-TFj+oQ4aG=PYAO8f?F(< z^xh!_N&S^c>_Rm-)*o3*r`usQuZi|-`*1k)J*y_sL66(o1($j5@ywp6Y)ZOT$Lbt= zkSYRQ0+vF7>3{_O&!P19MfAUWeeNF7qVm)5z5UxeRtC)5;>vJNk%MEL_wVBKtaovs z!kZb@qQ@N}J_JzRcY5&0wN>ow1?bi*POyI7h60R4V7v;7sWI11+k1=QJ&$^5<|rX`G@ zOJaMWngk9fNu3OpuQKo!1|eI~w*{~k%Jy|3_4jB)2MV)IZj_7tl(q$Jzmek=I%ypc zuXj*i&i(7e|9%nvYZV!Ti1)4v8NyQXWJQYg&6LWpdfqLR)_VFbTmVM7dB)@>*Z_rb*O z;w#&;Y8^3&9&IF-V3nILk+^A3!wi5a>fD;5aoh|1%DhXCsJFp@q9Iq45zXaY(P z6%~97zeTB^mr?0Te>cN7ldl5$@D8yMd^^B@a8xSO{P2)mX`d!&1%1+A7?QRC){lPg zf1n_PoGU}^6B>){Qu-j$scP9asp9thBBt&`YpW+w_gc2=gok=*mNSY}%51;A`n~ev zwgmwr(LY|tlm4b>`kRFAKl(~>DD`GA#0fJ<4nm7Th3m_1@WL_|7dDe@tVs|hz!FGj zX`pk+scS)8m2ebnGQDzd*4;!3!^G}3oa5Y&HG zzrvlS4d@boZ$YKi+@8VN8Uy+Yg(#B`1`Y-ePw*y+IQE$%Brj-X_d(n=y3%2yU8cH;8&_{sfC>a$M zZ01318sUjP=zAfX#@N;DkY`d8pbdo1AY_rpnGFqtG>~S@`rTrO@ELPf5xDv%=lhQRy*jEmrNxryN>7Vha63p)^;KeH0!1Q${*)LNVfkEx3b2`|!q`YR!M*;o zpG1qMxl9q`LuxN2U_($dlKBO}waQhE2f&f%FjU<+K z3|f(0*52CL1(-xHitfh%&`Mf^B-~k^*Jf*s4*<-LENp0)cdOa>$~RQ|=^v8c3pEFV z8L74h-sf-x(W_npH1JOr5J zvjW(_cpxzFTU00L_20kjpBD6Gs@N@wtt|M%T2=uqY^+Tdu#7akECUw^De@ zEa90LQnz3>%bl`K3w_6q{g^hb#?55g+Sn*0Nv(=#1i}!W{Z^j69uxTD`+6(o#cE5G zUT!`LSJETAc zv(1qNO@8TX$lip049=+56MPD zJ%O@pGE|iHoo-@nBu_r@QnXC)%P|0lhR@U{^(fjV&=Yiy=PzxhjqSoT58j3b4L~XQ z1vl<7!b_utv=NuFFW8APN`NkjyC~iCAb$@a0N81+WYBpW@6^`W#8gIqNmaD%8=TKB z4(>B+chTe21BDtfEr1s>{i{gP_`mtDD3ID0kPE@dm;+DVQ;HfqEeXZ2n{WgSbf^r_ znnTEK_5gV_rP$nTX)Y{`WO{>=uf;H$6+wQ27+LQLN6il7LFDm6|A$*?#ekRwawmfmzzA0C-h{Cfw=f zHC2;LJJ@_6<0M3U^xJO>+AmG21p&RSX;YY%;5i-hze`O1`aa?I>F-+@`dz?h%Gx%d zOKO{xN8?x+A^~#*L1`+gB~TPGm{mYw=I^R~@m0=!XzlFrk&N|&hl%n^4XEd0!J3w; zbAoF=7-tD%(()M2g(<zj^@*TnPUy}udgqmSqX@A)fGFVt|BnLL1F#7X-5bbN*{4FSIj@DPf<^}Ejc_qE zvn1B}Sg?v)337y~Pj46#T;t3Y!1O^;lYy{4fS0kCULr91a)8j`J0nt>Ne^22NZ`!g zTzr&3V@y>C+bU2rpqd8Sv(p3yAIXb?S6dwcNlf^H>ORO?p$HAPG%?G45|U&Tu%YBV zCBQ;?1><4k_eYGA^3NIOu-1G)wNBPnX!mGmS3h+33PGtmlOid7fadE-s^*Rmt+HRC z>Q(0fBek4BCdNQg*Y-4PoKK>9!x&R<1=9ToCeXdwegUH#Q|ix$bh zRJhKAjsm_zD#*D4SPEacpbrNmT2Flm2oOfETH=FEhX8F90d|={{{wm+YO^5SzXfTR zBTBji-+sp0dH1b0JiOakr|1i1dqRj!hu*XZ(h2M*-vsz|x($kxr$d|kPUK3zv^c-` zPUMdt?D$NvI}HOu_g`_=KWSC?m5cDt6ijT}#nBia&pSc?7<`x)djx3Snad-AXo=t} zT_8bEoIzo??GnX1)pS!W4Ei9Jj@#vT<=*0oE`auMJ{1T9=^slL26$?M2nh6{f7bs{4Eh zd%0#?#tE^+HqBP9eQCSsWLp4otfpy%X?iz+F1Vf+E?Dgd7b@}(zDYNNTgfyGzBR}f zY=&tF0l01Ko+h4Xt#=>aShk}-`acOKf4xV0s`i#se#1RN_rd8?qGKgb6@(dzsR^VM zSOw2$3*ZLl6xlfo3?V9%Q7Y?!7r&+69H*p>)h#1{a)IuDMH-3V1Dp?lp;&V^k!!#> z@|`gYfD8_FawdKKhC<&1@8*(FU`G{a5oifw$2s=;d*JCnLHIDR1vcSItTaX^(BA;` zBh@x((Hg8A;p{+PGvxK;G-`0qmL*j4WjKwSht#ftF5s^Vau$ zZw|`YF~#4KH8fLz%8S=uC+hyM$O-->LNcZ~SoODt<9?QyfY>7eI0(S?A%R$4dDs`| zj#p*VaV8cR8nKj?vAQ7;eZtV7=Du$Q2RcU33DG)oIj9aGf7+!X{%Y%whrOeb?0$1^HqTA}6=F5!j<3Me)eTGny& zRN87Pf;E{fI%&{enrWuz!Ol0|b(-mX^PRuG>-zoxSzf%}_j&Kd_gr|ZPRn$FrKE{_TF*X*WEi4!)fgLQ|gp2{0ZSuBLB0u~PO zwB*Lq@_T&XB_7RO5})#}OO;C$By|>x;Hkl{llGcmZ^YLHLB|PROdzLWNe+7!+uCeJ zjDStSzZ^!^bRr)sw_*y$n2^NPiJA8#7JR{@=1@?#VDN}5>iwI58-pkdQ~NQ)jDnpR z4cP8Yvy`Bh?Q(WLU>B7X>*@gj^N(!eE3--FZDLjdTm^N>F^r)&dR3|_Ap)kwFJ7wE93(xuZTv zJrVIpN8bh0)))m^P$1wO=ba{$=HUFo zEAaZHpBm{K6Wrrn-K1CB136K^K&vl{s^p9qdwCYF(HIb z_@}m#Mr)vfz!u1Ql$@7x=)AEy0uAP(Jl}d-J4QYrf~XR&DsI8jQ{FKZ@Dv4kbibA9 z$yYa#O;_0`^HZCgqhMu7>!!O`+k9{<2sk*#&xD7)f@N!1vr`nftDhyW+gd+nm-FW! zH@%B8CL(L4Ame&12#W!{$3F-kUqLGB&bg1*2Zg?5L%L6h7xZJjWW;>$-f!uBK+6dA z@dA@KfQ@N_6+vjH)XTzo2>K}#(G~Jl1JdhgBe%QZ&HKratN09LC9?S8VbeL zBYIIHhk)bgXwiylK}v04Ch8LVkVE(gi@HbpBfZEtUvPn9nSkwBMMkm8%hV8u$GJ*7Z4y+I}04O87}Gb=k* zpeYTL{&*T$Qd{~G#aFXXR6iR8bL-*;R+i7UwGY{z3sDX3npe?%=|2D6dnCvx{hNVh zfM>$em6e$BD~bSH9D)egI)L}1;*)yn1Q$*RO2pCv`13I$|D>6q=z-ujy7IN_ZHD^xg-m8o^lJ2>Q-QZAp;qd^x$H@qp#V$eTpi#R~X-wZztOUV&^Nvmt14vPy9Z^^5TKbL;jE zvk0^o^jG~uld(?)QBU_6YKP7;HLggNrn0vh{1DW zQrvOIXNd4^b--&7diCIW4aLH=rDsvy)5^^hzy*^;Cg9=Z)vSkilH?T3e^?64C8w*je_) z{m#TR+Ob~;Se7j|zB)qLy(H^pY-)n6n)4Z`4#$;f0zD?si6{jdsRxE-`$ypgumn5x$x>om+F+#039c4je6gO$=2J z0eOUx9m?%p_1S26z?sO~2Y_FRdP+@fp9q)`M0kjS$?y4MVYI#mcBmj=JxJvB0k-5! z63<(%4P>vX?NI6I3W|bgs0>^Lwtt|EdL!BxEihX_nply!s=#0&-%j(&;h>8$+=~Ka zShOrnF@Ad-@)(am&R@0zjX;1G5RDOS7KIJcMA2Hhc0dpFyhU!*62`WtP#uBd7FE(g z2msO7RBwxg<4FzE6L8>R(_Asb1&AF_jsduN;#jnMB1++nS>s{~SQ}ddTokL{G-bCwgU+%*;EA#MvdI6R>J`=Z zpl4fZI@Lh95WJ&0U9@U%PC%VtxH1?P4o0YX!dOAn1YDL1h@A&Mz;)_!g~(n&CD zP)+p00#%K5F2frG-3TgGZnhKA*yHh;cv8iiU^53=y=fh6ut}jogZD^wmo-!ML0NQ6 zILf_EJqiW|_Bzz}8xg@=$v2%Q%gSA`eYkA@jO6s}%DN2EcjB!MpMIG}miije#|CQh zkR*W8s(KOs5{Wau27jnhXWi@HNX@+y+Z0Pd>Eg@+biu=X6}j_9G8IGTNTqNzRBypR zCJywat%uoq&J09Z0{MOf`<%&W!}(!GNp0*ky>AROF7ET5Cad;_A17QY4bSa09p)J< z5<+=4XVUKRXwR#Yg-CU``X$WX?#MCyg>BLBFjFwHP7|>dWa{vrDlHZVo$_{DnIcN4 zlJA%6-1ajqJ~k|JxZV&T1)A87R$3dSiTv02qsmU}WvUjH#YXD$6v6d6SR@Z2|BKSM z*A#PVQqQq)_Azf`UB#vY0UX=5?Ws}IW6lo;TAtbbCs?UkfcLG8cEGhWe;_(~(nR53 zcbugJZPQu+hO;CpE093oERq`#$Te=X$j#I|RYl{~wyBxAX9hDwnN74C6-jY*W@Fzf|;aJe;#dZU6oWTUM2fG1VB9aM75o);U`QVP48H8LQ-&sN4gzIwiJfYUM zt8or;p<|l-x`lZEHVcDifDTipJv5)BDD)8n@lGdji>}eygNUBgqZ>N{HF*)* znDI=|u>=W}yRUkLUl&ydhomU{BK*w_bR4ks0;0=(tkt^e1AV>PiKpLrrWcMDl3ljIi%sRyVX|AJmCQi&qC=qjTZ({Ep3XiW$SR#lt(TsS0|AIF zJp*!D(sc0tXwZZGUGM3umOrK@R&cA-mvKa?U)n! zu7cR=^S+o z5+Z_>O={8n&h_X;Hz>&(MhM6~j4ZoMM};H3@xwl;e?&B{8qwsgK%TW00nL+Pp?}@h z$pm7cDH@O<06-WtP;fPhS?@61w3sxCfcn?xi@(*fb&6nz`D3DCl}z-xtH!6t&z=*7a(H+{1!q|GgjR{5!8fnr|KFl3~)T2~Y znAn52LhMlI0lGY(ECr%h(a{f3Lj(NknbfP}jpgmTLF2FS@Sj57sek-E}cXzffr`$xtfQg)wVM21vO^7XFslO|h7P0Q@Hmm{ zb>R^LZlUOG#HuEMFdm>nDZb&26vj`VXpOZ`y0@R*-<2+beh15iVFp%V|ChHGnXtAtV~wyy8g+Q*e57DP-2$t^hgQ2KKpuA4*kq= zi(|HNUg7($CCxnBGMW{z&czXOPG_CNi{R5CgopP$c$=7oNj~l!;py~V%{(*0Z12(W zZ7#2uy8i5c-Tc#ADkFuI6EZyE(hA;WT;hj5)p~H>S(I_9z)-}y3adDm+&#IMay%;E z_&)f@{C9DW5Hy86`CaT;*{nwngIkH|5?MU~DzOrJ zT8i*+pY_ysR2L6kx{j7pW%1XOi#D%GPb#x~whBeLD5^`#Wh@ ze>|hx7#IJd`U$?Hz1xiZaj*L;O%xeh{awq;yEB;k3sSHrZ9`uSv_C`~dVlBRa1JA` zsNqw~;K$*DU7@I{X!QAI7`*HI@&qt8((s*7qqBYT&b#^pYx%Z@)eEC`->z7bcfoo_ z0rh_MlH9i5ua`Be5E?keYLbYg5BM^DbSq~!({(>osCU`SUkoSFc}|9r4)kac^DWljG`3EIxv zrU#tmbLElQ5XNk}16dGc98VR6KDy8#fTm7RbE%8 zugyUWM$fL_5TQ#tq&?A;U7J!{oP4e3NSmQrNz8Z`BI-5&(5&m*EM=O@^n`GIzFNhV zs| zxpBaswBK2N(ynl0g0Zd(1sBzs6u&&~5_^F8*XyOXw!8ktp4M&cWqetPqC6d+7^M9? zRbzw5owS_fWL(xP7^)s-y3RqM;tST8`;q2@OJ{!op5sThdum(liPX^STtQ&qJ1#r2B3`Y|zr>=I3{5V))N)Nrj2jquHCY(&7~gTrF{>fN zP(hAr&8juk_Y!aJw+bzQf3hf7Xw8PSkD|{T$N#(n<-U{dVBDx7t?OCW{I{HD*t9NC z1^)+W8lnpy-%MZqpc)SezsU``HduONMtjbqfgtZoj(y!Ee=NFrJIL(hAqW>4!osT+jRSzLt3_Bj0cr?h&8v0L-_A= z3I`u~M0gmPpe{AEI zGvq8evWRZE{F|Tw?2NE|k7N!~rMxRrQfBpc9iT+pcQFQ>+S`YAC he~(E5-sA6%|92qe|Ap^<6RQ8275aaEjN05U{{T#iF;D;i literal 0 HcmV?d00001 diff --git a/testing/getting-started.html b/testing/getting-started.html index b0f2de68..c6d39d9f 100644 --- a/testing/getting-started.html +++ b/testing/getting-started.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Getting Started | Goravel - - + +
    - + diff --git a/testing/http-tests.html b/testing/http-tests.html index 7142773a..26cbfbff 100644 --- a/testing/http-tests.html +++ b/testing/http-tests.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');HTTP Tests | Goravel - - + +
    - + diff --git a/testing/index.html b/testing/index.html index 9c242fc8..0bdba533 100644 --- a/testing/index.html +++ b/testing/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Testing | Goravel - - + + - + diff --git a/testing/mock.html b/testing/mock.html index 7149dd22..bff4950e 100644 --- a/testing/mock.html +++ b/testing/mock.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Mock | Goravel - - + + - + diff --git a/the-basics/controllers.html b/the-basics/controllers.html index 02c0e93b..d7355ce5 100644 --- a/the-basics/controllers.html +++ b/the-basics/controllers.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Controllers | Goravel - - + +
    - + diff --git a/the-basics/grpc.html b/the-basics/grpc.html index b79c11b1..9326a720 100644 --- a/the-basics/grpc.html +++ b/the-basics/grpc.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Grpc | Goravel - - + + - + diff --git a/the-basics/index.html b/the-basics/index.html index f763dde2..9e9977c3 100644 --- a/the-basics/index.html +++ b/the-basics/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');The Basics | Goravel - - + + - + diff --git a/the-basics/logging.html b/the-basics/logging.html index 9ba670d1..a82547a9 100644 --- a/the-basics/logging.html +++ b/the-basics/logging.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Logging | Goravel - - + +
    - + diff --git a/the-basics/middleware.html b/the-basics/middleware.html index 5bcc828e..0a80d715 100644 --- a/the-basics/middleware.html +++ b/the-basics/middleware.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Middleware | Goravel - - + + - + diff --git a/the-basics/request.html b/the-basics/request.html index 3896c34c..066f0e4e 100644 --- a/the-basics/request.html +++ b/the-basics/request.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');HTTP Requests | Goravel - - + +
    - + diff --git a/the-basics/response.html b/the-basics/response.html index 8bd3df39..429ccfca 100644 --- a/the-basics/response.html +++ b/the-basics/response.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');HTTP Response | Goravel - - + +
    - + diff --git a/the-basics/routing.html b/the-basics/routing.html index 4bb66708..658bb397 100644 --- a/the-basics/routing.html +++ b/the-basics/routing.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Routing | Goravel - - + +
    - + diff --git a/the-basics/session.html b/the-basics/session.html index 73d9d3dd..9d899053 100644 --- a/the-basics/session.html +++ b/the-basics/session.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Session | Goravel - - + +
    - + diff --git a/the-basics/validation.html b/the-basics/validation.html index 44f1f83f..a1726cd0 100644 --- a/the-basics/validation.html +++ b/the-basics/validation.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Validation | Goravel - - + +
    - + diff --git a/the-basics/views.html b/the-basics/views.html index 10bcb748..2f99fc4d 100644 --- a/the-basics/views.html +++ b/the-basics/views.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Views | Goravel - - + +
    - + diff --git a/upgrade/history.html b/upgrade/history.html index 8af484b8..f5e941ed 100644 --- a/upgrade/history.html +++ b/upgrade/history.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');History Upgrade | Goravel - - + + - + diff --git a/upgrade/v1.1.html b/upgrade/v1.1.html index 590c3bc4..053cf122 100644 --- a/upgrade/v1.1.html +++ b/upgrade/v1.1.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.1 From v1.0 | Goravel - - + +
    - + diff --git a/upgrade/v1.10.html b/upgrade/v1.10.html index 5397c40a..ccfd5223 100644 --- a/upgrade/v1.10.html +++ b/upgrade/v1.10.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.10 From v1.9 | Goravel - - + +
    - + diff --git a/upgrade/v1.11.html b/upgrade/v1.11.html index 728f7c9f..d3737210 100644 --- a/upgrade/v1.11.html +++ b/upgrade/v1.11.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.11 From v1.10 | Goravel - - + +
    - + diff --git a/upgrade/v1.12.html b/upgrade/v1.12.html index f5a9e260..448465c5 100644 --- a/upgrade/v1.12.html +++ b/upgrade/v1.12.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.12 From v1.11 | Goravel - - + +
    - + diff --git a/upgrade/v1.13.html b/upgrade/v1.13.html index 8ffe85a9..bc9ae06f 100644 --- a/upgrade/v1.13.html +++ b/upgrade/v1.13.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.13 From v1.12 | Goravel - - + +
    - + diff --git a/upgrade/v1.14.html b/upgrade/v1.14.html index 1e905186..07d3a34c 100644 --- a/upgrade/v1.14.html +++ b/upgrade/v1.14.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.14 From v1.13 | Goravel - - + +
    - + diff --git a/upgrade/v1.15.html b/upgrade/v1.15.html index 658ef96c..d2d15d29 100644 --- a/upgrade/v1.15.html +++ b/upgrade/v1.15.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.15 From v1.14 | Goravel - - + +
    - + diff --git a/upgrade/v1.2.html b/upgrade/v1.2.html index 2054dc8f..76cd02b5 100644 --- a/upgrade/v1.2.html +++ b/upgrade/v1.2.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.2 From v1.1 | Goravel - - + + - + diff --git a/upgrade/v1.3.html b/upgrade/v1.3.html index a00acca0..ca4dd0d5 100644 --- a/upgrade/v1.3.html +++ b/upgrade/v1.3.html @@ -36,12 +36,12 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.3 From v1.2 | Goravel - - + + - + diff --git a/upgrade/v1.4.html b/upgrade/v1.4.html index df6a6f14..86609cc6 100644 --- a/upgrade/v1.4.html +++ b/upgrade/v1.4.html @@ -36,12 +36,12 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.4 From v1.3 | Goravel - - + +
    - + diff --git a/upgrade/v1.5.html b/upgrade/v1.5.html index 5b548e15..9e3f55fb 100644 --- a/upgrade/v1.5.html +++ b/upgrade/v1.5.html @@ -36,12 +36,12 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.5 From v1.4 | Goravel - - + + - + diff --git a/upgrade/v1.6.html b/upgrade/v1.6.html index 093483a4..df49bb2c 100644 --- a/upgrade/v1.6.html +++ b/upgrade/v1.6.html @@ -36,12 +36,12 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.6 From v1.5 | Goravel - - + + - + diff --git a/upgrade/v1.7.html b/upgrade/v1.7.html index 1448c4b4..226d98ba 100644 --- a/upgrade/v1.7.html +++ b/upgrade/v1.7.html @@ -36,12 +36,12 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.7 From v1.6 | Goravel - - + +
    - + diff --git a/upgrade/v1.8.html b/upgrade/v1.8.html index b610982f..d1c1a6bc 100644 --- a/upgrade/v1.8.html +++ b/upgrade/v1.8.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.8 From v1.7 | Goravel - - + +
    - + diff --git a/upgrade/v1.9.html b/upgrade/v1.9.html index 3960e530..1d82b65b 100644 --- a/upgrade/v1.9.html +++ b/upgrade/v1.9.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Upgrading To v1.9 From v1.8 | Goravel - - + +
    - + diff --git a/zh/architecutre-concepts/facades.html b/zh/architecutre-concepts/facades.html index afb381fb..b52e6aaa 100644 --- a/zh/architecutre-concepts/facades.html +++ b/zh/architecutre-concepts/facades.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Facades | Goravel - - + +
    - + diff --git a/zh/architecutre-concepts/index.html b/zh/architecutre-concepts/index.html index d2d1db0d..15c1a90e 100644 --- a/zh/architecutre-concepts/index.html +++ b/zh/architecutre-concepts/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');核心架构 | Goravel - - + + - + diff --git a/zh/architecutre-concepts/request-lifecycle.html b/zh/architecutre-concepts/request-lifecycle.html index 6e332c27..4072bb01 100644 --- a/zh/architecutre-concepts/request-lifecycle.html +++ b/zh/architecutre-concepts/request-lifecycle.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');请求周期 | Goravel - - + +
    - + diff --git a/zh/architecutre-concepts/service-container.html b/zh/architecutre-concepts/service-container.html index 2753d542..c48a3249 100644 --- a/zh/architecutre-concepts/service-container.html +++ b/zh/architecutre-concepts/service-container.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');服务容器 | Goravel - - + +
    - + diff --git a/zh/architecutre-concepts/service-providers.html b/zh/architecutre-concepts/service-providers.html index 36e3d26f..2bbda549 100644 --- a/zh/architecutre-concepts/service-providers.html +++ b/zh/architecutre-concepts/service-providers.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');服务提供者 | Goravel - - + +
    - + diff --git a/zh/digging-deeper/artisan-console.html b/zh/digging-deeper/artisan-console.html index 56641dae..064e527e 100644 --- a/zh/digging-deeper/artisan-console.html +++ b/zh/digging-deeper/artisan-console.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Artisan 命令行 | Goravel - - + +
    - + diff --git a/zh/digging-deeper/cache.html b/zh/digging-deeper/cache.html index a01bb265..f6cfd629 100644 --- a/zh/digging-deeper/cache.html +++ b/zh/digging-deeper/cache.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');缓存系统 | Goravel - - + +
    - + diff --git a/zh/digging-deeper/color.html b/zh/digging-deeper/color.html index d4815760..787aaeec 100644 --- a/zh/digging-deeper/color.html +++ b/zh/digging-deeper/color.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Color | Goravel - - + +
    - + diff --git a/zh/digging-deeper/event.html b/zh/digging-deeper/event.html index 9cd25f7b..85f53e89 100644 --- a/zh/digging-deeper/event.html +++ b/zh/digging-deeper/event.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');事件系统 | Goravel - - + +
    - + diff --git a/zh/digging-deeper/filesystem.html b/zh/digging-deeper/filesystem.html index 92db58e2..4fce764a 100644 --- a/zh/digging-deeper/filesystem.html +++ b/zh/digging-deeper/filesystem.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');文件存储 | Goravel - - + +
    - + diff --git a/zh/digging-deeper/helpers.html b/zh/digging-deeper/helpers.html index 0c011e04..e369dde0 100644 --- a/zh/digging-deeper/helpers.html +++ b/zh/digging-deeper/helpers.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');辅助函数 | Goravel - - + +
    - + diff --git a/zh/digging-deeper/index.html b/zh/digging-deeper/index.html index 77cfe077..7a6e581c 100644 --- a/zh/digging-deeper/index.html +++ b/zh/digging-deeper/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');综合话题 | Goravel - - + + - + diff --git a/zh/digging-deeper/localization.html b/zh/digging-deeper/localization.html index 9aa157d3..05537745 100644 --- a/zh/digging-deeper/localization.html +++ b/zh/digging-deeper/localization.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');本地化 | Goravel - - + + - + diff --git a/zh/digging-deeper/mail.html b/zh/digging-deeper/mail.html index 951c6696..048ab17a 100644 --- a/zh/digging-deeper/mail.html +++ b/zh/digging-deeper/mail.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');发送邮件 | Goravel - - + +
    - + diff --git a/zh/digging-deeper/package-development.html b/zh/digging-deeper/package-development.html index 3901d9ae..f7082285 100644 --- a/zh/digging-deeper/package-development.html +++ b/zh/digging-deeper/package-development.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');扩展包开发 | Goravel - - + +
    - + diff --git a/zh/digging-deeper/queues.html b/zh/digging-deeper/queues.html index fbb65310..2d48699c 100644 --- a/zh/digging-deeper/queues.html +++ b/zh/digging-deeper/queues.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');队列 | Goravel - - + +
    - + diff --git a/zh/digging-deeper/strings.html b/zh/digging-deeper/strings.html index 71175bf1..7d167e92 100644 --- a/zh/digging-deeper/strings.html +++ b/zh/digging-deeper/strings.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Strings | Goravel - - + +
    - + diff --git a/zh/digging-deeper/task-scheduling.html b/zh/digging-deeper/task-scheduling.html index cf712d65..a9f499f7 100644 --- a/zh/digging-deeper/task-scheduling.html +++ b/zh/digging-deeper/task-scheduling.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');任务调度 | Goravel - - + +
    - + diff --git a/zh/getting-started/compile.html b/zh/getting-started/compile.html index 879e1723..f92ec385 100644 --- a/zh/getting-started/compile.html +++ b/zh/getting-started/compile.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');编译 | Goravel - - + + - + diff --git a/zh/getting-started/configuration.html b/zh/getting-started/configuration.html index c0b95da9..54d3fe14 100644 --- a/zh/getting-started/configuration.html +++ b/zh/getting-started/configuration.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');配置信息 | Goravel - - + +
    - + diff --git a/zh/getting-started/directory-structure.html b/zh/getting-started/directory-structure.html index 10280d5f..6258bb48 100644 --- a/zh/getting-started/directory-structure.html +++ b/zh/getting-started/directory-structure.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');文件夹结构 | Goravel - - + +
    - + diff --git a/zh/getting-started/index.html b/zh/getting-started/index.html index 68802229..cdaa5a0b 100644 --- a/zh/getting-started/index.html +++ b/zh/getting-started/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');入门指南 | Goravel - - + + - + diff --git a/zh/getting-started/installation.html b/zh/getting-started/installation.html index 88b92372..42112164 100644 --- a/zh/getting-started/installation.html +++ b/zh/getting-started/installation.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');安装 | Goravel - - + +
    - + diff --git a/zh/index.html b/zh/index.html index 10d3b7aa..62bf1468 100644 --- a/zh/index.html +++ b/zh/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');关于 Goravel | Goravel - - + + -
    - +
    + diff --git a/zh/orm/factories.html b/zh/orm/factories.html index 930bb518..f15169ef 100644 --- a/zh/orm/factories.html +++ b/zh/orm/factories.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');模型工厂 | Goravel - - + +
    - + diff --git a/zh/orm/getting-started.html b/zh/orm/getting-started.html index 42bb6e55..9554af0a 100644 --- a/zh/orm/getting-started.html +++ b/zh/orm/getting-started.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');快速入门 | Goravel - - + +
    - + diff --git a/zh/orm/index.html b/zh/orm/index.html index ac8964c1..332f2f2f 100644 --- a/zh/orm/index.html +++ b/zh/orm/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');ORM | Goravel - - + + - + diff --git a/zh/orm/migrations.html b/zh/orm/migrations.html index bc62fa84..0965d89c 100644 --- a/zh/orm/migrations.html +++ b/zh/orm/migrations.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');数据库迁移 | Goravel - - + +
    - + diff --git a/zh/orm/relationships.html b/zh/orm/relationships.html index 388f4eb6..cc1cfc3a 100644 --- a/zh/orm/relationships.html +++ b/zh/orm/relationships.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');模型关联 | Goravel - - + +
    - + diff --git a/zh/orm/seeding.html b/zh/orm/seeding.html index b6ee394b..cb2ce642 100644 --- a/zh/orm/seeding.html +++ b/zh/orm/seeding.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');数据填充 | Goravel - - + +
    - + diff --git a/zh/prologue/contributions.html b/zh/prologue/contributions.html index 2543b0bf..d473b530 100644 --- a/zh/prologue/contributions.html +++ b/zh/prologue/contributions.html @@ -31,16 +31,16 @@ document.documentElement.dataset.theme = 'dark' } - 贡献指南 | Goravel +gtag('config', 'G-HJQNEG5H69');贡献指南 | Goravel - - + + -
    - +
    + diff --git a/zh/prologue/packages.html b/zh/prologue/packages.html index 854d026f..792a0da4 100644 --- a/zh/prologue/packages.html +++ b/zh/prologue/packages.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');优秀扩展包 | Goravel - - + +
    - + diff --git a/zh/security/authentication.html b/zh/security/authentication.html index 21728173..19167007 100644 --- a/zh/security/authentication.html +++ b/zh/security/authentication.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');用户认证 | Goravel - - + +
    - + diff --git a/zh/security/authorization.html b/zh/security/authorization.html index af0a73dd..769bc7a3 100644 --- a/zh/security/authorization.html +++ b/zh/security/authorization.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');用户授权 | Goravel - - + +
    - + diff --git a/zh/security/encryption.html b/zh/security/encryption.html index 3fc75eb6..6fb6fd7d 100644 --- a/zh/security/encryption.html +++ b/zh/security/encryption.html @@ -36,13 +36,13 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');加密解密 | Goravel - - + +
    - + diff --git a/zh/security/hashing.html b/zh/security/hashing.html index f14463fd..8e4f494e 100644 --- a/zh/security/hashing.html +++ b/zh/security/hashing.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');哈希 | Goravel - - + +
    - + diff --git a/zh/testing/getting-started.html b/zh/testing/getting-started.html index 59c949ba..5fc46580 100644 --- a/zh/testing/getting-started.html +++ b/zh/testing/getting-started.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');快速入门 | Goravel - - + +
    - + diff --git a/zh/testing/http-tests.html b/zh/testing/http-tests.html index a6417270..a1dceaae 100644 --- a/zh/testing/http-tests.html +++ b/zh/testing/http-tests.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');HTTP Tests | Goravel - - + +
    - + diff --git a/zh/testing/index.html b/zh/testing/index.html index b9f6b3cd..b045c756 100644 --- a/zh/testing/index.html +++ b/zh/testing/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');测试相关 | Goravel - - + + - + diff --git a/zh/testing/mock.html b/zh/testing/mock.html index 4253fc8a..16651e77 100644 --- a/zh/testing/mock.html +++ b/zh/testing/mock.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Mock | Goravel - - + + - + diff --git a/zh/the-basics/controllers.html b/zh/the-basics/controllers.html index 8da6fa4e..4356cca4 100644 --- a/zh/the-basics/controllers.html +++ b/zh/the-basics/controllers.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');控制器 | Goravel - - + +
    - + diff --git a/zh/the-basics/grpc.html b/zh/the-basics/grpc.html index 4efe5635..4db826f1 100644 --- a/zh/the-basics/grpc.html +++ b/zh/the-basics/grpc.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Grpc | Goravel - - + + - + diff --git a/zh/the-basics/index.html b/zh/the-basics/index.html index 9aa24320..6971646d 100644 --- a/zh/the-basics/index.html +++ b/zh/the-basics/index.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');基本功能 | Goravel - - + + - + diff --git a/zh/the-basics/logging.html b/zh/the-basics/logging.html index d5aec524..71851cb4 100644 --- a/zh/the-basics/logging.html +++ b/zh/the-basics/logging.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');日志 | Goravel - - + +
    - + diff --git a/zh/the-basics/middleware.html b/zh/the-basics/middleware.html index eaecb1d7..4d27c8c4 100644 --- a/zh/the-basics/middleware.html +++ b/zh/the-basics/middleware.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');HTTP 中间件 | Goravel - - + + - + diff --git a/zh/the-basics/request.html b/zh/the-basics/request.html index 53cf5a67..7f98d403 100644 --- a/zh/the-basics/request.html +++ b/zh/the-basics/request.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');请求 | Goravel - - + +
    - + diff --git a/zh/the-basics/response.html b/zh/the-basics/response.html index 181eb72f..46916735 100644 --- a/zh/the-basics/response.html +++ b/zh/the-basics/response.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');响应 | Goravel - - + +
    - + diff --git a/zh/the-basics/routing.html b/zh/the-basics/routing.html index 6a506d72..bfc2864b 100644 --- a/zh/the-basics/routing.html +++ b/zh/the-basics/routing.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');路由 | Goravel - - + +
    - + diff --git a/zh/the-basics/session.html b/zh/the-basics/session.html index 363634c1..feb208ce 100644 --- a/zh/the-basics/session.html +++ b/zh/the-basics/session.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');Session | Goravel - - + +
    - + diff --git a/zh/the-basics/validation.html b/zh/the-basics/validation.html index d776a10d..375ccfd3 100644 --- a/zh/the-basics/validation.html +++ b/zh/the-basics/validation.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');表单验证 | Goravel - - + +
    - + diff --git a/zh/the-basics/views.html b/zh/the-basics/views.html index 7e2fc0a1..d51746cb 100644 --- a/zh/the-basics/views.html +++ b/zh/the-basics/views.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');视图 | Goravel - - + +
    - + diff --git a/zh/upgrade/history.html b/zh/upgrade/history.html index 016edfda..c05ea9ea 100644 --- a/zh/upgrade/history.html +++ b/zh/upgrade/history.html @@ -36,11 +36,11 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');历史版本升级 | Goravel - - + + - + diff --git a/zh/upgrade/v1.1.html b/zh/upgrade/v1.1.html index 68ee73a8..df7729da 100644 --- a/zh/upgrade/v1.1.html +++ b/zh/upgrade/v1.1.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.0 升级到 v1.1 | Goravel - - + +
    - + diff --git a/zh/upgrade/v1.10.html b/zh/upgrade/v1.10.html index f69487fc..636fcba4 100644 --- a/zh/upgrade/v1.10.html +++ b/zh/upgrade/v1.10.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.9 升级到 v1.10 | Goravel - - + +
    - + diff --git a/zh/upgrade/v1.11.html b/zh/upgrade/v1.11.html index f15b2521..9232bd33 100644 --- a/zh/upgrade/v1.11.html +++ b/zh/upgrade/v1.11.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.10 升级到 v1.11 | Goravel - - + +
    - + diff --git a/zh/upgrade/v1.12.html b/zh/upgrade/v1.12.html index 24e0a995..d8636815 100644 --- a/zh/upgrade/v1.12.html +++ b/zh/upgrade/v1.12.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.11 升级到 v1.12 | Goravel - - + +
    - + diff --git a/zh/upgrade/v1.13.html b/zh/upgrade/v1.13.html index 54ed3ce4..1a227046 100644 --- a/zh/upgrade/v1.13.html +++ b/zh/upgrade/v1.13.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.12 升级到 v1.13 | Goravel - - + +
    - + diff --git a/zh/upgrade/v1.14.html b/zh/upgrade/v1.14.html index 9951ef03..84d7381c 100644 --- a/zh/upgrade/v1.14.html +++ b/zh/upgrade/v1.14.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.13 升级到 v1.14 | Goravel - - + +
    - + diff --git a/zh/upgrade/v1.15.html b/zh/upgrade/v1.15.html index 59412a78..886a1145 100644 --- a/zh/upgrade/v1.15.html +++ b/zh/upgrade/v1.15.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.14 升级到 v1.15 | Goravel - - + +
    - + diff --git a/zh/upgrade/v1.2.html b/zh/upgrade/v1.2.html index 356711ee..0525bb1b 100644 --- a/zh/upgrade/v1.2.html +++ b/zh/upgrade/v1.2.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.1 升级到 v1.2 | Goravel - - + + - + diff --git a/zh/upgrade/v1.3.html b/zh/upgrade/v1.3.html index 8d2d66b1..270a80a2 100644 --- a/zh/upgrade/v1.3.html +++ b/zh/upgrade/v1.3.html @@ -36,12 +36,12 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.2 升级到 v1.3 | Goravel - - + + - + diff --git a/zh/upgrade/v1.4.html b/zh/upgrade/v1.4.html index 5dcdd2a5..bbe6f602 100644 --- a/zh/upgrade/v1.4.html +++ b/zh/upgrade/v1.4.html @@ -36,12 +36,12 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.3 升级到 v1.4 | Goravel - - + +
    - + diff --git a/zh/upgrade/v1.5.html b/zh/upgrade/v1.5.html index 9b9b049a..2caf3688 100644 --- a/zh/upgrade/v1.5.html +++ b/zh/upgrade/v1.5.html @@ -36,12 +36,12 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.4 升级到 v1.5 | Goravel - - + + - + diff --git a/zh/upgrade/v1.6.html b/zh/upgrade/v1.6.html index 98f63b9a..b2c0c4a1 100644 --- a/zh/upgrade/v1.6.html +++ b/zh/upgrade/v1.6.html @@ -36,12 +36,12 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.5 升级到 v1.6 | Goravel - - + + - + diff --git a/zh/upgrade/v1.7.html b/zh/upgrade/v1.7.html index b4c815d0..0ee7491a 100644 --- a/zh/upgrade/v1.7.html +++ b/zh/upgrade/v1.7.html @@ -36,12 +36,12 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.6 升级到 v1.7 | Goravel - - + +
    - + diff --git a/zh/upgrade/v1.8.html b/zh/upgrade/v1.8.html index d3fb9ba6..979e4cf0 100644 --- a/zh/upgrade/v1.8.html +++ b/zh/upgrade/v1.8.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.7 升级到 v1.8 | Goravel - - + +
    - + diff --git a/zh/upgrade/v1.9.html b/zh/upgrade/v1.9.html index 0e68a066..092d0541 100644 --- a/zh/upgrade/v1.9.html +++ b/zh/upgrade/v1.9.html @@ -36,8 +36,8 @@ gtag('js', new Date()); gtag('config', 'G-HJQNEG5H69');从 v1.8 升级到 v1.9 | Goravel - - + +
    - +