Nette\Schema – třída vs struktury
- Gappa
- Nette Blogger | 205
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 | 8205
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 | 205
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)