| Auteur | SHA1 | Message | Date |
|---|---|---|---|
|
|
c64e053dc2 | alles mist | il y a 2 ans |
|
|
c1888caf16 | ddev setup with phpmyadmin | il y a 2 ans |
|
|
d8d61a8fb3 | Add webapp packages | il y a 2 ans |
|
|
a74fde7591 | Add initial set of files | il y a 2 ans |
| @@ -0,0 +1,10 @@ | |||||
| name: phpmyadmin | |||||
| repository: ddev/ddev-phpmyadmin | |||||
| version: v0.3.0 | |||||
| install_date: "2023-10-12T13:44:51+02:00" | |||||
| project_files: | |||||
| - docker-compose.phpmyadmin.yaml | |||||
| - docker-compose.phpmyadmin-norouter.yaml | |||||
| - commands/host/phpmyadmin | |||||
| global_files: [] | |||||
| removal_actions: [] | |||||
| @@ -0,0 +1,52 @@ | |||||
| #!/bin/bash | |||||
| ## #ddev-generated: If you want to edit and own this file, remove this line. | |||||
| ## Description: Launch a browser with PhpMyAdmin | |||||
| ## Usage: phpmyadmin | |||||
| ## Example: "ddev phpmyadmin" | |||||
| DDEV_PHPMYADMIN_PORT=8036 | |||||
| DDEV_PHPMYADMIN_HTTPS_PORT=8037 | |||||
| FULLURL=${DDEV_PRIMARY_URL} | |||||
| HTTPS="" | |||||
| if [ ${DDEV_PRIMARY_URL%://*} = "https" ]; then HTTPS=true; fi | |||||
| if [[ ! -z "${GITPOD_INSTANCE_ID}" ]] || [[ "${CODESPACES}" == "true" ]]; then | |||||
| FULLURL="${FULLURL/-${DDEV_HOST_WEBSERVER_PORT}/-${DDEV_PHPMYADMIN_PORT}}" | |||||
| else | |||||
| if [ "${HTTPS}" = "" ]; then | |||||
| FULLURL="${FULLURL%:[0-9]*}:${DDEV_PHPMYADMIN_PORT}" | |||||
| else | |||||
| FULLURL="${FULLURL%:[0-9]*}:${DDEV_PHPMYADMIN_HTTPS_PORT}" | |||||
| fi | |||||
| fi | |||||
| if [ -n "${1:-}" ] ; then | |||||
| if [[ ${1::1} != "/" ]] ; then | |||||
| FULLURL="${FULLURL}/"; | |||||
| fi | |||||
| FULLURL="${FULLURL}${1}"; | |||||
| fi | |||||
| if [ "${DDEV_DEBUG:-}" = "true" ]; then | |||||
| printf "FULLURL $FULLURL\n" && exit 0 | |||||
| fi | |||||
| case $OSTYPE in | |||||
| linux-gnu) | |||||
| if [[ ! -z "${GITPOD_INSTANCE_ID}" ]]; then | |||||
| gp preview ${FULLURL} | |||||
| else | |||||
| xdg-open ${FULLURL} | |||||
| fi | |||||
| ;; | |||||
| "darwin"*) | |||||
| open ${FULLURL} | |||||
| ;; | |||||
| "win*"* | "msys"*) | |||||
| start ${FULLURL} | |||||
| ;; | |||||
| esac | |||||
| @@ -0,0 +1,265 @@ | |||||
| name: spt-moduled-symfony | |||||
| type: php | |||||
| docroot: public | |||||
| php_version: "8.1" | |||||
| webserver_type: nginx-fpm | |||||
| xdebug_enabled: true | |||||
| additional_hostnames: [] | |||||
| additional_fqdns: [] | |||||
| database: | |||||
| type: mariadb | |||||
| version: "10.4" | |||||
| use_dns_when_possible: true | |||||
| composer_version: "2" | |||||
| web_environment: [] | |||||
| nodejs_version: "18" | |||||
| router_http_port: 8080 | |||||
| router_https_port: 8443 | |||||
| # Key features of ddev's config.yaml: | |||||
| # name: <projectname> # Name of the project, automatically provides | |||||
| # http://projectname.ddev.site and https://projectname.ddev.site | |||||
| # type: <projecttype> # drupal6/7/8, backdrop, typo3, wordpress, php | |||||
| # docroot: <relative_path> # Relative path to the directory containing index.php. | |||||
| # php_version: "8.1" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2" | |||||
| # You can explicitly specify the webimage but this | |||||
| # is not recommended, as the images are often closely tied to ddev's' behavior, | |||||
| # so this can break upgrades. | |||||
| # webimage: <docker_image> # nginx/php docker image. | |||||
| # database: | |||||
| # type: <dbtype> # mysql, mariadb, postgres | |||||
| # version: <version> # database version, like "10.4" or "8.0" | |||||
| # mariadb versions can be 5.5-10.8 and 10.11, mysql versions can be 5.5-8.0 | |||||
| # postgres versions can be 9-15. | |||||
| # router_http_port: <port> # Port to be used for http (defaults to global configuration, usually 80) | |||||
| # router_https_port: <port> # Port for https (defaults to global configuration, usually 443) | |||||
| # xdebug_enabled: false # Set to true to enable xdebug and "ddev start" or "ddev restart" | |||||
| # Note that for most people the commands | |||||
| # "ddev xdebug" to enable xdebug and "ddev xdebug off" to disable it work better, | |||||
| # as leaving xdebug enabled all the time is a big performance hit. | |||||
| # xhprof_enabled: false # Set to true to enable xhprof and "ddev start" or "ddev restart" | |||||
| # Note that for most people the commands | |||||
| # "ddev xhprof" to enable xhprof and "ddev xhprof off" to disable it work better, | |||||
| # as leaving xhprof enabled all the time is a big performance hit. | |||||
| # webserver_type: nginx-fpm, apache-fpm, or nginx-gunicorn | |||||
| # timezone: Europe/Berlin | |||||
| # This is the timezone used in the containers and by PHP; | |||||
| # it can be set to any valid timezone, | |||||
| # see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones | |||||
| # For example Europe/Dublin or MST7MDT | |||||
| # composer_root: <relative_path> | |||||
| # Relative path to the composer root directory from the project root. This is | |||||
| # the directory which contains the composer.json and where all Composer related | |||||
| # commands are executed. | |||||
| # composer_version: "2" | |||||
| # You can set it to "" or "2" (default) for Composer v2 or "1" for Composer v1 | |||||
| # to use the latest major version available at the time your container is built. | |||||
| # It is also possible to use each other Composer version channel. This includes: | |||||
| # - 2.2 (latest Composer LTS version) | |||||
| # - stable | |||||
| # - preview | |||||
| # - snapshot | |||||
| # Alternatively, an explicit Composer version may be specified, for example "2.2.18". | |||||
| # To reinstall Composer after the image was built, run "ddev debug refresh". | |||||
| # nodejs_version: "18" | |||||
| # change from the default system Node.js version to another supported version, like 14, 16, 18, 20. | |||||
| # Note that you can use 'ddev nvm' or nvm inside the web container to provide nearly any | |||||
| # Node.js version, including v6, etc. | |||||
| # additional_hostnames: | |||||
| # - somename | |||||
| # - someothername | |||||
| # would provide http and https URLs for "somename.ddev.site" | |||||
| # and "someothername.ddev.site". | |||||
| # additional_fqdns: | |||||
| # - example.com | |||||
| # - sub1.example.com | |||||
| # would provide http and https URLs for "example.com" and "sub1.example.com" | |||||
| # Please take care with this because it can cause great confusion. | |||||
| # upload_dirs: "custom/upload/dir" | |||||
| # | |||||
| # upload_dirs: | |||||
| # - custom/upload/dir | |||||
| # - ../private | |||||
| # | |||||
| # would set the destination paths for ddev import-files to <docroot>/custom/upload/dir | |||||
| # When mutagen is enabled this path is bind-mounted so that all the files | |||||
| # in the upload_dirs don't have to be synced into mutagen. | |||||
| # disable_upload_dirs_warning: false | |||||
| # If true, turns off the normal warning that says | |||||
| # "You have Mutagen enabled and your 'php' project type doesn't have upload_dirs set" | |||||
| # working_dir: | |||||
| # web: /var/www/html | |||||
| # db: /home | |||||
| # would set the default working directory for the web and db services. | |||||
| # These values specify the destination directory for ddev ssh and the | |||||
| # directory in which commands passed into ddev exec are run. | |||||
| # omit_containers: [db, ddev-ssh-agent] | |||||
| # Currently only these containers are supported. Some containers can also be | |||||
| # omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit | |||||
| # the "db" container, several standard features of ddev that access the | |||||
| # database container will be unusable. In the global configuration it is also | |||||
| # possible to omit ddev-router, but not here. | |||||
| # performance_mode: "global" | |||||
| # DDEV offers performance optimization strategies to improve the filesystem | |||||
| # performance depending on your host system. Should be configured globally. | |||||
| # | |||||
| # If set, will override the global config. Possible values are: | |||||
| # - "global": uses the value from the global config. | |||||
| # - "none": disables performance optimization for this project. | |||||
| # - "mutagen": enables Mutagen for this project. | |||||
| # - "nfs": enables NFS for this project. | |||||
| # | |||||
| # See https://ddev.readthedocs.io/en/latest/users/install/performance/#nfs | |||||
| # See https://ddev.readthedocs.io/en/latest/users/install/performance/#mutagen | |||||
| # fail_on_hook_fail: False | |||||
| # Decide whether 'ddev start' should be interrupted by a failing hook | |||||
| # host_https_port: "59002" | |||||
| # The host port binding for https can be explicitly specified. It is | |||||
| # dynamic unless otherwise specified. | |||||
| # This is not used by most people, most people use the *router* instead | |||||
| # of the localhost port. | |||||
| # host_webserver_port: "59001" | |||||
| # The host port binding for the ddev-webserver can be explicitly specified. It is | |||||
| # dynamic unless otherwise specified. | |||||
| # This is not used by most people, most people use the *router* instead | |||||
| # of the localhost port. | |||||
| # host_db_port: "59002" | |||||
| # The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic | |||||
| # unless explicitly specified. | |||||
| # mailhog_port: "8025" | |||||
| # mailhog_https_port: "8026" | |||||
| # The MailHog ports can be changed from the default 8025 and 8026 | |||||
| # host_mailhog_port: "8025" | |||||
| # The mailhog port is not normally bound on the host at all, instead being routed | |||||
| # through ddev-router, but it can be bound directly to localhost if specified here. | |||||
| # webimage_extra_packages: [php7.4-tidy, php-bcmath] | |||||
| # Extra Debian packages that are needed in the webimage can be added here | |||||
| # dbimage_extra_packages: [telnet,netcat] | |||||
| # Extra Debian packages that are needed in the dbimage can be added here | |||||
| # use_dns_when_possible: true | |||||
| # If the host has internet access and the domain configured can | |||||
| # successfully be looked up, DNS will be used for hostname resolution | |||||
| # instead of editing /etc/hosts | |||||
| # Defaults to true | |||||
| # project_tld: ddev.site | |||||
| # The top-level domain used for project URLs | |||||
| # The default "ddev.site" allows DNS lookup via a wildcard | |||||
| # If you prefer you can change this to "ddev.local" to preserve | |||||
| # pre-v1.9 behavior. | |||||
| # ngrok_args: --basic-auth username:pass1234 | |||||
| # Provide extra flags to the "ngrok http" command, see | |||||
| # https://ngrok.com/docs/ngrok-agent/config or run "ngrok http -h" | |||||
| # disable_settings_management: false | |||||
| # If true, ddev will not create CMS-specific settings files like | |||||
| # Drupal's settings.php/settings.ddev.php or TYPO3's AdditionalConfiguration.php | |||||
| # In this case the user must provide all such settings. | |||||
| # You can inject environment variables into the web container with: | |||||
| # web_environment: | |||||
| # - SOMEENV=somevalue | |||||
| # - SOMEOTHERENV=someothervalue | |||||
| # no_project_mount: false | |||||
| # (Experimental) If true, ddev will not mount the project into the web container; | |||||
| # the user is responsible for mounting it manually or via a script. | |||||
| # This is to enable experimentation with alternate file mounting strategies. | |||||
| # For advanced users only! | |||||
| # bind_all_interfaces: false | |||||
| # If true, host ports will be bound on all network interfaces, | |||||
| # not just the localhost interface. This means that ports | |||||
| # will be available on the local network if the host firewall | |||||
| # allows it. | |||||
| # default_container_timeout: 120 | |||||
| # The default time that ddev waits for all containers to become ready can be increased from | |||||
| # the default 120. This helps in importing huge databases, for example. | |||||
| #web_extra_exposed_ports: | |||||
| #- name: nodejs | |||||
| # container_port: 3000 | |||||
| # http_port: 2999 | |||||
| # https_port: 3000 | |||||
| #- name: something | |||||
| # container_port: 4000 | |||||
| # https_port: 4000 | |||||
| # http_port: 3999 | |||||
| # Allows a set of extra ports to be exposed via ddev-router | |||||
| # Fill in all three fields even if you don’t intend to use the https_port! | |||||
| # If you don’t add https_port, then it defaults to 0 and ddev-router will fail to start. | |||||
| # | |||||
| # The port behavior on the ddev-webserver must be arranged separately, for example | |||||
| # using web_extra_daemons. | |||||
| # For example, with a web app on port 3000 inside the container, this config would | |||||
| # expose that web app on https://<project>.ddev.site:9999 and http://<project>.ddev.site:9998 | |||||
| # web_extra_exposed_ports: | |||||
| # - name: myapp | |||||
| # container_port: 3000 | |||||
| # http_port: 9998 | |||||
| # https_port: 9999 | |||||
| #web_extra_daemons: | |||||
| #- name: "http-1" | |||||
| # command: "/var/www/html/node_modules/.bin/http-server -p 3000" | |||||
| # directory: /var/www/html | |||||
| #- name: "http-2" | |||||
| # command: "/var/www/html/node_modules/.bin/http-server /var/www/html/sub -p 3000" | |||||
| # directory: /var/www/html | |||||
| # override_config: false | |||||
| # By default, config.*.yaml files are *merged* into the configuration | |||||
| # But this means that some things can't be overridden | |||||
| # For example, if you have 'nfs_mount_enabled: true'' you can't override it with a merge | |||||
| # and you can't erase existing hooks or all environment variables. | |||||
| # However, with "override_config: true" in a particular config.*.yaml file, | |||||
| # 'nfs_mount_enabled: false' can override the existing values, and | |||||
| # hooks: | |||||
| # post-start: [] | |||||
| # or | |||||
| # web_environment: [] | |||||
| # or | |||||
| # additional_hostnames: [] | |||||
| # can have their intended affect. 'override_config' affects only behavior of the | |||||
| # config.*.yaml file it exists in. | |||||
| # Many ddev commands can be extended to run tasks before or after the | |||||
| # ddev command is executed, for example "post-start", "post-import-db", | |||||
| # "pre-composer", "post-composer" | |||||
| # See https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/ for more | |||||
| # information on the commands that can be extended and the tasks you can define | |||||
| # for them. Example: | |||||
| #hooks: | |||||
| @@ -0,0 +1,4 @@ | |||||
| #ddev-generated | |||||
| # If omit_containers[ddev-router] then this file will be replaced | |||||
| # with another with a `ports` statement to directly expose port 80 to 8036 | |||||
| services: {} | |||||
| @@ -0,0 +1,27 @@ | |||||
| #ddev-generated | |||||
| services: | |||||
| phpmyadmin: | |||||
| container_name: ddev-${DDEV_SITENAME}-phpmyadmin | |||||
| image: phpmyadmin:5 | |||||
| working_dir: "/root" | |||||
| restart: "no" | |||||
| labels: | |||||
| com.ddev.site-name: ${DDEV_SITENAME} | |||||
| com.ddev.approot: $DDEV_APPROOT | |||||
| expose: | |||||
| - "80" | |||||
| environment: | |||||
| - PMA_USER=root | |||||
| - PMA_PASSWORD=root | |||||
| - PMA_HOST=db | |||||
| - PMA_PORT=3306 | |||||
| - VIRTUAL_HOST=$DDEV_HOSTNAME | |||||
| - UPLOAD_LIMIT=4000M | |||||
| - HTTP_EXPOSE=8036:80 | |||||
| - HTTPS_EXPOSE=8037:80 | |||||
| healthcheck: | |||||
| interval: 120s | |||||
| timeout: 2s | |||||
| retries: 1 | |||||
| depends_on: | |||||
| - db | |||||
| @@ -0,0 +1,48 @@ | |||||
| <!DOCTYPE html> | |||||
| <html lang="en"> | |||||
| <head> | |||||
| <meta charset="UTF-8"> | |||||
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |||||
| <title>Login Form</title> | |||||
| </head> | |||||
| <body> | |||||
| <h1>Login</h1> | |||||
| <form id="loginForm"> | |||||
| <label for="email">Username (Email):</label> | |||||
| <input type="text" id="email" name="email" required> | |||||
| <br> | |||||
| <label for="password">Password:</label> | |||||
| <input type="password" id="password" name="password" required> | |||||
| <br> | |||||
| <button type="button" id="loginButton">Login</button> | |||||
| </form> | |||||
| <script> | |||||
| document.getElementById('loginButton').addEventListener('click', function() { | |||||
| const email = document.getElementById('email').value; | |||||
| const password = document.getElementById('password').value; | |||||
| const data = { | |||||
| email: email, | |||||
| password: password | |||||
| }; | |||||
| fetch('https://spt-moduled-symfony.ddev.site:8443/spt-core/api/login', { | |||||
| method: 'POST', | |||||
| headers: { | |||||
| 'Content-Type': 'application/json' | |||||
| }, | |||||
| body: JSON.stringify(data) | |||||
| }) | |||||
| .then(response => response.json()) | |||||
| .then(data => { | |||||
| console.log(data); | |||||
| // Handle the response data as needed | |||||
| }) | |||||
| .catch(error => { | |||||
| console.error(error); | |||||
| // Handle errors | |||||
| }); | |||||
| }); | |||||
| </script> | |||||
| </body> | |||||
| </html> | |||||
| @@ -0,0 +1,41 @@ | |||||
| # In all environments, the following files are loaded if they exist, | |||||
| # the latter taking precedence over the former: | |||||
| # | |||||
| # * .env contains default values for the environment variables needed by the app | |||||
| # * .env.local uncommitted file with local overrides | |||||
| # * .env.$APP_ENV committed environment-specific defaults | |||||
| # * .env.$APP_ENV.local uncommitted environment-specific overrides | |||||
| # | |||||
| # Real environment variables win over .env files. | |||||
| # | |||||
| # DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. | |||||
| # https://symfony.com/doc/current/configuration/secrets.html | |||||
| # | |||||
| # Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). | |||||
| # https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration | |||||
| ###> symfony/framework-bundle ### | |||||
| APP_ENV=dev | |||||
| APP_SECRET=c2d396b9813be5a23671a9912ade615c | |||||
| ###< symfony/framework-bundle ### | |||||
| ###> doctrine/doctrine-bundle ### | |||||
| # Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url | |||||
| # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml | |||||
| # | |||||
| # DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db" | |||||
| # DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=8.0.32&charset=utf8mb4" | |||||
| # DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=10.11.2-MariaDB&charset=utf8mb4" | |||||
| DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=15&charset=utf8" | |||||
| ###< doctrine/doctrine-bundle ### | |||||
| ###> symfony/messenger ### | |||||
| # Choose one of the transports below | |||||
| # MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/messages | |||||
| # MESSENGER_TRANSPORT_DSN=redis://localhost:6379/messages | |||||
| MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0 | |||||
| ###< symfony/messenger ### | |||||
| ###> symfony/mailer ### | |||||
| # MAILER_DSN=null://null | |||||
| ###< symfony/mailer ### | |||||
| @@ -0,0 +1,6 @@ | |||||
| # define your env variables for the test env here | |||||
| KERNEL_CLASS='App\Kernel' | |||||
| APP_SECRET='$ecretf0rt3st' | |||||
| SYMFONY_DEPRECATIONS_HELPER=999999 | |||||
| PANTHER_APP_ENV=panther | |||||
| PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots | |||||
| @@ -0,0 +1,22 @@ | |||||
| ###> symfony/framework-bundle ### | |||||
| /.env.local | |||||
| /.env.local.php | |||||
| /.env.*.local | |||||
| /config/secrets/prod/prod.decrypt.private.php | |||||
| /public/bundles/ | |||||
| /var/ | |||||
| /vendor/ | |||||
| ###< symfony/framework-bundle ### | |||||
| ###> phpunit/phpunit ### | |||||
| /phpunit.xml | |||||
| .phpunit.result.cache | |||||
| ###< phpunit/phpunit ### | |||||
| ###> symfony/phpunit-bridge ### | |||||
| .phpunit.result.cache | |||||
| /phpunit.xml | |||||
| ###< symfony/phpunit-bridge ### | |||||
| /.idea | |||||
| @@ -1,2 +1,31 @@ | |||||
| # spt-moduled-smfony | # spt-moduled-smfony | ||||
| Installation: | |||||
| gehe ins root Verzeichnis des Projekts und für aus: ddev config | |||||
| gehe den Installationsprozess durch | |||||
| starte danach ddev mit: ddev start | |||||
| Troubleshooting: | |||||
| Unable to listen on required ports, port 443 is already in use | |||||
| -> setze andere Ports in .ddev/config.yaml z.B. | |||||
| router_http_port: 8080 | |||||
| router_https_port: 8443 | |||||
| PHPMyAdmin installieren: | |||||
| ddev get ddev/ddev-phpmyadmin' | |||||
| ddev restart | |||||
| Symfony Konsolenbefehle mit Ddev ausführen, z.B.: | |||||
| ddev exec php bin/console make:migration | |||||
| Ddev Commands: | |||||
| ddev describe - zeigt Urls und installierte Komponenten | |||||
| @@ -0,0 +1,17 @@ | |||||
| #!/usr/bin/env php | |||||
| <?php | |||||
| use App\Kernel; | |||||
| use Symfony\Bundle\FrameworkBundle\Console\Application; | |||||
| 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); | |||||
| }; | |||||
| @@ -0,0 +1,19 @@ | |||||
| #!/usr/bin/env php | |||||
| <?php | |||||
| if (!ini_get('date.timezone')) { | |||||
| ini_set('date.timezone', 'UTC'); | |||||
| } | |||||
| if (is_file(dirname(__DIR__).'/vendor/phpunit/phpunit/phpunit')) { | |||||
| define('PHPUNIT_COMPOSER_INSTALL', dirname(__DIR__).'/vendor/autoload.php'); | |||||
| require PHPUNIT_COMPOSER_INSTALL; | |||||
| PHPUnit\TextUI\Command::main(); | |||||
| } else { | |||||
| if (!is_file(dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php')) { | |||||
| echo "Unable to find the `simple-phpunit.php` script in `vendor/symfony/phpunit-bridge/bin/`.\n"; | |||||
| exit(1); | |||||
| } | |||||
| require dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php'; | |||||
| } | |||||
| @@ -0,0 +1,10 @@ | |||||
| ###> symfony/framework-bundle ### | |||||
| /.env.local | |||||
| /.env.local.php | |||||
| /.env.*.local | |||||
| /config/secrets/prod/prod.decrypt.private.php | |||||
| /public/bundles/ | |||||
| /var/ | |||||
| /vendor/ | |||||
| ###< symfony/framework-bundle ### | |||||
| @@ -0,0 +1,42 @@ | |||||
| { | |||||
| "name": "spt/spt-core-bundle", | |||||
| "version": "1.0.0", | |||||
| "type": "symfony-bundle", | |||||
| "description": "Core bundle for basic functionality", | |||||
| "require": { | |||||
| "php": ">=8.1", | |||||
| "symfony/security-bundle": "^6.3", | |||||
| "nelmio/cors-bundle": "^2.3" | |||||
| }, | |||||
| "autoload": { | |||||
| "psr-4": { | |||||
| "Spt\\SptCoreBundle\\": "src/" | |||||
| } | |||||
| }, | |||||
| "autoload-dev": { | |||||
| "psr-4": { | |||||
| "Spt\\SptCoreBundle\\Tests\\": "tests/" | |||||
| } | |||||
| }, | |||||
| "authors": [ | |||||
| { | |||||
| "name": "Daniel Knudsen", | |||||
| "email": "d.knudsen@spawntree.de" | |||||
| }, | |||||
| { | |||||
| "name": "Florian Eisenmenger", | |||||
| "email": "f.eisenmenger@spawntree.de" | |||||
| } | |||||
| ], | |||||
| "config": { | |||||
| }, | |||||
| "require-dev": { | |||||
| "symfony/maker-bundle": "^1.51" | |||||
| }, | |||||
| "scripts": { | |||||
| "auto-scripts": { | |||||
| "cache:clear": "symfony-cmd", | |||||
| "assets:install %PUBLIC_DIR%": "symfony-cmd" | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,5 @@ | |||||
| <?php | |||||
| return [ | |||||
| Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], | |||||
| ]; | |||||
| @@ -0,0 +1,19 @@ | |||||
| framework: | |||||
| cache: | |||||
| # Unique name of your app: used to compute stable namespaces for cache keys. | |||||
| #prefix_seed: your_vendor_name/app_name | |||||
| # The "app" cache stores to the filesystem by default. | |||||
| # The data in this cache should persist between deploys. | |||||
| # Other options include: | |||||
| # Redis | |||||
| #app: cache.adapter.redis | |||||
| #default_redis_provider: redis://localhost | |||||
| # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) | |||||
| #app: cache.adapter.apcu | |||||
| # Namespaced pools use the above "app" backend by default | |||||
| #pools: | |||||
| #my.dedicated.cache: null | |||||
| @@ -0,0 +1,25 @@ | |||||
| # see https://symfony.com/doc/current/reference/configuration/framework.html | |||||
| framework: | |||||
| secret: '%env(APP_SECRET)%' | |||||
| #csrf_protection: true | |||||
| http_method_override: false | |||||
| handle_all_throwables: true | |||||
| # Enables session support. Note that the session will ONLY be started if you read or write from it. | |||||
| # Remove or comment this section to explicitly disable session support. | |||||
| session: | |||||
| handler_id: null | |||||
| cookie_secure: auto | |||||
| cookie_samesite: lax | |||||
| storage_factory_id: session.storage.factory.native | |||||
| #esi: true | |||||
| #fragments: true | |||||
| php_errors: | |||||
| log: true | |||||
| when@test: | |||||
| framework: | |||||
| test: true | |||||
| session: | |||||
| storage_factory_id: session.storage.factory.mock_file | |||||
| @@ -0,0 +1,25 @@ | |||||
| #nelmio_cors: | |||||
| # defaults: | |||||
| # origin_regex: true | |||||
| # allow_origin: ['*'] | |||||
| # allow_methods: ['*'] | |||||
| # allow_headers: ['*'] | |||||
| # expose_headers: ['Link'] | |||||
| # max_age: 3600 | |||||
| # paths: | |||||
| # '^/': null | |||||
| nelmio_cors: | |||||
| defaults: | |||||
| allow_credentials: true | |||||
| allow_origin: [ '*' ] | |||||
| allow_headers: [ '*' ] | |||||
| allow_methods: [ 'POST', 'PUT', 'GET', 'DELETE' ] | |||||
| expose_headers: [ ] | |||||
| max_age: 3600 | |||||
| hosts: [ ] | |||||
| origin_regex: true | |||||
| paths: | |||||
| # Important api settings : | |||||
| # Access-Control-Request-Method | |||||
| '^/': ~ | |||||
| @@ -0,0 +1,12 @@ | |||||
| framework: | |||||
| router: | |||||
| utf8: true | |||||
| # 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 | |||||
| when@prod: | |||||
| framework: | |||||
| router: | |||||
| strict_requirements: null | |||||
| @@ -0,0 +1,51 @@ | |||||
| security: | |||||
| # https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords | |||||
| password_hashers: | |||||
| Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto' | |||||
| # https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider | |||||
| providers: | |||||
| app_user_provider: | |||||
| entity: | |||||
| class: Spt\SptCoreBundle\Entity\User | |||||
| property: email | |||||
| firewalls: | |||||
| dev: | |||||
| pattern: ^/(_(profiler|wdt)|css|images|js)/ | |||||
| security: false | |||||
| main: | |||||
| lazy: true | |||||
| provider: app_user_provider | |||||
| nelmio_cors: ~ | |||||
| json_login: | |||||
| # api_login is a route we will create below | |||||
| check_path: spt_core_api_login | |||||
| username_path: email | |||||
| password_path: password | |||||
| #check_path: spt-core/api/login | |||||
| # activate different ways to authenticate | |||||
| # https://symfony.com/doc/current/security.html#the-firewall | |||||
| # https://symfony.com/doc/current/security/impersonating_user.html | |||||
| # switch_user: true | |||||
| # Easy way to control access for large sections of your site | |||||
| # Note: Only the *first* access control that matches will be used | |||||
| access_control: | |||||
| - { path: ^/spt-core/api/login, roles: IS_AUTHENTICATED_FULLY } | |||||
| # - { path: ^/admin, roles: ROLE_ADMIN } | |||||
| # - { path: ^/profile, roles: ROLE_USER } | |||||
| when@test: | |||||
| security: | |||||
| password_hashers: | |||||
| # By default, password hashers are resource intensive and take time. This is | |||||
| # important to generate secure password hashes. In tests however, secure hashes | |||||
| # are not important, waste resources and increase test times. The following | |||||
| # reduces the work factor to the lowest possible values. | |||||
| Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: | |||||
| algorithm: auto | |||||
| cost: 4 # Lowest possible value for bcrypt | |||||
| time_cost: 3 # Lowest possible value for argon | |||||
| memory_cost: 10 # Lowest possible value for argon | |||||
| @@ -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,4 @@ | |||||
| spt_core_bundle.routes: | |||||
| type: annotation | |||||
| resource: '../src/Controller' | |||||
| prefix: 'spt-core' | |||||
| @@ -0,0 +1,4 @@ | |||||
| when@dev: | |||||
| _errors: | |||||
| resource: '@FrameworkBundle/Resources/config/routing/errors.xml' | |||||
| prefix: /_error | |||||
| @@ -0,0 +1,33 @@ | |||||
| parameters: | |||||
| services: | |||||
| _defaults: | |||||
| autowire: true | |||||
| autoconfigure: true | |||||
| Spt\SptCoreBundle\Controller\SecurityController: ~ | |||||
| # makes classes in src/ available to be used as services | |||||
| # this creates a service per class whose id is the fully-qualified class name | |||||
| Spt\SptCoreBundle\: | |||||
| resource: '../src/' | |||||
| exclude: | |||||
| - '../src/DependencyInjection/' | |||||
| - '../src/Entity/' | |||||
| - '../src/Kernel.php' | |||||
| - '../src/Tests/' | |||||
| # controllers are imported separately to make sure services can be injected | |||||
| # as action arguments even if you don't extend any base controller class | |||||
| Spt\SptCoreBundle\Controller\: | |||||
| resource: '../src/Controller/' | |||||
| tags: ['controller.service_arguments'] | |||||
| Spt\SptCoreBundle\Command\: | |||||
| resource: '../src/Command/' | |||||
| autowire: true | |||||
| autoconfigure: true | |||||
| arguments: [ '@doctrine.orm.entity_manager', '@service_container' ] | |||||
| tags: | |||||
| - { name: 'console.command' } | |||||
| @@ -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']); | |||||
| }; | |||||
| @@ -0,0 +1,37 @@ | |||||
| <?php | |||||
| /** | |||||
| * @author Daniel Knudsen <d.knudsen@spawntree.de> | |||||
| * @date 20.10.23 | |||||
| */ | |||||
| namespace Spt\SptCoreBundle\Controller; | |||||
| use Spt\SptCoreBundle\Entity\User; | |||||
| use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; | |||||
| use Symfony\Bundle\SecurityBundle\Security; | |||||
| use Symfony\Component\HttpFoundation\JsonResponse; | |||||
| use Symfony\Component\HttpFoundation\Request; | |||||
| use Symfony\Component\HttpFoundation\Response; | |||||
| use Symfony\Component\Routing\Annotation\Route; | |||||
| use Symfony\Component\Security\Http\Attribute\CurrentUser; | |||||
| class ApiLoginController extends AbstractController | |||||
| { | |||||
| #[Route('/api/login', name: 'spt_core_api_login', methods: ['POST'])] | |||||
| public function index(Request $request): JsonResponse | |||||
| { | |||||
| $user = $this->getUser(); | |||||
| if (null === $user) { | |||||
| return $this->json([ | |||||
| 'message' => 'missing credentials', | |||||
| ], Response::HTTP_UNAUTHORIZED); | |||||
| } | |||||
| return $this->json([ | |||||
| 'message' => 'Welcome to your new controller!', | |||||
| 'path' => 'src/Controller/ApiLoginController.php', | |||||
| ]); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,37 @@ | |||||
| <?php | |||||
| /** | |||||
| * @author Daniel Knudsen <d.knudsen@spawntree.de> | |||||
| * @date 20.10.23 | |||||
| */ | |||||
| namespace Spt\SptCoreBundle\Controller; | |||||
| use Spt\SptCoreBundle\Entity\User; | |||||
| use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; | |||||
| use Symfony\Component\HttpFoundation\JsonResponse; | |||||
| use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; | |||||
| class RegistrationController extends AbstractController | |||||
| { | |||||
| public function index(UserPasswordHasherInterface $passwordHasher): JsonResponse | |||||
| { | |||||
| // manually hash pw | |||||
| //php bin/console security:hash-password | |||||
| // ... e.g. get the user data from a registration form | |||||
| // $user = new User(...); | |||||
| // $plaintextPassword = ...; | |||||
| // | |||||
| // // hash the password (based on the security.yaml config for the $user class) | |||||
| // $hashedPassword = $passwordHasher->hashPassword( | |||||
| // $user, | |||||
| // $plaintextPassword | |||||
| // ); | |||||
| // $user->setPassword($hashedPassword); | |||||
| // ... | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,22 @@ | |||||
| <?php | |||||
| namespace Spt\SptCoreBundle\Controller; | |||||
| use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; | |||||
| use Symfony\Component\HttpFoundation\JsonResponse; | |||||
| use Symfony\Component\Routing\Annotation\Route; | |||||
| /** | |||||
| * @author Daniel Knudsen <d.knudsen@spawntree.de> | |||||
| * @date 18.10.23 | |||||
| */ | |||||
| class SecurityController extends AbstractController | |||||
| { | |||||
| #[Route('/test', name: 'spt_core_test')] | |||||
| public function test() | |||||
| { | |||||
| return new JsonResponse('test'); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,32 @@ | |||||
| <?php | |||||
| /** | |||||
| * @author Daniel Knudsen <d.knudsen@spawntree.de> | |||||
| * @date 19.10.23 | |||||
| */ | |||||
| namespace Spt\SptCoreBundle\DependencyInjections; | |||||
| use Exception; | |||||
| use Symfony\Component\Config\FileLocator; | |||||
| use Symfony\Component\DependencyInjection\ContainerBuilder; | |||||
| use Symfony\Component\DependencyInjection\Extension\Extension; | |||||
| use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; | |||||
| class SptCoreExtension extends Extension | |||||
| { | |||||
| /** | |||||
| * @throws Exception | |||||
| */ | |||||
| public function load(array $configs, ContainerBuilder $container): void | |||||
| { | |||||
| $loader = new YamlFileLoader( | |||||
| $container, | |||||
| new FileLocator(__DIR__ . '/../../config') | |||||
| ); | |||||
| $loader->load('services.yaml'); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,99 @@ | |||||
| <?php | |||||
| namespace Spt\SptCoreBundle\Entity; | |||||
| use Doctrine\ORM\Mapping as ORM; | |||||
| use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; | |||||
| use Symfony\Component\Security\Core\User\UserInterface; | |||||
| #[ORM\Entity] | |||||
| #[ORM\Table(name: "user")] | |||||
| class User implements UserInterface, PasswordAuthenticatedUserInterface | |||||
| { | |||||
| #[ORM\Id] | |||||
| #[ORM\GeneratedValue] | |||||
| #[ORM\Column] | |||||
| private ?int $id = null; | |||||
| #[ORM\Column(length: 180, unique: true)] | |||||
| private ?string $email = null; | |||||
| #[ORM\Column] | |||||
| private array $roles = []; | |||||
| /** | |||||
| * @var string The hashed password | |||||
| */ | |||||
| #[ORM\Column] | |||||
| private ?string $password = null; | |||||
| public function getId(): ?int | |||||
| { | |||||
| return $this->id; | |||||
| } | |||||
| public function getEmail(): ?string | |||||
| { | |||||
| return $this->email; | |||||
| } | |||||
| public function setEmail(string $email): static | |||||
| { | |||||
| $this->email = $email; | |||||
| return $this; | |||||
| } | |||||
| /** | |||||
| * A visual identifier that represents this user. | |||||
| * | |||||
| * @see UserInterface | |||||
| */ | |||||
| public function getUserIdentifier(): string | |||||
| { | |||||
| return (string) $this->email; | |||||
| } | |||||
| /** | |||||
| * @see UserInterface | |||||
| */ | |||||
| public function getRoles(): array | |||||
| { | |||||
| $roles = $this->roles; | |||||
| // guarantee every user at least has ROLE_USER | |||||
| $roles[] = 'ROLE_USER'; | |||||
| return array_unique($roles); | |||||
| } | |||||
| public function setRoles(array $roles): static | |||||
| { | |||||
| $this->roles = $roles; | |||||
| return $this; | |||||
| } | |||||
| /** | |||||
| * @see PasswordAuthenticatedUserInterface | |||||
| */ | |||||
| public function getPassword(): string | |||||
| { | |||||
| return $this->password; | |||||
| } | |||||
| public function setPassword(string $password): static | |||||
| { | |||||
| $this->password = $password; | |||||
| return $this; | |||||
| } | |||||
| /** | |||||
| * @see UserInterface | |||||
| */ | |||||
| public function eraseCredentials(): void | |||||
| { | |||||
| // If you store any temporary, sensitive data on the user, clear it here | |||||
| // $this->plainPassword = null; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,26 @@ | |||||
| <?php | |||||
| /** | |||||
| * @author Daniel Knudsen <d.knudsen@spawntree.de> | |||||
| * @date 18.10.23 | |||||
| */ | |||||
| namespace Spt\SptCoreBundle; | |||||
| use Spt\SptCoreBundle\DependencyInjections\SptCoreExtension; | |||||
| use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; | |||||
| use Symfony\Component\HttpKernel\Bundle\AbstractBundle; | |||||
| use function dirname; | |||||
| class SptCoreBundle extends AbstractBundle | |||||
| { | |||||
| public function getPath(): string | |||||
| { | |||||
| return dirname(__DIR__); | |||||
| } | |||||
| public function getContainerExtension(): ?ExtensionInterface | |||||
| { | |||||
| return new SptCoreExtension(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,111 @@ | |||||
| { | |||||
| "type": "project", | |||||
| "license": "proprietary", | |||||
| "minimum-stability": "stable", | |||||
| "prefer-stable": true, | |||||
| "repositories": [ | |||||
| { | |||||
| "type": "path", | |||||
| "url": "./bundle/Spt/SptCoreBundle" | |||||
| } | |||||
| ], | |||||
| "require": { | |||||
| "php": ">=8.1", | |||||
| "ext-ctype": "*", | |||||
| "ext-iconv": "*", | |||||
| "doctrine/doctrine-bundle": "^2.10", | |||||
| "doctrine/doctrine-migrations-bundle": "^3.2", | |||||
| "doctrine/orm": "^2.16", | |||||
| "phpdocumentor/reflection-docblock": "^5.3", | |||||
| "phpstan/phpdoc-parser": "^1.24", | |||||
| "spt/spt-core-bundle": "^1.0", | |||||
| "symfony/asset": "6.3.*", | |||||
| "symfony/console": "6.3.*", | |||||
| "symfony/doctrine-messenger": "6.3.*", | |||||
| "symfony/dotenv": "6.3.*", | |||||
| "symfony/expression-language": "6.3.*", | |||||
| "symfony/flex": "^2", | |||||
| "symfony/form": "6.3.*", | |||||
| "symfony/framework-bundle": "6.3.*", | |||||
| "symfony/http-client": "6.3.*", | |||||
| "symfony/intl": "6.3.*", | |||||
| "symfony/mailer": "6.3.*", | |||||
| "symfony/mime": "6.3.*", | |||||
| "symfony/monolog-bundle": "^3.0", | |||||
| "symfony/notifier": "6.3.*", | |||||
| "symfony/process": "6.3.*", | |||||
| "symfony/property-access": "6.3.*", | |||||
| "symfony/property-info": "6.3.*", | |||||
| "symfony/runtime": "6.3.*", | |||||
| "symfony/security-bundle": "^6.3", | |||||
| "symfony/serializer": "6.3.*", | |||||
| "symfony/string": "6.3.*", | |||||
| "symfony/translation": "6.3.*", | |||||
| "symfony/twig-bundle": "6.3.*", | |||||
| "symfony/validator": "6.3.*", | |||||
| "symfony/web-link": "6.3.*", | |||||
| "symfony/yaml": "6.3.*", | |||||
| "twig/extra-bundle": "^2.12|^3.0", | |||||
| "twig/twig": "^2.12|^3.0" | |||||
| }, | |||||
| "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/" | |||||
| } | |||||
| }, | |||||
| "replace": { | |||||
| "symfony/polyfill-ctype": "*", | |||||
| "symfony/polyfill-iconv": "*", | |||||
| "symfony/polyfill-php72": "*", | |||||
| "symfony/polyfill-php73": "*", | |||||
| "symfony/polyfill-php74": "*", | |||||
| "symfony/polyfill-php80": "*", | |||||
| "symfony/polyfill-php81": "*" | |||||
| }, | |||||
| "scripts": { | |||||
| "auto-scripts": { | |||||
| "cache:clear": "symfony-cmd", | |||||
| "assets:install %PUBLIC_DIR%": "symfony-cmd" | |||||
| }, | |||||
| "post-install-cmd": [ | |||||
| "@auto-scripts" | |||||
| ], | |||||
| "post-update-cmd": [ | |||||
| "@auto-scripts" | |||||
| ] | |||||
| }, | |||||
| "conflict": { | |||||
| "symfony/symfony": "*" | |||||
| }, | |||||
| "extra": { | |||||
| "symfony": { | |||||
| "allow-contrib": false, | |||||
| "require": "6.3.*" | |||||
| } | |||||
| }, | |||||
| "require-dev": { | |||||
| "roave/security-advisories": "dev-latest" | |||||
| , | |||||
| "phpunit/phpunit": "^9.5", | |||||
| "symfony/browser-kit": "6.3.*", | |||||
| "symfony/css-selector": "6.3.*", | |||||
| "symfony/debug-bundle": "6.3.*", | |||||
| "symfony/maker-bundle": "^1.0", | |||||
| "symfony/phpunit-bridge": "^6.3", | |||||
| "symfony/stopwatch": "6.3.*", | |||||
| "symfony/web-profiler-bundle": "6.3.*" | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,15 @@ | |||||
| <?php | |||||
| return [ | |||||
| Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], | |||||
| Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], | |||||
| Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], | |||||
| Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true], | |||||
| Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], | |||||
| Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], | |||||
| Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], | |||||
| Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], | |||||
| Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], | |||||
| Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], | |||||
| Spt\SptCoreBundle\SptCoreBundle::class => ['all' => true], | |||||
| ]; | |||||
| @@ -0,0 +1,19 @@ | |||||
| framework: | |||||
| cache: | |||||
| # Unique name of your app: used to compute stable namespaces for cache keys. | |||||
| #prefix_seed: your_vendor_name/app_name | |||||
| # The "app" cache stores to the filesystem by default. | |||||
| # The data in this cache should persist between deploys. | |||||
| # Other options include: | |||||
| # Redis | |||||
| #app: cache.adapter.redis | |||||
| #default_redis_provider: redis://localhost | |||||
| # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) | |||||
| #app: cache.adapter.apcu | |||||
| # Namespaced pools use the above "app" backend by default | |||||
| #pools: | |||||
| #my.dedicated.cache: null | |||||
| @@ -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,48 @@ | |||||
| doctrine: | |||||
| dbal: | |||||
| url: '%env(resolve:DATABASE_URL)%' | |||||
| # IMPORTANT: You MUST configure your server version, | |||||
| # either here or in the DATABASE_URL env var (see .env file) | |||||
| #server_version: '15' | |||||
| profiling_collect_backtrace: '%kernel.debug%' | |||||
| orm: | |||||
| auto_generate_proxy_classes: true | |||||
| enable_lazy_ghost_objects: true | |||||
| report_fields_where_declared: true | |||||
| validate_xml_mapping: true | |||||
| naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware | |||||
| auto_mapping: true | |||||
| mappings: | |||||
| App: | |||||
| is_bundle: false | |||||
| dir: '%kernel.project_dir%/src/Entity' | |||||
| prefix: 'App\Entity' | |||||
| alias: App | |||||
| when@test: | |||||
| doctrine: | |||||
| dbal: | |||||
| # "TEST_TOKEN" is typically set by ParaTest | |||||
| dbname_suffix: '_test%env(default::TEST_TOKEN)%' | |||||
| when@prod: | |||||
| doctrine: | |||||
| orm: | |||||
| auto_generate_proxy_classes: false | |||||
| proxy_dir: '%kernel.build_dir%/doctrine/orm/Proxies' | |||||
| query_cache_driver: | |||||
| type: pool | |||||
| pool: doctrine.system_cache_pool | |||||
| result_cache_driver: | |||||
| type: pool | |||||
| pool: doctrine.result_cache_pool | |||||
| framework: | |||||
| cache: | |||||
| pools: | |||||
| doctrine.result_cache_pool: | |||||
| adapter: cache.app | |||||
| doctrine.system_cache_pool: | |||||
| adapter: cache.system | |||||
| @@ -0,0 +1,6 @@ | |||||
| doctrine_migrations: | |||||
| migrations_paths: | |||||
| # namespace is arbitrary but should be different from App\Migrations | |||||
| # as migrations classes should NOT be autoloaded | |||||
| 'DoctrineMigrations': '%kernel.project_dir%/migrations' | |||||
| enable_profiler: false | |||||
| @@ -0,0 +1,25 @@ | |||||
| # see https://symfony.com/doc/current/reference/configuration/framework.html | |||||
| framework: | |||||
| secret: '%env(APP_SECRET)%' | |||||
| #csrf_protection: true | |||||
| http_method_override: false | |||||
| handle_all_throwables: true | |||||
| # Enables session support. Note that the session will ONLY be started if you read or write from it. | |||||
| # Remove or comment this section to explicitly disable session support. | |||||
| session: | |||||
| handler_id: null | |||||
| cookie_secure: auto | |||||
| cookie_samesite: lax | |||||
| storage_factory_id: session.storage.factory.native | |||||
| #esi: true | |||||
| #fragments: true | |||||
| php_errors: | |||||
| log: true | |||||
| when@test: | |||||
| framework: | |||||
| test: true | |||||
| session: | |||||
| storage_factory_id: session.storage.factory.mock_file | |||||
| @@ -0,0 +1,3 @@ | |||||
| framework: | |||||
| mailer: | |||||
| dsn: '%env(MAILER_DSN)%' | |||||
| @@ -0,0 +1,24 @@ | |||||
| framework: | |||||
| messenger: | |||||
| failure_transport: failed | |||||
| transports: | |||||
| # https://symfony.com/doc/current/messenger.html#transport-configuration | |||||
| async: | |||||
| dsn: '%env(MESSENGER_TRANSPORT_DSN)%' | |||||
| options: | |||||
| use_notify: true | |||||
| check_delayed_interval: 60000 | |||||
| retry_strategy: | |||||
| max_retries: 3 | |||||
| multiplier: 2 | |||||
| failed: 'doctrine://default?queue_name=failed' | |||||
| # sync: 'sync://' | |||||
| routing: | |||||
| Symfony\Component\Mailer\Messenger\SendEmailMessage: async | |||||
| Symfony\Component\Notifier\Message\ChatMessage: async | |||||
| Symfony\Component\Notifier\Message\SmsMessage: async | |||||
| # Route your messages to the transports | |||||
| # 'App\Message\YourMessage': async | |||||
| @@ -0,0 +1,61 @@ | |||||
| monolog: | |||||
| channels: | |||||
| - deprecation # Deprecations are logged in the dedicated "deprecation" channel when it exists | |||||
| when@dev: | |||||
| monolog: | |||||
| handlers: | |||||
| main: | |||||
| type: stream | |||||
| path: "%kernel.logs_dir%/%kernel.environment%.log" | |||||
| level: debug | |||||
| channels: ["!event"] | |||||
| # uncomment to get logging in your browser | |||||
| # you may have to allow bigger header sizes in your Web server configuration | |||||
| #firephp: | |||||
| # type: firephp | |||||
| # level: info | |||||
| #chromephp: | |||||
| # type: chromephp | |||||
| # level: info | |||||
| console: | |||||
| type: console | |||||
| process_psr_3_messages: false | |||||
| channels: ["!event", "!doctrine", "!console"] | |||||
| when@test: | |||||
| monolog: | |||||
| handlers: | |||||
| main: | |||||
| type: fingers_crossed | |||||
| action_level: error | |||||
| handler: nested | |||||
| excluded_http_codes: [404, 405] | |||||
| channels: ["!event"] | |||||
| nested: | |||||
| type: stream | |||||
| path: "%kernel.logs_dir%/%kernel.environment%.log" | |||||
| level: debug | |||||
| when@prod: | |||||
| monolog: | |||||
| handlers: | |||||
| main: | |||||
| type: fingers_crossed | |||||
| action_level: error | |||||
| handler: nested | |||||
| excluded_http_codes: [404, 405] | |||||
| buffer_size: 50 # How many messages should be saved? Prevent memory leaks | |||||
| nested: | |||||
| type: stream | |||||
| path: php://stderr | |||||
| level: debug | |||||
| formatter: monolog.formatter.json | |||||
| console: | |||||
| type: console | |||||
| process_psr_3_messages: false | |||||
| channels: ["!event", "!doctrine"] | |||||
| deprecation: | |||||
| type: stream | |||||
| channels: [deprecation] | |||||
| path: php://stderr | |||||
| @@ -0,0 +1,12 @@ | |||||
| framework: | |||||
| notifier: | |||||
| chatter_transports: | |||||
| texter_transports: | |||||
| channel_policy: | |||||
| # use chat/slack, chat/telegram, sms/twilio or sms/nexmo | |||||
| urgent: ['email'] | |||||
| high: ['email'] | |||||
| medium: ['email'] | |||||
| low: ['email'] | |||||
| admin_recipients: | |||||
| - { email: admin@example.com } | |||||
| @@ -0,0 +1,12 @@ | |||||
| framework: | |||||
| router: | |||||
| utf8: true | |||||
| # 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 | |||||
| when@prod: | |||||
| framework: | |||||
| router: | |||||
| strict_requirements: null | |||||
| @@ -0,0 +1,15 @@ | |||||
| framework: | |||||
| default_locale: en | |||||
| translator: | |||||
| default_path: '%kernel.project_dir%/translations' | |||||
| fallbacks: | |||||
| - en | |||||
| # providers: | |||||
| # crowdin: | |||||
| # dsn: '%env(CROWDIN_DSN)%' | |||||
| # loco: | |||||
| # dsn: '%env(LOCO_DSN)%' | |||||
| # lokalise: | |||||
| # dsn: '%env(LOKALISE_DSN)%' | |||||
| # phrase: | |||||
| # dsn: '%env(PHRASE_DSN)%' | |||||
| @@ -0,0 +1,6 @@ | |||||
| twig: | |||||
| default_path: '%kernel.project_dir%/templates' | |||||
| when@test: | |||||
| twig: | |||||
| strict_variables: true | |||||
| @@ -0,0 +1,13 @@ | |||||
| framework: | |||||
| validation: | |||||
| email_validation_mode: html5 | |||||
| # Enables validator auto-mapping support. | |||||
| # For instance, basic validation constraints will be inferred from Doctrine's metadata. | |||||
| #auto_mapping: | |||||
| # App\Entity\: [] | |||||
| when@test: | |||||
| framework: | |||||
| validation: | |||||
| not_compromised_password: false | |||||
| @@ -0,0 +1,17 @@ | |||||
| when@dev: | |||||
| web_profiler: | |||||
| toolbar: true | |||||
| intercept_redirects: false | |||||
| framework: | |||||
| profiler: | |||||
| only_exceptions: false | |||||
| collect_serializer_data: true | |||||
| when@test: | |||||
| web_profiler: | |||||
| toolbar: false | |||||
| intercept_redirects: false | |||||
| 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,5 @@ | |||||
| controllers: | |||||
| resource: | |||||
| path: ../src/Controller/ | |||||
| namespace: App\Controller | |||||
| type: attribute | |||||
| @@ -0,0 +1,4 @@ | |||||
| when@dev: | |||||
| _errors: | |||||
| resource: '@FrameworkBundle/Resources/config/routing/errors.xml' | |||||
| prefix: /_error | |||||
| @@ -0,0 +1,2 @@ | |||||
| spt_core_bundle.routes: | |||||
| resource: '@SptCoreBundle/config/routes.yaml' | |||||
| @@ -0,0 +1,8 @@ | |||||
| when@dev: | |||||
| web_profiler_wdt: | |||||
| resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' | |||||
| prefix: /_wdt | |||||
| web_profiler_profiler: | |||||
| resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' | |||||
| prefix: /_profiler | |||||
| @@ -0,0 +1,24 @@ | |||||
| # This file is the entry point to configure your own services. | |||||
| # Files in the packages/ subdirectory configure your dependencies. | |||||
| # Put parameters here that don't need to change on each machine where the app is deployed | |||||
| # https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration | |||||
| parameters: | |||||
| services: | |||||
| # default configuration for services in *this* file | |||||
| _defaults: | |||||
| autowire: true # Automatically injects dependencies in your services. | |||||
| autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. | |||||
| # makes classes in src/ available to be used as services | |||||
| # this creates a service per class whose id is the fully-qualified class name | |||||
| App\: | |||||
| resource: '../src/' | |||||
| exclude: | |||||
| - '../src/DependencyInjection/' | |||||
| - '../src/Entity/' | |||||
| - '../src/Kernel.php' | |||||
| # add more service definitions when explicit configuration is needed | |||||
| # please note that last definitions always *replace* previous ones | |||||
| @@ -0,0 +1,14 @@ | |||||
| version: '3' | |||||
| services: | |||||
| ###> doctrine/doctrine-bundle ### | |||||
| database: | |||||
| ports: | |||||
| - "5432" | |||||
| ###< doctrine/doctrine-bundle ### | |||||
| ###> symfony/mailer ### | |||||
| mailer: | |||||
| image: schickling/mailcatcher | |||||
| ports: ["1025", "1080"] | |||||
| ###< symfony/mailer ### | |||||
| @@ -0,0 +1,21 @@ | |||||
| version: '3' | |||||
| services: | |||||
| ###> doctrine/doctrine-bundle ### | |||||
| database: | |||||
| image: postgres:${POSTGRES_VERSION:-15}-alpine | |||||
| environment: | |||||
| POSTGRES_DB: ${POSTGRES_DB:-app} | |||||
| # You should definitely change the password in production | |||||
| POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-!ChangeMe!} | |||||
| POSTGRES_USER: ${POSTGRES_USER:-app} | |||||
| volumes: | |||||
| - database_data:/var/lib/postgresql/data:rw | |||||
| # You may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data! | |||||
| # - ./docker/db/data:/var/lib/postgresql/data:rw | |||||
| ###< doctrine/doctrine-bundle ### | |||||
| volumes: | |||||
| ###> doctrine/doctrine-bundle ### | |||||
| database_data: | |||||
| ###< doctrine/doctrine-bundle ### | |||||
| @@ -0,0 +1,38 @@ | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <!-- https://phpunit.readthedocs.io/en/latest/configuration.html --> | |||||
| <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
| xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" | |||||
| backupGlobals="false" | |||||
| colors="true" | |||||
| bootstrap="tests/bootstrap.php" | |||||
| convertDeprecationsToExceptions="false" | |||||
| > | |||||
| <php> | |||||
| <ini name="display_errors" value="1" /> | |||||
| <ini name="error_reporting" value="-1" /> | |||||
| <server name="APP_ENV" value="test" force="true" /> | |||||
| <server name="SHELL_VERBOSITY" value="-1" /> | |||||
| <server name="SYMFONY_PHPUNIT_REMOVE" value="" /> | |||||
| <server name="SYMFONY_PHPUNIT_VERSION" value="9.5" /> | |||||
| </php> | |||||
| <testsuites> | |||||
| <testsuite name="Project Test Suite"> | |||||
| <directory>tests</directory> | |||||
| </testsuite> | |||||
| </testsuites> | |||||
| <coverage processUncoveredFiles="true"> | |||||
| <include> | |||||
| <directory suffix=".php">src</directory> | |||||
| </include> | |||||
| </coverage> | |||||
| <listeners> | |||||
| <listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener" /> | |||||
| </listeners> | |||||
| <extensions> | |||||
| </extensions> | |||||
| </phpunit> | |||||
| @@ -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']); | |||||
| }; | |||||
| @@ -0,0 +1,24 @@ | |||||
| <?php | |||||
| /** | |||||
| * @author Daniel Knudsen <d.knudsen@spawntree.de> | |||||
| * @date 23.10.23 | |||||
| */ | |||||
| namespace App\Controller; | |||||
| use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; | |||||
| use Symfony\Component\HttpFoundation\Request; | |||||
| use Symfony\Component\HttpFoundation\Response; | |||||
| use Symfony\Component\Routing\Annotation\Route; | |||||
| class TestController extends AbstractController | |||||
| { | |||||
| #[Route('/', name: 'test_index')] | |||||
| public function index(Request $request): Response | |||||
| { | |||||
| return $this->render('index.html.twig', []); | |||||
| } | |||||
| } | |||||
| @@ -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; | |||||
| } | |||||
| @@ -0,0 +1,264 @@ | |||||
| { | |||||
| "doctrine/doctrine-bundle": { | |||||
| "version": "2.10", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "2.10", | |||||
| "ref": "e025a6cb69b195970543820b2f18ad21724473fa" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/doctrine.yaml", | |||||
| "src/Entity/.gitignore", | |||||
| "src/Repository/.gitignore" | |||||
| ] | |||||
| }, | |||||
| "doctrine/doctrine-migrations-bundle": { | |||||
| "version": "3.2", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "3.1", | |||||
| "ref": "1d01ec03c6ecbd67c3375c5478c9a423ae5d6a33" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/doctrine_migrations.yaml", | |||||
| "migrations/.gitignore" | |||||
| ] | |||||
| }, | |||||
| "nelmio/cors-bundle": { | |||||
| "version": "2.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "1.5", | |||||
| "ref": "6bea22e6c564fba3a1391615cada1437d0bde39c" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/nelmio_cors.yaml" | |||||
| ] | |||||
| }, | |||||
| "phpunit/phpunit": { | |||||
| "version": "9.6", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "9.6", | |||||
| "ref": "7364a21d87e658eb363c5020c072ecfdc12e2326" | |||||
| }, | |||||
| "files": [ | |||||
| ".env.test", | |||||
| "phpunit.xml.dist", | |||||
| "tests/bootstrap.php" | |||||
| ] | |||||
| }, | |||||
| "spt/spt-core-bundle": { | |||||
| "version": "1.0.0" | |||||
| }, | |||||
| "symfony/console": { | |||||
| "version": "6.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "5.3", | |||||
| "ref": "da0c8be8157600ad34f10ff0c9cc91232522e047" | |||||
| }, | |||||
| "files": [ | |||||
| "bin/console" | |||||
| ] | |||||
| }, | |||||
| "symfony/debug-bundle": { | |||||
| "version": "6.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "5.3", | |||||
| "ref": "5aa8aa48234c8eb6dbdd7b3cd5d791485d2cec4b" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/debug.yaml" | |||||
| ] | |||||
| }, | |||||
| "symfony/flex": { | |||||
| "version": "2.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "1.0", | |||||
| "ref": "146251ae39e06a95be0fe3d13c807bcf3938b172" | |||||
| }, | |||||
| "files": [ | |||||
| ".env" | |||||
| ] | |||||
| }, | |||||
| "symfony/framework-bundle": { | |||||
| "version": "6.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "6.2", | |||||
| "ref": "af47254c5e4cd543e6af3e4508298ffebbdaddd3" | |||||
| }, | |||||
| "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" | |||||
| ] | |||||
| }, | |||||
| "symfony/mailer": { | |||||
| "version": "6.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "4.3", | |||||
| "ref": "2bf89438209656b85b9a49238c4467bff1b1f939" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/mailer.yaml" | |||||
| ] | |||||
| }, | |||||
| "symfony/maker-bundle": { | |||||
| "version": "1.51", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "1.0", | |||||
| "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" | |||||
| } | |||||
| }, | |||||
| "symfony/messenger": { | |||||
| "version": "6.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "6.0", | |||||
| "ref": "ba1ac4e919baba5644d31b57a3284d6ba12d52ee" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/messenger.yaml" | |||||
| ] | |||||
| }, | |||||
| "symfony/monolog-bundle": { | |||||
| "version": "3.8", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "3.7", | |||||
| "ref": "213676c4ec929f046dfde5ea8e97625b81bc0578" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/monolog.yaml" | |||||
| ] | |||||
| }, | |||||
| "symfony/notifier": { | |||||
| "version": "6.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "5.0", | |||||
| "ref": "178877daf79d2dbd62129dd03612cb1a2cb407cc" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/notifier.yaml" | |||||
| ] | |||||
| }, | |||||
| "symfony/phpunit-bridge": { | |||||
| "version": "6.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "6.3", | |||||
| "ref": "01dfaa98c58f7a7b5a9b30e6edb7074af7ed9819" | |||||
| }, | |||||
| "files": [ | |||||
| ".env.test", | |||||
| "bin/phpunit", | |||||
| "phpunit.xml.dist", | |||||
| "tests/bootstrap.php" | |||||
| ] | |||||
| }, | |||||
| "symfony/routing": { | |||||
| "version": "6.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "6.2", | |||||
| "ref": "e0a11b4ccb8c9e70b574ff5ad3dfdcd41dec5aa6" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/routing.yaml", | |||||
| "config/routes.yaml" | |||||
| ] | |||||
| }, | |||||
| "symfony/security-bundle": { | |||||
| "version": "6.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "6.0", | |||||
| "ref": "8a5b112826f7d3d5b07027f93786ae11a1c7de48" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/security.yaml" | |||||
| ] | |||||
| }, | |||||
| "symfony/translation": { | |||||
| "version": "6.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "6.3", | |||||
| "ref": "64fe617084223633e1dedf9112935d8c95410d3e" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/translation.yaml", | |||||
| "translations/.gitignore" | |||||
| ] | |||||
| }, | |||||
| "symfony/twig-bundle": { | |||||
| "version": "6.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "6.3", | |||||
| "ref": "b7772eb20e92f3fb4d4fe756e7505b4ba2ca1a2c" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/twig.yaml", | |||||
| "templates/base.html.twig" | |||||
| ] | |||||
| }, | |||||
| "symfony/validator": { | |||||
| "version": "6.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "5.3", | |||||
| "ref": "c32cfd98f714894c4f128bb99aa2530c1227603c" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/validator.yaml" | |||||
| ] | |||||
| }, | |||||
| "symfony/web-profiler-bundle": { | |||||
| "version": "6.3", | |||||
| "recipe": { | |||||
| "repo": "github.com/symfony/recipes", | |||||
| "branch": "main", | |||||
| "version": "6.1", | |||||
| "ref": "e42b3f0177df239add25373083a564e5ead4e13a" | |||||
| }, | |||||
| "files": [ | |||||
| "config/packages/web_profiler.yaml", | |||||
| "config/routes/web_profiler.yaml" | |||||
| ] | |||||
| }, | |||||
| "twig/extra-bundle": { | |||||
| "version": "v3.7.1" | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,16 @@ | |||||
| <!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></svg>"> | |||||
| {% block stylesheets %} | |||||
| {% endblock %} | |||||
| {% block javascripts %} | |||||
| {% endblock %} | |||||
| </head> | |||||
| <body> | |||||
| {% block body %}{% endblock %} | |||||
| </body> | |||||
| </html> | |||||
| @@ -0,0 +1,48 @@ | |||||
| <!DOCTYPE html> | |||||
| <html lang="en"> | |||||
| <head> | |||||
| <meta charset="UTF-8"> | |||||
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |||||
| <title>Login Form</title> | |||||
| </head> | |||||
| <body> | |||||
| <h1>Login</h1> | |||||
| <form id="loginForm"> | |||||
| <label for="email">Username (Email):</label> | |||||
| <input type="text" id="email" name="email" required> | |||||
| <br> | |||||
| <label for="password">Password:</label> | |||||
| <input type="password" id="password" name="password" required> | |||||
| <br> | |||||
| <button type="button" id="loginButton">Login</button> | |||||
| </form> | |||||
| <script> | |||||
| document.getElementById('loginButton').addEventListener('click', function() { | |||||
| const email = document.getElementById('email').value; | |||||
| const password = document.getElementById('password').value; | |||||
| const data = { | |||||
| email: email, | |||||
| password: password | |||||
| }; | |||||
| fetch('https://spt-moduled-symfony.ddev.site:8443/spt-core/api/login', { | |||||
| method: 'POST', | |||||
| headers: { | |||||
| 'Content-Type': 'application/json' | |||||
| }, | |||||
| body: JSON.stringify(data) | |||||
| }) | |||||
| .then(response => response.json()) | |||||
| .then(data => { | |||||
| console.log(data); | |||||
| // Handle the response data as needed | |||||
| }) | |||||
| .catch(error => { | |||||
| console.error(error); | |||||
| // Handle errors | |||||
| }); | |||||
| }); | |||||
| </script> | |||||
| </body> | |||||
| </html> | |||||
| @@ -0,0 +1,11 @@ | |||||
| <?php | |||||
| use Symfony\Component\Dotenv\Dotenv; | |||||
| require dirname(__DIR__).'/vendor/autoload.php'; | |||||
| if (file_exists(dirname(__DIR__).'/config/bootstrap.php')) { | |||||
| require dirname(__DIR__).'/config/bootstrap.php'; | |||||
| } elseif (method_exists(Dotenv::class, 'bootEnv')) { | |||||
| (new Dotenv())->bootEnv(dirname(__DIR__).'/.env'); | |||||
| } | |||||