[{"data":1,"prerenderedAt":1958},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-getting-started-coming-from-symfony":442,"-hu-getting-started-coming-from-symfony-surround":1953},[4,45,60,81,112,129,146,173,197,213,242,280,357,373,385,404,430],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fhu\u002Fqueue","hu\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Áttekintés","\u002Fhu\u002Fqueue\u002Foverview","hu\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"A kit","i-lucide-box","\u002Fhu\u002Fkit","hu\u002F3.kit",[248,252,257,262,267,271,276],{"title":249,"path":250,"stem":251,"icon":244},"A kit áttekintése","\u002Fhu\u002Fkit\u002Foverview","hu\u002F3.kit\u002F1.overview",{"title":253,"path":254,"stem":255,"icon":256},"Alkalmazás-életciklus","\u002Fhu\u002Fkit\u002Fapp","hu\u002F3.kit\u002F2.app","i-lucide-power",{"title":258,"path":259,"stem":260,"icon":261},"Szerver","\u002Fhu\u002Fkit\u002Fserver","hu\u002F3.kit\u002F3.server","i-lucide-server",{"title":263,"path":264,"stem":265,"icon":266},"Worker","\u002Fhu\u002Fkit\u002Fworker","hu\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":268,"path":269,"stem":270,"icon":70},"Realtime","\u002Fhu\u002Fkit\u002Frealtime","hu\u002F3.kit\u002F5.realtime",{"title":272,"path":273,"stem":274,"icon":275},"Migrációk","\u002Fhu\u002Fkit\u002Fmigrations","hu\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":277,"path":278,"stem":279,"icon":111},"Social login","\u002Fhu\u002Fkit\u002Fsocial-login","hu\u002F3.kit\u002F7.social-login",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F4.cli",[286,289,294,299,304,309,314,319,324,329,334,338,343,348,352],{"title":52,"path":287,"stem":288,"icon":282},"\u002Fhu\u002Fcli\u002Foverview","hu\u002F4.cli\u002F1.overview",{"title":290,"path":291,"stem":292,"icon":293},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":295,"path":296,"stem":297,"icon":298},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":300,"path":301,"stem":302,"icon":303},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":305,"path":306,"stem":307,"icon":308},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":310,"path":311,"stem":312,"icon":313},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":315,"path":316,"stem":317,"icon":318},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":320,"path":321,"stem":322,"icon":323},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":325,"path":326,"stem":327,"icon":328},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":330,"path":331,"stem":332,"icon":333},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":335,"path":336,"stem":337,"icon":244},"add core","\u002Fhu\u002Fcli\u002Fadd-core","hu\u002F4.cli\u002F5.add-core",{"title":339,"path":340,"stem":341,"icon":342},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":344,"path":345,"stem":346,"icon":347},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":349,"path":350,"stem":351,"icon":266},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F4.cli\u002F8.worker-generators",{"title":353,"path":354,"stem":355,"icon":356},"upgrade templates","\u002Fhu\u002Fcli\u002Fupgrade-templates","hu\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":358,"icon":227,"path":359,"stem":360,"children":361,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F5.errs",[362,365,369],{"title":52,"path":363,"stem":364,"icon":227},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F5.errs\u002F1.overview",{"title":366,"path":367,"stem":368},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F5.errs\u002F2.api",{"title":370,"path":371,"stem":372,"icon":227},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F5.errs\u002F3.integration",{"title":374,"icon":231,"path":375,"stem":376,"children":377,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F6.envconf",[378,381],{"title":52,"path":379,"stem":380,"icon":231},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F6.envconf\u002F1.overview",{"title":382,"path":383,"stem":384},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F6.envconf\u002F2.recipes",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F7.httperr",[391,394,399],{"title":52,"path":392,"stem":393,"icon":387},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F7.httperr\u002F1.overview",{"title":395,"path":396,"stem":397,"icon":398},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":400,"path":401,"stem":402,"icon":403},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":405,"icon":406,"path":407,"stem":408,"children":409,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F8.dbx",[410,413,417,421,426],{"title":52,"path":411,"stem":412,"icon":406},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F8.dbx\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":106},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F8.dbx\u002F2.pg",{"title":418,"path":419,"stem":420,"icon":47},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F8.dbx\u002F3.bunx",{"title":422,"path":423,"stem":424,"icon":425},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":427,"path":428,"stem":429,"icon":318},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F8.dbx\u002F5.seed",{"title":431,"icon":55,"path":432,"stem":433,"children":434,"page":44},"paginate","\u002Fhu\u002Fpaginate","hu\u002F9.paginate",[435,438],{"title":52,"path":436,"stem":437,"icon":55},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F9.paginate\u002F1.overview",{"title":439,"path":440,"stem":441,"icon":19},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F9.paginate\u002F2.cursor",{"id":443,"title":21,"body":444,"description":1946,"extension":1947,"links":1948,"meta":1949,"navigation":1950,"path":22,"seo":1951,"stem":23,"__hash__":1952},"docs_hu\u002Fhu\u002F1.getting-started\u002F3.coming-from-symfony.md",{"type":445,"value":446,"toc":1939},"minimark",[447,456,468,473,925,929,932,1394,1397,1814,1833,1837,1876,1880,1913,1917,1935],[448,449,450,451,455],"p",{},"Ha Symfonyval dolgoztál, a gpsystem gondolkodásmódja ismerős lesz: a Messenger, az EventDispatcher és a Voterek mögötti fogalmak egy az egyben átjönnek. Ez az oldal megmutatja, mi minek felel meg, és őszintén azt is, mi ",[452,453,454],"strong",{},"nem"," transzferálódik.",[448,457,458,459,463,464,467],{},"Ami átjön: az üzenet-alapú aszinkron feldolgozás, az esemény\u002Flistener-gondolkodás és a kérésenkénti jogosultság-ellenőrzés fogalmi kerete. Ami nem: nincs service container és autowiring (a függőségek egy explicit ",[460,461,462],"code",{},"Dependencies"," structban utaznak, amit a ",[460,465,466],{},"main.go","-ban te töltesz ki), nincs bundle-rendszer, és nincs Doctrine ORM: a repository-kban SQL-t vagy bun query buildert írsz.",[469,470,472],"h2",{"id":471},"megfeleltetési-tábla","Megfeleltetési tábla",[474,475,476,492],"table",{},[477,478,479],"thead",{},[480,481,482,486,489],"tr",{},[483,484,485],"th",{},"Symfony",[483,487,488],{},"gpsystem",[483,490,491],{},"Hol",[493,494,495,523,545,569,587,611,625,640,658,675,690,707,730,757,773,788,803,821,839,852,874,893,909],"tbody",{},[480,496,497,505,518],{},[498,499,500,501,504],"td",{},"Scheduler komponens (",[460,502,503],{},"#[AsPeriodicTask]",")",[498,506,507,510,511,514,515,504],{},[460,508,509],{},"scheduler.Schedule"," fluent API (",[460,512,513],{},"sched.DailyAt(...)",", ",[460,516,517],{},"sched.Job(...)",[498,519,520],{},[521,522,77],"a",{"href":78},[480,524,525,531,541],{},[498,526,527,528,504],{},"Messenger (",[460,529,530],{},"#[AsMessageHandler]",[498,532,533,536,537,540],{},[460,534,535],{},"events.Event"," + ",[460,538,539],{},"events.Listen"," (minden listener önálló, újrapróbált task)",[498,542,543],{},[521,544,67],{"href":68},[480,546,547,553,562],{},[498,548,549,550,504],{},"Messenger transport, worker (",[460,551,552],{},"messenger:consume",[498,554,555,557,558,561],{},[460,556,46],{}," (asynq + Valkey) + ",[460,559,560],{},"cmd\u002Fworker"," bináris",[498,563,564,514,567],{},[521,565,566],{"href":53},"Queue",[521,568,263],{"href":264},[480,570,571,577,583],{},[498,572,573,574,504],{},"Security Voterek (",[460,575,576],{},"voteOnAttribute",[498,578,579,582],{},[460,580,581],{},"policy.Registry"," + generált enforcer middleware, fail-closed",[498,584,585],{},[521,586,98],{"href":99},[480,588,589,595,607],{},[498,590,591,592],{},"Role hierarchy, ",[460,593,594],{},"ROLE_*",[498,596,597,514,600,603,604],{},[460,598,599],{},"rbac.Identity",[460,601,602],{},"RequireRole"," \u002F ",[460,605,606],{},"RequirePermission",[498,608,609],{},[521,610,93],{"href":94},[480,612,613,616,621],{},[498,614,615],{},"Security firewall, authenticatorok",[498,617,618,620],{},[460,619,82],{}," (JWT kibocsátás és middleware)",[498,622,623],{},[521,624,88],{"href":89},[480,626,627,630,636],{},[498,628,629],{},"MonologBundle (dev channel)",[498,631,632,635],{},[460,633,634],{},"logx\u002Fmonolog"," (Monolog-formátumú konzol-handler)",[498,637,638],{},[521,639,183],{"href":184},[480,641,642,648,654],{},[498,643,644,645,504],{},"Doctrine Migrations (",[460,646,647],{},"doctrine:migrations:migrate",[498,649,650,653],{},[460,651,652],{},"go run .\u002Fcmd\u002Fmigrate"," (beágyazott, számozott SQL)",[498,655,656],{},[521,657,272],{"href":273},[480,659,660,665,671],{},[498,661,662],{},[460,663,664],{},"EntityManager::wrapInTransaction()",[498,666,667,670],{},[460,668,669],{},"Transactor.WithinTransaction(ctx, fn)"," (a tranzakció a contextben utazik)",[498,672,673],{},[521,674,422],{"href":423},[480,676,677,683,686],{},[498,678,679,680,504],{},"Validator attribútumok (",[460,681,682],{},"#[Assert\\NotBlank]",[498,684,685],{},"validator struct-tagek + generált request-típusok",[498,687,688],{},[521,689,400],{"href":401},[480,691,692,698,703],{},[498,693,694,695],{},"Exception listenerek, ",[460,696,697],{},"ExceptionEvent",[498,699,700,702],{},[460,701,358],{}," kódok + public üzenet → RFC 9457 problem+json \u002F Sentry",[498,704,705],{},[521,706,224],{"href":225},[480,708,709,717,726],{},[498,710,711,536,714],{},[460,712,713],{},"config\u002Fpackages\u002F*.yaml",[460,715,716],{},".env",[498,718,719,722,723,725],{},[460,720,721],{},"envconf.MustLoad[T]"," (típusos struct env-ből, ",[460,724,716],{},"-támogatással)",[498,727,728],{},[521,729,204],{"href":229},[480,731,732,735,752],{},[498,733,734],{},"Flysystem bundle (oneup)",[498,736,737,738,740,741,744,745,744,748,751],{},"a ",[460,739,147],{}," modul ",[460,742,743],{},"Driver","\u002F",[460,746,747],{},"Disk",[460,749,750],{},"Manager"," modellje + S3-driver",[498,753,754],{},[521,755,756],{"href":153},"Tárolás",[480,758,759,762,768],{},[498,760,761],{},"Mailer komponens",[498,763,764,767],{},[460,765,766],{},"mail.Message"," builder + MJML template-ek; a memória-mailer a teszt-dupla",[498,769,770],{},[521,771,772],{"href":119},"E-mail",[480,774,775,778,783],{},[498,776,777],{},"Notifier komponens",[498,779,780,782],{},[460,781,130],{}," (multi-csatornás értesítések)",[498,784,785],{},[521,786,787],{"href":136},"Értesítések",[480,789,790,793,799],{},[498,791,792],{},"Mercure",[498,794,795,798],{},[460,796,797],{},"realtime"," (first-party publish\u002Fsubscribe)",[498,800,801],{},[521,802,268],{"href":269},[480,804,805,811,816],{},[498,806,807,808,504],{},"MakerBundle (",[460,809,810],{},"make:*",[498,812,813],{},[460,814,815],{},"go tool gpsystem new\u002Fadd ...",[498,817,818],{},[521,819,820],{"href":287},"CLI",[480,822,823,826,834],{},[498,824,825],{},"Pagerfanta \u002F KnpPaginatorBundle",[498,827,828,603,831],{},[460,829,830],{},"paginate.Page[T]",[460,832,833],{},"paginate.CursorPage[T]",[498,835,836],{},[521,837,838],{"href":436},"Lapozás",[480,840,841,844,847],{},[498,842,843],{},"Doctrine ORM",[498,845,846],{},"pgx (SQL) vagy bun (query builder), nincs ActiveRecord\u002FDoctrine-szimuláció",[498,848,849],{},[521,850,851],{"href":411},"Adatbázis",[480,853,854,861,870],{},[498,855,856,857,860],{},"Route-annotációk (",[460,858,859],{},"#[Route]","), auto-discovery",[498,862,863,866,867,869],{},[460,864,865],{},"Register\u003CSurface>(router, deps)"," (explicit hívás a ",[460,868,466],{},"-ban)",[498,871,872],{},[521,873,220],{"href":221},[480,875,876,879,889],{},[498,877,878],{},"Külön controller-készlet közönségenként (publikus API vs admin firewall mögött)",[498,880,881,884,885,888],{},[452,882,883],{},"surface"," (felület-köteg): ",[460,886,887],{},"surfaces\u002F\u003Csurface>\u002F",", saját kontrakttal és middleware-rel",[498,890,891],{},[521,892,330],{"href":331},[480,894,895,898,905],{},[498,896,897],{},"Entity-metódusok + közös service-logika",[498,899,900,901,904],{},"a modul ",[460,902,903],{},"core\u002F"," csomagja (egyszer leírt szabályok, minden surface hívja)",[498,906,907],{},[521,908,35],{"href":36},[480,910,911,914,921],{},[498,912,913],{},"Doctrine repository-k",[498,915,916,917,920],{},"a modul-szintű ",[460,918,919],{},"repository\u002F",": modulonként egy, minden surface közösen használja",[498,922,923],{},[521,924,35],{"href":36},[469,926,928],{"id":927},"két-példa-egymás-mellett","Két példa egymás mellett",[448,930,931],{},"Messenger handler: egy asztali üzenet feldolgozása:",[933,934,935,1139],"code-group",{},[936,937,943],"pre",{"className":938,"code":939,"filename":940,"language":941,"meta":942,"style":942},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","#[AsMessageHandler]\nfinal class OrderPlacedHandler\n{\n    public function __invoke(OrderPlaced $message): void\n    {\n        $this->mailer->send(\n            (new TemplatedEmail())\n                ->to($message->email)\n                ->htmlTemplate('emails\u002Forder_confirmation.html.twig')\n                ->context(['orderId' => $message->orderId]),\n        );\n    }\n}\n","Symfony: src\u002FMessageHandler\u002FOrderPlacedHandler.php","php","",[460,944,945,954,968,975,1007,1013,1031,1046,1068,1089,1121,1127,1133],{"__ignoreMap":942},[946,947,950],"span",{"class":948,"line":949},"line",1,[946,951,953],{"class":952},"sTEyZ","#[AsMessageHandler]\n",[946,955,957,961,964],{"class":948,"line":956},2,[946,958,960],{"class":959},"spNyl","final",[946,962,963],{"class":959}," class",[946,965,967],{"class":966},"sBMFI"," OrderPlacedHandler\n",[946,969,971],{"class":948,"line":970},3,[946,972,974],{"class":973},"sMK4o","{\n",[946,976,978,981,984,988,991,994,997,1000,1003],{"class":948,"line":977},4,[946,979,980],{"class":959},"    public",[946,982,983],{"class":959}," function",[946,985,987],{"class":986},"s2Zo4"," __invoke",[946,989,990],{"class":973},"(",[946,992,993],{"class":966},"OrderPlaced",[946,995,996],{"class":973}," $",[946,998,999],{"class":952},"message",[946,1001,1002],{"class":973},"):",[946,1004,1006],{"class":1005},"sbssI"," void\n",[946,1008,1010],{"class":948,"line":1009},5,[946,1011,1012],{"class":973},"    {\n",[946,1014,1016,1019,1022,1025,1028],{"class":948,"line":1015},6,[946,1017,1018],{"class":973},"        $this->",[946,1020,1021],{"class":952},"mailer",[946,1023,1024],{"class":973},"->",[946,1026,1027],{"class":986},"send",[946,1029,1030],{"class":973},"(\n",[946,1032,1034,1037,1040,1043],{"class":948,"line":1033},7,[946,1035,1036],{"class":973},"            (",[946,1038,1039],{"class":1005},"new",[946,1041,1042],{"class":966}," TemplatedEmail",[946,1044,1045],{"class":973},"())\n",[946,1047,1049,1052,1055,1058,1060,1062,1065],{"class":948,"line":1048},8,[946,1050,1051],{"class":973},"                ->",[946,1053,1054],{"class":986},"to",[946,1056,1057],{"class":973},"($",[946,1059,999],{"class":952},[946,1061,1024],{"class":973},[946,1063,1064],{"class":952},"email",[946,1066,1067],{"class":973},")\n",[946,1069,1071,1073,1076,1078,1081,1085,1087],{"class":948,"line":1070},9,[946,1072,1051],{"class":973},[946,1074,1075],{"class":986},"htmlTemplate",[946,1077,990],{"class":973},[946,1079,1080],{"class":973},"'",[946,1082,1084],{"class":1083},"sfazB","emails\u002Forder_confirmation.html.twig",[946,1086,1080],{"class":973},[946,1088,1067],{"class":973},[946,1090,1092,1094,1097,1100,1102,1105,1107,1110,1112,1114,1116,1118],{"class":948,"line":1091},10,[946,1093,1051],{"class":973},[946,1095,1096],{"class":986},"context",[946,1098,1099],{"class":973},"([",[946,1101,1080],{"class":973},[946,1103,1104],{"class":1083},"orderId",[946,1106,1080],{"class":973},[946,1108,1109],{"class":973}," =>",[946,1111,996],{"class":973},[946,1113,999],{"class":952},[946,1115,1024],{"class":973},[946,1117,1104],{"class":952},[946,1119,1120],{"class":973},"]),\n",[946,1122,1124],{"class":948,"line":1123},11,[946,1125,1126],{"class":973},"        );\n",[946,1128,1130],{"class":948,"line":1129},12,[946,1131,1132],{"class":973},"    }\n",[946,1134,1136],{"class":948,"line":1135},13,[946,1137,1138],{"class":973},"}\n",[936,1140,1145],{"className":1141,"code":1142,"filename":1143,"language":1144,"meta":942,"style":942},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","func sendOrderConfirmation(deps shop.Dependencies) func(context.Context, shopevents.OrderPlaced) error {\n    return func(ctx context.Context, ev shopevents.OrderPlaced) error {\n        msg := mail.NewMessage().\n            WithTo(ev.Email).\n            WithSubject(\"Rendelésed visszaigazolása\").\n            WithBody(mjml.Template(templates, \"templates\u002Forder_confirmation.mjml.tmpl\",\n                map[string]any{\"OrderID\": ev.OrderID}))\n        return deps.Mailer.Send(ctx, msg)\n    }\n}\n","gpsystem: internal\u002Fmodules\u002Fshop\u002Flisteners\u002Fsend_order_confirmation.go","go",[460,1146,1147,1199,1234,1253,1271,1288,1321,1357,1386,1390],{"__ignoreMap":942},[946,1148,1149,1152,1155,1157,1161,1164,1167,1169,1171,1174,1176,1178,1181,1184,1187,1189,1191,1193,1196],{"class":948,"line":949},[946,1150,1151],{"class":973},"func",[946,1153,1154],{"class":986}," sendOrderConfirmation",[946,1156,990],{"class":973},[946,1158,1160],{"class":1159},"sHdIc","deps",[946,1162,1163],{"class":966}," shop",[946,1165,1166],{"class":973},".",[946,1168,462],{"class":966},[946,1170,504],{"class":973},[946,1172,1173],{"class":973}," func(",[946,1175,1096],{"class":966},[946,1177,1166],{"class":973},[946,1179,1180],{"class":966},"Context",[946,1182,1183],{"class":973},",",[946,1185,1186],{"class":966}," shopevents",[946,1188,1166],{"class":973},[946,1190,993],{"class":966},[946,1192,504],{"class":973},[946,1194,1195],{"class":959}," error",[946,1197,1198],{"class":973}," {\n",[946,1200,1201,1205,1207,1210,1213,1215,1217,1219,1222,1224,1226,1228,1230,1232],{"class":948,"line":956},[946,1202,1204],{"class":1203},"s7zQu","    return",[946,1206,1173],{"class":973},[946,1208,1209],{"class":1159},"ctx",[946,1211,1212],{"class":966}," context",[946,1214,1166],{"class":973},[946,1216,1180],{"class":966},[946,1218,1183],{"class":973},[946,1220,1221],{"class":1159}," ev",[946,1223,1186],{"class":966},[946,1225,1166],{"class":973},[946,1227,993],{"class":966},[946,1229,504],{"class":973},[946,1231,1195],{"class":959},[946,1233,1198],{"class":973},[946,1235,1236,1239,1242,1245,1247,1250],{"class":948,"line":970},[946,1237,1238],{"class":952},"        msg ",[946,1240,1241],{"class":973},":=",[946,1243,1244],{"class":952}," mail",[946,1246,1166],{"class":973},[946,1248,1249],{"class":986},"NewMessage",[946,1251,1252],{"class":973},"().\n",[946,1254,1255,1258,1260,1263,1265,1268],{"class":948,"line":977},[946,1256,1257],{"class":986},"            WithTo",[946,1259,990],{"class":973},[946,1261,1262],{"class":952},"ev",[946,1264,1166],{"class":973},[946,1266,1267],{"class":952},"Email",[946,1269,1270],{"class":973},").\n",[946,1272,1273,1276,1278,1281,1284,1286],{"class":948,"line":1009},[946,1274,1275],{"class":986},"            WithSubject",[946,1277,990],{"class":973},[946,1279,1280],{"class":973},"\"",[946,1282,1283],{"class":1083},"Rendelésed visszaigazolása",[946,1285,1280],{"class":973},[946,1287,1270],{"class":973},[946,1289,1290,1293,1295,1298,1300,1303,1305,1308,1310,1313,1316,1318],{"class":948,"line":1015},[946,1291,1292],{"class":986},"            WithBody",[946,1294,990],{"class":973},[946,1296,1297],{"class":952},"mjml",[946,1299,1166],{"class":973},[946,1301,1302],{"class":986},"Template",[946,1304,990],{"class":973},[946,1306,1307],{"class":952},"templates",[946,1309,1183],{"class":973},[946,1311,1312],{"class":973}," \"",[946,1314,1315],{"class":1083},"templates\u002Forder_confirmation.mjml.tmpl",[946,1317,1280],{"class":973},[946,1319,1320],{"class":973},",\n",[946,1322,1323,1326,1329,1332,1335,1338,1340,1343,1345,1348,1350,1352,1354],{"class":948,"line":1033},[946,1324,1325],{"class":973},"                map[",[946,1327,1328],{"class":959},"string",[946,1330,1331],{"class":973},"]",[946,1333,1334],{"class":966},"any",[946,1336,1337],{"class":973},"{",[946,1339,1280],{"class":973},[946,1341,1342],{"class":1083},"OrderID",[946,1344,1280],{"class":973},[946,1346,1347],{"class":973},":",[946,1349,1221],{"class":952},[946,1351,1166],{"class":973},[946,1353,1342],{"class":952},[946,1355,1356],{"class":973},"}))\n",[946,1358,1359,1362,1365,1367,1370,1372,1375,1377,1379,1381,1384],{"class":948,"line":1048},[946,1360,1361],{"class":1203},"        return",[946,1363,1364],{"class":952}," deps",[946,1366,1166],{"class":973},[946,1368,1369],{"class":952},"Mailer",[946,1371,1166],{"class":973},[946,1373,1374],{"class":986},"Send",[946,1376,990],{"class":973},[946,1378,1209],{"class":952},[946,1380,1183],{"class":973},[946,1382,1383],{"class":952}," msg",[946,1385,1067],{"class":973},[946,1387,1388],{"class":948,"line":1070},[946,1389,1132],{"class":973},[946,1391,1392],{"class":948,"line":1091},[946,1393,1138],{"class":973},[448,1395,1396],{},"Jogosultság-ellenőrzés: kérésenkénti tulajdonos-ellenőrzés, amikor a szerep önmagában kevés:",[933,1398,1399,1568],{},[936,1400,1403],{"className":938,"code":1401,"filename":1402,"language":941,"meta":942,"style":942},"class OrderVoter extends Voter\n{\n    protected function voteOnAttribute(string $attribute, mixed $order, TokenInterface $token): bool\n    {\n        $user = $token->getUser();\n        return $order->getUserId() === $user->getId()\n            || in_array('ROLE_ADMIN', $user->getRoles(), true);\n    }\n}\n","Symfony: src\u002FSecurity\u002FVoter\u002FOrderVoter.php",[460,1404,1405,1419,1423,1467,1471,1494,1526,1560,1564],{"__ignoreMap":942},[946,1406,1407,1410,1413,1416],{"class":948,"line":949},[946,1408,1409],{"class":959},"class",[946,1411,1412],{"class":966}," OrderVoter",[946,1414,1415],{"class":959}," extends",[946,1417,1418],{"class":966}," Voter\n",[946,1420,1421],{"class":948,"line":956},[946,1422,974],{"class":973},[946,1424,1425,1428,1430,1433,1435,1437,1439,1442,1444,1447,1449,1452,1454,1457,1459,1462,1464],{"class":948,"line":970},[946,1426,1427],{"class":959},"    protected",[946,1429,983],{"class":959},[946,1431,1432],{"class":986}," voteOnAttribute",[946,1434,990],{"class":973},[946,1436,1328],{"class":1005},[946,1438,996],{"class":973},[946,1440,1441],{"class":952},"attribute",[946,1443,1183],{"class":973},[946,1445,1446],{"class":1005}," mixed",[946,1448,996],{"class":973},[946,1450,1451],{"class":952},"order",[946,1453,1183],{"class":973},[946,1455,1456],{"class":966}," TokenInterface",[946,1458,996],{"class":973},[946,1460,1461],{"class":952},"token",[946,1463,1002],{"class":973},[946,1465,1466],{"class":1005}," bool\n",[946,1468,1469],{"class":948,"line":977},[946,1470,1012],{"class":973},[946,1472,1473,1476,1479,1482,1484,1486,1488,1491],{"class":948,"line":1009},[946,1474,1475],{"class":973},"        $",[946,1477,1478],{"class":952},"user ",[946,1480,1481],{"class":973},"=",[946,1483,996],{"class":973},[946,1485,1461],{"class":952},[946,1487,1024],{"class":973},[946,1489,1490],{"class":986},"getUser",[946,1492,1493],{"class":973},"();\n",[946,1495,1496,1498,1500,1502,1504,1507,1510,1513,1515,1518,1520,1523],{"class":948,"line":1015},[946,1497,1361],{"class":1203},[946,1499,996],{"class":973},[946,1501,1451],{"class":952},[946,1503,1024],{"class":973},[946,1505,1506],{"class":986},"getUserId",[946,1508,1509],{"class":973},"()",[946,1511,1512],{"class":973}," ===",[946,1514,996],{"class":973},[946,1516,1517],{"class":952},"user",[946,1519,1024],{"class":973},[946,1521,1522],{"class":986},"getId",[946,1524,1525],{"class":973},"()\n",[946,1527,1528,1531,1534,1536,1538,1541,1543,1545,1547,1549,1551,1554,1557],{"class":948,"line":1033},[946,1529,1530],{"class":973},"            ||",[946,1532,1533],{"class":986}," in_array",[946,1535,990],{"class":973},[946,1537,1080],{"class":973},[946,1539,1540],{"class":1083},"ROLE_ADMIN",[946,1542,1080],{"class":973},[946,1544,1183],{"class":973},[946,1546,996],{"class":973},[946,1548,1517],{"class":952},[946,1550,1024],{"class":973},[946,1552,1553],{"class":986},"getRoles",[946,1555,1556],{"class":973},"(),",[946,1558,1559],{"class":973}," true);\n",[946,1561,1562],{"class":948,"line":1048},[946,1563,1132],{"class":973},[946,1565,1566],{"class":948,"line":1070},[946,1567,1138],{"class":973},[936,1569,1572],{"className":1141,"code":1570,"filename":1571,"language":1144,"meta":942,"style":942},"func New() *kitpolicy.Registry {\n    reg := kitpolicy.NewRegistry()\n    reg.Register(\"orders.view\", func(ctx context.Context, id *rbac.Identity, req any) error {\n        if id.HasRole(\"admin\") {\n            return nil\n        }\n        r := req.(gen.GetOrderRequest)\n        if !ownsOrder(ctx, id, r.OrderId) {\n            return kitpolicy.Deny(\"You can only view your own orders.\")\n        }\n        return nil\n    })\n    return reg\n}\n","gpsystem: internal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fpolicy\u002Fpolicy.go",[460,1573,1574,1596,1613,1673,1698,1706,1711,1733,1765,1787,1791,1797,1802,1809],{"__ignoreMap":942},[946,1575,1576,1578,1581,1583,1586,1589,1591,1594],{"class":948,"line":949},[946,1577,1151],{"class":973},[946,1579,1580],{"class":986}," New",[946,1582,1509],{"class":973},[946,1584,1585],{"class":973}," *",[946,1587,1588],{"class":966},"kitpolicy",[946,1590,1166],{"class":973},[946,1592,1593],{"class":966},"Registry",[946,1595,1198],{"class":973},[946,1597,1598,1601,1603,1606,1608,1611],{"class":948,"line":956},[946,1599,1600],{"class":952},"    reg ",[946,1602,1241],{"class":973},[946,1604,1605],{"class":952}," kitpolicy",[946,1607,1166],{"class":973},[946,1609,1610],{"class":986},"NewRegistry",[946,1612,1525],{"class":973},[946,1614,1615,1618,1620,1623,1625,1627,1630,1632,1634,1636,1638,1640,1642,1644,1646,1649,1651,1654,1656,1659,1661,1664,1667,1669,1671],{"class":948,"line":970},[946,1616,1617],{"class":952},"    reg",[946,1619,1166],{"class":973},[946,1621,1622],{"class":986},"Register",[946,1624,990],{"class":973},[946,1626,1280],{"class":973},[946,1628,1629],{"class":1083},"orders.view",[946,1631,1280],{"class":973},[946,1633,1183],{"class":973},[946,1635,1173],{"class":973},[946,1637,1209],{"class":1159},[946,1639,1212],{"class":966},[946,1641,1166],{"class":973},[946,1643,1180],{"class":966},[946,1645,1183],{"class":973},[946,1647,1648],{"class":1159}," id",[946,1650,1585],{"class":973},[946,1652,1653],{"class":966},"rbac",[946,1655,1166],{"class":973},[946,1657,1658],{"class":966},"Identity",[946,1660,1183],{"class":973},[946,1662,1663],{"class":1159}," req",[946,1665,1666],{"class":966}," any",[946,1668,504],{"class":973},[946,1670,1195],{"class":959},[946,1672,1198],{"class":973},[946,1674,1675,1678,1680,1682,1685,1687,1689,1692,1694,1696],{"class":948,"line":977},[946,1676,1677],{"class":1203},"        if",[946,1679,1648],{"class":952},[946,1681,1166],{"class":973},[946,1683,1684],{"class":986},"HasRole",[946,1686,990],{"class":973},[946,1688,1280],{"class":973},[946,1690,1691],{"class":1083},"admin",[946,1693,1280],{"class":973},[946,1695,504],{"class":973},[946,1697,1198],{"class":973},[946,1699,1700,1703],{"class":948,"line":1009},[946,1701,1702],{"class":1203},"            return",[946,1704,1705],{"class":973}," nil\n",[946,1707,1708],{"class":948,"line":1015},[946,1709,1710],{"class":973},"        }\n",[946,1712,1713,1716,1718,1720,1723,1726,1728,1731],{"class":948,"line":1033},[946,1714,1715],{"class":952},"        r ",[946,1717,1241],{"class":973},[946,1719,1663],{"class":952},[946,1721,1722],{"class":973},".(",[946,1724,1725],{"class":966},"gen",[946,1727,1166],{"class":973},[946,1729,1730],{"class":966},"GetOrderRequest",[946,1732,1067],{"class":973},[946,1734,1735,1737,1740,1743,1745,1747,1749,1751,1753,1756,1758,1761,1763],{"class":948,"line":1048},[946,1736,1677],{"class":1203},[946,1738,1739],{"class":973}," !",[946,1741,1742],{"class":986},"ownsOrder",[946,1744,990],{"class":973},[946,1746,1209],{"class":952},[946,1748,1183],{"class":973},[946,1750,1648],{"class":952},[946,1752,1183],{"class":973},[946,1754,1755],{"class":952}," r",[946,1757,1166],{"class":973},[946,1759,1760],{"class":952},"OrderId",[946,1762,504],{"class":973},[946,1764,1198],{"class":973},[946,1766,1767,1769,1771,1773,1776,1778,1780,1783,1785],{"class":948,"line":1070},[946,1768,1702],{"class":1203},[946,1770,1605],{"class":952},[946,1772,1166],{"class":973},[946,1774,1775],{"class":986},"Deny",[946,1777,990],{"class":973},[946,1779,1280],{"class":973},[946,1781,1782],{"class":1083},"You can only view your own orders.",[946,1784,1280],{"class":973},[946,1786,1067],{"class":973},[946,1788,1789],{"class":948,"line":1091},[946,1790,1710],{"class":973},[946,1792,1793,1795],{"class":948,"line":1123},[946,1794,1361],{"class":1203},[946,1796,1705],{"class":973},[946,1798,1799],{"class":948,"line":1129},[946,1800,1801],{"class":973},"    })\n",[946,1803,1804,1806],{"class":948,"line":1135},[946,1805,1204],{"class":1203},[946,1807,1808],{"class":952}," reg\n",[946,1810,1812],{"class":948,"line":1811},14,[946,1813,1138],{"class":973},[448,1815,1816,1817,1820,1821,1824,1825,1828,1829,1832],{},"Egy lényegi különbség: egy Symfony Voter ",[460,1818,1819],{},"abstain","-nel is válaszolhat (nem dönt, adja tovább a láncnak), és a ",[460,1822,1823],{},"denyAccessUnlessGranted()"," hívás a controllerben elfelejthető. Itt a policy a TypeSpec-kontraktus ",[460,1826,1827],{},"@policy"," dekorátorával kötődik a művelethez, az enforcer middleware pedig a generált táblából kényszeríti ki. A megjelölt, de nem regisztrált policy nem átenged, hanem hibázik (",[521,1830,1831],{"href":99},"fail-closed","); nincs \"abstain\" állapot.",[469,1834,1836],{"id":1835},"viselkedésbeli-különbségek","Viselkedésbeli különbségek",[1838,1839,1840,1853,1864],"ul",{},[1841,1842,1843,1846,1847,1850,1851,1166],"li",{},[452,1844,1845],{},"Események és a fan-out."," A Symfony Messenger egy üzenethez egy handlert rendel (több handler regisztrálható, de tipikusan egy retry-konfiguráció vonatkozik az üzenetre). A gpsystem minden listenert ",[452,1848,1849],{},"önálló, saját retry-kerettel futó asynq taskként"," kezel: egy event N listener-taskra terül szét, egy hibázó listener újrapróbálkozása sosem futtatja újra a többit. Részletek: ",[521,1852,67],{"href":68},[1841,1854,1855,1858,1859,1861,1862,1166],{},[452,1856,1857],{},"Tranzakciós outbox."," A Doctrine ",[460,1860,664],{}," a commit-előtti rollbacket kezeli, de a commit-utáni crash-ablakot (a folyamat a DB-commit és az üzenet-dispatch közt hal le) nem zárja be. A gpsystem outboxa gyárilag ugyanabba az adatbázisba, ugyanabban a tranzakcióban írja az eventet, mint az üzleti változást. Részletek: ",[521,1863,72],{"href":73},[1841,1865,1866,1869,1870,1873,1874,1166],{},[452,1867,1868],{},"Migrációk."," A Doctrine Migrations-nek van séma-diff generátora (",[460,1871,1872],{},"doctrine:migrations:diff","); a gpsystemben nincs, csak sima, kézzel írt SQL, tudatos trade-off a diff-mágia elfedő hatása ellen. Részletek: ",[521,1875,272],{"href":273},[469,1877,1879],{"id":1878},"mi-nincs-és-miért","Mi nincs, és miért",[1838,1881,1882,1898,1907],{},[1841,1883,1884,1887,1888,1890,1891,1893,1894,1897],{},[452,1885,1886],{},"Nincs service container és autowiring."," A ",[460,1889,462],{}," struct kézzel épül a ",[460,1892,466],{},"-ban. Cserébe a \"honnan jön ez a függőség?\" kérdésre mindig egy ",[460,1895,1896],{},"cmd\u002F\u003Cmodul>\u002Fmain.go","-beli sor a válasz.",[1841,1899,1900,1903,1904,1906],{},[452,1901,1902],{},"Nincs Doctrine ORM."," A repository-réteg pgx-szel (SQL) vagy bunnal (query builder) dolgozik, a Go-ökoszisztémában az explicit lekérdezés a bevett út. A ",[521,1905,418],{"href":419}," opcionális adapter, ha a query builder kényelmét szeretnéd.",[1841,1908,1909,1912],{},[452,1910,1911],{},"Nincs Twig."," A kit API-backendekre fókuszál; a szerveroldali renderelés nem része.",[469,1914,1916],{"id":1915},"háttér","Háttér",[448,1918,1919,1920,1923,1924,1927,1928,1934],{},"A kit szerzőjének motivációja pont az volt, hogy a Go-ökoszisztémában is legyen egy, a batteries-included PHP frameworkökhöz hasonlóan könnyen használható rendszer: ahol a projekt első napján üzleti logikát írsz, nem infrastruktúrát válogatsz. A Go-világ ereje a kis, egymástól független, jól tesztelt library-kben van: a gpsystem nem lecserélni akarja ezeket, hanem egyetlen, összecsiszolt és karbantartott kompozíciót adni belőlük. A library-fél egy ",[452,1921,1922],{},"microservice chassis",", a generált projekt egy ",[452,1925,1926],{},"service template"," (",[521,1929,1933],{"href":1930,"rel":1931},"https:\u002F\u002Fmicroservices.io\u002Fpatterns\u002Fmicroservice-chassis.html",[1932],"nofollow","Richardson","), nem egy futásidejű réteg, ami az app fölött él. A cél a kényelmes indulás, nem egy új, zárt keretrendszer.",[1936,1937,1938],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":942,"searchDepth":956,"depth":956,"links":1940},[1941,1942,1943,1944,1945],{"id":471,"depth":956,"text":472},{"id":927,"depth":956,"text":928},{"id":1835,"depth":956,"text":1836},{"id":1878,"depth":956,"text":1879},{"id":1915,"depth":956,"text":1916},"Fogalomról fogalomra megfeleltetés a Symfony és a gpsystem között.","md",null,{},{"icon":19},{"title":21,"description":1946},"CegDsTVT19QcIGDXH44W9_epDmf_OekUa3n4qZf7BNM",[1954,1956],{"title":16,"path":17,"stem":18,"description":1955,"icon":19,"children":-1},"Fogalomról fogalomra megfeleltetés a Laravel és a gpsystem között.",{"title":25,"path":26,"stem":27,"description":1957,"icon":28,"children":-1},"Előfeltételek, a CLI telepítése és az első gpsystem projekted létrehozása.",1785445877220]