All the GPU CRUD updates

This commit is contained in:
Timothy Warren 2022-10-13 22:26:33 -04:00
parent 5188f80567
commit 2c2ef3f3b9
23 changed files with 630 additions and 142 deletions

217
composer.lock generated
View File

@ -317,16 +317,16 @@
}, },
{ {
"name": "doctrine/common", "name": "doctrine/common",
"version": "3.4.2", "version": "3.4.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/common.git", "url": "https://github.com/doctrine/common.git",
"reference": "609c3a7b6af49a7b4b13945ca2fdf4af801946af" "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/common/zipball/609c3a7b6af49a7b4b13945ca2fdf4af801946af", "url": "https://api.github.com/repos/doctrine/common/zipball/8b5e5650391f851ed58910b3e3d48a71062eeced",
"reference": "609c3a7b6af49a7b4b13945ca2fdf4af801946af", "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -388,7 +388,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/common/issues", "issues": "https://github.com/doctrine/common/issues",
"source": "https://github.com/doctrine/common/tree/3.4.2" "source": "https://github.com/doctrine/common/tree/3.4.3"
}, },
"funding": [ "funding": [
{ {
@ -404,7 +404,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-09-28T14:20:50+00:00" "time": "2022-10-09T11:47:59+00:00"
}, },
{ {
"name": "doctrine/dbal", "name": "doctrine/dbal",
@ -1198,16 +1198,16 @@
}, },
{ {
"name": "doctrine/orm", "name": "doctrine/orm",
"version": "2.13.2", "version": "2.13.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/orm.git", "url": "https://github.com/doctrine/orm.git",
"reference": "a8b02fd70fa777ca8278b9604fdef75c15c6a12f" "reference": "e750360bd52b080c4cbaaee1b48b80f7dc873b36"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/orm/zipball/a8b02fd70fa777ca8278b9604fdef75c15c6a12f", "url": "https://api.github.com/repos/doctrine/orm/zipball/e750360bd52b080c4cbaaee1b48b80f7dc873b36",
"reference": "a8b02fd70fa777ca8278b9604fdef75c15c6a12f", "reference": "e750360bd52b080c4cbaaee1b48b80f7dc873b36",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1292,9 +1292,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/orm/issues", "issues": "https://github.com/doctrine/orm/issues",
"source": "https://github.com/doctrine/orm/tree/2.13.2" "source": "https://github.com/doctrine/orm/tree/2.13.3"
}, },
"time": "2022-09-22T13:36:43+00:00" "time": "2022-10-07T06:37:17+00:00"
}, },
{ {
"name": "doctrine/persistence", "name": "doctrine/persistence",
@ -2287,16 +2287,16 @@
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v6.1.5", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "17524a64ebcfab68d237bbed247e9a9917747096" "reference": "7fa3b9cf17363468795e539231a5c91b02b608fc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/17524a64ebcfab68d237bbed247e9a9917747096", "url": "https://api.github.com/repos/symfony/console/zipball/7fa3b9cf17363468795e539231a5c91b02b608fc",
"reference": "17524a64ebcfab68d237bbed247e9a9917747096", "reference": "7fa3b9cf17363468795e539231a5c91b02b608fc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2363,7 +2363,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v6.1.5" "source": "https://github.com/symfony/console/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -2379,7 +2379,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-09-03T14:24:42+00:00" "time": "2022-10-07T08:04:03+00:00"
}, },
{ {
"name": "symfony/dependency-injection", "name": "symfony/dependency-injection",
@ -2537,16 +2537,16 @@
}, },
{ {
"name": "symfony/doctrine-bridge", "name": "symfony/doctrine-bridge",
"version": "v6.1.5", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/doctrine-bridge.git", "url": "https://github.com/symfony/doctrine-bridge.git",
"reference": "ca0fdecd106f81d6bd7f123e77b5830c558e1148" "reference": "5db7ac51c40d03d576b2696a6b55975e53a3dfd5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/ca0fdecd106f81d6bd7f123e77b5830c558e1148", "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/5db7ac51c40d03d576b2696a6b55975e53a3dfd5",
"reference": "ca0fdecd106f81d6bd7f123e77b5830c558e1148", "reference": "5db7ac51c40d03d576b2696a6b55975e53a3dfd5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2632,7 +2632,7 @@
"description": "Provides integration for Doctrine with various Symfony components", "description": "Provides integration for Doctrine with various Symfony components",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/doctrine-bridge/tree/v6.1.5" "source": "https://github.com/symfony/doctrine-bridge/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -2648,20 +2648,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-09-08T09:34:40+00:00" "time": "2022-10-10T09:34:31+00:00"
}, },
{ {
"name": "symfony/error-handler", "name": "symfony/error-handler",
"version": "v6.1.3", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/error-handler.git", "url": "https://github.com/symfony/error-handler.git",
"reference": "736e42db3fd586d91820355988698e434e1d8419" "reference": "49f718e41f1b6f0fd5730895ca5b1c37defd828d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/736e42db3fd586d91820355988698e434e1d8419", "url": "https://api.github.com/repos/symfony/error-handler/zipball/49f718e41f1b6f0fd5730895ca5b1c37defd828d",
"reference": "736e42db3fd586d91820355988698e434e1d8419", "reference": "49f718e41f1b6f0fd5730895ca5b1c37defd828d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2703,7 +2703,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code", "description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/error-handler/tree/v6.1.3" "source": "https://github.com/symfony/error-handler/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -2719,7 +2719,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-07-29T07:42:06+00:00" "time": "2022-10-07T08:04:03+00:00"
}, },
{ {
"name": "symfony/event-dispatcher", "name": "symfony/event-dispatcher",
@ -3114,16 +3114,16 @@
}, },
{ {
"name": "symfony/framework-bundle", "name": "symfony/framework-bundle",
"version": "v6.1.5", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/framework-bundle.git", "url": "https://github.com/symfony/framework-bundle.git",
"reference": "be33f4a8b58e40c3ad876537ece359af374eb030" "reference": "b79e5866a8293de00c8436836c2038ec31916ee7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/framework-bundle/zipball/be33f4a8b58e40c3ad876537ece359af374eb030", "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/b79e5866a8293de00c8436836c2038ec31916ee7",
"reference": "be33f4a8b58e40c3ad876537ece359af374eb030", "reference": "b79e5866a8293de00c8436836c2038ec31916ee7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3245,7 +3245,7 @@
"description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/framework-bundle/tree/v6.1.5" "source": "https://github.com/symfony/framework-bundle/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -3261,20 +3261,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-09-29T11:04:32+00:00" "time": "2022-10-07T08:04:03+00:00"
}, },
{ {
"name": "symfony/http-foundation", "name": "symfony/http-foundation",
"version": "v6.1.5", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-foundation.git", "url": "https://github.com/symfony/http-foundation.git",
"reference": "90f5d9726942db69490fe467a3acb5e7154fd555" "reference": "3ae8e9c57155fc48930493a629da293b32efbde0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/90f5d9726942db69490fe467a3acb5e7154fd555", "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3ae8e9c57155fc48930493a629da293b32efbde0",
"reference": "90f5d9726942db69490fe467a3acb5e7154fd555", "reference": "3ae8e9c57155fc48930493a629da293b32efbde0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3320,7 +3320,7 @@
"description": "Defines an object-oriented layer for the HTTP specification", "description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-foundation/tree/v6.1.5" "source": "https://github.com/symfony/http-foundation/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -3336,20 +3336,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-09-17T07:55:45+00:00" "time": "2022-10-02T08:30:52+00:00"
}, },
{ {
"name": "symfony/http-kernel", "name": "symfony/http-kernel",
"version": "v6.1.5", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-kernel.git", "url": "https://github.com/symfony/http-kernel.git",
"reference": "bf433ef30c2dfbf1f47449d5dce8be243e8a0012" "reference": "102f99bf81799e93f61b9a73b2f38b309c587a94"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/bf433ef30c2dfbf1f47449d5dce8be243e8a0012", "url": "https://api.github.com/repos/symfony/http-kernel/zipball/102f99bf81799e93f61b9a73b2f38b309c587a94",
"reference": "bf433ef30c2dfbf1f47449d5dce8be243e8a0012", "reference": "102f99bf81799e93f61b9a73b2f38b309c587a94",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3430,7 +3430,7 @@
"description": "Provides a structured process for converting a Request into a Response", "description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-kernel/tree/v6.1.5" "source": "https://github.com/symfony/http-kernel/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -3446,7 +3446,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-09-30T08:10:57+00:00" "time": "2022-10-12T07:48:47+00:00"
}, },
{ {
"name": "symfony/maker-bundle", "name": "symfony/maker-bundle",
@ -4501,16 +4501,16 @@
}, },
{ {
"name": "symfony/property-info", "name": "symfony/property-info",
"version": "v6.1.3", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/property-info.git", "url": "https://github.com/symfony/property-info.git",
"reference": "2fc363ed2f2b5d3b231ed0824e066d140d3fd1d8" "reference": "f28d0db9d2687f81d68d0dc6b2e42817647f5d64"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/property-info/zipball/2fc363ed2f2b5d3b231ed0824e066d140d3fd1d8", "url": "https://api.github.com/repos/symfony/property-info/zipball/f28d0db9d2687f81d68d0dc6b2e42817647f5d64",
"reference": "2fc363ed2f2b5d3b231ed0824e066d140d3fd1d8", "reference": "f28d0db9d2687f81d68d0dc6b2e42817647f5d64",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4570,7 +4570,7 @@
"validator" "validator"
], ],
"support": { "support": {
"source": "https://github.com/symfony/property-info/tree/v6.1.3" "source": "https://github.com/symfony/property-info/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -4586,7 +4586,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-07-19T08:34:05+00:00" "time": "2022-10-07T08:04:03+00:00"
}, },
{ {
"name": "symfony/routing", "name": "symfony/routing",
@ -4678,16 +4678,16 @@
}, },
{ {
"name": "symfony/security-core", "name": "symfony/security-core",
"version": "v6.1.5", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/security-core.git", "url": "https://github.com/symfony/security-core.git",
"reference": "ddba1c08f084ac851c41eab99243db7c42ebf189" "reference": "e42fb611d1a36e6e1e34f8cd715cea108a39cad5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/security-core/zipball/ddba1c08f084ac851c41eab99243db7c42ebf189", "url": "https://api.github.com/repos/symfony/security-core/zipball/e42fb611d1a36e6e1e34f8cd715cea108a39cad5",
"reference": "ddba1c08f084ac851c41eab99243db7c42ebf189", "reference": "e42fb611d1a36e6e1e34f8cd715cea108a39cad5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4749,7 +4749,7 @@
"description": "Symfony Security Component - Core Library", "description": "Symfony Security Component - Core Library",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/security-core/tree/v6.1.5" "source": "https://github.com/symfony/security-core/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -4765,7 +4765,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-09-17T07:55:45+00:00" "time": "2022-10-02T08:30:52+00:00"
}, },
{ {
"name": "symfony/security-csrf", "name": "symfony/security-csrf",
@ -4987,16 +4987,16 @@
}, },
{ {
"name": "symfony/string", "name": "symfony/string",
"version": "v6.1.5", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/string.git", "url": "https://github.com/symfony/string.git",
"reference": "17c08b068176996a1d7db8d00ffae3c248267016" "reference": "7e7e0ff180d4c5a6636eaad57b65092014b61864"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/17c08b068176996a1d7db8d00ffae3c248267016", "url": "https://api.github.com/repos/symfony/string/zipball/7e7e0ff180d4c5a6636eaad57b65092014b61864",
"reference": "17c08b068176996a1d7db8d00ffae3c248267016", "reference": "7e7e0ff180d4c5a6636eaad57b65092014b61864",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5052,7 +5052,7 @@
"utf8" "utf8"
], ],
"support": { "support": {
"source": "https://github.com/symfony/string/tree/v6.1.5" "source": "https://github.com/symfony/string/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -5068,20 +5068,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-09-02T08:05:20+00:00" "time": "2022-10-10T09:34:31+00:00"
}, },
{ {
"name": "symfony/translation", "name": "symfony/translation",
"version": "v6.1.4", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/translation.git", "url": "https://github.com/symfony/translation.git",
"reference": "45d0f5bb8df7255651ca91c122fab604e776af03" "reference": "e6cd330e5a072518f88d65148f3f165541807494"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/45d0f5bb8df7255651ca91c122fab604e776af03", "url": "https://api.github.com/repos/symfony/translation/zipball/e6cd330e5a072518f88d65148f3f165541807494",
"reference": "45d0f5bb8df7255651ca91c122fab604e776af03", "reference": "e6cd330e5a072518f88d65148f3f165541807494",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5148,7 +5148,7 @@
"description": "Provides tools to internationalize your application", "description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/translation/tree/v6.1.4" "source": "https://github.com/symfony/translation/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -5164,7 +5164,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-02T16:17:38+00:00" "time": "2022-10-07T08:04:03+00:00"
}, },
{ {
"name": "symfony/translation-contracts", "name": "symfony/translation-contracts",
@ -5249,16 +5249,16 @@
}, },
{ {
"name": "symfony/twig-bridge", "name": "symfony/twig-bridge",
"version": "v6.1.4", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/twig-bridge.git", "url": "https://github.com/symfony/twig-bridge.git",
"reference": "ec8da630a439a233817412fca93d14aa1813cc5d" "reference": "368e9bac2dbaed85d943745b521077f8101b599d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/twig-bridge/zipball/ec8da630a439a233817412fca93d14aa1813cc5d", "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/368e9bac2dbaed85d943745b521077f8101b599d",
"reference": "ec8da630a439a233817412fca93d14aa1813cc5d", "reference": "368e9bac2dbaed85d943745b521077f8101b599d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5351,7 +5351,7 @@
"description": "Provides integration for Twig with various Symfony components", "description": "Provides integration for Twig with various Symfony components",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/twig-bridge/tree/v6.1.4" "source": "https://github.com/symfony/twig-bridge/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -5367,7 +5367,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-04T19:19:00+00:00" "time": "2022-10-12T05:10:31+00:00"
}, },
{ {
"name": "symfony/twig-bundle", "name": "symfony/twig-bundle",
@ -5457,16 +5457,16 @@
}, },
{ {
"name": "symfony/validator", "name": "symfony/validator",
"version": "v6.1.5", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/validator.git", "url": "https://github.com/symfony/validator.git",
"reference": "7d7724f550e0f657a591831a7c31e25678ff8779" "reference": "e5589882403e1e19774d7c5ffb65d9c6466d216c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/validator/zipball/7d7724f550e0f657a591831a7c31e25678ff8779", "url": "https://api.github.com/repos/symfony/validator/zipball/e5589882403e1e19774d7c5ffb65d9c6466d216c",
"reference": "7d7724f550e0f657a591831a7c31e25678ff8779", "reference": "e5589882403e1e19774d7c5ffb65d9c6466d216c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5545,7 +5545,7 @@
"description": "Provides tools to validate values", "description": "Provides tools to validate values",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/validator/tree/v6.1.5" "source": "https://github.com/symfony/validator/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -5561,20 +5561,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-09-17T07:55:45+00:00" "time": "2022-10-02T08:30:52+00:00"
}, },
{ {
"name": "symfony/var-dumper", "name": "symfony/var-dumper",
"version": "v6.1.5", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/var-dumper.git", "url": "https://github.com/symfony/var-dumper.git",
"reference": "d0833493fb2413a86f522fb54a1896a7718e98ec" "reference": "0f0adde127f24548e23cbde83bcaeadc491c551f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/d0833493fb2413a86f522fb54a1896a7718e98ec", "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0f0adde127f24548e23cbde83bcaeadc491c551f",
"reference": "d0833493fb2413a86f522fb54a1896a7718e98ec", "reference": "0f0adde127f24548e23cbde83bcaeadc491c551f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5633,7 +5633,7 @@
"dump" "dump"
], ],
"support": { "support": {
"source": "https://github.com/symfony/var-dumper/tree/v6.1.5" "source": "https://github.com/symfony/var-dumper/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -5649,7 +5649,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-09-08T09:34:40+00:00" "time": "2022-10-07T08:04:03+00:00"
}, },
{ {
"name": "symfony/var-exporter", "name": "symfony/var-exporter",
@ -5725,16 +5725,16 @@
}, },
{ {
"name": "symfony/yaml", "name": "symfony/yaml",
"version": "v6.1.4", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/yaml.git", "url": "https://github.com/symfony/yaml.git",
"reference": "86ee4d8fa594ed45e40d86eedfda1bcb66c8d919" "reference": "66c6b0cf52b00f74614a2cf7ae7db08ea1095931"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/86ee4d8fa594ed45e40d86eedfda1bcb66c8d919", "url": "https://api.github.com/repos/symfony/yaml/zipball/66c6b0cf52b00f74614a2cf7ae7db08ea1095931",
"reference": "86ee4d8fa594ed45e40d86eedfda1bcb66c8d919", "reference": "66c6b0cf52b00f74614a2cf7ae7db08ea1095931",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5779,7 +5779,7 @@
"description": "Loads and dumps YAML files", "description": "Loads and dumps YAML files",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/yaml/tree/v6.1.4" "source": "https://github.com/symfony/yaml/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -5795,7 +5795,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-02T16:17:38+00:00" "time": "2022-10-07T08:04:03+00:00"
}, },
{ {
"name": "twig/twig", "name": "twig/twig",
@ -6471,12 +6471,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/Roave/SecurityAdvisories.git", "url": "https://github.com/Roave/SecurityAdvisories.git",
"reference": "b0d3e99ce9c8ec237338a70277dd409ffcf6cedc" "reference": "2e0b4657407c945bc54a1d73910fcf81fca58ec6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/b0d3e99ce9c8ec237338a70277dd409ffcf6cedc", "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/2e0b4657407c945bc54a1d73910fcf81fca58ec6",
"reference": "b0d3e99ce9c8ec237338a70277dd409ffcf6cedc", "reference": "2e0b4657407c945bc54a1d73910fcf81fca58ec6",
"shasum": "" "shasum": ""
}, },
"conflict": { "conflict": {
@ -6527,7 +6527,7 @@
"cesnet/simplesamlphp-module-proxystatistics": "<3.1", "cesnet/simplesamlphp-module-proxystatistics": "<3.1",
"codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeception/codeception": "<3.1.3|>=4,<4.1.22",
"codeigniter/framework": "<=3.0.6", "codeigniter/framework": "<=3.0.6",
"codeigniter4/framework": "<4.1.9", "codeigniter4/framework": "<4.2.7",
"codeigniter4/shield": "= 1.0.0-beta", "codeigniter4/shield": "= 1.0.0-beta",
"codiad/codiad": "<=2.8.4", "codiad/codiad": "<=2.8.4",
"composer/composer": "<1.10.26|>=2-alpha.1,<2.2.12|>=2.3,<2.3.5", "composer/composer": "<1.10.26|>=2-alpha.1,<2.2.12|>=2.3,<2.3.5",
@ -6690,6 +6690,9 @@
"matyhtf/framework": "<3.0.6", "matyhtf/framework": "<3.0.6",
"mautic/core": "<4.3|= 2.13.1", "mautic/core": "<4.3|= 2.13.1",
"mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35",
"melisplatform/melis-asset-manager": "<5.0.1",
"melisplatform/melis-cms": "<5.0.1",
"melisplatform/melis-front": "<5.0.1",
"mezzio/mezzio-swoole": "<3.7|>=4,<4.3", "mezzio/mezzio-swoole": "<3.7|>=4,<4.3",
"microweber/microweber": "<=1.3.1", "microweber/microweber": "<=1.3.1",
"miniorange/miniorange-saml": "<1.4.3", "miniorange/miniorange-saml": "<1.4.3",
@ -6987,7 +6990,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-10-05T15:07:13+00:00" "time": "2022-10-11T21:05:01+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",
@ -8093,16 +8096,16 @@
}, },
{ {
"name": "symfony/web-profiler-bundle", "name": "symfony/web-profiler-bundle",
"version": "v6.1.5", "version": "v6.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/web-profiler-bundle.git", "url": "https://github.com/symfony/web-profiler-bundle.git",
"reference": "7e9381a776881a32e59d8072beac6859e2ddbbc7" "reference": "45d05cd8e967fd06bb1f66f748ed308c00674d32"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/7e9381a776881a32e59d8072beac6859e2ddbbc7", "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/45d05cd8e967fd06bb1f66f748ed308c00674d32",
"reference": "7e9381a776881a32e59d8072beac6859e2ddbbc7", "reference": "45d05cd8e967fd06bb1f66f748ed308c00674d32",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -8151,7 +8154,7 @@
"description": "Provides a development tool that gives detailed information about the execution of any request", "description": "Provides a development tool that gives detailed information about the execution of any request",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/web-profiler-bundle/tree/v6.1.5" "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.1.6"
}, },
"funding": [ "funding": [
{ {
@ -8167,7 +8170,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-31T08:17:45+00:00" "time": "2022-10-02T08:30:52+00:00"
}, },
{ {
"name": "theseer/tokenizer", "name": "theseer/tokenizer",

View File

@ -32,3 +32,6 @@ services:
# App\Service\ExampleService: # App\Service\ExampleService:
# arguments: # arguments:
# $someArgument: 'some_value' # $someArgument: 'some_value'
_instanceof:
App\Types\AbstractEnumType:
tags: [ 'app.doctrine_enum_type' ]

View File

@ -0,0 +1,84 @@
<?php
namespace App\Controller;
use App\Entity\BrandCategory;
use App\Form\BrandCategoryType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/brand/category')]
class BrandCategoryController extends AbstractController
{
#[Route('/', name: 'brand-category_index', methods: ['GET'])]
public function index(EntityManagerInterface $entityManager): Response
{
$brandCategories = $entityManager
->getRepository(BrandCategory::class)
->findAll();
return $this->render('brand_category/index.html.twig', [
'brand_categories' => $brandCategories,
]);
}
#[Route('/new', name: 'brand-category_new', methods: ['GET', 'POST'])]
public function new(Request $request, EntityManagerInterface $entityManager): Response
{
$brandCategory = new BrandCategory();
$form = $this->createForm(BrandCategoryType::class, $brandCategory);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->persist($brandCategory);
$entityManager->flush();
return $this->redirectToRoute('brand-category_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('brand_category/new.html.twig', [
'brand_category' => $brandCategory,
'form' => $form,
]);
}
#[Route('/{name}', name: 'brand-category_show', methods: ['GET'])]
public function show(BrandCategory $brandCategory): Response
{
return $this->render('brand_category/show.html.twig', [
'brand_category' => $brandCategory,
]);
}
#[Route('/{name}/edit', name: 'brand-category_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, BrandCategory $brandCategory, EntityManagerInterface $entityManager): Response
{
$form = $this->createForm(BrandCategoryType::class, $brandCategory);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->flush();
return $this->redirectToRoute('brand-category_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('brand_category/edit.html.twig', [
'brand_category' => $brandCategory,
'form' => $form,
]);
}
#[Route('/{name}', name: 'brand-category_delete', methods: ['POST'])]
public function delete(Request $request, BrandCategory $brandCategory, EntityManagerInterface $entityManager): Response
{
if ($this->isCsrfTokenValid('delete'.$brandCategory->getName(), $request->request->get('_token'))) {
$entityManager->remove($brandCategory);
$entityManager->flush();
}
return $this->redirectToRoute('brand_category_index', [], Response::HTTP_SEE_OTHER);
}
}

View File

@ -2,6 +2,7 @@
namespace App\Entity; namespace App\Entity;
use App\Repository\BrandRepository;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;

View File

@ -15,37 +15,37 @@ trait CameraTrait
#[ORM\ManyToOne(targetEntity: 'CameraType')] #[ORM\ManyToOne(targetEntity: 'CameraType')]
#[ORM\JoinColumn(name: 'type_id', referencedColumnName: 'id', nullable: FALSE)] #[ORM\JoinColumn(name: 'type_id', referencedColumnName: 'id', nullable: FALSE)]
private readonly CameraType $type; private CameraType $type;
#[ORM\Column(name: 'brand', type: 'string', length: 64, nullable: FALSE)] #[ORM\Column(name: 'brand', type: 'string', length: 64, nullable: FALSE)]
private readonly string $brand; private string $brand;
#[ORM\Column(name: 'mount', type: 'string', length: 32, nullable: FALSE)] #[ORM\Column(name: 'mount', type: 'string', length: 32, nullable: FALSE)]
private readonly string $mount; private string $mount;
#[ORM\Column(name: 'model', type: 'string', length: 255, nullable: FALSE)] #[ORM\Column(name: 'model', type: 'string', length: 255, nullable: FALSE)]
private readonly string $model; private string $model;
#[ORM\Column(name: 'is_digital', type: 'boolean', nullable: FALSE)] #[ORM\Column(name: 'is_digital', type: 'boolean', nullable: FALSE)]
private readonly bool $isDigital; private bool $isDigital;
#[ORM\Column(name: 'crop_factor', type: 'decimal', precision: 10, scale: 0, nullable: FALSE)] #[ORM\Column(name: 'crop_factor', type: 'decimal', precision: 10, scale: 0, nullable: FALSE)]
private string $cropFactor = '1.0'; private string $cropFactor = '1.0';
#[ORM\Column(name: 'is_working', type: 'boolean', nullable: FALSE)] #[ORM\Column(name: 'is_working', type: 'boolean', nullable: FALSE)]
private readonly bool $isWorking; private bool $isWorking;
#[ORM\Column(name: 'notes', type: 'text', nullable: TRUE)] #[ORM\Column(name: 'notes', type: 'text', nullable: TRUE)]
private readonly ?string $notes; private ?string $notes = null;
#[ORM\Column(name: 'serial', type: 'string', length: 20, nullable: FALSE)] #[ORM\Column(name: 'serial', type: 'string', length: 20, nullable: FALSE)]
private readonly string $serial; private string $serial;
#[ORM\Column(name: 'formerly_owned', type: 'boolean', nullable: FALSE)] #[ORM\Column(name: 'formerly_owned', type: 'boolean', nullable: FALSE)]
private bool $formerlyOwned = FALSE; private bool $formerlyOwned = FALSE;
#[ORM\Column(name: 'battery_type', type: 'string', nullable: TRUE)] #[ORM\Column(name: 'battery_type', type: 'string', nullable: TRUE)]
private readonly ?string $batteryType; private ?string $batteryType;
#[ORM\Column(name: 'film_format', type: 'string', nullable: TRUE)] #[ORM\Column(name: 'film_format', type: 'string', nullable: TRUE)]
private ?string $filmFormat = '135'; private ?string $filmFormat = '135';
@ -142,7 +142,7 @@ trait CameraTrait
return $this->isWorking; return $this->isWorking;
} }
public function setNotes(string $notes): self public function setNotes(?string $notes): self
{ {
$this->notes = $notes; $this->notes = $notes;

39
src/Entity/Cpu.php Normal file
View File

@ -0,0 +1,39 @@
<?php declare(strict_types=1);
namespace App\Entity;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Table(name: 'cpu', schema: 'collection')]
#[ORM\Entity]
class Cpu {
use GetSetTrait;
#[ORM\Column(name: 'id', type: 'integer', nullable: FALSE)]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'IDENTITY')]
private int $id;
#[ORM\ManyToOne(targetEntity: 'Brand')]
#[ORM\OrderBy(['name' => 'asc'])]
#[ORM\JoinColumn(name: 'brand_id', referencedColumnName: 'id', nullable: FALSE)]
private Brand $brand;
public function getId(): ?int
{
return $this->id;
}
public function getBrand(): ?Brand
{
return $this->brand;
}
public function setBrand(?Brand $brand): self
{
$this->brand = $brand;
return $this;
}
}

View File

@ -2,6 +2,8 @@
namespace App\Entity; namespace App\Entity;
use App\Enum\SlotKeyEnum;
use App\Types\SlotKeyEnumType;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
@ -24,7 +26,7 @@ class Gpu
#[ORM\ManyToOne(targetEntity: 'GpuCore')] #[ORM\ManyToOne(targetEntity: 'GpuCore')]
#[ORM\OrderBy(['brand' => 'asc', 'name' => 'asc'])] #[ORM\OrderBy(['brand' => 'asc', 'name' => 'asc'])]
#[ORM\JoinColumn(name: 'gpu_core_id', referencedColumnName: 'id', nullable: TRUE)] #[ORM\JoinColumn(name: 'gpu_core_id', referencedColumnName: 'id', nullable: TRUE)]
private GpuCore $gpuCore; private ?GpuCore $gpuCore = null;
#[ORM\Column(name: 'reference_model_name', nullable: FALSE)] #[ORM\Column(name: 'reference_model_name', nullable: FALSE)]
private string $modelName; private string $modelName;
@ -37,8 +39,8 @@ class Gpu
#[ORM\Column(name: 'alternate_model_name', nullable: TRUE)] #[ORM\Column(name: 'alternate_model_name', nullable: TRUE)]
private ?string $alternateModelName = ''; private ?string $alternateModelName = '';
#[ORM\Column(name: 'card_key', nullable: TRUE)] #[ORM\Column(name: 'card_key', type: SlotKeyEnumType::NAME, nullable: TRUE, enumType: SlotKeyEnum::class)]
private ?string $cardKey; private $cardKey = SlotKeyEnum::PCIE_X16;
#[ORM\Column(name: 'bus_interface', nullable: TRUE)] #[ORM\Column(name: 'bus_interface', nullable: TRUE)]
private ?string $busInterface; private ?string $busInterface;
@ -56,7 +58,7 @@ class Gpu
private int $pcie8power = 0; private int $pcie8power = 0;
#[ORM\Column(name: 'tdp', nullable: TRUE)] #[ORM\Column(name: 'tdp', nullable: TRUE)]
private readonly ?int $tdp; private ?int $tdp = 0;
#[ORM\Column(name: 'base_clock', nullable: TRUE)] #[ORM\Column(name: 'base_clock', nullable: TRUE)]
private ?int $baseClock; private ?int $baseClock;
@ -150,12 +152,12 @@ class Gpu
return $this; return $this;
} }
public function getCardKey(): ?string public function getCardKey()
{ {
return $this->cardKey; return $this->cardKey;
} }
public function setCardKey(?string $cardKey): self public function setCardKey($cardKey): self
{ {
$this->cardKey = $cardKey; $this->cardKey = $cardKey;

View File

@ -22,25 +22,25 @@ class GpuCore implements Stringable
private Brand $brand; private Brand $brand;
#[ORM\Column(name: 'name')] #[ORM\Column(name: 'name')]
private readonly string $name; private string $name;
#[ORM\Column(name: 'variant', nullable: TRUE)] #[ORM\Column(name: 'variant', nullable: TRUE)]
private readonly ?string $variant; private ?string $variant;
#[ORM\Column(name: 'generation_name')] #[ORM\Column(name: 'generation_name')]
private readonly string $generationName; private string $generationName;
#[ORM\Column(name: 'generation_link', nullable: TRUE)] #[ORM\Column(name: 'generation_link', nullable: TRUE)]
private ?string $generationLink = ''; private ?string $generationLink = '';
#[ORM\Column(name: 'architecture')] #[ORM\Column(name: 'architecture')]
private readonly string $architecture; private string $architecture;
#[ORM\Column(name: 'architecture_link')] #[ORM\Column(name: 'architecture_link')]
private readonly string $architectureLink; private string $architectureLink;
#[ORM\Column(name: 'process_node', nullable: TRUE)] #[ORM\Column(name: 'process_node', nullable: TRUE)]
private readonly ?int $processNode; private ?int $processNode;
public function __toString(): string public function __toString(): string
{ {

7
src/Enum/CardBusEnum.php Normal file
View File

@ -0,0 +1,7 @@
<?php declare(strict_types=1);
namespace App\Enum;
enum CardBusEnum: string {
case PCIE_10_1 = 'PCIe 1.0 x1';
}

77
src/Enum/SlotKeyEnum.php Normal file
View File

@ -0,0 +1,77 @@
<?php declare(strict_types=1);
namespace App\Enum;
enum SlotKeyEnum: string {
case PCIE_X16 = 'PCIe x16';
case PCIE_X8 = 'PCIe x8';
case PCIE_X4 = 'PCIe x4';
case PCIE_X1 = 'PCIe x1';
case AGP_UNIVERSAL = 'Universal AGP';
case AGP_33V = '3.3V AGP';
case AGP_15V = '1.5V AGP';
case AGP_PRO_UNIVERSAL = 'Universal AGP Pro';
case AGP_PRO_33V = '3.3V AGP Pro';
case AGP_PRO_15V = '1.5V AGP Pro';
case PCI_5V = '5V 32-bit PCI';
case PCI_33V = '3.3V 32-bit PCI';
case PCI_UNIVERSAL = 'Universal 32-bit PCI';
case PCI_64_5V = '5V 64-bit PCI';
case PCI_64_33V = '3.3V 64-bit PCI';
case PCI_64_UNIVERSAL = 'Universal 64-bit PCI';
case PCI_X = 'PCI-X';
case VLB = 'VESA Local Bus';
case ISA_8 = '8-bit ISA';
case ISA_16 = '16-bit ISA';
case OLD1 = 'PCI 5V';
public static function getCases(): array
{
$cases = self::cases();
return array_map(static fn(UnitEnum $case) => $case->name, $cases);
}
public static function getValues(): array
{
$cases = self::cases();
return array_map(static fn(UnitEnum $case) => $case->value, $cases);
}
public static function getGroups(): array
{
return [
'PCI Express' => [
self::PCIE_X16,
self::PCIE_X8,
self::PCIE_X4,
self::PCIE_X1,
],
'AGP' => [
self::AGP_UNIVERSAL,
self::AGP_33V,
self::AGP_15V,
],
'PCI 32-bit' => [
self::PCI_UNIVERSAL,
self::PCI_5V,
self::PCI_33V,
],
'PCI 64-bit' => [
self::PCI_X,
self::PCI_64_UNIVERSAL,
self::PCI_64_33V,
self::PCI_64_5V,
],
'ISA' => [
self::ISA_16,
self::ISA_8,
self::VLB,
]
];
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace App\Form;
use App\Entity\BrandCategory;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class BrandCategoryType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('name')
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => BrandCategory::class,
]);
}
}

View File

@ -2,10 +2,12 @@
namespace App\Form; namespace App\Form;
use App\Enum\SlotKeyEnum;
use App\Entity\{Brand, Gpu, GpuCore}; use App\Entity\{Brand, Gpu, GpuCore};
use Doctrine\ORM\EntityRepository; use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\{AbstractType, FormBuilderInterface}; use Symfony\Component\Form\
{AbstractType, Extension\Core\Type\EnumType, FormBuilderInterface};
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
class GpuType extends AbstractType class GpuType extends AbstractType
@ -23,6 +25,9 @@ class GpuType extends AbstractType
->add('gpuCore', EntityType::class, [ ->add('gpuCore', EntityType::class, [
'class' => GpuCore::class, 'class' => GpuCore::class,
'query_builder' => static fn (EntityRepository $e) => $e->createQueryBuilder('gc')->orderBy('gc.brand', 'ASC')->orderBy('gc.name', 'ASC'), 'query_builder' => static fn (EntityRepository $e) => $e->createQueryBuilder('gc')->orderBy('gc.brand', 'ASC')->orderBy('gc.name', 'ASC'),
'placeholder' => 'Unknown',
'empty_data' => NULL,
'required' => false,
]) ])
->add('boardBrand', EntityType::class, [ ->add('boardBrand', EntityType::class, [
'class' => Brand::class, 'class' => Brand::class,
@ -32,13 +37,17 @@ class GpuType extends AbstractType
'required' => false, 'required' => false,
]) ])
->add('alternateModelName') ->add('alternateModelName')
->add('cardKey') ->add('cardKey', EnumType::class, [
'class' => SlotKeyEnum::class,
'choices' => SlotKeyEnum::getGroups(),
'choice_label' => fn (\UnitEnum $choice):string => $choice->value,
])
->add('busInterface') ->add('busInterface')
->add('slotWidth') ->add('slotWidth')
->add('molexPower', null, ['label' => 'Molex Power Connectors']) ->add('molexPower', null, ['label' => 'Molex Power Connectors'])
->add('pcie6power', null, ['label' => 'PCIe 6-pin Power Connectors']) ->add('pcie6power', null, ['label' => 'PCIe 6-pin Power Connectors'])
->add('pcie8power', null, ['label' => 'PCIe 8-pin Power Connectors']) ->add('pcie8power', null, ['label' => 'PCIe 8-pin Power Connectors'])
->add('tdp', null, ['label' => 'TDP (Watts)']) ->add('tdp', null, ['label' => 'TDP (Watts)', 'empty_data' => '0'])
->add('baseClock', null, ['label' => 'GPU Base Clock (MHz)']) ->add('baseClock', null, ['label' => 'GPU Base Clock (MHz)'])
->add('boostClock', null, ['label' => 'GPU Boost Clock (MHz)']) ->add('boostClock', null, ['label' => 'GPU Boost Clock (MHz)'])
->add('memoryClock', null, ['label' => 'Memory Speed (MHz)']) ->add('memoryClock', null, ['label' => 'Memory Speed (MHz)'])

View File

@ -11,12 +11,15 @@
namespace App; namespace App;
use App\Types\AbstractEnumType;
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Kernel as BaseKernel; use Symfony\Component\HttpKernel\Kernel as BaseKernel;
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
class Kernel extends BaseKernel class Kernel extends BaseKernel implements CompilerPassInterface
{ {
use MicroKernelTrait; use MicroKernelTrait;
@ -34,4 +37,19 @@ class Kernel extends BaseKernel
$routes->import('../config/{routes}/*.yaml'); $routes->import('../config/{routes}/*.yaml');
$routes->import('../config/{routes}.yaml'); $routes->import('../config/{routes}.yaml');
} }
public function process(ContainerBuilder $container)
{
$typesDefinition = [];
if ($container->hasParameter('doctrine.dbal.connection_factory.types')) {
$typesDefinition = $container->getParameter('doctrine.dbal.connection_factory.types');
}
$taggedEnums = $container->findTaggedServiceIds('app.doctrine_enum_type');
foreach ($taggedEnums as $enumType => $definition) {
$typesDefinition[$enumType::NAME] = ['class' => $enumType];
}
$container->setParameter('doctrine.dbal.connection_factory.types', $typesDefinition);
}
} }

View File

@ -0,0 +1,44 @@
<?php declare(strict_types=1);
namespace App\Types;
use BackedEnum;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;
abstract class AbstractEnumType extends Type
{
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
return 'TEXT';
}
public function convertToDatabaseValue($value, AbstractPlatform $platform): mixed
{
if (is_scalar($value))
{
return $value;
}
if ($value instanceof BackedEnum)
{
return $value->value;
}
return $value;
}
public function convertToPHPValue($value, AbstractPlatform $platform): mixed
{
if (false === enum_exists($this::getEnumsClass(), true))
{
throw new \LogicException("This class should be an enum");
}
$enum = $this::getEnumsClass();
return $enum::from($value);
}
abstract public static function getEnumsClass(): string;
}

View File

@ -0,0 +1,19 @@
<?php declare(strict_types=1);
namespace App\Types;
use App\Enum\CardBusEnum;
class CardBusEnumType extends AbstractEnumType {
public const NAME = 'cardBusEnum';
public static function getEnumsClass(): string
{
return CardBusEnum::class;
}
public function getName(): string
{
return self::NAME;
}
}

View File

@ -0,0 +1,19 @@
<?php declare(strict_types=1);
namespace App\Types;
use App\Enum\SlotKeyEnum;
class SlotKeyEnumType extends AbstractEnumType {
public const NAME = 'slotKeyEnum';
public static function getEnumsClass(): string
{
return SlotKeyEnum::class;
}
public function getName(): string
{
return self::NAME;
}
}

View File

@ -0,0 +1,30 @@
{% extends 'form.html.twig' %}
{% block title %}Edit Brand Category{% endblock %}
{% block form %}
<h2>Edit Brand Category</h2>
<div class="small callout">
<ul>
<li>
<a href="{{ path('brand-category_index') }}">Back to the list</a>
</li>
</ul>
</div>
<div class="large primary callout">
{{ form_start(form) }}
{{ form_widget(form) }}
<button
type="submit"
class="success button expanded"
>Update</button>
{{ form_end(form) }}
<form method="post" action="{{ path('brand-category_delete', {'name': brand_category.name}) }}" onsubmit="return confirm('Are you sure you want to delete this item?');">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ brand_category.name) }}">
<button type="submit" class="alert button expanded">Delete</button>
</form>
</div>
{% endblock %}

View File

@ -0,0 +1,45 @@
{% extends 'form.html.twig' %}
{% block title %}Brand Categories{% endblock %}
{% block form %}
<h2>Brand Categories</h2>
<div class="small callout primary">
<ul>
<li>
<a href="{{ path('brand-category_new') }}">Add a Brand Category</a>
</li>
</ul>
</div>
<table class="hover scroll sortable stack">
<thead>
<tr>
<th>&nbsp;</th>
<th>Name</th>
</tr>
</thead>
<tbody>
{% for brand_category in brand_categories %}
<tr>
<td>
<ul>
<li>
<a href="{{ path('brand-category_show', {'name': brand_category.name}) }}">View 👁</a>
</li>
<li>
<a href="{{ path('brand-category_edit', {'name': brand_category.name}) }}">Edit <span class="edit-icon">&#9998;</span></a>
</li>
</ul>
</td>
<td>{{ brand_category.name }}</td>
</tr>
{% else %}
<tr>
<td colspan="2">no records found</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

View File

@ -0,0 +1,22 @@
{% extends 'form.html.twig' %}
{% block title %}New Brand Category{% endblock %}
{% block form %}
<h2>Create new Brand Category</h2>
<div class="small callout">
<ul>
<li>
<a href="{{ path('brand-category_index') }}">Back to the list</a>
</li>
</ul>
</div>
<div class="large primary callout">
{{ form_start(form) }}
{{ form_widget(form) }}
<button type="submit" class="success button expanded">Add</button>
{{ form_end(form) }}
</div>
{% endblock %}

View File

@ -0,0 +1,39 @@
{% extends 'form.html.twig' %}
{% block title %}Brand Category{% endblock %}
{% block form %}
<h2>Brand Category</h2>
<div class="callout">
<ul>
<li>
<a href="{{ path('brand-category_index') }}">Back to the list</a>
</li>
<li>
<a href="{{ path('brand-category_edit', { 'name': brand_category.name }) }}">Edit</a>
</li>
</ul>
<hr/>
<form method="post" action="{{ path('brand-category_delete', {'name': brand_category.name}) }}"
onsubmit="return confirm('Are you sure you want to delete this item?');">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ brand_category.name) }}">
<button type="submit" class="alert button expanded">Delete</button>
</form>
</div>
<div class="large primary callout">
<table class="table">
<tbody>
<tr>
<th>Name</th>
<td>{{ brand_category.name }}</td>
</tr>
</tbody>
</table>
</div>
{% endblock %}

View File

@ -81,15 +81,17 @@
<td>{{ gpu.id }}</td> <td>{{ gpu.id }}</td>
<td>{{ gpu.gpuBrand.name }} {{ gpu.modelName }}</td> <td>{{ gpu.gpuBrand.name }} {{ gpu.modelName }}</td>
<td> <td>
{% if gpu.gpuCore %}
{% if gpu.gpuCore.variant %} {% if gpu.gpuCore.variant %}
{{ gpu.gpuCore.name }} ({{ gpu.gpuCore.variant }}) {{ gpu.gpuCore.name }} ({{ gpu.gpuCore.variant }})
{% else %} {% else %}
{{ gpu.gpuCore.name }} {{ gpu.gpuCore.name }}
{% endif %} {% endif %}
{% endif %}
</td> </td>
<td>{% if gpu.boardBrand %}{{ gpu.boardBrand.name }}{% else %}Unknown{% endif %}</td> <td>{% if gpu.boardBrand %}{{ gpu.boardBrand.name }}{% else %}Unknown{% endif %}</td>
<td>{{ gpu.alternateModelName }}</td> <td>{{ gpu.alternateModelName }}</td>
<td>{{ gpu.cardKey }}</td> <td>{{ gpu.cardKey.value }}</td>
<td>{{ gpu.busInterface }}</td> <td>{{ gpu.busInterface }}</td>
<td>{{ gpu.slotWidth }}</td> <td>{{ gpu.slotWidth }}</td>
<td> <td>
@ -196,7 +198,7 @@
</td> </td>
<td>{% if gpu.boardBrand %}{{ gpu.boardBrand.name }}{% else %}Unknown{% endif %}</td> <td>{% if gpu.boardBrand %}{{ gpu.boardBrand.name }}{% else %}Unknown{% endif %}</td>
<td>{{ gpu.alternateModelName }}</td> <td>{{ gpu.alternateModelName }}</td>
<td>{{ gpu.cardKey }}</td> <td>{{ gpu.cardKey.value }}</td>
<td>{{ gpu.busInterface }}</td> <td>{{ gpu.busInterface }}</td>
<td>{{ gpu.slotWidth }}</td> <td>{{ gpu.slotWidth }}</td>
<td> <td>

View File

@ -42,7 +42,7 @@
</tr> </tr>
<tr> <tr>
<th>CardKey</th> <th>CardKey</th>
<td>{{ gpu.cardKey }}</td> <td>{{ gpu.cardKey.value }}</td>
</tr> </tr>
<tr> <tr>
<th>BusInterface</th> <th>BusInterface</th>

View File

@ -6,8 +6,8 @@
<li class="{{ route starts with 'brand_' ? 'is-active' }}"> <li class="{{ route starts with 'brand_' ? 'is-active' }}">
<a href="{{ path('brand_index') }}">🕺 Brands</a> <a href="{{ path('brand_index') }}">🕺 Brands</a>
</li> </li>
<li class="not-implemented"> <li class="{{ route starts with 'brand-category_' ? 'is-active' }}">
<a href="#">💃 Brand Categories</a> <a href="{{ path('brand-category_index') }}">💃 Brand Categories</a>
</li> </li>
<li class="not-implemented"> <li class="not-implemented">