Template
Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa10f214f4 | ||
|
|
4082a362a1 | ||
|
|
c650d99bd4 | ||
|
|
e61a0d8867 | ||
|
|
89f29d60c0 | ||
|
|
ec139f9844 | ||
|
|
f12fbaec94 | ||
|
|
d3c07bbde3 | ||
|
|
1873d54a5d | ||
|
|
0706f1f6a5 |
@@ -0,0 +1,33 @@
|
|||||||
|
# Abhängigkeiten
|
||||||
|
/vendor/
|
||||||
|
/node_modules/
|
||||||
|
|
||||||
|
# Symfony-Laufzeit
|
||||||
|
/var/cache/
|
||||||
|
/var/log/
|
||||||
|
/var/sessions/
|
||||||
|
|
||||||
|
# Sensible Daten
|
||||||
|
.env.local
|
||||||
|
.env.local.php
|
||||||
|
.env.*.local
|
||||||
|
/config/secrets/
|
||||||
|
|
||||||
|
# Generierte Assets
|
||||||
|
/public/bundles/
|
||||||
|
/public/build/
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
/log/
|
||||||
|
|
||||||
|
# IDE & OS
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Lock-Dateien (groß, wenig Mehrwert)
|
||||||
|
composer.lock
|
||||||
|
symfony.lock
|
||||||
|
package-lock.json
|
||||||
|
yarn.lock
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# editorconfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
indent_size = 4
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[{compose.yaml,compose.*.yaml}]
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# Diese Datei enthält sichere Standardwerte für die Entwicklung.
|
||||||
|
# Für lokale Überschreibungen: .env.local erstellen (wird nicht eingecheckt).
|
||||||
|
|
||||||
|
###> symfony/cache ###
|
||||||
|
REDIS_URL=redis://localhost:6379
|
||||||
|
###< symfony/cache ###
|
||||||
|
|
||||||
|
###> symfony/framework-bundle ###
|
||||||
|
APP_ENV=dev
|
||||||
|
APP_DEBUG=true
|
||||||
|
APP_SECRET=
|
||||||
|
APP_SHARE_DIR=var/share
|
||||||
|
###< symfony/framework-bundle ###
|
||||||
|
|
||||||
|
###> symfony/routing ###
|
||||||
|
# Configure how to generate URLs in non-HTTP contexts, such as CLI commands.
|
||||||
|
# See https://symfony.com/doc/current/routing.html#generating-urls-in-commands
|
||||||
|
DEFAULT_URI=http://localhost
|
||||||
|
###< symfony/routing ###
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
###> symfony/framework-bundle ###
|
||||||
|
APP_SECRET=837fe105fe253f4566c15a2aa7f1815d
|
||||||
|
###< symfony/framework-bundle ###
|
||||||
+9
-15
@@ -1,15 +1,12 @@
|
|||||||
### Symfony ###
|
###> symfony/framework-bundle ###
|
||||||
/vendor/
|
/.env.local
|
||||||
/var/
|
/.env.local.php
|
||||||
|
/.env.*.local
|
||||||
|
/config/secrets/prod/prod.decrypt.private.pem
|
||||||
/public/bundles/
|
/public/bundles/
|
||||||
/config/secrets/*.php
|
/var/
|
||||||
/config/jwt/*.pem
|
/vendor/
|
||||||
|
###< symfony/framework-bundle ###
|
||||||
### Symfony - Environment Dateien ###
|
|
||||||
.env
|
|
||||||
.env.local
|
|
||||||
.env.local.php
|
|
||||||
.env.*.local
|
|
||||||
|
|
||||||
### PHP ###
|
### PHP ###
|
||||||
.php_cs.cache
|
.php_cs.cache
|
||||||
@@ -18,10 +15,7 @@
|
|||||||
phpunit.xml
|
phpunit.xml
|
||||||
composer.phar
|
composer.phar
|
||||||
|
|
||||||
### Junie ###
|
### Node / Frontend ###
|
||||||
.junie/
|
|
||||||
|
|
||||||
### Node / Frontend (usw.) ###
|
|
||||||
node_modules/
|
node_modules/
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
|
|||||||
Generated
+8
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="InertiaPackage">
|
||||||
|
<option name="directoryPaths">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
Generated
+54
@@ -0,0 +1,54 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="PhpDockerContainerSettings">
|
||||||
|
<list>
|
||||||
|
<map>
|
||||||
|
<entry key="45296835-d70f-4470-842b-9ebd1da7e4b6">
|
||||||
|
<value>
|
||||||
|
<DockerContainerSettings>
|
||||||
|
<option name="version" value="1" />
|
||||||
|
<option name="volumeBindings">
|
||||||
|
<list>
|
||||||
|
<DockerVolumeBindingImpl>
|
||||||
|
<option name="containerPath" value="/opt/project" />
|
||||||
|
<option name="hostPath" value="$PROJECT_DIR$" />
|
||||||
|
</DockerVolumeBindingImpl>
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</DockerContainerSettings>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="6b443141-64c6-417c-b704-6fbbec180944">
|
||||||
|
<value>
|
||||||
|
<DockerContainerSettings>
|
||||||
|
<option name="version" value="1" />
|
||||||
|
<option name="volumeBindings">
|
||||||
|
<list>
|
||||||
|
<DockerVolumeBindingImpl>
|
||||||
|
<option name="containerPath" value="/opt/project" />
|
||||||
|
<option name="hostPath" value="$PROJECT_DIR$" />
|
||||||
|
</DockerVolumeBindingImpl>
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</DockerContainerSettings>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="744087ea-f61a-432a-ada3-4a967ce1edba">
|
||||||
|
<value>
|
||||||
|
<DockerContainerSettings>
|
||||||
|
<option name="version" value="1" />
|
||||||
|
<option name="volumeBindings">
|
||||||
|
<list>
|
||||||
|
<DockerVolumeBindingImpl>
|
||||||
|
<option name="containerPath" value="/opt/project" />
|
||||||
|
<option name="hostPath" value="$PROJECT_DIR$" />
|
||||||
|
</DockerVolumeBindingImpl>
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</DockerContainerSettings>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</list>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
Generated
+88
@@ -1,5 +1,17 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
|
<component name="LaravelPint">
|
||||||
|
<laravel_pint_settings>
|
||||||
|
<laravel_pint_by_interpreter asDefaultInterpreter="true" interpreter_id="6b443141-64c6-417c-b704-6fbbec180944">
|
||||||
|
<option name="timeout" value="30000" />
|
||||||
|
</laravel_pint_by_interpreter>
|
||||||
|
</laravel_pint_settings>
|
||||||
|
</component>
|
||||||
|
<component name="MessDetector">
|
||||||
|
<phpmd_settings>
|
||||||
|
<phpmd_by_interpreter asDefaultInterpreter="true" interpreter_id="6b443141-64c6-417c-b704-6fbbec180944" timeout="30000" />
|
||||||
|
</phpmd_settings>
|
||||||
|
</component>
|
||||||
<component name="MessDetectorOptionsConfiguration">
|
<component name="MessDetectorOptionsConfiguration">
|
||||||
<option name="transferred" value="true" />
|
<option name="transferred" value="true" />
|
||||||
</component>
|
</component>
|
||||||
@@ -10,9 +22,85 @@
|
|||||||
<option name="highlightLevel" value="WARNING" />
|
<option name="highlightLevel" value="WARNING" />
|
||||||
<option name="transferred" value="true" />
|
<option name="transferred" value="true" />
|
||||||
</component>
|
</component>
|
||||||
|
<component name="PhpCSFixer">
|
||||||
|
<phpcsfixer_settings>
|
||||||
|
<phpcs_fixer_by_interpreter asDefaultInterpreter="true" interpreter_id="6b443141-64c6-417c-b704-6fbbec180944" timeout="30000" />
|
||||||
|
</phpcsfixer_settings>
|
||||||
|
</component>
|
||||||
|
<component name="PhpCodeSniffer">
|
||||||
|
<phpcs_settings>
|
||||||
|
<phpcs_by_interpreter asDefaultInterpreter="true" interpreter_id="6b443141-64c6-417c-b704-6fbbec180944" timeout="30000" />
|
||||||
|
</phpcs_settings>
|
||||||
|
</component>
|
||||||
|
<component name="PhpIncludePathManager">
|
||||||
|
<include_path>
|
||||||
|
<path value="$PROJECT_DIR$/vendor/nikic/php-parser" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/composer" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/psr/container" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/psr/log" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/psr/event-dispatcher" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/psr/cache" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/twig/twig" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/web-profiler-bundle" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/deprecation-contracts" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/dependency-injection" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/stopwatch" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/routing" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/yaml" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/twig-bridge" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/console" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/http-foundation" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/service-contracts" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-normalizer" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/var-exporter" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/debug-bundle" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/cache-contracts" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/event-dispatcher-contracts" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/doctrine/inflector" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/runtime" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/process" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/error-handler" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/string" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/maker-bundle" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-grapheme" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-php85" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/framework-bundle" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-ctype" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-mbstring" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/event-dispatcher" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/translation-contracts" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/config" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/dotenv" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/finder" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/cache" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/twig-bundle" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/var-dumper" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/flex" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/http-kernel" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/filesystem" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-deepclone" />
|
||||||
|
</include_path>
|
||||||
|
</component>
|
||||||
|
<component name="PhpInterpreters">
|
||||||
|
<interpreters>
|
||||||
|
<interpreter id="6b443141-64c6-417c-b704-6fbbec180944" name="localhost/symfony-php:latest" home="docker://DATA" auto="false" debugger_id="php.debugger.XDebug">
|
||||||
|
<remote_data INTERPRETER_PATH="/usr/local/bin/php" HELPERS_PATH="/opt/.phpstorm_helpers" VALID="true" RUN_AS_ROOT_VIA_SUDO="false" DOCKER_ACCOUNT_NAME="Podman" DOCKER_IMAGE_NAME="localhost/symfony-php:latest" DOCKER_REMOTE_PROJECT_PATH="/opt/project" />
|
||||||
|
</interpreter>
|
||||||
|
</interpreters>
|
||||||
|
</component>
|
||||||
|
<component name="PhpStan">
|
||||||
|
<PhpStan_settings>
|
||||||
|
<phpstan_by_interpreter asDefaultInterpreter="true" interpreter_id="6b443141-64c6-417c-b704-6fbbec180944" timeout="60000" />
|
||||||
|
</PhpStan_settings>
|
||||||
|
</component>
|
||||||
<component name="PhpStanOptionsConfiguration">
|
<component name="PhpStanOptionsConfiguration">
|
||||||
<option name="transferred" value="true" />
|
<option name="transferred" value="true" />
|
||||||
</component>
|
</component>
|
||||||
|
<component name="Psalm">
|
||||||
|
<Psalm_settings>
|
||||||
|
<psalm_fixer_by_interpreter asDefaultInterpreter="true" interpreter_id="6b443141-64c6-417c-b704-6fbbec180944" timeout="60000" />
|
||||||
|
</Psalm_settings>
|
||||||
|
</component>
|
||||||
<component name="PsalmOptionsConfiguration">
|
<component name="PsalmOptionsConfiguration">
|
||||||
<option name="transferred" value="true" />
|
<option name="transferred" value="true" />
|
||||||
</component>
|
</component>
|
||||||
|
|||||||
Generated
+5
-1
@@ -1,7 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<module type="WEB_MODULE" version="4">
|
<module type="WEB_MODULE" version="4">
|
||||||
<component name="NewModuleRootManager">
|
<component name="NewModuleRootManager">
|
||||||
<content url="file://$MODULE_DIR$" />
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" packagePrefix="App\" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" packagePrefix="App\Tests\" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/var" />
|
||||||
|
</content>
|
||||||
<orderEntry type="inheritedJdk" />
|
<orderEntry type="inheritedJdk" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
</component>
|
</component>
|
||||||
|
|||||||
Generated
+6
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Symfony2PluginSettings">
|
||||||
|
<option name="pluginEnabled" value="true" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
Vendored
-1
@@ -1 +0,0 @@
|
|||||||
{}
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 3, 29 June 2007
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
|||||||
@@ -1,92 +1,143 @@
|
|||||||
# Symfony Podman Template
|
# Symfony Template
|
||||||
|
|
||||||
Dieses Projekt ist ein Template für die Symfony-Entwicklung unter Verwendung von Podman. Es bietet eine vollständig vorkonfigurierte Entwicklungsumgebung mit PHP-FPM, Nginx und PostgreSQL, die in einem gemeinsamen Pod ausgeführt werden.
|
Symfony 7.2 Projekttemplate mit Podman-Containern für Entwicklung und Produktion.
|
||||||
|
|
||||||
## Features
|
## Stack
|
||||||
|
|
||||||
- **Podman Integration**: Optimiert für die lokale Entwicklung in Containern ohne Docker-Zwang.
|
| Komponente | Version |
|
||||||
- **Multi-Container Pod**:
|
|------------|---------|
|
||||||
- `symfony-php`: PHP 8.5 FPM inklusive Symfony CLI und Composer.
|
| PHP-FPM | 8.4 |
|
||||||
- `symfony-nginx`: Nginx Webserver, vorkonfiguriert für Symfony.
|
| Symfony | 8.1 |
|
||||||
- `symfony-db`: PostgreSQL 16 Datenbank.
|
| Nginx | 1.27 |
|
||||||
- **Automatisches Setup**: Ein zentrales Bash-Skript übernimmt die Initialisierung, Image-Erstellung und Container-Steuerung.
|
| Redis | 8 |
|
||||||
- **Automatische Umgebungskonfiguration**: Erstellt oder aktualisiert die `.env` Datei mit den korrekten Datenbank-Zugangsdaten.
|
|
||||||
|
**Dev-Abhängigkeiten:** Symfony Profiler, MakerBundle, DebugBundle, VarDumper, Xdebug
|
||||||
|
|
||||||
## Voraussetzungen
|
## Voraussetzungen
|
||||||
|
|
||||||
Stellen Sie sicher, dass folgende Software auf Ihrem System installiert ist:
|
|
||||||
- [Podman](https://podman.io/)
|
- [Podman](https://podman.io/)
|
||||||
- Bash (zum Ausführen des Setup-Skripts)
|
- `openssl` (für Secret-Generierung)
|
||||||
- Openssl (wird vom Skript zur Generierung des `APP_SECRET` verwendet)
|
|
||||||
|
|
||||||
## Installation & Setup
|
## Entwicklungsumgebung
|
||||||
|
|
||||||
1. **Projekt vorbereiten**:
|
|
||||||
Klonen Sie das Repository oder laden Sie die Dateien in Ihr Projektverzeichnis.
|
|
||||||
|
|
||||||
2. **Setup-Skript ausführen**:
|
|
||||||
Das Skript `setup-pod.sh` automatisiert den gesamten Prozess:
|
|
||||||
```bash
|
```bash
|
||||||
chmod +x setup-pod.sh
|
./setup-dev.sh
|
||||||
./setup-pod.sh
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Was das Skript tut:
|
Das Skript:
|
||||||
- Erstellt/aktualisiert die `.env` Datei.
|
1. Erstellt `.env.local` mit generiertem `APP_SECRET`
|
||||||
- Erstellt einen Pod namens `symfony-dev`.
|
2. Baut die Container-Images (`symfony-php`, `symfony-nginx`)
|
||||||
- Baut und startet die PHP- und Nginx-Container.
|
3. Startet den Pod `symfony-dev` mit PHP-FPM, Nginx und Redis
|
||||||
- Startet eine PostgreSQL-Instanz.
|
4. Führt `composer install` aus
|
||||||
- Installiert Composer-Abhängigkeiten (falls eine `composer.json` vorhanden ist).
|
|
||||||
- Erstellt die Datenbank und führt Migrationen aus.
|
|
||||||
|
|
||||||
3. **Anwendung aufrufen**:
|
**App:** http://localhost:8080
|
||||||
Sobald das Setup abgeschlossen ist, erreichen Sie die Anwendung unter:
|
|
||||||
👉 **[http://localhost:8080](http://localhost:8080)**
|
|
||||||
|
|
||||||
## Datenbank-Details
|
### Umgebung verwalten
|
||||||
|
|
||||||
Die Standard-Zugangsdaten (konfigurierbar im `setup-pod.sh`) sind:
|
|
||||||
- **DB-Host**: `localhost` (da alle Container im selben Pod laufen)
|
|
||||||
- **DB-Port**: `5432`
|
|
||||||
- **User**: `symfony_user`
|
|
||||||
- **Passwort**: `devpassword`
|
|
||||||
- **Datenbank**: `symfony_db`
|
|
||||||
|
|
||||||
## Arbeiten mit der Umgebung
|
|
||||||
|
|
||||||
### Symfony & Composer Befehle
|
|
||||||
Da PHP in einem Container läuft, müssen Befehle dort ausgeführt werden:
|
|
||||||
```bash
|
```bash
|
||||||
# Beispiel: Cache leeren
|
# Stoppen / Starten
|
||||||
podman exec -it symfony-php php bin/console cache:clear
|
|
||||||
|
|
||||||
# Beispiel: Neue Migration erstellen
|
|
||||||
podman exec -it symfony-php php bin/console make:migration
|
|
||||||
```
|
|
||||||
|
|
||||||
### Logs einsehen
|
|
||||||
Um die Ausgaben der verschiedenen Dienste zu verfolgen:
|
|
||||||
```bash
|
|
||||||
podman logs -f symfony-php
|
|
||||||
podman logs -f symfony-nginx
|
|
||||||
```
|
|
||||||
|
|
||||||
### Umgebung stoppen und starten
|
|
||||||
```bash
|
|
||||||
# Pod stoppen
|
|
||||||
podman pod stop symfony-dev
|
podman pod stop symfony-dev
|
||||||
|
|
||||||
# Pod wieder starten
|
|
||||||
podman pod start symfony-dev
|
podman pod start symfony-dev
|
||||||
|
|
||||||
|
# Entfernen
|
||||||
|
podman pod stop symfony-dev && podman pod rm symfony-dev
|
||||||
|
|
||||||
|
# Neustart (rebuild)
|
||||||
|
./setup-dev.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Im Container arbeiten
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Shell öffnen
|
||||||
|
podman exec -it symfony-php bash
|
||||||
|
|
||||||
|
# Symfony CLI
|
||||||
|
podman exec -it symfony-php php bin/console <befehl>
|
||||||
|
podman exec -it symfony-php php bin/console make:controller HomeController
|
||||||
|
|
||||||
|
# Composer
|
||||||
|
podman exec -it symfony-php composer require <paket>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Xdebug
|
||||||
|
|
||||||
|
Xdebug ist im Dev-Container aktiv und wird per Trigger gestartet (kein automatischer Start).
|
||||||
|
|
||||||
|
| Einstellung | Wert |
|
||||||
|
|-------------|----------------------------|
|
||||||
|
| Modus | `debug` |
|
||||||
|
| Port | `9003` |
|
||||||
|
| Host | `host.containers.internal` |
|
||||||
|
| Trigger | `XDEBUG_SESSION` (Cookie/Query-Parameter) |
|
||||||
|
|
||||||
|
## Produktions-Build
|
||||||
|
|
||||||
|
In der Live-Umgebung wird **nur der PHP-FPM-Container** benötigt. Das Produktions-Image enthält die gesamte App inkl. Vendor-Verzeichnis – kein Volume-Mount erforderlich.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Image bauen
|
||||||
|
./build-prod.sh symfony-app 1.0.0
|
||||||
|
|
||||||
|
# Container starten
|
||||||
|
podman run -d \
|
||||||
|
--name symfony-app \
|
||||||
|
-p 9000:9000 \
|
||||||
|
-e APP_ENV=prod \
|
||||||
|
-e APP_SECRET=$(openssl rand -hex 16) \
|
||||||
|
-e REDIS_URL=redis://your-redis-host:6379 \
|
||||||
|
symfony-app:1.0.0
|
||||||
|
|
||||||
|
# Cache warmup
|
||||||
|
podman exec symfony-app php bin/console cache:warmup --env=prod
|
||||||
|
```
|
||||||
|
|
||||||
|
Der Build verwendet einen **Multi-Stage-Build**:
|
||||||
|
- **Stage 1:** Composer installiert nur Produktionsabhängigkeiten (`--no-dev --optimize-autoloader`)
|
||||||
|
- **Stage 2:** Schlankes PHP-FPM Image mit optimiertem OPcache
|
||||||
|
|
||||||
## Projektstruktur
|
## Projektstruktur
|
||||||
|
|
||||||
- `config/`: Symfony Konfiguration.
|
```
|
||||||
- `podman/`: Container-Definitionen (`Containerfile`) und Webserver-Konfiguration.
|
.
|
||||||
- `public/`: Document Root für Nginx.
|
├── build-prod.sh # Produktions-Image bauen
|
||||||
- `src/`: PHP Quellcode.
|
├── setup-dev.sh # Entwicklungsumgebung starten
|
||||||
- `setup-pod.sh`: Das Herzstück der Automatisierung.
|
├── composer.json
|
||||||
|
├── public/
|
||||||
|
│ └── index.php # Symfony-Einstiegspunkt
|
||||||
|
├── src/
|
||||||
|
│ └── Kernel.php
|
||||||
|
├── config/
|
||||||
|
│ ├── bundles.php
|
||||||
|
│ ├── routes.yaml
|
||||||
|
│ ├── services.yaml
|
||||||
|
│ └── packages/
|
||||||
|
│ ├── cache.yaml # Redis als Cache-Backend
|
||||||
|
│ ├── framework.yaml
|
||||||
|
│ └── routing.yaml
|
||||||
|
└── podman/
|
||||||
|
├── php/ # Entwicklungs-Container
|
||||||
|
│ ├── Containerfile
|
||||||
|
│ └── conf.d/dev.ini # Xdebug & Error-Reporting
|
||||||
|
├── nginx/
|
||||||
|
│ ├── Containerfile
|
||||||
|
│ └── default.conf
|
||||||
|
└── php-prod/ # Produktions-Container
|
||||||
|
├── Containerfile
|
||||||
|
└── conf.d/opcache.ini
|
||||||
|
```
|
||||||
|
|
||||||
|
## Umgebungsvariablen
|
||||||
|
|
||||||
|
| Variable | Beschreibung | Standard |
|
||||||
|
|--------------|--------------------------|----------------------------------|
|
||||||
|
| `APP_ENV` | Symfony-Umgebung | `dev` |
|
||||||
|
| `APP_DEBUG` | Debug-Modus | `true` |
|
||||||
|
| `APP_SECRET` | Kryptografisches Secret | Wird in `.env.local` generiert |
|
||||||
|
| `REDIS_URL` | Redis-Verbindungs-URL | `redis://localhost:6379` |
|
||||||
|
|
||||||
|
`.env` enthält sichere Standardwerte und wird eingecheckt. Lokale Überschreibungen in `.env.local` (nicht eingecheckt).
|
||||||
|
|
||||||
## Lizenz
|
## Lizenz
|
||||||
Dieses Projekt ist unter der im [LICENSE](LICENSE) File angegebenen Lizenz lizenziert.
|
|
||||||
|
GPL-3.0-only
|
||||||
|
|||||||
Executable
+21
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use App\Kernel;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
||||||
|
|
||||||
|
if (!is_dir(dirname(__DIR__).'/vendor')) {
|
||||||
|
throw new LogicException('Dependencies are missing. Try running "composer install".');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_file(dirname(__DIR__).'/vendor/autoload_runtime.php')) {
|
||||||
|
throw new LogicException('Symfony Runtime is missing. Try running "composer require symfony/runtime".');
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
|
||||||
|
|
||||||
|
return function (array $context) {
|
||||||
|
$kernel = new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
|
||||||
|
|
||||||
|
return new Application($kernel);
|
||||||
|
};
|
||||||
Executable
+40
@@ -0,0 +1,40 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
|
||||||
|
# Projektnamen aus composer.json lesen (Teil nach "/") und bereinigen
|
||||||
|
PROJECT_NAME=$(grep -m1 '"name"' "$PROJECT_DIR/composer.json" \
|
||||||
|
| sed 's/.*"[^/]*\/\([^"]*\)".*/\1/' \
|
||||||
|
| tr '[:upper:]' '[:lower:]' \
|
||||||
|
| sed 's/[^a-z0-9]/-/g')
|
||||||
|
|
||||||
|
IMAGE_NAME="${1:-$PROJECT_NAME}"
|
||||||
|
IMAGE_TAG="${2:-latest}"
|
||||||
|
|
||||||
|
echo "Projekt: $PROJECT_NAME"
|
||||||
|
echo "Baue Produktions-Image: $IMAGE_NAME:$IMAGE_TAG"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
podman build \
|
||||||
|
--tag "$IMAGE_NAME:$IMAGE_TAG" \
|
||||||
|
--file podman/php-prod/Containerfile \
|
||||||
|
"$PROJECT_DIR"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||||
|
echo "Build abgeschlossen: $IMAGE_NAME:$IMAGE_TAG"
|
||||||
|
echo ""
|
||||||
|
echo "Container starten:"
|
||||||
|
echo ""
|
||||||
|
echo " podman run -d \\"
|
||||||
|
echo " --name $PROJECT_NAME \\"
|
||||||
|
echo " -p 9000:9000 \\"
|
||||||
|
echo " -e APP_ENV=prod \\"
|
||||||
|
echo " -e APP_SECRET=\$(openssl rand -hex 16) \\"
|
||||||
|
echo " -e REDIS_URL=redis://your-redis-host:6379 \\"
|
||||||
|
echo " $IMAGE_NAME:$IMAGE_TAG"
|
||||||
|
echo ""
|
||||||
|
echo "Cache warmup nach dem Start:"
|
||||||
|
echo " podman exec $PROJECT_NAME php bin/console cache:warmup --env=prod"
|
||||||
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
"name": "app/symfony",
|
||||||
|
"description": "Symfony Application Template",
|
||||||
|
"type": "project",
|
||||||
|
"license": "GPL-3.0-only",
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"prefer-stable": true,
|
||||||
|
"require": {
|
||||||
|
"php": ">=8.2",
|
||||||
|
"ext-ctype": "*",
|
||||||
|
"ext-iconv": "*",
|
||||||
|
"ext-redis": "*",
|
||||||
|
"symfony/cache": "8.1.*",
|
||||||
|
"symfony/console": "8.1.*",
|
||||||
|
"symfony/dotenv": "8.1.*",
|
||||||
|
"symfony/flex": "^2",
|
||||||
|
"symfony/framework-bundle": "8.1.*",
|
||||||
|
"symfony/runtime": "8.1.*",
|
||||||
|
"symfony/yaml": "8.1.*"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/debug-bundle": "8.1.*",
|
||||||
|
"symfony/maker-bundle": "^1.67",
|
||||||
|
"symfony/stopwatch": "8.1.*",
|
||||||
|
"symfony/var-dumper": "8.1.*",
|
||||||
|
"symfony/web-profiler-bundle": "8.1.*"
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"allow-plugins": {
|
||||||
|
"php-http/discovery": true,
|
||||||
|
"symfony/flex": true,
|
||||||
|
"symfony/runtime": true
|
||||||
|
},
|
||||||
|
"sort-packages": true
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"App\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload-dev": {
|
||||||
|
"psr-4": {
|
||||||
|
"App\\Tests\\": "tests/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"auto-scripts": {
|
||||||
|
"cache:clear": "symfony-cmd",
|
||||||
|
"assets:install %PUBLIC_DIR%": "symfony-cmd"
|
||||||
|
},
|
||||||
|
"post-install-cmd": [
|
||||||
|
"@auto-scripts"
|
||||||
|
],
|
||||||
|
"post-update-cmd": [
|
||||||
|
"@auto-scripts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"symfony": {
|
||||||
|
"allow-contrib": false,
|
||||||
|
"require": "8.1.*"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Generated
+3583
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
|
||||||
|
Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
|
||||||
|
Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true],
|
||||||
|
Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
|
||||||
|
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
|
||||||
|
];
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
framework:
|
||||||
|
cache:
|
||||||
|
app: cache.adapter.redis
|
||||||
|
default_redis_provider: '%env(REDIS_URL)%'
|
||||||
|
|
||||||
|
when@test:
|
||||||
|
framework:
|
||||||
|
cache:
|
||||||
|
app: cache.adapter.array
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
when@dev:
|
||||||
|
debug:
|
||||||
|
# Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser.
|
||||||
|
# See the "server:dump" command to start a new server.
|
||||||
|
dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%"
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
framework:
|
||||||
|
secret: '%env(APP_SECRET)%'
|
||||||
|
http_method_override: false
|
||||||
|
handle_all_throwables: true
|
||||||
|
|
||||||
|
session:
|
||||||
|
handler_id: null
|
||||||
|
cookie_secure: auto
|
||||||
|
cookie_samesite: lax
|
||||||
|
storage_factory_id: session.storage.factory.native
|
||||||
|
|
||||||
|
php_errors:
|
||||||
|
log: true
|
||||||
|
|
||||||
|
when@test:
|
||||||
|
framework:
|
||||||
|
test: true
|
||||||
|
session:
|
||||||
|
storage_factory_id: session.storage.factory.mock_file
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
framework:
|
||||||
|
router:
|
||||||
|
utf8: true
|
||||||
|
|
||||||
|
when@prod:
|
||||||
|
framework:
|
||||||
|
router:
|
||||||
|
strict_requirements: null
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
twig:
|
||||||
|
file_name_pattern: '*.twig'
|
||||||
|
|
||||||
|
when@test:
|
||||||
|
twig:
|
||||||
|
strict_variables: true
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
when@dev:
|
||||||
|
web_profiler:
|
||||||
|
toolbar: true
|
||||||
|
|
||||||
|
framework:
|
||||||
|
profiler: true
|
||||||
|
|
||||||
|
when@test:
|
||||||
|
framework:
|
||||||
|
profiler:
|
||||||
|
collect: false
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (file_exists(dirname(__DIR__).'/var/cache/prod/App_KernelProdContainer.preload.php')) {
|
||||||
|
require dirname(__DIR__).'/var/cache/prod/App_KernelProdContainer.preload.php';
|
||||||
|
}
|
||||||
@@ -0,0 +1,887 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// This file is auto-generated and is for apps only. Bundles SHOULD NOT rely on its content.
|
||||||
|
|
||||||
|
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
|
||||||
|
|
||||||
|
use Symfony\Component\Config\Loader\ParamConfigurator as Param;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class provides array-shapes for configuring the services and bundles of an application.
|
||||||
|
*
|
||||||
|
* Services declared with the config() method below are autowired and autoconfigured by default.
|
||||||
|
*
|
||||||
|
* This is for apps only. Bundles SHOULD NOT use it.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
|
* ```php
|
||||||
|
* // config/services.php
|
||||||
|
* namespace Symfony\Component\DependencyInjection\Loader\Configurator;
|
||||||
|
*
|
||||||
|
* return App::config([
|
||||||
|
* 'services' => [
|
||||||
|
* 'App\\' => [
|
||||||
|
* 'resource' => '../src/',
|
||||||
|
* ],
|
||||||
|
* ],
|
||||||
|
* ]);
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @psalm-type ImportsConfig = list<string|array{
|
||||||
|
* resource: string,
|
||||||
|
* type?: string|null,
|
||||||
|
* ignore_errors?: bool,
|
||||||
|
* }>
|
||||||
|
* @psalm-type ParametersConfig = array<string, scalar|\UnitEnum|array<scalar|\UnitEnum|array<mixed>|Param|null>|Param|null>
|
||||||
|
* @psalm-type ArgumentsType = list<mixed>|array<string, mixed>
|
||||||
|
* @psalm-type CallType = array<string, ArgumentsType>|array{0:string, 1?:ArgumentsType, 2?:bool}|array{method:string, arguments?:ArgumentsType, returns_clone?:bool}
|
||||||
|
* @psalm-type TagsType = list<string|array<string, array<string, mixed>>> // arrays inside the list must have only one element, with the tag name as the key
|
||||||
|
* @psalm-type CallbackType = string|array{0:string|ReferenceConfigurator,1:string}|\Closure|ReferenceConfigurator
|
||||||
|
* @psalm-type DeprecationType = array{package: string, version: string, message?: string}
|
||||||
|
* @psalm-type DefaultsType = array{
|
||||||
|
* public?: bool,
|
||||||
|
* tags?: TagsType,
|
||||||
|
* resource_tags?: TagsType,
|
||||||
|
* autowire?: bool,
|
||||||
|
* autoconfigure?: bool,
|
||||||
|
* bind?: array<string, mixed>,
|
||||||
|
* }
|
||||||
|
* @psalm-type InstanceofType = array{
|
||||||
|
* shared?: bool,
|
||||||
|
* lazy?: bool|string,
|
||||||
|
* public?: bool,
|
||||||
|
* properties?: array<string, mixed>,
|
||||||
|
* configurator?: CallbackType,
|
||||||
|
* calls?: list<CallType>,
|
||||||
|
* tags?: TagsType,
|
||||||
|
* resource_tags?: TagsType,
|
||||||
|
* autowire?: bool,
|
||||||
|
* bind?: array<string, mixed>,
|
||||||
|
* constructor?: string,
|
||||||
|
* }
|
||||||
|
* @psalm-type DefinitionType = array{
|
||||||
|
* class?: string,
|
||||||
|
* file?: string,
|
||||||
|
* parent?: string,
|
||||||
|
* shared?: bool,
|
||||||
|
* synthetic?: bool,
|
||||||
|
* lazy?: bool|string,
|
||||||
|
* public?: bool,
|
||||||
|
* abstract?: bool,
|
||||||
|
* deprecated?: DeprecationType,
|
||||||
|
* factory?: CallbackType,
|
||||||
|
* configurator?: CallbackType,
|
||||||
|
* arguments?: ArgumentsType,
|
||||||
|
* properties?: array<string, mixed>,
|
||||||
|
* calls?: list<CallType>,
|
||||||
|
* tags?: TagsType,
|
||||||
|
* resource_tags?: TagsType,
|
||||||
|
* decorates?: string,
|
||||||
|
* decorates_tag?: string,
|
||||||
|
* decoration_inner_name?: string,
|
||||||
|
* decoration_priority?: int,
|
||||||
|
* decoration_on_invalid?: 'exception'|'ignore'|null,
|
||||||
|
* autowire?: bool,
|
||||||
|
* autoconfigure?: bool,
|
||||||
|
* bind?: array<string, mixed>,
|
||||||
|
* constructor?: string,
|
||||||
|
* from_callable?: CallbackType,
|
||||||
|
* }
|
||||||
|
* @psalm-type AliasType = string|array{
|
||||||
|
* alias: string,
|
||||||
|
* public?: bool,
|
||||||
|
* deprecated?: DeprecationType,
|
||||||
|
* }
|
||||||
|
* @psalm-type PrototypeType = array{
|
||||||
|
* resource: string,
|
||||||
|
* namespace?: string,
|
||||||
|
* exclude?: string|list<string>,
|
||||||
|
* parent?: string,
|
||||||
|
* shared?: bool,
|
||||||
|
* lazy?: bool|string,
|
||||||
|
* public?: bool,
|
||||||
|
* abstract?: bool,
|
||||||
|
* deprecated?: DeprecationType,
|
||||||
|
* factory?: CallbackType,
|
||||||
|
* arguments?: ArgumentsType,
|
||||||
|
* properties?: array<string, mixed>,
|
||||||
|
* configurator?: CallbackType,
|
||||||
|
* calls?: list<CallType>,
|
||||||
|
* tags?: TagsType,
|
||||||
|
* resource_tags?: TagsType,
|
||||||
|
* autowire?: bool,
|
||||||
|
* autoconfigure?: bool,
|
||||||
|
* bind?: array<string, mixed>,
|
||||||
|
* constructor?: string,
|
||||||
|
* }
|
||||||
|
* @psalm-type StackType = array{
|
||||||
|
* stack: list<DefinitionType|AliasType|PrototypeType|array<class-string, ArgumentsType|null>>,
|
||||||
|
* public?: bool,
|
||||||
|
* deprecated?: DeprecationType,
|
||||||
|
* decorates?: string,
|
||||||
|
* decorates_tag?: string,
|
||||||
|
* decoration_inner_name?: string,
|
||||||
|
* decoration_priority?: int,
|
||||||
|
* decoration_on_invalid?: 'exception'|'ignore'|null,
|
||||||
|
* }
|
||||||
|
* @psalm-type ServicesConfig = array{
|
||||||
|
* _defaults?: DefaultsType,
|
||||||
|
* _instanceof?: InstanceofType,
|
||||||
|
* ...<string, DefinitionType|AliasType|PrototypeType|StackType|ArgumentsType|null>
|
||||||
|
* }
|
||||||
|
* @psalm-type ExtensionType = array<string, mixed>
|
||||||
|
* @psalm-type FrameworkConfig = array{
|
||||||
|
* secret?: scalar|Param|null,
|
||||||
|
* http_method_override?: bool|Param, // Set true to enable support for the '_method' request parameter to determine the intended HTTP method on POST requests. // Default: false
|
||||||
|
* allowed_http_method_override?: null|list<string|Param>,
|
||||||
|
* trust_x_sendfile_type_header?: scalar|Param|null, // Set true to enable support for xsendfile in binary file responses. // Default: "%env(bool:default::SYMFONY_TRUST_X_SENDFILE_TYPE_HEADER)%"
|
||||||
|
* ide?: scalar|Param|null, // Default: "%env(default::SYMFONY_IDE)%"
|
||||||
|
* test?: bool|Param,
|
||||||
|
* default_locale?: scalar|Param|null, // Default: "en"
|
||||||
|
* set_locale_from_accept_language?: bool|Param, // Whether to use the Accept-Language HTTP header to set the Request locale (only when the "_locale" request attribute is not passed). // Default: false
|
||||||
|
* set_content_language_from_locale?: bool|Param, // Whether to set the Content-Language HTTP header on the Response using the Request locale. // Default: false
|
||||||
|
* enabled_locales?: list<scalar|Param|null>,
|
||||||
|
* trusted_hosts?: string|list<scalar|Param|null>,
|
||||||
|
* trusted_proxies?: mixed, // Default: ["%env(default::SYMFONY_TRUSTED_PROXIES)%"]
|
||||||
|
* trusted_headers?: string|list<scalar|Param|null>,
|
||||||
|
* error_controller?: scalar|Param|null, // Default: "error_controller"
|
||||||
|
* handle_all_throwables?: bool|Param, // HttpKernel will handle all kinds of \Throwable. // Default: true
|
||||||
|
* csrf_protection?: bool|array{
|
||||||
|
* enabled?: scalar|Param|null, // Default: null
|
||||||
|
* stateless_token_ids?: list<scalar|Param|null>,
|
||||||
|
* check_header?: scalar|Param|null, // Whether to check the CSRF token in a header in addition to a cookie when using stateless protection. // Default: false
|
||||||
|
* cookie_name?: scalar|Param|null, // The name of the cookie to use when using stateless protection. // Default: "csrf-token"
|
||||||
|
* },
|
||||||
|
* form?: bool|array{ // Form configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* csrf_protection?: bool|array{
|
||||||
|
* enabled?: scalar|Param|null, // Default: null
|
||||||
|
* token_id?: scalar|Param|null, // Default: null
|
||||||
|
* field_name?: scalar|Param|null, // Default: "_token"
|
||||||
|
* field_attr?: array<string, scalar|Param|null>,
|
||||||
|
* },
|
||||||
|
* },
|
||||||
|
* http_cache?: bool|array{ // HTTP cache configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* debug?: bool|Param, // Default: "%kernel.debug%"
|
||||||
|
* trace_level?: "none"|"short"|"full"|Param,
|
||||||
|
* trace_header?: scalar|Param|null,
|
||||||
|
* default_ttl?: int|Param,
|
||||||
|
* private_headers?: list<scalar|Param|null>,
|
||||||
|
* skip_response_headers?: list<scalar|Param|null>,
|
||||||
|
* allow_reload?: bool|Param,
|
||||||
|
* allow_revalidate?: bool|Param,
|
||||||
|
* stale_while_revalidate?: int|Param,
|
||||||
|
* stale_if_error?: int|Param,
|
||||||
|
* terminate_on_cache_hit?: bool|Param, // Deprecated: Setting the "framework.http_cache.terminate_on_cache_hit.terminate_on_cache_hit" configuration option is deprecated. It will be removed in version 9.0.
|
||||||
|
* },
|
||||||
|
* esi?: bool|array{ // ESI configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* },
|
||||||
|
* ssi?: bool|array{ // SSI configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* },
|
||||||
|
* fragments?: bool|array{ // Fragments configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* hinclude_default_template?: scalar|Param|null, // Default: null
|
||||||
|
* path?: scalar|Param|null, // Default: "/_fragment"
|
||||||
|
* },
|
||||||
|
* profiler?: bool|array{ // Profiler configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* collect?: bool|Param, // Default: true
|
||||||
|
* collect_parameter?: scalar|Param|null, // The name of the parameter to use to enable or disable collection on a per request basis. // Default: null
|
||||||
|
* only_exceptions?: bool|Param, // Default: false
|
||||||
|
* only_main_requests?: bool|Param, // Default: false
|
||||||
|
* dsn?: scalar|Param|null, // Default: "file:%kernel.cache_dir%/profiler"
|
||||||
|
* collect_serializer_data?: true|Param, // Deprecated: Setting the "framework.profiler.collect_serializer_data.collect_serializer_data" configuration option is deprecated. It will be removed in version 9.0. // Default: true
|
||||||
|
* },
|
||||||
|
* workflows?: bool|array{
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* workflows?: array<string, array{ // Default: []
|
||||||
|
* audit_trail?: bool|array{
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* },
|
||||||
|
* type?: "workflow"|"state_machine"|Param, // Default: "state_machine"
|
||||||
|
* marking_store?: array{
|
||||||
|
* type?: "method"|Param,
|
||||||
|
* property?: scalar|Param|null,
|
||||||
|
* service?: scalar|Param|null,
|
||||||
|
* },
|
||||||
|
* supports?: string|list<scalar|Param|null>,
|
||||||
|
* definition_validators?: list<scalar|Param|null>,
|
||||||
|
* support_strategy?: scalar|Param|null,
|
||||||
|
* initial_marking?: \BackedEnum|string|list<scalar|Param|null>,
|
||||||
|
* events_to_dispatch?: null|list<string|Param>,
|
||||||
|
* places?: string|list<array{ // Default: []
|
||||||
|
* name?: scalar|Param|null,
|
||||||
|
* metadata?: array<string, mixed>,
|
||||||
|
* }>,
|
||||||
|
* transitions?: list<array{ // Default: []
|
||||||
|
* name?: string|Param,
|
||||||
|
* guard?: string|Param, // An expression to block the transition.
|
||||||
|
* from?: \BackedEnum|string|list<array{ // Default: []
|
||||||
|
* place?: string|Param,
|
||||||
|
* weight?: int|Param, // Default: 1
|
||||||
|
* }>,
|
||||||
|
* to?: \BackedEnum|string|list<array{ // Default: []
|
||||||
|
* place?: string|Param,
|
||||||
|
* weight?: int|Param, // Default: 1
|
||||||
|
* }>,
|
||||||
|
* weight?: int|Param, // Default: 1
|
||||||
|
* metadata?: array<string, mixed>,
|
||||||
|
* }>,
|
||||||
|
* metadata?: array<string, mixed>,
|
||||||
|
* }>,
|
||||||
|
* },
|
||||||
|
* router?: bool|array{ // Router configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* resource?: scalar|Param|null,
|
||||||
|
* type?: scalar|Param|null,
|
||||||
|
* default_uri?: scalar|Param|null, // The default URI used to generate URLs in a non-HTTP context. // Default: null
|
||||||
|
* http_port?: scalar|Param|null, // Default: 80
|
||||||
|
* https_port?: scalar|Param|null, // Default: 443
|
||||||
|
* strict_requirements?: scalar|Param|null, // set to true to throw an exception when a parameter does not match the requirements set to false to disable exceptions when a parameter does not match the requirements (and return null instead) set to null to disable parameter checks against requirements 'true' is the preferred configuration in development mode, while 'false' or 'null' might be preferred in production // Default: true
|
||||||
|
* utf8?: bool|Param, // Default: true
|
||||||
|
* },
|
||||||
|
* session?: bool|array{ // Session configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* storage_factory_id?: scalar|Param|null, // Default: "session.storage.factory.native"
|
||||||
|
* handler_id?: scalar|Param|null, // Defaults to using the native session handler, or to the native *file* session handler if "save_path" is not null.
|
||||||
|
* name?: scalar|Param|null,
|
||||||
|
* cookie_lifetime?: scalar|Param|null,
|
||||||
|
* cookie_path?: scalar|Param|null,
|
||||||
|
* cookie_domain?: scalar|Param|null,
|
||||||
|
* cookie_secure?: true|false|"auto"|Param, // Default: "auto"
|
||||||
|
* cookie_httponly?: bool|Param, // Default: true
|
||||||
|
* cookie_samesite?: null|"lax"|"strict"|"none"|Param, // Default: "lax"
|
||||||
|
* use_cookies?: bool|Param,
|
||||||
|
* gc_divisor?: scalar|Param|null,
|
||||||
|
* gc_probability?: scalar|Param|null,
|
||||||
|
* gc_maxlifetime?: scalar|Param|null,
|
||||||
|
* save_path?: scalar|Param|null, // Defaults to "%kernel.cache_dir%/sessions" if the "handler_id" option is not null.
|
||||||
|
* metadata_update_threshold?: int|Param, // Seconds to wait between 2 session metadata updates. // Default: 0
|
||||||
|
* },
|
||||||
|
* request?: bool|array{ // Request configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* formats?: array<string, string|list<scalar|Param|null>>,
|
||||||
|
* },
|
||||||
|
* assets?: bool|array{ // Assets configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* strict_mode?: bool|Param, // Throw an exception if an entry is missing from the manifest.json. // Default: false
|
||||||
|
* version_strategy?: scalar|Param|null, // Default: null
|
||||||
|
* version?: scalar|Param|null, // Default: null
|
||||||
|
* version_format?: scalar|Param|null, // Default: "%%s?%%s"
|
||||||
|
* json_manifest_path?: scalar|Param|null, // Default: null
|
||||||
|
* base_path?: scalar|Param|null, // Default: ""
|
||||||
|
* base_urls?: string|list<scalar|Param|null>,
|
||||||
|
* packages?: array<string, array{ // Default: []
|
||||||
|
* strict_mode?: bool|Param, // Throw an exception if an entry is missing from the manifest.json. // Default: false
|
||||||
|
* version_strategy?: scalar|Param|null, // Default: null
|
||||||
|
* version?: scalar|Param|null,
|
||||||
|
* version_format?: scalar|Param|null, // Default: null
|
||||||
|
* json_manifest_path?: scalar|Param|null, // Default: null
|
||||||
|
* base_path?: scalar|Param|null, // Default: ""
|
||||||
|
* base_urls?: string|list<scalar|Param|null>,
|
||||||
|
* }>,
|
||||||
|
* },
|
||||||
|
* asset_mapper?: bool|array{ // Asset Mapper configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* paths?: string|array<string, scalar|Param|null>,
|
||||||
|
* excluded_patterns?: list<scalar|Param|null>,
|
||||||
|
* exclude_dotfiles?: bool|Param, // If true, any files starting with "." will be excluded from the asset mapper. // Default: true
|
||||||
|
* server?: bool|Param, // If true, a "dev server" will return the assets from the public directory (true in "debug" mode only by default). // Default: true
|
||||||
|
* public_prefix?: scalar|Param|null, // The public path where the assets will be written to (and served from when "server" is true). // Default: "/assets/"
|
||||||
|
* missing_import_mode?: "strict"|"warn"|"ignore"|Param, // Behavior if an asset cannot be found when imported from JavaScript or CSS files - e.g. "import './non-existent.js'". "strict" means an exception is thrown, "warn" means a warning is logged, "ignore" means the import is left as-is. // Default: "warn"
|
||||||
|
* extensions?: array<string, scalar|Param|null>,
|
||||||
|
* importmap_path?: scalar|Param|null, // The path of the importmap.php file. // Default: "%kernel.project_dir%/importmap.php"
|
||||||
|
* importmap_polyfill?: scalar|Param|null, // The importmap name that will be used to load the polyfill. Set to false to disable. // Default: "es-module-shims"
|
||||||
|
* importmap_script_attributes?: array<string, scalar|Param|null>,
|
||||||
|
* vendor_dir?: scalar|Param|null, // The directory to store JavaScript vendors. // Default: "%kernel.project_dir%/assets/vendor"
|
||||||
|
* precompress?: bool|array{ // Precompress assets with Brotli, Zstandard and gzip.
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* formats?: list<scalar|Param|null>,
|
||||||
|
* extensions?: list<scalar|Param|null>,
|
||||||
|
* },
|
||||||
|
* },
|
||||||
|
* translator?: bool|array{ // Translator configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* fallbacks?: string|list<scalar|Param|null>,
|
||||||
|
* logging?: bool|Param, // Default: false
|
||||||
|
* formatter?: scalar|Param|null, // Default: "translator.formatter.default"
|
||||||
|
* cache_dir?: scalar|Param|null, // Default: "%kernel.cache_dir%/translations"
|
||||||
|
* default_path?: scalar|Param|null, // The default path used to load translations. // Default: "%kernel.project_dir%/translations"
|
||||||
|
* paths?: list<scalar|Param|null>,
|
||||||
|
* pseudo_localization?: bool|array{
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* accents?: bool|Param, // Default: true
|
||||||
|
* expansion_factor?: float|Param, // Default: 1.0
|
||||||
|
* brackets?: bool|Param, // Default: true
|
||||||
|
* parse_html?: bool|Param, // Default: false
|
||||||
|
* localizable_html_attributes?: list<scalar|Param|null>,
|
||||||
|
* },
|
||||||
|
* providers?: array<string, array{ // Default: []
|
||||||
|
* dsn?: scalar|Param|null,
|
||||||
|
* domains?: list<scalar|Param|null>,
|
||||||
|
* locales?: list<scalar|Param|null>,
|
||||||
|
* }>,
|
||||||
|
* globals?: array<string, string|array{ // Default: []
|
||||||
|
* value?: mixed,
|
||||||
|
* message?: string|Param,
|
||||||
|
* parameters?: array<string, scalar|Param|null>,
|
||||||
|
* domain?: string|Param,
|
||||||
|
* }>,
|
||||||
|
* },
|
||||||
|
* validation?: bool|array{ // Validation configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* enable_attributes?: bool|Param, // Default: true
|
||||||
|
* static_method?: string|list<scalar|Param|null>,
|
||||||
|
* translation_domain?: scalar|Param|null, // Default: "validators"
|
||||||
|
* email_validation_mode?: "html5"|"html5-allow-no-tld"|"strict"|Param, // Default: "html5"
|
||||||
|
* mapping?: array{
|
||||||
|
* paths?: list<scalar|Param|null>,
|
||||||
|
* },
|
||||||
|
* not_compromised_password?: bool|array{
|
||||||
|
* enabled?: bool|Param, // When disabled, compromised passwords will be accepted as valid. // Default: true
|
||||||
|
* endpoint?: scalar|Param|null, // API endpoint for the NotCompromisedPassword Validator. // Default: null
|
||||||
|
* },
|
||||||
|
* disable_translation?: bool|Param, // Default: false
|
||||||
|
* property_metadata_existence_check?: bool|Param, // When enabled, validateProperty() and validatePropertyValue() throw an exception if no metadata is found for the given property. // Default: false
|
||||||
|
* auto_mapping?: array<string, array{ // Default: []
|
||||||
|
* services?: list<scalar|Param|null>,
|
||||||
|
* }>,
|
||||||
|
* },
|
||||||
|
* serializer?: bool|array{ // Serializer configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* enable_attributes?: bool|Param, // Default: true
|
||||||
|
* name_converter?: scalar|Param|null,
|
||||||
|
* circular_reference_handler?: scalar|Param|null,
|
||||||
|
* max_depth_handler?: scalar|Param|null,
|
||||||
|
* mapping?: array{
|
||||||
|
* paths?: list<scalar|Param|null>,
|
||||||
|
* },
|
||||||
|
* default_context?: array<string, mixed>,
|
||||||
|
* named_serializers?: array<string, array{ // Default: []
|
||||||
|
* name_converter?: scalar|Param|null,
|
||||||
|
* default_context?: array<string, mixed>,
|
||||||
|
* include_built_in_normalizers?: bool|Param, // Whether to include the built-in normalizers // Default: true
|
||||||
|
* include_built_in_encoders?: bool|Param, // Whether to include the built-in encoders // Default: true
|
||||||
|
* }>,
|
||||||
|
* },
|
||||||
|
* property_access?: bool|array{ // Property access configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* magic_call?: bool|Param, // Default: false
|
||||||
|
* magic_get?: bool|Param, // Default: true
|
||||||
|
* magic_set?: bool|Param, // Default: true
|
||||||
|
* throw_exception_on_invalid_index?: bool|Param, // Default: false
|
||||||
|
* throw_exception_on_invalid_property_path?: bool|Param, // Default: true
|
||||||
|
* },
|
||||||
|
* type_info?: bool|array{ // Type info configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* aliases?: array<string, scalar|Param|null>,
|
||||||
|
* },
|
||||||
|
* property_info?: bool|array{ // Property info configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* with_constructor_extractor?: bool|Param, // Registers the constructor extractor. // Default: true
|
||||||
|
* },
|
||||||
|
* cache?: array{ // Cache configuration
|
||||||
|
* prefix_seed?: scalar|Param|null, // Used to namespace cache keys when using several apps with the same shared backend. // Default: "_%kernel.project_dir%.%kernel.container_class%"
|
||||||
|
* app?: scalar|Param|null, // App related cache pools configuration. // Default: "cache.adapter.filesystem"
|
||||||
|
* system?: scalar|Param|null, // System related cache pools configuration. // Default: "cache.adapter.system"
|
||||||
|
* directory?: scalar|Param|null, // Default: "%kernel.share_dir%/pools/app"
|
||||||
|
* default_psr6_provider?: scalar|Param|null,
|
||||||
|
* default_redis_provider?: scalar|Param|null, // Default: "redis://localhost"
|
||||||
|
* default_valkey_provider?: scalar|Param|null, // Default: "valkey://localhost"
|
||||||
|
* default_memcached_provider?: scalar|Param|null, // Default: "memcached://localhost"
|
||||||
|
* default_doctrine_dbal_provider?: scalar|Param|null, // Default: "database_connection"
|
||||||
|
* default_pdo_provider?: scalar|Param|null, // Default: null
|
||||||
|
* pools?: array<string, array{ // Default: []
|
||||||
|
* adapters?: string|list<scalar|Param|null>,
|
||||||
|
* tags?: scalar|Param|null, // Default: null
|
||||||
|
* public?: bool|Param, // Default: false
|
||||||
|
* default_lifetime?: scalar|Param|null, // Default lifetime of the pool.
|
||||||
|
* provider?: scalar|Param|null, // Overwrite the setting from the default provider for this adapter.
|
||||||
|
* early_expiration_message_bus?: scalar|Param|null,
|
||||||
|
* clearer?: scalar|Param|null,
|
||||||
|
* marshaller?: scalar|Param|null, // The marshaller service to use for this pool.
|
||||||
|
* }>,
|
||||||
|
* },
|
||||||
|
* php_errors?: array{ // PHP errors handling configuration
|
||||||
|
* log?: mixed, // Use the application logger instead of the PHP logger for logging PHP errors. // Default: true
|
||||||
|
* throw?: bool|Param, // Throw PHP errors as \ErrorException instances. // Default: true
|
||||||
|
* },
|
||||||
|
* exceptions?: array<string, array{ // Default: []
|
||||||
|
* log_level?: scalar|Param|null, // The level of log message. Null to let Symfony decide. // Default: null
|
||||||
|
* status_code?: scalar|Param|null, // The status code of the response. Null or 0 to let Symfony decide. // Default: null
|
||||||
|
* log_channel?: scalar|Param|null, // The channel of log message. Null to let Symfony decide. // Default: null
|
||||||
|
* }>,
|
||||||
|
* web_link?: bool|array{ // Web links configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* },
|
||||||
|
* lock?: bool|string|array{ // Lock configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* resources?: string|array<string, string|list<scalar|Param|null>>,
|
||||||
|
* },
|
||||||
|
* semaphore?: bool|string|array{ // Semaphore configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* resources?: string|array<string, scalar|Param|null>,
|
||||||
|
* },
|
||||||
|
* messenger?: bool|array{ // Messenger configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* routing?: array<string, string|list<scalar|Param|null>>,
|
||||||
|
* serializer?: array{
|
||||||
|
* default_serializer?: scalar|Param|null, // Service id to use as the default serializer for the transports. // Default: "messenger.transport.native_php_serializer"
|
||||||
|
* symfony_serializer?: array{
|
||||||
|
* format?: scalar|Param|null, // Serialization format for the messenger.transport.symfony_serializer service (which is not the serializer used by default). // Default: "json"
|
||||||
|
* context?: array<string, mixed>,
|
||||||
|
* },
|
||||||
|
* },
|
||||||
|
* transports?: array<string, string|array{ // Default: []
|
||||||
|
* dsn?: scalar|Param|null,
|
||||||
|
* serializer?: scalar|Param|null, // Service id of a custom serializer to use. // Default: null
|
||||||
|
* options?: array<string, mixed>,
|
||||||
|
* failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null
|
||||||
|
* retry_strategy?: string|array{
|
||||||
|
* service?: scalar|Param|null, // Service id to override the retry strategy entirely. // Default: null
|
||||||
|
* max_retries?: int|Param, // Default: 3
|
||||||
|
* delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000
|
||||||
|
* multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: this delay = (delay * (multiple ^ retries)). // Default: 2
|
||||||
|
* max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0
|
||||||
|
* jitter?: float|Param, // Randomness to apply to the delay (between 0 and 1). // Default: 0.1
|
||||||
|
* },
|
||||||
|
* rate_limiter?: scalar|Param|null, // Rate limiter name to use when processing messages. // Default: null
|
||||||
|
* }>,
|
||||||
|
* failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null
|
||||||
|
* stop_worker_on_signals?: int|string|list<scalar|Param|null>,
|
||||||
|
* default_bus?: scalar|Param|null, // Default: null
|
||||||
|
* buses?: array<string, array{ // Default: {"messenger.bus.default":{"default_middleware":{"enabled":true,"allow_no_handlers":false,"allow_no_senders":true},"middleware":[]}}
|
||||||
|
* default_middleware?: bool|string|array{
|
||||||
|
* enabled?: bool|Param, // Default: true
|
||||||
|
* allow_no_handlers?: bool|Param, // Default: false
|
||||||
|
* allow_no_senders?: bool|Param, // Default: true
|
||||||
|
* },
|
||||||
|
* middleware?: string|list<string|array{ // Default: []
|
||||||
|
* id?: scalar|Param|null,
|
||||||
|
* arguments?: list<mixed>,
|
||||||
|
* }>,
|
||||||
|
* }>,
|
||||||
|
* },
|
||||||
|
* scheduler?: bool|array{ // Scheduler configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* },
|
||||||
|
* disallow_search_engine_index?: bool|Param, // Enabled by default when debug is enabled. // Default: true
|
||||||
|
* http_client?: bool|array{ // HTTP Client configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* max_host_connections?: int|Param, // The maximum number of connections to a single host.
|
||||||
|
* default_options?: array{
|
||||||
|
* headers?: array<string, mixed>,
|
||||||
|
* vars?: array<string, mixed>,
|
||||||
|
* max_redirects?: int|Param, // The maximum number of redirects to follow.
|
||||||
|
* http_version?: scalar|Param|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version.
|
||||||
|
* resolve?: array<string, scalar|Param|null>,
|
||||||
|
* proxy?: scalar|Param|null, // The URL of the proxy to pass requests through or null for automatic detection.
|
||||||
|
* no_proxy?: scalar|Param|null, // A comma separated list of hosts that do not require a proxy to be reached.
|
||||||
|
* timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter.
|
||||||
|
* max_duration?: float|Param, // The maximum execution time for the request+response as a whole.
|
||||||
|
* bindto?: scalar|Param|null, // A network interface name, IP address, a host name or a UNIX socket to bind to.
|
||||||
|
* verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context.
|
||||||
|
* verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name.
|
||||||
|
* cafile?: scalar|Param|null, // A certificate authority file.
|
||||||
|
* capath?: scalar|Param|null, // A directory that contains multiple certificate authority files.
|
||||||
|
* local_cert?: scalar|Param|null, // A PEM formatted certificate file.
|
||||||
|
* local_pk?: scalar|Param|null, // A private key file.
|
||||||
|
* passphrase?: scalar|Param|null, // The passphrase used to encrypt the "local_pk" file.
|
||||||
|
* ciphers?: scalar|Param|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...)
|
||||||
|
* peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es).
|
||||||
|
* sha1?: mixed,
|
||||||
|
* pin-sha256?: mixed,
|
||||||
|
* md5?: mixed,
|
||||||
|
* },
|
||||||
|
* crypto_method?: scalar|Param|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants.
|
||||||
|
* extra?: array<string, mixed>,
|
||||||
|
* rate_limiter?: scalar|Param|null, // Rate limiter name to use for throttling requests. // Default: null
|
||||||
|
* caching?: bool|array{ // Caching configuration.
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client"
|
||||||
|
* shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true
|
||||||
|
* max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. // Default: 86400
|
||||||
|
* },
|
||||||
|
* retry_failed?: bool|array{
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null
|
||||||
|
* http_codes?: int|string|array<string, array{ // Default: []
|
||||||
|
* code?: int|Param,
|
||||||
|
* methods?: string|list<string|Param>,
|
||||||
|
* }>,
|
||||||
|
* max_retries?: int|Param, // Default: 3
|
||||||
|
* delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000
|
||||||
|
* multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2
|
||||||
|
* max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0
|
||||||
|
* jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1
|
||||||
|
* },
|
||||||
|
* },
|
||||||
|
* mock_response_factory?: scalar|Param|null, // `true` to always return empty 200 responses, or the id of the service to use to generate mock responses - which should be either an invokable or an iterable.
|
||||||
|
* scoped_clients?: array<string, string|array{ // Default: []
|
||||||
|
* scope?: scalar|Param|null, // The regular expression that the request URL must match before adding the other options. When none is provided, the base URI is used instead.
|
||||||
|
* base_uri?: scalar|Param|null, // The URI to resolve relative URLs, following rules in RFC 3985, section 2.
|
||||||
|
* auth_basic?: scalar|Param|null, // An HTTP Basic authentication "username:password".
|
||||||
|
* auth_bearer?: scalar|Param|null, // A token enabling HTTP Bearer authorization.
|
||||||
|
* auth_ntlm?: scalar|Param|null, // A "username:password" pair to use Microsoft NTLM authentication (requires the cURL extension).
|
||||||
|
* query?: array<string, scalar|Param|null>,
|
||||||
|
* headers?: array<string, mixed>,
|
||||||
|
* max_redirects?: int|Param, // The maximum number of redirects to follow.
|
||||||
|
* http_version?: scalar|Param|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version.
|
||||||
|
* resolve?: array<string, scalar|Param|null>,
|
||||||
|
* proxy?: scalar|Param|null, // The URL of the proxy to pass requests through or null for automatic detection.
|
||||||
|
* no_proxy?: scalar|Param|null, // A comma separated list of hosts that do not require a proxy to be reached.
|
||||||
|
* timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter.
|
||||||
|
* max_duration?: float|Param, // The maximum execution time for the request+response as a whole.
|
||||||
|
* bindto?: scalar|Param|null, // A network interface name, IP address, a host name or a UNIX socket to bind to.
|
||||||
|
* verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context.
|
||||||
|
* verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name.
|
||||||
|
* cafile?: scalar|Param|null, // A certificate authority file.
|
||||||
|
* capath?: scalar|Param|null, // A directory that contains multiple certificate authority files.
|
||||||
|
* local_cert?: scalar|Param|null, // A PEM formatted certificate file.
|
||||||
|
* local_pk?: scalar|Param|null, // A private key file.
|
||||||
|
* passphrase?: scalar|Param|null, // The passphrase used to encrypt the "local_pk" file.
|
||||||
|
* ciphers?: scalar|Param|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...).
|
||||||
|
* peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es).
|
||||||
|
* sha1?: mixed,
|
||||||
|
* pin-sha256?: mixed,
|
||||||
|
* md5?: mixed,
|
||||||
|
* },
|
||||||
|
* crypto_method?: scalar|Param|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants.
|
||||||
|
* mock_response_factory?: scalar|Param|null, // `true` to always return empty 200 responses, `false` to disable mocking, or the id of the service to use to generate mock responses (invokable or iterable).
|
||||||
|
* extra?: array<string, mixed>,
|
||||||
|
* rate_limiter?: scalar|Param|null, // Rate limiter name to use for throttling requests. // Default: null
|
||||||
|
* caching?: bool|array{ // Caching configuration.
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client"
|
||||||
|
* shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true
|
||||||
|
* max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. // Default: 86400
|
||||||
|
* },
|
||||||
|
* retry_failed?: bool|array{
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null
|
||||||
|
* http_codes?: int|string|array<string, array{ // Default: []
|
||||||
|
* code?: int|Param,
|
||||||
|
* methods?: string|list<string|Param>,
|
||||||
|
* }>,
|
||||||
|
* max_retries?: int|Param, // Default: 3
|
||||||
|
* delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000
|
||||||
|
* multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2
|
||||||
|
* max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0
|
||||||
|
* jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1
|
||||||
|
* },
|
||||||
|
* }>,
|
||||||
|
* },
|
||||||
|
* mailer?: bool|array{ // Mailer configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* message_bus?: scalar|Param|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null
|
||||||
|
* dsn?: scalar|Param|null, // Default: null
|
||||||
|
* transports?: array<string, scalar|Param|null>,
|
||||||
|
* envelope?: array{ // Mailer Envelope configuration
|
||||||
|
* sender?: scalar|Param|null,
|
||||||
|
* recipients?: string|list<scalar|Param|null>,
|
||||||
|
* allowed_recipients?: string|list<scalar|Param|null>,
|
||||||
|
* },
|
||||||
|
* headers?: array<string, string|array{ // Default: []
|
||||||
|
* value?: mixed,
|
||||||
|
* }>,
|
||||||
|
* dkim_signer?: bool|array{ // DKIM signer configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* key?: scalar|Param|null, // Key content, or path to key (in PEM format with the `file://` prefix) // Default: ""
|
||||||
|
* domain?: scalar|Param|null, // Default: ""
|
||||||
|
* select?: scalar|Param|null, // Default: ""
|
||||||
|
* passphrase?: scalar|Param|null, // The private key passphrase // Default: ""
|
||||||
|
* options?: array<string, mixed>,
|
||||||
|
* },
|
||||||
|
* smime_signer?: bool|array{ // S/MIME signer configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* key?: scalar|Param|null, // Path to key (in PEM format) // Default: ""
|
||||||
|
* certificate?: scalar|Param|null, // Path to certificate (in PEM format without the `file://` prefix) // Default: ""
|
||||||
|
* passphrase?: scalar|Param|null, // The private key passphrase // Default: null
|
||||||
|
* extra_certificates?: scalar|Param|null, // Default: null
|
||||||
|
* sign_options?: int|Param, // Default: null
|
||||||
|
* },
|
||||||
|
* smime_encrypter?: bool|array{ // S/MIME encrypter configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* repository?: scalar|Param|null, // S/MIME certificate repository service. This service shall implement the `Symfony\Component\Mailer\EventListener\SmimeCertificateRepositoryInterface`. // Default: ""
|
||||||
|
* cipher?: int|Param, // A set of algorithms used to encrypt the message // Default: null
|
||||||
|
* },
|
||||||
|
* },
|
||||||
|
* secrets?: bool|array{
|
||||||
|
* enabled?: bool|Param, // Default: true
|
||||||
|
* vault_directory?: scalar|Param|null, // Default: "%kernel.project_dir%/config/secrets/%kernel.runtime_environment%"
|
||||||
|
* local_dotenv_file?: scalar|Param|null, // Default: "%kernel.project_dir%/.env.%kernel.environment%.local"
|
||||||
|
* decryption_env_var?: scalar|Param|null, // Default: "base64:default::SYMFONY_DECRYPTION_SECRET"
|
||||||
|
* },
|
||||||
|
* notifier?: bool|array{ // Notifier configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* message_bus?: scalar|Param|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null
|
||||||
|
* chatter_transports?: array<string, scalar|Param|null>,
|
||||||
|
* texter_transports?: array<string, scalar|Param|null>,
|
||||||
|
* notification_on_failed_messages?: bool|Param, // Default: false
|
||||||
|
* channel_policy?: array<string, string|list<scalar|Param|null>>,
|
||||||
|
* admin_recipients?: list<array{ // Default: []
|
||||||
|
* email?: scalar|Param|null,
|
||||||
|
* phone?: scalar|Param|null, // Default: ""
|
||||||
|
* }>,
|
||||||
|
* },
|
||||||
|
* rate_limiter?: bool|array{ // Rate limiter configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* limiters?: array<string, array{ // Default: []
|
||||||
|
* lock_factory?: scalar|Param|null, // The service ID of the lock factory used by this limiter (or null to disable locking). // Default: "auto"
|
||||||
|
* cache_pool?: scalar|Param|null, // The cache pool to use for storing the current limiter state. // Default: "cache.rate_limiter"
|
||||||
|
* storage_service?: scalar|Param|null, // The service ID of a custom storage implementation, this precedes any configured "cache_pool". // Default: null
|
||||||
|
* policy?: "fixed_window"|"token_bucket"|"sliding_window"|"compound"|"no_limit"|Param, // The algorithm to be used by this limiter.
|
||||||
|
* limiters?: string|list<scalar|Param|null>,
|
||||||
|
* limit?: int|Param, // The maximum allowed hits in a fixed interval or burst.
|
||||||
|
* interval?: scalar|Param|null, // Configures the fixed interval if "policy" is set to "fixed_window" or "sliding_window". The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent).
|
||||||
|
* rate?: array{ // Configures the fill rate if "policy" is set to "token_bucket".
|
||||||
|
* interval?: scalar|Param|null, // Configures the rate interval. The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent).
|
||||||
|
* amount?: int|Param, // Amount of tokens to add each interval. // Default: 1
|
||||||
|
* },
|
||||||
|
* anchor_at?: scalar|Param|null, // Aligns the "fixed_window" policy to a calendar (e.g. "2024-01-05 00:00:00 UTC" combined with `interval: 1 month` resets the counter on the 5th of each month). UTC if not specified. // Default: null
|
||||||
|
* }>,
|
||||||
|
* },
|
||||||
|
* uid?: bool|array{ // Uid configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* default_uuid_version?: 7|6|4|1|Param, // Default: 7
|
||||||
|
* name_based_uuid_version?: 5|3|Param, // Default: 5
|
||||||
|
* name_based_uuid_namespace?: scalar|Param|null,
|
||||||
|
* time_based_uuid_version?: 7|6|1|Param, // Default: 7
|
||||||
|
* time_based_uuid_node?: scalar|Param|null,
|
||||||
|
* uuid47_secret?: scalar|Param|null, // A high-entropy secret used by the "uuid47_transformer" service. Defaults to "kernel.secret". // Default: null
|
||||||
|
* },
|
||||||
|
* html_sanitizer?: bool|array{ // HtmlSanitizer configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* sanitizers?: array<string, array{ // Default: []
|
||||||
|
* default_action?: "drop"|"block"|"allow"|Param, // Defines how the sanitizer must behave by default.
|
||||||
|
* allow_safe_elements?: bool|Param, // Allows "safe" elements and attributes. // Default: false
|
||||||
|
* allow_static_elements?: bool|Param, // Allows all static elements and attributes from the W3C Sanitizer API standard. // Default: false
|
||||||
|
* allow_elements?: array<string, mixed>,
|
||||||
|
* block_elements?: string|list<string|Param>,
|
||||||
|
* drop_elements?: string|list<string|Param>,
|
||||||
|
* allow_attributes?: array<string, mixed>,
|
||||||
|
* drop_attributes?: array<string, mixed>,
|
||||||
|
* force_attributes?: array<string, array<string, string|Param>>,
|
||||||
|
* force_https_urls?: bool|Param, // Transforms URLs using the HTTP scheme to use the HTTPS scheme instead. // Default: false
|
||||||
|
* allowed_link_schemes?: string|list<string|Param>,
|
||||||
|
* allowed_link_hosts?: null|string|list<string|Param>,
|
||||||
|
* allow_relative_links?: bool|Param, // Allows relative URLs to be used in links href attributes. // Default: false
|
||||||
|
* allowed_media_schemes?: string|list<string|Param>,
|
||||||
|
* allowed_media_hosts?: null|string|list<string|Param>,
|
||||||
|
* allow_relative_medias?: bool|Param, // Allows relative URLs to be used in media source attributes (img, audio, video, ...). // Default: false
|
||||||
|
* with_attribute_sanitizers?: string|list<string|Param>,
|
||||||
|
* without_attribute_sanitizers?: string|list<string|Param>,
|
||||||
|
* max_input_length?: int|Param, // The maximum length allowed for the sanitized input. // Default: 0
|
||||||
|
* }>,
|
||||||
|
* },
|
||||||
|
* webhook?: bool|array{ // Webhook configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* message_bus?: scalar|Param|null, // The message bus to use. // Default: "messenger.default_bus"
|
||||||
|
* event_header_name?: scalar|Param|null, // Default: "Webhook-Event"
|
||||||
|
* id_header_name?: scalar|Param|null, // Default: "Webhook-Id"
|
||||||
|
* signature_header_name?: scalar|Param|null, // Default: "Webhook-Signature"
|
||||||
|
* signing_algorithm?: scalar|Param|null, // Default: "sha256"
|
||||||
|
* routing?: array<string, array{ // Default: []
|
||||||
|
* service?: scalar|Param|null,
|
||||||
|
* secret?: scalar|Param|null, // Default: ""
|
||||||
|
* }>,
|
||||||
|
* },
|
||||||
|
* remote-event?: bool|array{ // RemoteEvent configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* },
|
||||||
|
* json_streamer?: bool|array{ // JSON streamer configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* default_options?: array{
|
||||||
|
* include_null_properties?: bool|Param, // Encode the properties with null value // Default: false
|
||||||
|
* ...<string, mixed>
|
||||||
|
* },
|
||||||
|
* },
|
||||||
|
* }
|
||||||
|
* @psalm-type WebProfilerConfig = array{
|
||||||
|
* toolbar?: bool|array{ // Profiler toolbar configuration
|
||||||
|
* enabled?: bool|Param, // Default: false
|
||||||
|
* ajax_replace?: bool|Param, // Replace toolbar on AJAX requests // Default: false
|
||||||
|
* },
|
||||||
|
* intercept_redirects?: bool|Param, // Default: false
|
||||||
|
* excluded_ajax_paths?: scalar|Param|null, // Default: "^/((index|app(_[\\w]+)?)\\.php/)?_wdt"
|
||||||
|
* }
|
||||||
|
* @psalm-type DebugConfig = array{
|
||||||
|
* max_items?: int|Param, // Max number of displayed items past the first level, -1 means no limit. // Default: 2500
|
||||||
|
* min_depth?: int|Param, // Minimum tree depth to clone all the items, 1 is default. // Default: 1
|
||||||
|
* max_string_length?: int|Param, // Max length of displayed strings, -1 means no limit. // Default: -1
|
||||||
|
* dump_destination?: scalar|Param|null, // A stream URL where dumps should be written to. // Default: null
|
||||||
|
* theme?: "dark"|"light"|Param, // Changes the color of the dump() output when rendered directly on the templating. "dark" (default) or "light". // Default: "dark"
|
||||||
|
* }
|
||||||
|
* @psalm-type TwigConfig = array{
|
||||||
|
* form_themes?: list<scalar|Param|null>,
|
||||||
|
* globals?: array<string, array{ // Default: []
|
||||||
|
* id?: scalar|Param|null,
|
||||||
|
* type?: scalar|Param|null,
|
||||||
|
* value?: mixed,
|
||||||
|
* }>,
|
||||||
|
* autoescape_service?: scalar|Param|null, // Default: null
|
||||||
|
* autoescape_service_method?: scalar|Param|null, // Default: null
|
||||||
|
* cache?: scalar|Param|null, // Default: true
|
||||||
|
* charset?: scalar|Param|null, // Default: "%kernel.charset%"
|
||||||
|
* debug?: bool|Param, // Default: "%kernel.debug%"
|
||||||
|
* strict_variables?: bool|Param, // Default: "%kernel.debug%"
|
||||||
|
* auto_reload?: scalar|Param|null,
|
||||||
|
* optimizations?: int|Param,
|
||||||
|
* default_path?: scalar|Param|null, // The default path used to load templates. // Default: "%kernel.project_dir%/templates"
|
||||||
|
* file_name_pattern?: string|list<scalar|Param|null>,
|
||||||
|
* paths?: array<string, mixed>,
|
||||||
|
* date?: array{ // The default format options used by the date filter.
|
||||||
|
* format?: scalar|Param|null, // Default: "F j, Y H:i"
|
||||||
|
* interval_format?: scalar|Param|null, // Default: "%d days"
|
||||||
|
* timezone?: scalar|Param|null, // The timezone used when formatting dates, when set to null, the timezone returned by date_default_timezone_get() is used. // Default: null
|
||||||
|
* },
|
||||||
|
* number_format?: array{ // The default format options for the number_format filter.
|
||||||
|
* decimals?: int|Param, // Default: 0
|
||||||
|
* decimal_point?: scalar|Param|null, // Default: "."
|
||||||
|
* thousands_separator?: scalar|Param|null, // Default: ","
|
||||||
|
* },
|
||||||
|
* mailer?: array{
|
||||||
|
* html_to_text_converter?: scalar|Param|null, // A service implementing the "Symfony\Component\Mime\HtmlToTextConverter\HtmlToTextConverterInterface". // Default: null
|
||||||
|
* },
|
||||||
|
* }
|
||||||
|
* @psalm-type MakerConfig = array{
|
||||||
|
* root_namespace?: scalar|Param|null, // Default: "App"
|
||||||
|
* generate_final_classes?: bool|Param, // Default: true
|
||||||
|
* generate_final_entities?: bool|Param, // Default: false
|
||||||
|
* }
|
||||||
|
* @psalm-type ConfigType = array{
|
||||||
|
* imports?: ImportsConfig,
|
||||||
|
* parameters?: ParametersConfig,
|
||||||
|
* services?: ServicesConfig,
|
||||||
|
* framework?: FrameworkConfig,
|
||||||
|
* twig?: TwigConfig,
|
||||||
|
* "when@dev"?: array{
|
||||||
|
* imports?: ImportsConfig,
|
||||||
|
* parameters?: ParametersConfig,
|
||||||
|
* services?: ServicesConfig,
|
||||||
|
* framework?: FrameworkConfig,
|
||||||
|
* web_profiler?: WebProfilerConfig,
|
||||||
|
* debug?: DebugConfig,
|
||||||
|
* twig?: TwigConfig,
|
||||||
|
* maker?: MakerConfig,
|
||||||
|
* },
|
||||||
|
* "when@prod"?: array{
|
||||||
|
* imports?: ImportsConfig,
|
||||||
|
* parameters?: ParametersConfig,
|
||||||
|
* services?: ServicesConfig,
|
||||||
|
* framework?: FrameworkConfig,
|
||||||
|
* twig?: TwigConfig,
|
||||||
|
* },
|
||||||
|
* "when@test"?: array{
|
||||||
|
* imports?: ImportsConfig,
|
||||||
|
* parameters?: ParametersConfig,
|
||||||
|
* services?: ServicesConfig,
|
||||||
|
* framework?: FrameworkConfig,
|
||||||
|
* web_profiler?: WebProfilerConfig,
|
||||||
|
* debug?: DebugConfig,
|
||||||
|
* twig?: TwigConfig,
|
||||||
|
* },
|
||||||
|
* ...<string, ExtensionType|array{ // extra keys must follow the when@%env% pattern or match an extension alias
|
||||||
|
* imports?: ImportsConfig,
|
||||||
|
* parameters?: ParametersConfig,
|
||||||
|
* services?: ServicesConfig,
|
||||||
|
* ...<string, ExtensionType>,
|
||||||
|
* }>
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
final class App
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param ConfigType $config
|
||||||
|
*
|
||||||
|
* @psalm-return ConfigType
|
||||||
|
*/
|
||||||
|
public static function config(array $config): array
|
||||||
|
{
|
||||||
|
/** @var ConfigType $config */
|
||||||
|
$config = AppReference::config($config);
|
||||||
|
|
||||||
|
return $config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Symfony\Component\Routing\Loader\Configurator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class provides array-shapes for configuring the routes of an application.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
|
* ```php
|
||||||
|
* // config/routes.php
|
||||||
|
* namespace Symfony\Component\Routing\Loader\Configurator;
|
||||||
|
*
|
||||||
|
* return Routes::config([
|
||||||
|
* 'controllers' => [
|
||||||
|
* 'resource' => 'routing.controllers',
|
||||||
|
* ],
|
||||||
|
* ]);
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @psalm-type RouteConfig = array{
|
||||||
|
* path: string|array<string,string>,
|
||||||
|
* controller?: string,
|
||||||
|
* methods?: string|list<string>,
|
||||||
|
* requirements?: array<string,string>,
|
||||||
|
* defaults?: array<string,mixed>,
|
||||||
|
* options?: array<string,mixed>,
|
||||||
|
* host?: string|array<string,string>,
|
||||||
|
* schemes?: string|list<string>,
|
||||||
|
* condition?: string,
|
||||||
|
* locale?: string,
|
||||||
|
* format?: string,
|
||||||
|
* utf8?: bool,
|
||||||
|
* stateless?: bool,
|
||||||
|
* }
|
||||||
|
* @psalm-type ImportConfig = array{
|
||||||
|
* resource: string,
|
||||||
|
* type?: string,
|
||||||
|
* exclude?: string|list<string>,
|
||||||
|
* prefix?: string|array<string,string>,
|
||||||
|
* name_prefix?: string,
|
||||||
|
* trailing_slash_on_root?: bool,
|
||||||
|
* controller?: string,
|
||||||
|
* methods?: string|list<string>,
|
||||||
|
* requirements?: array<string,string>,
|
||||||
|
* defaults?: array<string,mixed>,
|
||||||
|
* options?: array<string,mixed>,
|
||||||
|
* host?: string|array<string,string>,
|
||||||
|
* schemes?: string|list<string>,
|
||||||
|
* condition?: string,
|
||||||
|
* locale?: string,
|
||||||
|
* format?: string,
|
||||||
|
* utf8?: bool,
|
||||||
|
* stateless?: bool,
|
||||||
|
* }
|
||||||
|
* @psalm-type AliasConfig = array{
|
||||||
|
* alias: string,
|
||||||
|
* deprecated?: array{package:string, version:string, message?:string},
|
||||||
|
* }
|
||||||
|
* @psalm-type RoutesConfig = array{
|
||||||
|
* "when@dev"?: array<string, RouteConfig|ImportConfig|AliasConfig>,
|
||||||
|
* "when@prod"?: array<string, RouteConfig|ImportConfig|AliasConfig>,
|
||||||
|
* "when@test"?: array<string, RouteConfig|ImportConfig|AliasConfig>,
|
||||||
|
* ...<string, RouteConfig|ImportConfig|AliasConfig>
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
final class Routes
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param RoutesConfig $config
|
||||||
|
*
|
||||||
|
* @psalm-return RoutesConfig
|
||||||
|
*/
|
||||||
|
public static function config(array $config): array
|
||||||
|
{
|
||||||
|
return $config;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
controllers:
|
||||||
|
resource:
|
||||||
|
path: ../src/Controller/
|
||||||
|
namespace: App\Controller
|
||||||
|
type: attribute
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
when@dev:
|
||||||
|
_errors:
|
||||||
|
resource: '@FrameworkBundle/Resources/config/routing/errors.php'
|
||||||
|
prefix: /_error
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
when@dev:
|
||||||
|
web_profiler_wdt:
|
||||||
|
resource: '@WebProfilerBundle/Resources/config/routing/wdt.php'
|
||||||
|
prefix: /_wdt
|
||||||
|
|
||||||
|
web_profiler_profiler:
|
||||||
|
resource: '@WebProfilerBundle/Resources/config/routing/profiler.php'
|
||||||
|
prefix: /_profiler
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
parameters:
|
||||||
|
|
||||||
|
services:
|
||||||
|
_defaults:
|
||||||
|
autowire: true
|
||||||
|
autoconfigure: true
|
||||||
|
|
||||||
|
App\:
|
||||||
|
resource: '../src/'
|
||||||
|
exclude:
|
||||||
|
- '../src/DependencyInjection/'
|
||||||
|
- '../src/Entity/'
|
||||||
|
- '../src/Kernel.php'
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
FROM docker.io/library/nginx:1.27-alpine
|
||||||
|
|
||||||
|
COPY podman/nginx/default.conf /etc/nginx/conf.d/default.conf
|
||||||
|
|
||||||
|
EXPOSE 80
|
||||||
|
|
||||||
|
CMD ["nginx", "-g", "daemon off;"]
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name localhost;
|
||||||
|
root /var/www/html/public;
|
||||||
|
|
||||||
|
add_header X-Frame-Options "SAMEORIGIN";
|
||||||
|
add_header X-Content-Type-Options "nosniff";
|
||||||
|
|
||||||
|
index index.php;
|
||||||
|
charset utf-8;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$query_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
location = /favicon.ico { access_log off; log_not_found off; }
|
||||||
|
location = /robots.txt { access_log off; log_not_found off; }
|
||||||
|
|
||||||
|
error_page 404 /index.php;
|
||||||
|
|
||||||
|
location ~ ^/index\.php(/|$) {
|
||||||
|
fastcgi_pass localhost:9000;
|
||||||
|
fastcgi_split_path_info ^(.+\.php)(/.*)$;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
fastcgi_param DOCUMENT_ROOT $document_root;
|
||||||
|
fastcgi_buffer_size 128k;
|
||||||
|
fastcgi_buffers 4 256k;
|
||||||
|
fastcgi_busy_buffers_size 256k;
|
||||||
|
internal;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
return 404;
|
||||||
|
}
|
||||||
|
|
||||||
|
error_log /var/log/nginx/project_error.log;
|
||||||
|
access_log /var/log/nginx/project_access.log;
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# Stage 1: Composer-Abhängigkeiten installieren
|
||||||
|
FROM docker.io/library/composer:2 AS composer
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY composer.json composer.lock* ./
|
||||||
|
|
||||||
|
RUN composer install \
|
||||||
|
--no-dev \
|
||||||
|
--no-scripts \
|
||||||
|
--no-interaction \
|
||||||
|
--optimize-autoloader \
|
||||||
|
--prefer-dist
|
||||||
|
|
||||||
|
# Stage 2: PHP-FPM Produktions-Runtime
|
||||||
|
FROM docker.io/library/php:8.4-fpm AS runtime
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
libzip-dev \
|
||||||
|
libicu-dev \
|
||||||
|
libsodium-dev \
|
||||||
|
&& docker-php-ext-install \
|
||||||
|
zip \
|
||||||
|
intl \
|
||||||
|
sodium \
|
||||||
|
opcache \
|
||||||
|
&& pecl install redis \
|
||||||
|
&& docker-php-ext-enable redis \
|
||||||
|
&& apt-get purge -y --auto-remove \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
COPY podman/php-prod/conf.d/ /usr/local/etc/php/conf.d/
|
||||||
|
|
||||||
|
WORKDIR /var/www/html
|
||||||
|
|
||||||
|
# App-Dateien kopieren
|
||||||
|
COPY --chown=www-data:www-data . .
|
||||||
|
|
||||||
|
# Produktions-Vendor aus Stage 1 überschreibt ggf. vorhandenes vendor/
|
||||||
|
COPY --from=composer --chown=www-data:www-data /app/vendor ./vendor
|
||||||
|
|
||||||
|
# Entwicklungs-Artefakte entfernen und Verzeichnisse vorbereiten
|
||||||
|
RUN rm -rf podman/ log/ .git/ .env.local .env.*.local \
|
||||||
|
&& mkdir -p var/cache/prod var/log \
|
||||||
|
&& chown -R www-data:www-data var
|
||||||
|
|
||||||
|
USER www-data
|
||||||
|
|
||||||
|
CMD ["php-fpm"]
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
; Produktions-OPcache-Konfiguration
|
||||||
|
opcache.enable = 1
|
||||||
|
opcache.memory_consumption = 256
|
||||||
|
opcache.interned_strings_buffer = 16
|
||||||
|
opcache.max_accelerated_files = 20000
|
||||||
|
opcache.revalidate_freq = 0
|
||||||
|
opcache.validate_timestamps = 0
|
||||||
|
opcache.fast_shutdown = 1
|
||||||
|
opcache.enable_cli = 0
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
FROM docker.io/library/php:8.4-fpm
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
git \
|
||||||
|
curl \
|
||||||
|
unzip \
|
||||||
|
libzip-dev \
|
||||||
|
libicu-dev \
|
||||||
|
libsodium-dev \
|
||||||
|
&& docker-php-ext-install \
|
||||||
|
zip \
|
||||||
|
intl \
|
||||||
|
sodium \
|
||||||
|
opcache \
|
||||||
|
&& pecl install redis xdebug \
|
||||||
|
&& docker-php-ext-enable redis xdebug \
|
||||||
|
&& apt-get purge -y --auto-remove \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Symfony CLI
|
||||||
|
RUN curl -1sLf 'https://dl.cloudsmith.io/public/symfony/stable/setup.deb.sh' | bash \
|
||||||
|
&& apt-get install -y symfony-cli \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
COPY --from=docker.io/library/composer:2 /usr/bin/composer /usr/bin/composer
|
||||||
|
|
||||||
|
COPY podman/php/conf.d/ /usr/local/etc/php/conf.d/
|
||||||
|
|
||||||
|
WORKDIR /var/www/html
|
||||||
|
|
||||||
|
CMD ["php-fpm"]
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
; Entwicklungs-PHP-Konfiguration
|
||||||
|
display_errors = On
|
||||||
|
display_startup_errors = On
|
||||||
|
error_reporting = E_ALL
|
||||||
|
log_errors = On
|
||||||
|
|
||||||
|
; Xdebug (Auslösung per XDEBUG_SESSION Cookie oder Query-Parameter)
|
||||||
|
[xdebug]
|
||||||
|
xdebug.mode = debug
|
||||||
|
xdebug.client_host = host.containers.internal
|
||||||
|
xdebug.client_port = 9003
|
||||||
|
xdebug.start_with_request = trigger
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use App\Kernel;
|
||||||
|
|
||||||
|
require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
|
||||||
|
|
||||||
|
return function (array $context) {
|
||||||
|
return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
|
||||||
|
};
|
||||||
Executable
+110
@@ -0,0 +1,110 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
|
||||||
|
# Projektnamen aus composer.json lesen (Teil nach "/") und bereinigen
|
||||||
|
PROJECT_NAME=$(grep -m1 '"name"' "$PROJECT_DIR/composer.json" \
|
||||||
|
| sed 's/.*"[^/]*\/\([^"]*\)".*/\1/' \
|
||||||
|
| tr '[:upper:]' '[:lower:]' \
|
||||||
|
| sed 's/[^a-z0-9]/-/g')
|
||||||
|
|
||||||
|
POD_NAME="${PROJECT_NAME}-dev"
|
||||||
|
CTR_PHP="${PROJECT_NAME}-php"
|
||||||
|
CTR_NGINX="${PROJECT_NAME}-nginx"
|
||||||
|
CTR_REDIS="${PROJECT_NAME}-redis"
|
||||||
|
IMG_PHP="${PROJECT_NAME}-php"
|
||||||
|
IMG_NGINX="${PROJECT_NAME}-nginx"
|
||||||
|
VOL_REDIS="${PROJECT_NAME}-redis-data"
|
||||||
|
|
||||||
|
echo "Projekt: $PROJECT_NAME"
|
||||||
|
echo "Pod: $POD_NAME"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# .env.local erstellen falls nicht vorhanden
|
||||||
|
if [ ! -f "$PROJECT_DIR/.env.local" ]; then
|
||||||
|
echo "Erstelle .env.local mit generiertem APP_SECRET..."
|
||||||
|
cat > "$PROJECT_DIR/.env.local" <<EOF
|
||||||
|
APP_SECRET=$(openssl rand -hex 16)
|
||||||
|
REDIS_URL=redis://localhost:6379
|
||||||
|
EOF
|
||||||
|
echo ".env.local erstellt"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Bestehenden Pod entfernen falls vorhanden
|
||||||
|
if podman pod exists "$POD_NAME" 2>/dev/null; then
|
||||||
|
echo "Entferne bestehenden Pod '$POD_NAME'..."
|
||||||
|
podman pod stop "$POD_NAME" 2>/dev/null || true
|
||||||
|
podman pod rm "$POD_NAME" 2>/dev/null || true
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Pod erstellen
|
||||||
|
echo "Erstelle Pod '$POD_NAME' (Port 8080 -> 80)..."
|
||||||
|
podman pod create --name "$POD_NAME" -p 8080:80
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# PHP-FPM bauen und starten
|
||||||
|
echo "Baue PHP-FPM Container (inkl. Xdebug, Redis-Extension)..."
|
||||||
|
podman build -t "$IMG_PHP" -f podman/php/Containerfile "$PROJECT_DIR"
|
||||||
|
|
||||||
|
echo "Starte PHP-FPM..."
|
||||||
|
podman run -d \
|
||||||
|
--pod "$POD_NAME" \
|
||||||
|
--name "$CTR_PHP" \
|
||||||
|
-v "$PROJECT_DIR:/var/www/html:Z" \
|
||||||
|
"$IMG_PHP"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Nginx bauen und starten
|
||||||
|
echo "Baue Nginx Container..."
|
||||||
|
podman build -t "$IMG_NGINX" -f podman/nginx/Containerfile "$PROJECT_DIR"
|
||||||
|
|
||||||
|
echo "Starte Nginx..."
|
||||||
|
podman run -d \
|
||||||
|
--pod "$POD_NAME" \
|
||||||
|
--name "$CTR_NGINX" \
|
||||||
|
-v "$PROJECT_DIR:/var/www/html:Z" \
|
||||||
|
"$IMG_NGINX"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Redis starten
|
||||||
|
echo "Starte Redis..."
|
||||||
|
podman run -d \
|
||||||
|
--pod "$POD_NAME" \
|
||||||
|
--name "$CTR_REDIS" \
|
||||||
|
-v "$VOL_REDIS:/data" \
|
||||||
|
docker.io/library/redis:8-alpine \
|
||||||
|
redis-server --appendonly yes
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Kurz warten bis Container bereit sind
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
# Composer install
|
||||||
|
if [ -f "$PROJECT_DIR/composer.json" ]; then
|
||||||
|
echo "Installiere Composer-Abhängigkeiten..."
|
||||||
|
podman exec "$CTR_PHP" composer install --no-interaction
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "Leere Symfony Cache..."
|
||||||
|
podman exec "$CTR_PHP" php bin/console cache:clear --env=dev
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||||
|
echo "Entwicklungsumgebung bereit!"
|
||||||
|
echo ""
|
||||||
|
echo " App: http://localhost:8080"
|
||||||
|
echo " Redis: localhost:6379 (innerhalb des Pods)"
|
||||||
|
echo ""
|
||||||
|
echo "Nützliche Befehle:"
|
||||||
|
echo " podman exec -it $CTR_PHP bash"
|
||||||
|
echo " podman exec -it $CTR_PHP php bin/console <befehl>"
|
||||||
|
echo " podman exec -it $CTR_PHP composer require <paket>"
|
||||||
|
echo ""
|
||||||
|
echo " podman pod stop $POD_NAME # Umgebung stoppen"
|
||||||
|
echo " podman pod start $POD_NAME # Umgebung starten"
|
||||||
|
echo " podman pod rm $POD_NAME # Umgebung entfernen"
|
||||||
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\Routing\Attribute\Route;
|
||||||
|
|
||||||
|
final class HomeController extends AbstractController
|
||||||
|
{
|
||||||
|
#[Route('/', name: 'app_home')]
|
||||||
|
public function index(): Response
|
||||||
|
{
|
||||||
|
return $this->render('home/index.html.twig', [
|
||||||
|
'controller_name' => 'HomeController',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
|
||||||
|
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
|
||||||
|
|
||||||
|
class Kernel extends BaseKernel
|
||||||
|
{
|
||||||
|
use MicroKernelTrait;
|
||||||
|
}
|
||||||
+107
@@ -0,0 +1,107 @@
|
|||||||
|
{
|
||||||
|
"symfony/console": {
|
||||||
|
"version": "8.1",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "5.3",
|
||||||
|
"ref": "1781ff40d8a17d87cf53f8d4cf0c8346ed2bb461"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"bin/console"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"symfony/debug-bundle": {
|
||||||
|
"version": "8.1",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "5.3",
|
||||||
|
"ref": "5aa8aa48234c8eb6dbdd7b3cd5d791485d2cec4b"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"config/packages/debug.yaml"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"symfony/flex": {
|
||||||
|
"version": "2.11",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "2.4",
|
||||||
|
"ref": "52e9754527a15e2b79d9a610f98185a1fe46622a"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
".env",
|
||||||
|
".env.dev"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"symfony/framework-bundle": {
|
||||||
|
"version": "8.1",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "8.1",
|
||||||
|
"ref": "312027aea160796a50bf2d185503afdb5d71f570"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"config/packages/cache.yaml",
|
||||||
|
"config/packages/framework.yaml",
|
||||||
|
"config/preload.php",
|
||||||
|
"config/routes/framework.yaml",
|
||||||
|
"config/services.yaml",
|
||||||
|
"public/index.php",
|
||||||
|
"src/Controller/.gitignore",
|
||||||
|
"src/Kernel.php",
|
||||||
|
".editorconfig"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"symfony/maker-bundle": {
|
||||||
|
"version": "1.67",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "1.0",
|
||||||
|
"ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"symfony/routing": {
|
||||||
|
"version": "8.1",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "7.4",
|
||||||
|
"ref": "bc94c4fd86f393f3ab3947c18b830ea343e51ded"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"config/packages/routing.yaml",
|
||||||
|
"config/routes.yaml"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"symfony/twig-bundle": {
|
||||||
|
"version": "8.1",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "6.4",
|
||||||
|
"ref": "f250159ebe99153d0c640a3e7742876fc7453f2c"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"config/packages/twig.yaml",
|
||||||
|
"templates/base.html.twig"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"symfony/web-profiler-bundle": {
|
||||||
|
"version": "8.1",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "8.1",
|
||||||
|
"ref": "6bdd46f712bbed33a27130b6e055391cb1ab73d9"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"config/packages/web_profiler.yaml",
|
||||||
|
"config/routes/web_profiler.yaml"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>{% block title %}Welcome!{% endblock %}</title>
|
||||||
|
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text><text y=%221.3em%22 x=%220.2em%22 font-size=%2276%22 fill=%22%23fff%22>sf</text></svg>">
|
||||||
|
{% block stylesheets %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block javascripts %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% set frankenphpHotReload = app.request.server.get('FRANKENPHP_HOT_RELOAD') %}
|
||||||
|
{% if frankenphpHotReload %}
|
||||||
|
<meta name="frankenphp-hot-reload:url" content="{{ frankenphpHotReload }}">
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/idiomorph"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/frankenphp-hot-reload/+esm" type="module"></script>
|
||||||
|
{% endif %}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{% block body %}{% endblock %}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{% extends 'base.html.twig' %}
|
||||||
|
|
||||||
|
{% block title %}Hello HomeController!{% endblock %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<style>
|
||||||
|
.example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; }
|
||||||
|
.example-wrapper code { background: #F5F5F5; padding: 2px 6px; }
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div class="example-wrapper">
|
||||||
|
<h1>Hello {{ controller_name }}! ✅</h1>
|
||||||
|
|
||||||
|
This friendly message is coming from:
|
||||||
|
<ul>
|
||||||
|
<li>Your controller at <code>/var/www/html/src/Controller/HomeController.php</code></li>
|
||||||
|
<li>Your template at <code>/var/www/html/templates/home/index.html.twig</code></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
Reference in New Issue
Block a user