Validace dat pomocí Nette/Schema

Petr Parolek
Člen | 455
+
0
-

Ahoj,

nette/schema je pro mě velká magie. Jak mám prosím zvalidovat, jestli je vstup integer nebo string, která obsahuje povinný prvek z pole?

		try {
			$schema = Nette\Schema\Expect::anyOf(
				Nette\Schema\Expect::anyOf(
					Nette\Schema\Expect::int()
				)
			);

			$processor = new Nette\Schema\Processor;
			$processor->process($schema, $displayZoom);
		} catch(\Exception $e) {
			throw new \InvalidArgumentException;
		}

Nenapadá mě, jak zvalidovat pole.

Editoval ppar (26. 1. 2021 17:11)

David Matějka
Moderator | 6445
+
0
-

nechápu, co vlastně chceš

jestli je vstup integer nebo string, která obsahuje povinný prvek z pole?

můžeš to přeformulovat nebo ukázat nějaký příklad?

Petr Parolek
Člen | 455
+
0
-

Řeším nefunkční validaci vstupu u https://github.com/…Response.php#… . Různě jsem s tím laboroval celý den v čistém PHP a bez úspěchu. Napadlo mě použít nette/schema.

David Matějka
Moderator | 6445
+
+1
-

takže int nebo hodnotu z enumu?

v tom případě něco jako

Expect::anyOf(Expect::int(), 'foo', 'bar', 'lorem')

ale používat tady v tom tvém případě nette/schema je hroznej overkill

Petr Parolek
Člen | 455
+
0
-

ok, jak kod opravit, aby fungoval i na PHP 8.0?

David Matějka
Moderator | 6445
+
0
-

a co v php 8 nefunguje?

Petr Parolek
Člen | 455
+
0
-
Contributte\PdfResponse\InvalidArgumentException was expected, but none was thrown

   in tests/PdfResponse/PdfResponse.setters.phpt(25) Tester\Assert::exception()
   in contributte-pdf/tests/bootstrap.php(22) {closure}()
   in tests/PdfResponse/PdfResponse.setters.phpt(36) test()

viz https://github.com/…s/1770832138?…

David Matějka
Moderator | 6445
+
0
-

problém je v té $displayLayout <= 0 podmínce, to se se stringem začalo chovat v php 8 jinak, viz https://3v4l.org/Qi9He

Petr Parolek
Člen | 455
+
0
-

OK, co mám mít v kodě, aby vše fungovao správně ve všech verzích PHP?

David Matějka
Moderator | 6445
+
0
-

treba

if ((!is_int($displayZoom) || $displayZoom <= 0) && !in_array($displayZoom, [
		        self::ZOOM_DEFAULT,
		        self::ZOOM_FULLPAGE,
		        self::ZOOM_FULLWIDTH,
		        self::ZOOM_REAL
	        ], true))
Petr Parolek
Člen | 455
+
0
-

Stále nefunguje na PHP8.0:

	/**
	 * @param string|int $displayZoom
	 */
	public function setDisplayZoom($displayZoom): void
	{
		if ((!is_int($displayZoom) || $displayZoom <= 0) && !in_array($displayZoom, [
				self::ZOOM_DEFAULT,
				self::ZOOM_FULLPAGE,
				self::ZOOM_FULLWIDTH,
				self::ZOOM_REAL
			], true)) {
			throw new InvalidArgumentException("Invalid zoom '" . $displayZoom . "', use PdfResponse::ZOOM_* constants or o positive integer.");
		}

		$this->displayZoom = $displayZoom;
	}

Failed: Contributte\PdfResponse\InvalidArgumentException was expected, but none was thrown

`

Editoval ppar (26. 1. 2021 18:28)

David Matějka
Moderator | 6445
+
0
-

a opravdu ti failuje tahle část? protože tam je ještě setDisplayLayout, kde je ta stejná podmínka s <= 0, a tam už vůbec nedává smysl, protože je povolen jen string input

Petr Parolek
Člen | 455
+
0
-

https://github.com/…s/1771107138?… nevím

Editoval ppar (26. 1. 2021 18:35)

David Matějka
Moderator | 6445
+
0
-

in tests/PdfResponse/PdfResponse.setters.phpt(>>> 34 <<<) Tester\Assert::exception()

https://github.com/…setters.phpt#L34

Petr Parolek
Člen | 455
+
0
-

Díky moc, byl jsem nesoustředěný, vše už šlape.