{"tag":"graphql","articles":{"projects\/avris-graphqlbundle":{"key":"projects\/avris-graphqlbundle","type":"article","published":true,"meta":{"createdAt":"2018-09-27T23:32:04+02:00","publishedAt":"2018-09-27T23:30:00+02:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/GraphqlBundle","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-graphqlbundle"},"content":{"en":{"slug":"avris-graphqlbundle","title":"Avris GraphqlBundle","intro":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_small.png\u0022 alt=\u0022Avris GraphqlBundle\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHsklEQVRIiX2X268lRRXGf+tS1fty9j4XZs4AwzCIipJBiUQiCTEgCSoxmKBRoyZeHvRB44N\/gu+++WA0PuuT8QUx0Wi8JJooeEFAJIIzwDhOBmbmnLPP3mfv7qrlQ+8ZjBorXd2ddF2++r5atb6WW287E1EqQhC1QlTMnVoKQaAiuBqmSnJntVpSa4UIiEAAEUHoi4ggIkBwrUTEutbrT6IiAiqCuWMiNM0QjxAiglILEiBAKQWhH1hVe6CiUCtJlW49ASLrdlxvLwIgqMobk8u1dyFqQdSIeKOfISQ1tBb8WgdBCSoRoCGI9pMRgqoDQlcqhqAIIYqprtnoF4L039bX+ma4G6tViwhE9AsUUXTd11RxM5IqHqJQy5rgnhEikBBUDTfFRDBR3BSJSq2VWks\/gHu\/+lpRtetSqQhRK0GwubXF1ctXgAohiEPUgqpAgJmSzEh+DZAAKlDXbAmI6FoGQ1HMjGyJUdNAdMwXCxp3muRkT9RaKaWjKwWEfr\/UCsBNJ3ZZHsyA2pMWgWpeg1JMe4mzKS6aiGiRMJCKXt+kgpr11FpCRVExVJxxM2Z7uMmV2R4aSpSg8YR6hiiECF3X9gwJnL71Vv559mVEAgkwFYQAEiKxlkxJprimTBesI8auxQqo9uyoYWpkd7IlFEMk0eTEm45vcDifsWxbTty4y2oxZ7Z\/gImQXalRuf\/9D\/Dic88zzQ1B9JEFqPaiqIIIJFOyGx6akLSWC6EGmCiqhori5rga2TMuQjInSSJpw87OJh\/53MfY2d7i59\/\/Ea+cewVrNkjeR9Nkc4P7H3qAZ3\/xa7YGQ6AQET0YFVTATDDtWXMXnNwgnVNrrPUFUEQNNUfEcHNUE262rokHH3kvn\/zyJ3jhyb\/w+De+R6Jwx003E7VycDjDs\/Hpr32VJ3\/wBLdMp6xKS42OiNJLp+voSv0eykkxBZfBmNoWpNb+HApADBFHLZHMUTWSOYOUGbnz+S99lA889iCzKwc88a3HyTpkezTgzW+5mcO919ibH\/HQVz5FUqGee5W337TLbDHnqFtRakepLWgluWEmuCvJhZQMl9EUWXVQKgH9HkERSagY4omsziAlRinxyc88zAceexCAp3\/1DImGycaEjVHDweUFp9\/9Tt7\/6P34oOE3X\/8Ou8c20WjZ2w+6LlGiBxRSUQ1SdtyFlBTPgstwArmDAhIKoQgK4qAJUyeZk1Pi7rvfxIc\/\/r7rKWH\/4owbThzn5OldTp85xal7bmd8bEpE8MqPf8l4mCl1g0HTkZsKUqnR0nUroraogWpgbuTG8SQ4k03oChHSg4k+ugzHNaE4sj4AP\/PFR66fzAAf\/MLD\/GeJCM7\/8ilWl17j+G03sNzLtIdXmWqLWEUsqLWldkuEDjXBXEk5402D62RCKvR5BsVDSRhZnBxGViOj3HP3rZw8ufNfAP691FJ48Se\/4+CFFxmMlcHmiON33kK3N2b\/gqCyQmhBMlESIrWPsORYzlgzxCdbE0oB1gwZgoczEGOAMsBoqnDfe97yf8HMLu3x3A9\/zer1SwwbQKFdzJm\/3uKyYrTZUNvSnz0GKglZy6XuWB6gzRC\/cWdI1wW1QA1FQ1GMFELCGITSFOGO24\/9TyCL\/Tl\/\/dUznP\/982RpGQ5qnzoqRAt1adAoeahEUkxiLVNCTbGU0dwgqYE8xO\/abZgftayWhVVXKaVSakVCkKhYEUyEY9uj6yAOZwvOvXCes396ifPP\/p0mWkZeiFRwKlkroQEWsOpzpaQgeeAmmAmaEpIHkAxyhtyAD\/BHt\/\/B4VFlNmvZP6zMuuBgCfMVHLWw6oTSwbe\/+V0WhwuuvrbP4eV9cikkConKQCtD6xinYDqorEYVJkEKYWC9zZDSoh5YNqwGbWsYE9qloYPE3pURLQPkwTPHYjpIHB31VsktE+JUnJBEwamamW7vcPnKHiF9wnU1jt2ww3x2SDZj99g2SSplvs8kw\/FxcNN24a53nuJw7wIvX7jKbLGg5Jatm0\/yi5\/+lrMXlkwHld3dCcs2+M1zh8jG1k5oyogalhLeDBA1PDd4ylhquO2Wk5w8dRopLYFyfGvCfBXcuLvL4mBOVLjj9tvYHA95+rd\/4MadKdvjhlSXvO2ut7K4eBYtC5aXzrE17rjj7hFXL8y4dGGfyRBcOo7f9zDzP\/8MufezX4pmY0pXYTCe4KlB1RFzkidEjGFOnDl1gvlRS+kKt5\/Y5vzFK+zvH3Jic8w4ZxbzJYlgeXjE9qgh5kdsD5ydyYBGO+rhHtLO2RxV7jyzRTOGl556iclQaLxjeOIEebqJF4zZfAGWWB0cIHIIaO+FojfgKsqFC+eRUqFUnoqgWyygFrIZFhClYrWQ6L3xKGUmyZm4s9kkRklwLYwyzI5a7n3HlFevKPVyx3QIk6v\/4K0ffBd+5dzfWLUt6plaKt4M4Y1\/CATwlFBVJIKogUYgEWitSNddN\/i1XeJiXL34MoM8wEXY3Jhyw3QLj8p8vs\/2dMIfn3f+eW7Ixb0jzr5+xDAHja74UPcqcuzNd0YthW61orZL0niChFBWR2hq+nRQOzwPAHrPDWgNFEHimofuvbhGIFRMBFfBBZRKNkM16LoWobA7cTYHxuVFb3Mbh\/tOw78Ak6pNn\/7nMikAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_small.png\u0022 alt=\u0022Avris GraphqlBundle\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ESimplify Graphql configuration using plain methods with typehints and annotations.\u003C\/p\u003E\n\u003Cp\u003EThis bundle is a wrapper on \u003Ccode\u003Ewebonyx\/graphql-php\u003C\/code\u003E.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_big.png\u0022 alt=\u0022Avris GraphqlBundle\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHsklEQVRIiX2X268lRRXGf+tS1fty9j4XZs4AwzCIipJBiUQiCTEgCSoxmKBRoyZeHvRB44N\/gu+++WA0PuuT8QUx0Wi8JJooeEFAJIIzwDhOBmbmnLPP3mfv7qrlQ+8ZjBorXd2ddF2++r5atb6WW287E1EqQhC1QlTMnVoKQaAiuBqmSnJntVpSa4UIiEAAEUHoi4ggIkBwrUTEutbrT6IiAiqCuWMiNM0QjxAiglILEiBAKQWhH1hVe6CiUCtJlW49ASLrdlxvLwIgqMobk8u1dyFqQdSIeKOfISQ1tBb8WgdBCSoRoCGI9pMRgqoDQlcqhqAIIYqprtnoF4L039bX+ma4G6tViwhE9AsUUXTd11RxM5IqHqJQy5rgnhEikBBUDTfFRDBR3BSJSq2VWks\/gHu\/+lpRtetSqQhRK0GwubXF1ctXgAohiEPUgqpAgJmSzEh+DZAAKlDXbAmI6FoGQ1HMjGyJUdNAdMwXCxp3muRkT9RaKaWjKwWEfr\/UCsBNJ3ZZHsyA2pMWgWpeg1JMe4mzKS6aiGiRMJCKXt+kgpr11FpCRVExVJxxM2Z7uMmV2R4aSpSg8YR6hiiECF3X9gwJnL71Vv559mVEAgkwFYQAEiKxlkxJprimTBesI8auxQqo9uyoYWpkd7IlFEMk0eTEm45vcDifsWxbTty4y2oxZ7Z\/gImQXalRuf\/9D\/Dic88zzQ1B9JEFqPaiqIIIJFOyGx6akLSWC6EGmCiqhori5rga2TMuQjInSSJpw87OJh\/53MfY2d7i59\/\/Ea+cewVrNkjeR9Nkc4P7H3qAZ3\/xa7YGQ6AQET0YFVTATDDtWXMXnNwgnVNrrPUFUEQNNUfEcHNUE262rokHH3kvn\/zyJ3jhyb\/w+De+R6Jwx003E7VycDjDs\/Hpr32VJ3\/wBLdMp6xKS42OiNJLp+voSv0eykkxBZfBmNoWpNb+HApADBFHLZHMUTWSOYOUGbnz+S99lA889iCzKwc88a3HyTpkezTgzW+5mcO919ibH\/HQVz5FUqGee5W337TLbDHnqFtRakepLWgluWEmuCvJhZQMl9EUWXVQKgH9HkERSagY4omsziAlRinxyc88zAceexCAp3\/1DImGycaEjVHDweUFp9\/9Tt7\/6P34oOE3X\/8Ou8c20WjZ2w+6LlGiBxRSUQ1SdtyFlBTPgstwArmDAhIKoQgK4qAJUyeZk1Pi7rvfxIc\/\/r7rKWH\/4owbThzn5OldTp85xal7bmd8bEpE8MqPf8l4mCl1g0HTkZsKUqnR0nUroraogWpgbuTG8SQ4k03oChHSg4k+ugzHNaE4sj4AP\/PFR66fzAAf\/MLD\/GeJCM7\/8ilWl17j+G03sNzLtIdXmWqLWEUsqLWldkuEDjXBXEk5402D62RCKvR5BsVDSRhZnBxGViOj3HP3rZw8ufNfAP691FJ48Se\/4+CFFxmMlcHmiON33kK3N2b\/gqCyQmhBMlESIrWPsORYzlgzxCdbE0oB1gwZgoczEGOAMsBoqnDfe97yf8HMLu3x3A9\/zer1SwwbQKFdzJm\/3uKyYrTZUNvSnz0GKglZy6XuWB6gzRC\/cWdI1wW1QA1FQ1GMFELCGITSFOGO24\/9TyCL\/Tl\/\/dUznP\/982RpGQ5qnzoqRAt1adAoeahEUkxiLVNCTbGU0dwgqYE8xO\/abZgftayWhVVXKaVSakVCkKhYEUyEY9uj6yAOZwvOvXCes396ifPP\/p0mWkZeiFRwKlkroQEWsOpzpaQgeeAmmAmaEpIHkAxyhtyAD\/BHt\/\/B4VFlNmvZP6zMuuBgCfMVHLWw6oTSwbe\/+V0WhwuuvrbP4eV9cikkConKQCtD6xinYDqorEYVJkEKYWC9zZDSoh5YNqwGbWsYE9qloYPE3pURLQPkwTPHYjpIHB31VsktE+JUnJBEwamamW7vcPnKHiF9wnU1jt2ww3x2SDZj99g2SSplvs8kw\/FxcNN24a53nuJw7wIvX7jKbLGg5Jatm0\/yi5\/+lrMXlkwHld3dCcs2+M1zh8jG1k5oyogalhLeDBA1PDd4ylhquO2Wk5w8dRopLYFyfGvCfBXcuLvL4mBOVLjj9tvYHA95+rd\/4MadKdvjhlSXvO2ut7K4eBYtC5aXzrE17rjj7hFXL8y4dGGfyRBcOo7f9zDzP\/8MufezX4pmY0pXYTCe4KlB1RFzkidEjGFOnDl1gvlRS+kKt5\/Y5vzFK+zvH3Jic8w4ZxbzJYlgeXjE9qgh5kdsD5ydyYBGO+rhHtLO2RxV7jyzRTOGl556iclQaLxjeOIEebqJF4zZfAGWWB0cIHIIaO+FojfgKsqFC+eRUqFUnoqgWyygFrIZFhClYrWQ6L3xKGUmyZm4s9kkRklwLYwyzI5a7n3HlFevKPVyx3QIk6v\/4K0ffBd+5dzfWLUt6plaKt4M4Y1\/CATwlFBVJIKogUYgEWitSNddN\/i1XeJiXL34MoM8wEXY3Jhyw3QLj8p8vs\/2dMIfn3f+eW7Ixb0jzr5+xDAHja74UPcqcuzNd0YthW61orZL0niChFBWR2hq+nRQOzwPAHrPDWgNFEHimofuvbhGIFRMBFfBBZRKNkM16LoWobA7cTYHxuVFb3Mbh\/tOw78Ak6pNn\/7nMikAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_big.png\u0022 alt=\u0022Avris GraphqlBundle\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ESimplify Graphql configuration using plain methods with typehints and annotations.\u003C\/p\u003E\n\u003Cp\u003EThis bundle is a wrapper on \u003Ccode\u003Ewebonyx\/graphql-php\u003C\/code\u003E.\u003C\/p\u003E\n\u003Ch3\u003EDisclaimer\u003C\/h3\u003E\n\u003Cp\u003EI\u2019m new to GraphQL, currently writing my first project using it.\nI\u2019m sure that many things are missing from the bundle and many assumptions I made are wrong,\nso please be understanding, and if possible help out with a pull request.\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs bash border\u0022\u003E$ composer require avris\/graphql-bundle\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThen add a route:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs yaml border\u0022\u003E\u003Cspan class=\u0022hljs-attr\u0022\u003Eavris_graphql_main:\u003C\/span\u003E\n    \u003Cspan class=\u0022hljs-attr\u0022\u003Epath:\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\/graph\u0027\u003C\/span\u003E\n    \u003Cspan class=\u0022hljs-attr\u0022\u003Econtroller:\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003EAvris\\GraphqlBundle\\Controller\\GraphqlController::main\u003C\/span\u003E\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EExample\u003C\/h3\u003E\n\u003Cp\u003ELet\u2019s say you have the following type in your app:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-meta\u0022\u003E\u0026lt;?php\u003C\/span\u003E\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Enamespace\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EEntity\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EUser\u003C\/span\u003E\n\u003C\/span\u003E{\n    \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ properties, constructor, etc.\u003C\/span\u003E\n\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Eprivate\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E $type = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E;\n\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Etype\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003EObjectType\u003C\/span\u003E\n    \u003C\/span\u003E{\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E::$type ?: \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E::$type = \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E::buildType();\n    }\n\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Eprivate\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EbuildType\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003EObjectType\u003C\/span\u003E\n    \u003C\/span\u003E{\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E ObjectType([\n            \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027name\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027User\u0027\u003C\/span\u003E,\n            \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027fields\u0027\u003C\/span\u003E =\u0026gt; [\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027id\u0027\u003C\/span\u003E =\u0026gt; [\n                    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; Type::id(),\n                    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E(User $user)\u003C\/span\u003E \u003C\/span\u003E{\n                        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E $user-\u0026gt;getId();\n                    },\n                ],\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027email\u0027\u003C\/span\u003E =\u0026gt; [\n                    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; Type::string(),\n                    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E(User $user)\u003C\/span\u003E \u003C\/span\u003E{\n                        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E $user-\u0026gt;getEmail();\n                    },\n                ],\n            ],\n        ]);\n    }\n\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetId\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Estring\u003C\/span\u003E\n    \u003C\/span\u003E{\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;id;\n    }\n\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetEmail\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Estring\u003C\/span\u003E\n    \u003C\/span\u003E{\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;email;\n    }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd the following GraphQL schema:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E Schema([\n    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027query\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E ObjectType([\n        \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027name\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Query\u0027\u003C\/span\u003E,\n        \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027fields\u0027\u003C\/span\u003E =\u0026gt; [\n            \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027hello\u0027\u003C\/span\u003E =\u0026gt; [\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; Type::string(),\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E \u003C\/span\u003E{\n                    \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027GraphQL API\u0027\u003C\/span\u003E;\n                }\n            ],\n            \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027user\u0027\u003C\/span\u003E =\u0026gt; [\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; User::type(),\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027args\u0027\u003C\/span\u003E =\u0026gt; [\n                    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027id\u0027\u003C\/span\u003E =\u0026gt; [\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; Type::nonNull(Type::id())],\n                ],\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;accessControl-\u0026gt;guard(\u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E($root, $args)\u003C\/span\u003E \u003C\/span\u003E{\n                    \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;repository-\u0026gt;find($args[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027id\u0027\u003C\/span\u003E]);\n                }, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027ROLE_ADMIN\u0027\u003C\/span\u003E),\n            ],\n            \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027currentUser\u0027\u003C\/span\u003E =\u0026gt; [\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; User::type(),\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E($root, $args)\u003C\/span\u003E \u003C\/span\u003E{\n                    $user = \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;tokenStorage-\u0026gt;getToken()-\u0026gt;getUser();\n\n                    \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E $user \u003Cspan class=\u0022hljs-keyword\u0022\u003Einstanceof\u003C\/span\u003E User ? $user : \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E;\n                },\n            ],\n            \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027jwt\u0027\u003C\/span\u003E =\u0026gt; [\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; Type::string(),\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027args\u0027\u003C\/span\u003E =\u0026gt; [\n                    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027login\u0027\u003C\/span\u003E =\u0026gt; Type::nonNull(Type::string()),\n                    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027password\u0027\u003C\/span\u003E =\u0026gt; Type::nonNull(Type::string()),\n                ],\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E($root, $args)\u003C\/span\u003E \u003C\/span\u003E{\n                    $user = \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;repository-\u0026gt;findOneBy([\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027email\u0027\u003C\/span\u003E =\u0026gt; $args[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027login\u0027\u003C\/span\u003E]]);\n\n                    \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E (!$user || !\u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;encoder-\u0026gt;isPasswordValid($user, $args[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027password\u0027\u003C\/span\u003E])) {\n                        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E;\n                    }\n\n                    \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E (string) \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;jwtManager-\u0026gt;issue($user);\n                },\n            ]\n        ],\n    ]),\n    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027mutation\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E ObjectType([\n        \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027name\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Mutation\u0027\u003C\/span\u003E,\n        \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027fields\u0027\u003C\/span\u003E =\u0026gt; [\n            \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027userRegistered\u0027\u003C\/span\u003E =\u0026gt; [\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; User::type(),\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027args\u0027\u003C\/span\u003E =\u0026gt; [\n                    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027email\u0027\u003C\/span\u003E =\u0026gt; Type::nonNull(Type::string()),\n                    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027password\u0027\u003C\/span\u003E =\u0026gt; Type::nonNull(Type::string()),\n                ],\n                \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E($root, $args)\u003C\/span\u003E \u003C\/span\u003E{\n                    \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;eventDispatcher-\u0026gt;dispatch(\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E UserRegisteredEvent($args[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027email\u0027\u003C\/span\u003E], $args[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027password\u0027\u003C\/span\u003E]));\n                },\n            ]\n        ],\n    ]),\n]);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EUsing this bundle, you can rewrite the entity\/type like this:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-meta\u0022\u003E\u0026lt;?php\u003C\/span\u003E\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Enamespace\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EEntity\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EAvris\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EGraphqlBundle\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EAnnotation\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Eas\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EGraphql\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Type\n *\/\u003C\/span\u003E\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EUser\u003C\/span\u003E\n\u003C\/span\u003E{\n    \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ properties, constructor, etc.\u003C\/span\u003E\n\n    \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n     * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query\n     *\/\u003C\/span\u003E\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetId\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Estring\u003C\/span\u003E\n    \u003C\/span\u003E{\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;id;\n    }\n\n    \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n     * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query\n     *\/\u003C\/span\u003E\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetEmail\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Estring\u003C\/span\u003E\n    \u003C\/span\u003E{\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;email;\n    }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd your schema\/controllers like this:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-meta\u0022\u003E\u0026lt;?php\u003C\/span\u003E\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Enamespace\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EController\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EAvris\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EGraphqlBundle\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EAnnotation\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Eas\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EGraphql\u003C\/span\u003E;\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003ESymfony\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EBundle\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EFrameworkBundle\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EController\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EAbstractController\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EHomeController\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eextends\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EAbstractController\u003C\/span\u003E\n\u003C\/span\u003E{\n    \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n     * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query\n     *\/\u003C\/span\u003E\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Ehello\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Estring\u003C\/span\u003E\n    \u003C\/span\u003E{\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027GraphQL API\u0027\u003C\/span\u003E;\n    }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Eand:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-meta\u0022\u003E\u0026lt;?php\u003C\/span\u003E\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Enamespace\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EController\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EAvris\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EGraphqlBundle\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EAnnotation\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Eas\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EGraphql\u003C\/span\u003E;\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EEntity\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EUser\u003C\/span\u003E;\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EEvents\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EUserRegistered\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EUserController\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eextends\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EBaseController\u003C\/span\u003E\n\u003C\/span\u003E{\n    \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ dependecies...\u003C\/span\u003E\n\n    \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n     * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query\n     * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Security(\u0022ROLE_ADMIN\u0022)\n     * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\ParamType(\u0022id\u0022, var=\u0022id\u0022)\n     *\/\u003C\/span\u003E\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Euser\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E(string $id)\u003C\/span\u003E: ?\u003Cspan class=\u0022hljs-title\u0022\u003EUser\u003C\/span\u003E\n    \u003C\/span\u003E{\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;repository-\u0026gt;find($id);\n    }\n\n    \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n     * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query\n     *\/\u003C\/span\u003E\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EcurrentUser\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: ?\u003Cspan class=\u0022hljs-title\u0022\u003EUser\u003C\/span\u003E\n    \u003C\/span\u003E{\n        $user = \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;tokenStorage-\u0026gt;getToken()-\u0026gt;getUser();\n\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E $user \u003Cspan class=\u0022hljs-keyword\u0022\u003Einstanceof\u003C\/span\u003E User ? $user : \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E;\n    }\n\n    \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n     * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query\n     *\/\u003C\/span\u003E\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Ejwt\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E(string $login, string $password)\u003C\/span\u003E: ?\u003Cspan class=\u0022hljs-title\u0022\u003Estring\u003C\/span\u003E\n    \u003C\/span\u003E{\n        $user = \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;repository-\u0026gt;findOneBy([\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027email\u0027\u003C\/span\u003E =\u0026gt; $login]);\n\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E (!$user || !\u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;encoder-\u0026gt;isPasswordValid($user, $password)) {\n            \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E;\n        }\n\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E (string) \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;jwtManager-\u0026gt;issue($user);\n    }\n\n    \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n     * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query(\u0022mutation\u0022)\n     *\/\u003C\/span\u003E\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EuserRegistered\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E(string $email, string $password)\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003EUser\u003C\/span\u003E\n    \u003C\/span\u003E{\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;eventDispatcher-\u0026gt;dispatch(\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E UserRegisteredEvent($email, $password));\n    }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThe bundle will parse all the classes in \u003Ccode\u003Esrc\/Controller\u003C\/code\u003E and \u003Ccode\u003Esrc\/Entity\u003C\/code\u003E\n(that list can be configured in the config key \u003Ccode\u003Eavris_graphql.load\u003C\/code\u003E)\nlooking for the \u003Ccode\u003EGraphql\u003C\/code\u003E annotations.\u003C\/p\u003E\n\u003Cp\u003EAll parameters of a query-method, as well as its return type have to be typehinted.\nSupported built-in types are \u003Ccode\u003Estring\u003C\/code\u003E, \u003Ccode\u003Ebool\u003C\/code\u003E, \u003Ccode\u003Eint\u003C\/code\u003E and \u003Ccode\u003Efloat\u003C\/code\u003E.\nYou can also typehint any type you registered with \u003Ccode\u003E@Graphql\\Type\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cp\u003EAdditionally, you can use \u003Ccode\u003Eid\u003C\/code\u003E, list (\u003Ccode\u003Eint[]\u003C\/code\u003E) and union (\u003Ccode\u003Eint|float\u003C\/code\u003E),\nbut for that you need an \u003Ccode\u003E@Graph\\ParamType\u003C\/code\u003E or \u003Ccode\u003E@Graph\\ReturnType\u003C\/code\u003E annotation for that.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["bundle","graphql","php","symfony"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-graphql-bundle_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_mini.png\u0022 alt=\u0022Avris GraphqlBundle\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ESimplify Graphql configuration using plain methods with typehints and annotations.\u003C\/p\u003E\n\u003Cp\u003EThis bundle is a wrapper on \u003Ccode\u003Ewebonyx\/graphql-php\u003C\/code\u003E.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_mini.png\u0022 alt=\u0022Avris GraphqlBundle\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ESimplify Graphql configuration using plain methods with typehints and annotations.\u003C\/p\u003E\n\u003Cp\u003EThis bundle is a wrapper on \u003Ccode\u003Ewebonyx\/graphql-php\u003C\/code\u003E.\u003C\/p\u003E\n\u003Ch3\u003EDisclaimer\u003C\/h3\u003E\n\u003Cp\u003EI\u2019m new to GraphQL, currently writing my first project using it.\nI\u2019m sure that many things are missing from the bundle and many assumptions I made are wrong,\nso please be understanding, and if possible help out with a pull request.\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-bash\u0022\u003E$ composer require avris\/graphql-bundle\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThen add a route:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-yaml\u0022\u003Eavris_graphql_main:\n    path: \u0027\/graph\u0027\n    controller: Avris\\GraphqlBundle\\Controller\\GraphqlController::main\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EExample\u003C\/h3\u003E\n\u003Cp\u003ELet\u2019s say you have the following type in your app:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E\u0026lt;?php\n\nnamespace App\\Entity;\n\nfinal class User\n{\n    \/\/ properties, constructor, etc.\n\n    private static $type = null;\n\n    final public static function type(): ObjectType\n    {\n        return static::$type ?: static::$type = static::buildType();\n    }\n\n    private static function buildType(): ObjectType\n    {\n        return new ObjectType([\n            \u0027name\u0027 =\u0026gt; \u0027User\u0027,\n            \u0027fields\u0027 =\u0026gt; [\n                \u0027id\u0027 =\u0026gt; [\n                    \u0027type\u0027 =\u0026gt; Type::id(),\n                    \u0027resolve\u0027 =\u0026gt; function (User $user) {\n                        return $user-\u0026gt;getId();\n                    },\n                ],\n                \u0027email\u0027 =\u0026gt; [\n                    \u0027type\u0027 =\u0026gt; Type::string(),\n                    \u0027resolve\u0027 =\u0026gt; function (User $user) {\n                        return $user-\u0026gt;getEmail();\n                    },\n                ],\n            ],\n        ]);\n    }\n\n    public function getId(): string\n    {\n        return $this-\u0026gt;id;\n    }\n\n    public function getEmail(): string\n    {\n        return $this-\u0026gt;email;\n    }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd the following GraphQL schema:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003Enew Schema([\n    \u0027query\u0027 =\u0026gt; new ObjectType([\n        \u0027name\u0027 =\u0026gt; \u0027Query\u0027,\n        \u0027fields\u0027 =\u0026gt; [\n            \u0027hello\u0027 =\u0026gt; [\n                \u0027type\u0027 =\u0026gt; Type::string(),\n                \u0027resolve\u0027 =\u0026gt; function () {\n                    return \u0027GraphQL API\u0027;\n                }\n            ],\n            \u0027user\u0027 =\u0026gt; [\n                \u0027type\u0027 =\u0026gt; User::type(),\n                \u0027args\u0027 =\u0026gt; [\n                    \u0027id\u0027 =\u0026gt; [\u0027type\u0027 =\u0026gt; Type::nonNull(Type::id())],\n                ],\n                \u0027resolve\u0027 =\u0026gt; $this-\u0026gt;accessControl-\u0026gt;guard(function ($root, $args) {\n                    return $this-\u0026gt;repository-\u0026gt;find($args[\u0027id\u0027]);\n                }, \u0027ROLE_ADMIN\u0027),\n            ],\n            \u0027currentUser\u0027 =\u0026gt; [\n                \u0027type\u0027 =\u0026gt; User::type(),\n                \u0027resolve\u0027 =\u0026gt; function ($root, $args) {\n                    $user = $this-\u0026gt;tokenStorage-\u0026gt;getToken()-\u0026gt;getUser();\n\n                    return $user instanceof User ? $user : null;\n                },\n            ],\n            \u0027jwt\u0027 =\u0026gt; [\n                \u0027type\u0027 =\u0026gt; Type::string(),\n                \u0027args\u0027 =\u0026gt; [\n                    \u0027login\u0027 =\u0026gt; Type::nonNull(Type::string()),\n                    \u0027password\u0027 =\u0026gt; Type::nonNull(Type::string()),\n                ],\n                \u0027resolve\u0027 =\u0026gt; function ($root, $args) {\n                    $user = $this-\u0026gt;repository-\u0026gt;findOneBy([\u0027email\u0027 =\u0026gt; $args[\u0027login\u0027]]);\n\n                    if (!$user || !$this-\u0026gt;encoder-\u0026gt;isPasswordValid($user, $args[\u0027password\u0027])) {\n                        return null;\n                    }\n\n                    return (string) $this-\u0026gt;jwtManager-\u0026gt;issue($user);\n                },\n            ]\n        ],\n    ]),\n    \u0027mutation\u0027 =\u0026gt; new ObjectType([\n        \u0027name\u0027 =\u0026gt; \u0027Mutation\u0027,\n        \u0027fields\u0027 =\u0026gt; [\n            \u0027userRegistered\u0027 =\u0026gt; [\n                \u0027type\u0027 =\u0026gt; User::type(),\n                \u0027args\u0027 =\u0026gt; [\n                    \u0027email\u0027 =\u0026gt; Type::nonNull(Type::string()),\n                    \u0027password\u0027 =\u0026gt; Type::nonNull(Type::string()),\n                ],\n                \u0027resolve\u0027 =\u0026gt; function ($root, $args) {\n                    return $this-\u0026gt;eventDispatcher-\u0026gt;dispatch(new UserRegisteredEvent($args[\u0027email\u0027], $args[\u0027password\u0027]));\n                },\n            ]\n        ],\n    ]),\n]);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EUsing this bundle, you can rewrite the entity\/type like this:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E\u0026lt;?php\n\nnamespace App\\Entity;\n\nuse Avris\\GraphqlBundle\\Annotation as Graphql;\n\n\/**\n * @Graphql\\Type\n *\/\nfinal class User\n{\n    \/\/ properties, constructor, etc.\n\n    \/**\n     * @Graphql\\Query\n     *\/\n    public function getId(): string\n    {\n        return $this-\u0026gt;id;\n    }\n\n    \/**\n     * @Graphql\\Query\n     *\/\n    public function getEmail(): string\n    {\n        return $this-\u0026gt;email;\n    }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd your schema\/controllers like this:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E\u0026lt;?php\n\nnamespace App\\Controller;\n\nuse Avris\\GraphqlBundle\\Annotation as Graphql;\nuse Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController;\n\nfinal class HomeController extends AbstractController\n{\n    \/**\n     * @Graphql\\Query\n     *\/\n    public function hello(): string\n    {\n        return \u0027GraphQL API\u0027;\n    }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Eand:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E\u0026lt;?php\n\nnamespace App\\Controller;\n\nuse Avris\\GraphqlBundle\\Annotation as Graphql;\nuse App\\Entity\\User;\nuse App\\Events\\UserRegistered;\n\nfinal class UserController extends BaseController\n{\n    \/\/ dependecies...\n\n    \/**\n     * @Graphql\\Query\n     * @Graphql\\Security(\u0022ROLE_ADMIN\u0022)\n     * @Graphql\\ParamType(\u0022id\u0022, var=\u0022id\u0022)\n     *\/\n    public function user(string $id): ?User\n    {\n        return $this-\u0026gt;repository-\u0026gt;find($id);\n    }\n\n    \/**\n     * @Graphql\\Query\n     *\/\n    public function currentUser(): ?User\n    {\n        $user = $this-\u0026gt;tokenStorage-\u0026gt;getToken()-\u0026gt;getUser();\n\n        return $user instanceof User ? $user : null;\n    }\n\n    \/**\n     * @Graphql\\Query\n     *\/\n    public function jwt(string $login, string $password): ?string\n    {\n        $user = $this-\u0026gt;repository-\u0026gt;findOneBy([\u0027email\u0027 =\u0026gt; $login]);\n\n        if (!$user || !$this-\u0026gt;encoder-\u0026gt;isPasswordValid($user, $password)) {\n            return null;\n        }\n\n        return (string) $this-\u0026gt;jwtManager-\u0026gt;issue($user);\n    }\n\n    \/**\n     * @Graphql\\Query(\u0022mutation\u0022)\n     *\/\n    public function userRegistered(string $email, string $password): User\n    {\n        return $this-\u0026gt;eventDispatcher-\u0026gt;dispatch(new UserRegisteredEvent($email, $password));\n    }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThe bundle will parse all the classes in \u003Ccode\u003Esrc\/Controller\u003C\/code\u003E and \u003Ccode\u003Esrc\/Entity\u003C\/code\u003E\n(that list can be configured in the config key \u003Ccode\u003Eavris_graphql.load\u003C\/code\u003E)\nlooking for the \u003Ccode\u003EGraphql\u003C\/code\u003E annotations.\u003C\/p\u003E\n\u003Cp\u003EAll parameters of a query-method, as well as its return type have to be typehinted.\nSupported built-in types are \u003Ccode\u003Estring\u003C\/code\u003E, \u003Ccode\u003Ebool\u003C\/code\u003E, \u003Ccode\u003Eint\u003C\/code\u003E and \u003Ccode\u003Efloat\u003C\/code\u003E.\nYou can also typehint any type you registered with \u003Ccode\u003E@Graphql\\Type\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cp\u003EAdditionally, you can use \u003Ccode\u003Eid\u003C\/code\u003E, list (\u003Ccode\u003Eint[]\u003C\/code\u003E) and union (\u003Ccode\u003Eint|float\u003C\/code\u003E),\nbut for that you need an \u003Ccode\u003E@Graph\\ParamType\u003C\/code\u003E or \u003Ccode\u003E@Graph\\ReturnType\u003C\/code\u003E annotation for that.\u003C\/p\u003E","words":680,"readTime":3,"lang":"en"}}}}}