Nette Schema anyOf() v arrayOf()

baraja
Nette Blogger | 29
+
0
-

Ahoj,

snažím se přijít na to, jak do arrayOf() vložit validaci anyOf().

Nyní používám toto schéma (momentálně nefunguje):

'routing' => Expect::arrayOf( // (route [*] => rules)
	Expect::arrayOf( // (rule => definition)
		Expect::anyOf([
			Expect::string(), // URL
			Expect::structure([
				'source' => Expect::string()->required(),
				'format' => Expect::string()->required(),
			]),
		])->firstIsDefault()
	),
	Expect::anyOf(Expect::string()->required()),
)

Testovací struktura:

routing:
 	*:
		- https://unpkg.com/vue@2.6.12/dist/vue.min.js
		- https://unpkg.com/bootstrap-vue@2.17.0/dist/bootstrap-vue.min.js
		- https://unpkg.com/bootstrap@4.6.0/dist/css/bootstrap.min.css
		- https://unpkg.com/bootstrap-vue@2.21.2/dist/bootstrap-vue.min.css
		-
			source: 'https://fonts.googleapis.com/css2?family=Roboto:wght@300;500&family=Work+Sans:wght@100;300;600&display=swap'
			format: css
	Front:Homepage:default:
		- js/reservation-form.js

Dostávám tuto chybu:

The item ‚assetsLoader › routing › Front:Test:detail › 0‘ expects to be array, ‚test.js‘ given.

Prosím, napadá vás, jak by šlo schéma upravit tak, aby položkou definice mohl být jak string, tak struktura uvedená jako poslední položka? Momentálně to musím obcházet tak, že to validuji proti typu mixed() a pak si to ošetřuji aplikačně, což mi nepřijde šikovné řešení.

Myslím, že je zápis validní a problém bude spíše v balíku. Vypadá to, že schéma nepodporuje vložení anyOf() do arrayOf().

Rel: https://github.com/…f7688cb4e87b

Díky.

Editoval baraja (30. 5. 2021 16:14)

Marek Bartoš
Nette Blogger | 1146
+
+1
-

anyOf přijímá variadický parametr, ne pole. Takže takto

'routing' => Expect::arrayOf( // (route [*] => rules)
	Expect::arrayOf( // (rule => definition)
		Expect::anyOf(
			Expect::string(), // URL
			Expect::structure([
				'source' => Expect::string()->required(),
				'format' => Expect::string()->required(),
			]),
		)->firstIsDefault()
	),
	Expect::anyOf(Expect::string()->required()),
)
baraja
Nette Blogger | 29
+
-2
-

Aha, díky. To by mě absolutně vůbec nenapadlo.

@DavidGrudl Nemělo by to v takovém případě vyhodit výjimku? Je to dost magic a nenapadlo by mě, že se to nebude umět přijmout pole typů.

David Grudl
Nette Core | 8082
+
+2
-

Spíš asi notice než výjimku.