Nette\Schema – třída vs struktury

Gappa
Nette Blogger | 199
+
0
-

Ahoj,

jde nějak použít jako zdroj dat třídu (aby fungovalo napovídání v IDE a PHPStan byl spokojený) a zároveň mít možnost např. definovat seznam povolených hodnot nebo rozsah?

Např. zde:

Pokud bych chtěl pomocí Schema omezit, že $dsn může pouze nabývat určitých hodnot (např. sqlite a mysql), jde to nějak? Nebo lze buď použít napovídání, nebo lepší validaci? :)

Díky za jakékoliv info.

David Grudl
Nette Core | 8105
+
+1
-

Myslím, že by mělo jít oboje zkombinovat

class ConfigClass
{
	public string $dsn;
	public string $user;
	public string $name;
}

$schema = Expect::from(new ConfigClass, [
	'dsn' => Expect::anyOf('mysql', 'sqlite')
]);
Gappa
Nette Blogger | 199
+
0
-

Díky, funguje :)

final class ResizerConfig
{
	/** @var string */
	public $library;

	/** @var string */
	public $cacheNS = 'resizer';

	/** @var bool */
	public $absoluteUrls = false;

	/** @var bool */
	public $interlace = true;

	/** @var string */
	public $wwwDir;

	/** @var string */
	public $tempDir;

	/** @var string */
	public $cache = '/resizer/';

	/** @var int */
	public $qualityWebp;

	/** @var int */
	public $qualityJpeg;

	/** @var int */
	public $compressionPng;
}
public function getConfigSchema(): Schema
{
	return Expect::from(new ResizerConfig, [
		'library' => Expect::anyOf('Gd', 'Imagick', 'Gmagick')->default('Imagick'),
		'qualityWebp' => Expect::int(75)->min(0)->max(100),
		'qualityJpeg' => Expect::int(75)->min(0)->max(100),
		'compressionPng' => Expect::int(9)->min(0)->max(9),
	]);
}

Jenom pozor na to, že zdá se nelze kombinovat default z konfigurační třídy a pravidla ze schématu – default se nebude brát v potaz, je ho nutné uvést přímo ve schématu. Ale je lepší to mít pohromadě a ve třídě jen type hinty.

Editoval Gappa (25. 6. 2020 13:17)