|
1306 | 1306 | * configure_roles?: list<scalar|Param|null>, |
1307 | 1307 | * access_checker?: scalar|Param|null, // Default: null |
1308 | 1308 | * allow_unauthenticated?: bool|Param, // Default: false |
| 1309 | + * object_access?: array{ // Object-level checks after roles (e.g. editors only manage their publications). |
| 1310 | + * strategy?: "none"|"owner"|"service"|Param, // none (roles only), owner (createdBy), or service (host checker). // Default: "none" |
| 1311 | + * service?: scalar|Param|null, // Service id implementing BlogKitResourceAccessCheckerInterface when strategy=service. // Default: null |
| 1312 | + * }, |
1309 | 1313 | * }, |
1310 | 1314 | * web_ui?: array{ |
1311 | 1315 | * layout_template?: scalar|Param|null, // Default: "@NowoBlogKitBundle/admin/layout.html.twig" |
|
1320 | 1324 | * table_prefix?: scalar|Param|null, // Default: "" |
1321 | 1325 | * connection?: scalar|Param|null, // Default: "default" |
1322 | 1326 | * }, |
| 1327 | + * comments?: array{ |
| 1328 | + * rate_limit?: array{ // Public comment POST rate limiting. Requires cache.app except strategy none/service. |
| 1329 | + * strategy?: "none"|"fixed_window"|"per_ip_article"|"sliding_window"|"service"|Param, // Default: "fixed_window" |
| 1330 | + * limit?: int|Param, // Max submissions per interval. 0 disables the limiter. // Default: 5 |
| 1331 | + * interval_seconds?: int|Param, // Default: 60 |
| 1332 | + * service?: scalar|Param|null, // Service id implementing BlogCommentRateLimiterInterface when strategy=service. // Default: null |
| 1333 | + * }, |
| 1334 | + * captcha?: array{ // Public comment bot mitigation. Secrets stay in YAML, not BlogSettings. |
| 1335 | + * strategy?: "none"|"honeypot"|"recaptcha_v2"|"recaptcha_v3"|"hcaptcha"|"turnstile"|"service"|Param, // Default: "honeypot" |
| 1336 | + * site_key?: scalar|Param|null, // Default: "" |
| 1337 | + * secret_key?: scalar|Param|null, // Default: "" |
| 1338 | + * min_score?: float|Param, // Minimum reCAPTCHA v3 score. // Default: 0.5 |
| 1339 | + * honeypot_field?: scalar|Param|null, // Default: "website" |
| 1340 | + * service?: scalar|Param|null, // Service id implementing BlogCommentCaptchaStrategyInterface when strategy=service. // Default: null |
| 1341 | + * }, |
| 1342 | + * }, |
| 1343 | + * listing?: array{ // Public /blog index: numbered pagination or infinite scroll. |
| 1344 | + * mode?: "paginated"|"infinite"|Param, // paginated (numbered pages) or infinite (IntersectionObserver + ?partial=1). // Default: "paginated" |
| 1345 | + * masonry?: array{ // Public index card layout. Admin inherit / 0 keeps these YAML values. |
| 1346 | + * strategy?: "masonry"|"grid"|"list"|Param, // masonry (packed columns), grid (uniform rows), or list (single column). // Default: "masonry" |
| 1347 | + * columns_mobile?: int|Param, // Default: 1 |
| 1348 | + * columns_tablet?: int|Param, // Default: 2 |
| 1349 | + * columns_desktop?: int|Param, // Default: 2 |
| 1350 | + * }, |
| 1351 | + * }, |
| 1352 | + * html?: array{ |
| 1353 | + * sanitize?: array{ // Sanitize article HTML on persist and public render. Default none keeps trusted-editor |raw. |
| 1354 | + * strategy?: "none"|"strip"|"allowlist"|"service"|Param, // Default: "none" |
| 1355 | + * service?: scalar|Param|null, // Service id implementing BlogHtmlSanitizerInterface when strategy=service. // Default: null |
| 1356 | + * }, |
| 1357 | + * }, |
1323 | 1358 | * } |
1324 | 1359 | * @psalm-type NowoUiKitConfig = array{ |
1325 | 1360 | * css_framework?: "bootstrap"|"bootstrap5"|"bootstrap4"|"tailwind"|"foundation"|"custom"|"tabler"|"none"|Param, // Host CSS stack: bootstrap5|bootstrap4|tailwind|foundation|custom|none|tabler (bootstrap alias → bootstrap5). // Default: "bootstrap5" |
|
0 commit comments