diff --git a/.gitattributes b/.gitattributes index 89f0af5..3d0ae75 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,8 +1,35 @@ -# Ignore all test and documentation for archive -/.github export-ignore -/.gitattributes export-ignore -/.scrutinizer.yml export-ignore -/.travis.yml export-ignore -/docs export-ignore -/composer.lock -*.css linguist-language=PHP \ No newline at end of file +# Autodetect text files +* text=auto eol=lf + +# ...Unless the name matches the following overriding patterns + +# Definitively text files +*.php text +*.css text +*.js text +*.txt text +*.md text +*.xml text +*.json text +*.bat text +*.sql text +*.yml text + +# Ensure those won't be messed up with +*.png binary +*.jpg binary +*.gif binary +*.ttf binary + +# Avoid merge conflicts in CHANGELOG +# https://about.gitlab.com/2015/02/10/gitlab-reduced-merge-conflicts-by-90-percent-with-changelog-placeholders/ +/CHANGELOG.md merge=union + +# Exclude files from the archive +/.gitattributes export-ignore +/.github export-ignore +/.gitignore export-ignore +/.styleci.yml export-ignore +/docs export-ignore +/psalm.xml export-ignore +/tests export-ignore diff --git a/README.md b/README.md index 99f0c11..fa30670 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,11 @@ A modern, Bootstrap 5-powered Yii2 application template designed for rapid web-application development. Built with best practices, clean architecture, and developer-friendly configuration, it lets you create production-ready apps with minimal setup while maintaining code quality and extensibility. -![app-basic](docs/home.png) + + + + Web Application Basic + ## Features @@ -81,7 +85,7 @@ cd myapp ```bash # Using built-in PHP server -php -S localhost:8080 -t public +php -S localhost:8080 -t web # Or using Yii console command ./yii serve @@ -149,13 +153,11 @@ root/ │ │ ├── event/ Event handlers │ │ └── resource/ CSS, JS, layouts, messages │ └── usecase/ Application use cases -│ ├── contact/ Contact functionality │ ├── hello/ Console command example -│ ├── security/ Security features │ └── site/ Site pages ├── tests/ Test suites ├── vendor/ Composer dependencies -└── public/ Web server document root +└── web/ Web server document root ``` #### Creating your first page @@ -176,11 +178,6 @@ class SiteController extends Controller { return $this->render('index'); } - - public function actionAbout(): string - { - return $this->render('about'); - } } ``` @@ -216,10 +213,8 @@ For detailed configuration options and advanced usage: The web application includes these ready-to-use pages: -- **[Home Page](docs/home.png)** - Welcome page with navigation -- **[About Page](docs/about.png)** - Information about your application -- **[Contact Page](docs/contact.png)** - Contact form with validation -- **[404 Error Page](docs/404.png)** - Custom error handling +- **[404 Error Page](docs/images/404.png)** - Custom error handling +- **[404 Error Page Dark](docs/images/404-dark.png)** - Custom error handling ## Our social networks diff --git a/composer.json b/composer.json index a67d13f..c96046c 100644 --- a/composer.json +++ b/composer.json @@ -12,11 +12,8 @@ "require": { "php": ">=8.1", "php-forge/foxy": "^0.1", - "ui-awesome/html": "^0.3", - "ui-awesome/html-component-bootstrap5": "^1.0@dev", "ui-awesome/html-svg":"^0.2", "vlucas/phpdotenv": "^5.6", - "yii2-extensions/localeurls": "^0.1.0", "yiisoft/yii2": "^2.0.53|^22", "yiisoft/yii2-bootstrap5": "^2.0.50|^22", "yiisoft/yii2-symfonymailer": "^4.0|^22" diff --git a/composer.lock b/composer.lock index f885f5d..4395466 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a00d0ea1f531a8651ce8f8e80bbe8df3", + "content-hash": "79369565fba8387bdaacddb16fe6a3d3", "packages": [ { "name": "cebe/markdown", @@ -72,16 +72,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.7", + "version": "1.5.8", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "d665d22c417056996c59019579f1967dfe5c1e82" + "reference": "719026bb30813accb68271fee7e39552a58e9f65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/d665d22c417056996c59019579f1967dfe5c1e82", - "reference": "d665d22c417056996c59019579f1967dfe5c1e82", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/719026bb30813accb68271fee7e39552a58e9f65", + "reference": "719026bb30813accb68271fee7e39552a58e9f65", "shasum": "" }, "require": { @@ -128,7 +128,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.7" + "source": "https://github.com/composer/ca-bundle/tree/1.5.8" }, "funding": [ { @@ -138,26 +138,22 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2025-05-26T15:08:54+00:00" + "time": "2025-08-20T18:49:47+00:00" }, { "name": "composer/class-map-generator", - "version": "1.6.1", + "version": "1.6.2", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "134b705ddb0025d397d8318a75825fe3c9d1da34" + "reference": "ba9f089655d4cdd64e762a6044f411ccdaec0076" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/134b705ddb0025d397d8318a75825fe3c9d1da34", - "reference": "134b705ddb0025d397d8318a75825fe3c9d1da34", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ba9f089655d4cdd64e762a6044f411ccdaec0076", + "reference": "ba9f089655d4cdd64e762a6044f411ccdaec0076", "shasum": "" }, "require": { @@ -201,7 +197,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.6.1" + "source": "https://github.com/composer/class-map-generator/tree/1.6.2" }, "funding": [ { @@ -211,26 +207,22 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2025-03-24T13:50:44+00:00" + "time": "2025-08-20T18:52:43+00:00" }, { "name": "composer/composer", - "version": "2.8.10", + "version": "2.8.11", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "53834f587d7ab2527eb237459d7b94d1fb9d4c5a" + "reference": "00e1a3396eea67033775c4a49c772376f45acd73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/53834f587d7ab2527eb237459d7b94d1fb9d4c5a", - "reference": "53834f587d7ab2527eb237459d7b94d1fb9d4c5a", + "url": "https://api.github.com/repos/composer/composer/zipball/00e1a3396eea67033775c4a49c772376f45acd73", + "reference": "00e1a3396eea67033775c4a49c772376f45acd73", "shasum": "" }, "require": { @@ -244,7 +236,7 @@ "justinrainbow/json-schema": "^6.3.1", "php": "^7.2.5 || ^8.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.11 || ^3.2", + "react/promise": "^2.11 || ^3.3", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", "seld/signal-handler": "^2.0", @@ -315,7 +307,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.8.10" + "source": "https://github.com/composer/composer/tree/2.8.11" }, "funding": [ { @@ -325,13 +317,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2025-07-10T17:08:33+00:00" + "time": "2025-08-21T09:29:39+00:00" }, { "name": "composer/metadata-minifier", @@ -483,16 +471,16 @@ }, { "name": "composer/semver", - "version": "3.4.3", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", "shasum": "" }, "require": { @@ -544,7 +532,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" + "source": "https://github.com/composer/semver/tree/3.4.4" }, "funding": [ { @@ -554,13 +542,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2024-09-19T14:15:21+00:00" + "time": "2025-08-20T19:15:30+00:00" }, { "name": "composer/spdx-licenses", @@ -1022,16 +1006,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "6.4.2", + "version": "6.5.1", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02" + "reference": "b5ab21e431594897e5bb86343c01f140ba862c26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ce1fd2d47799bb60668643bc6220f6278a4c1d02", - "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/b5ab21e431594897e5bb86343c01f140ba862c26", + "reference": "b5ab21e431594897e5bb86343c01f140ba862c26", "shasum": "" }, "require": { @@ -1041,7 +1025,7 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "3.3.0", - "json-schema/json-schema-test-suite": "1.2.0", + "json-schema/json-schema-test-suite": "^23.2", "marc-mabe/php-enum-phpstan": "^2.0", "phpspec/prophecy": "^1.19", "phpstan/phpstan": "^1.12", @@ -1091,9 +1075,9 @@ ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/6.4.2" + "source": "https://github.com/jsonrainbow/json-schema/tree/6.5.1" }, - "time": "2025-06-03T18:27:04+00:00" + "time": "2025-08-29T10:58:11+00:00" }, { "name": "marc-mabe/php-enum", @@ -1292,16 +1276,16 @@ }, { "name": "phpoption/phpoption", - "version": "1.9.3", + "version": "1.9.4", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", "shasum": "" }, "require": { @@ -1309,7 +1293,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" }, "type": "library", "extra": { @@ -1351,7 +1335,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.4" }, "funding": [ { @@ -1363,7 +1347,7 @@ "type": "tidelift" } ], - "time": "2024-07-20T21:41:07+00:00" + "time": "2025-08-21T11:53:16+00:00" }, { "name": "psr/container", @@ -1520,23 +1504,23 @@ }, { "name": "react/promise", - "version": "v3.2.0", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", "shasum": "" }, "require": { "php": ">=7.1.0" }, "require-dev": { - "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpstan/phpstan": "1.12.28 || 1.4.10", "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", @@ -1581,7 +1565,7 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.2.0" + "source": "https://github.com/reactphp/promise/tree/v3.3.0" }, "funding": [ { @@ -1589,7 +1573,7 @@ "type": "open_collective" } ], - "time": "2024-05-24T10:39:05+00:00" + "time": "2025-08-19T18:57:03+00:00" }, { "name": "seld/jsonlint", @@ -1766,16 +1750,16 @@ }, { "name": "symfony/console", - "version": "v7.3.1", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "9e27aecde8f506ba0fd1d9989620c04a87697101" + "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/9e27aecde8f506ba0fd1d9989620c04a87697101", - "reference": "9e27aecde8f506ba0fd1d9989620c04a87697101", + "url": "https://api.github.com/repos/symfony/console/zipball/cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", + "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", "shasum": "" }, "require": { @@ -1840,7 +1824,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.1" + "source": "https://github.com/symfony/console/tree/v7.3.3" }, "funding": [ { @@ -1851,12 +1835,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2025-08-25T06:35:40+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1927,16 +1915,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v7.3.0", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "497f73ac996a598c92409b44ac43b6690c4f666d" + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d", - "reference": "497f73ac996a598c92409b44ac43b6690c4f666d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191", + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191", "shasum": "" }, "require": { @@ -1987,7 +1975,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3" }, "funding": [ { @@ -1998,12 +1986,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-22T09:11:45+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -2083,16 +2075,16 @@ }, { "name": "symfony/filesystem", - "version": "v7.3.0", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edcbb768a186b5c3f25d0643159a787d3e63b7fd", + "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd", "shasum": "" }, "require": { @@ -2129,7 +2121,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.3.0" + "source": "https://github.com/symfony/filesystem/tree/v7.3.2" }, "funding": [ { @@ -2140,25 +2132,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-25T15:15:23+00:00" + "time": "2025-07-07T08:17:47+00:00" }, { "name": "symfony/finder", - "version": "v7.3.0", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d" + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ec2344cf77a48253bbca6939aa3d2477773ea63d", - "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d", + "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", "shasum": "" }, "require": { @@ -2193,7 +2189,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.3.0" + "source": "https://github.com/symfony/finder/tree/v7.3.2" }, "funding": [ { @@ -2204,25 +2200,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-30T19:00:26+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/mailer", - "version": "v7.3.1", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "b5db5105b290bdbea5ab27b89c69effcf1cb3368" + "reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/b5db5105b290bdbea5ab27b89c69effcf1cb3368", - "reference": "b5db5105b290bdbea5ab27b89c69effcf1cb3368", + "url": "https://api.github.com/repos/symfony/mailer/zipball/a32f3f45f1990db8c4341d5122a7d3a381c7e575", + "reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575", "shasum": "" }, "require": { @@ -2273,7 +2273,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.3.1" + "source": "https://github.com/symfony/mailer/tree/v7.3.3" }, "funding": [ { @@ -2284,25 +2284,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/mime", - "version": "v7.3.0", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9" + "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9", - "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9", + "url": "https://api.github.com/repos/symfony/mime/zipball/e0a0f859148daf1edf6c60b398eb40bfc96697d1", + "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1", "shasum": "" }, "require": { @@ -2357,7 +2361,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.3.0" + "source": "https://github.com/symfony/mime/tree/v7.3.2" }, "funding": [ { @@ -2368,16 +2372,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-02-19T08:51:26+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -2436,7 +2444,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" }, "funding": [ { @@ -2447,6 +2455,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -2456,7 +2468,7 @@ }, { "name": "symfony/polyfill-iconv", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", @@ -2516,7 +2528,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.33.0" }, "funding": [ { @@ -2527,6 +2539,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -2536,16 +2552,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { @@ -2594,7 +2610,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -2605,16 +2621,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", @@ -2677,7 +2697,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" }, "funding": [ { @@ -2688,6 +2708,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -2697,7 +2721,7 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -2758,7 +2782,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -2769,6 +2793,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -2778,7 +2806,7 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", @@ -2839,7 +2867,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -2850,6 +2878,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -2924,7 +2956,7 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", @@ -2980,7 +3012,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" }, "funding": [ { @@ -2991,6 +3023,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -3000,7 +3036,7 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", @@ -3060,7 +3096,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -3071,6 +3107,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -3080,7 +3120,7 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", @@ -3136,7 +3176,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" }, "funding": [ { @@ -3147,6 +3187,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -3156,16 +3200,16 @@ }, { "name": "symfony/process", - "version": "v6.4.20", + "version": "v6.4.25", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "e2a61c16af36c9a07e5c9906498b73e091949a20" + "reference": "6be2f0c9ab3428587c07bed03aa9e3d1b823c6c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/e2a61c16af36c9a07e5c9906498b73e091949a20", - "reference": "e2a61c16af36c9a07e5c9906498b73e091949a20", + "url": "https://api.github.com/repos/symfony/process/zipball/6be2f0c9ab3428587c07bed03aa9e3d1b823c6c8", + "reference": "6be2f0c9ab3428587c07bed03aa9e3d1b823c6c8", "shasum": "" }, "require": { @@ -3197,7 +3241,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.20" + "source": "https://github.com/symfony/process/tree/v6.4.25" }, "funding": [ { @@ -3208,12 +3252,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-03-10T17:11:00+00:00" + "time": "2025-08-14T06:23:17+00:00" }, { "name": "symfony/service-contracts", @@ -3300,16 +3348,16 @@ }, { "name": "symfony/string", - "version": "v7.3.0", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125" + "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125", - "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125", + "url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", + "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", "shasum": "" }, "require": { @@ -3367,7 +3415,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.3.0" + "source": "https://github.com/symfony/string/tree/v7.3.3" }, "funding": [ { @@ -3378,69 +3426,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-20T20:19:01+00:00" - }, - { - "name": "ui-awesome/html", - "version": "0.3.0", - "source": { - "type": "git", - "url": "https://github.com/ui-awesome/html.git", - "reference": "bc6ae50a3abdea7a5e149a2752787e9d381159e0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ui-awesome/html/zipball/bc6ae50a3abdea7a5e149a2752787e9d381159e0", - "reference": "bc6ae50a3abdea7a5e149a2752787e9d381159e0", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": "^8.1", - "php-forge/awesome-widget": "^0.1.2", - "ui-awesome/html-attribute": "^0.2", - "ui-awesome/html-concern": "^0.2", - "ui-awesome/html-core": "^0.1", - "ui-awesome/html-helper": "^0.2", - "ui-awesome/html-interop": "^0.1" - }, - "require-dev": { - "maglnet/composer-require-checker": "^4.7", - "php-forge/support": "^0.1", - "phpunit/phpunit": "^10.5", - "roave/infection-static-analysis-plugin": "^1.34", - "symplify/easy-coding-standard": "^12.1", - "vimeo/psalm": "^5.20" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "UIAwesome\\Html\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "description": "UI Awesome HTML Code Generator for PHP.", - "keywords": [ - "code-generator", - "html", - "php", - "ui-awesome" - ], - "support": { - "issues": "https://github.com/ui-awesome/html/issues", - "source": "https://github.com/ui-awesome/html/tree/0.3.0" - }, - "time": "2024-03-31T12:21:24+00:00" + "time": "2025-08-25T06:35:40+00:00" }, { "name": "ui-awesome/html-attribute", @@ -3497,64 +3492,6 @@ }, "time": "2024-03-30T17:55:29+00:00" }, - { - "name": "ui-awesome/html-component-bootstrap5", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/ui-awesome/html-component-bootstrap5.git", - "reference": "aab2bcd36f19d4a3a19c011868a603e38ff023bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ui-awesome/html-component-bootstrap5/zipball/aab2bcd36f19d4a3a19c011868a603e38ff023bb", - "reference": "aab2bcd36f19d4a3a19c011868a603e38ff023bb", - "shasum": "" - }, - "require": { - "php": "^8.1", - "php-forge/awesome-widget": "^0.1", - "ui-awesome/html-core-component": "^0.1", - "ui-awesome/html-helper": "^0.2", - "ui-awesome/html-svg": "^0.2" - }, - "require-dev": { - "maglnet/composer-require-checker": "^4.7", - "php-forge/support": "^0.1", - "phpunit/phpunit": "^10.5", - "roave/infection-static-analysis-plugin": "^1.34", - "symplify/easy-coding-standard": "^12.1", - "vimeo/psalm": "^5.20" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "UIAwesome\\Html\\Component\\Bootstrap5\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "mit" - ], - "description": "UI Awesome HTML Component Bootstrap5 for PHP.", - "keywords": [ - "bootstrap5", - "html-component", - "php", - "ui-awesome" - ], - "support": { - "issues": "https://github.com/ui-awesome/html-component-bootstrap5/issues", - "source": "https://github.com/ui-awesome/html-component-bootstrap5/tree/main" - }, - "time": "2024-03-31T13:56:53+00:00" - }, { "name": "ui-awesome/html-concern", "version": "0.2.0", @@ -3668,66 +3605,6 @@ }, "time": "2024-03-30T20:03:08+00:00" }, - { - "name": "ui-awesome/html-core-component", - "version": "0.1.0", - "source": { - "type": "git", - "url": "https://github.com/ui-awesome/html-core-component.git", - "reference": "5d87762328528943a9a964adb75e43715fbca0dc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ui-awesome/html-core-component/zipball/5d87762328528943a9a964adb75e43715fbca0dc", - "reference": "5d87762328528943a9a964adb75e43715fbca0dc", - "shasum": "" - }, - "require": { - "php": "^8.1", - "php-forge/awesome-widget": "^0.1", - "ui-awesome/html-attribute": "^0.2", - "ui-awesome/html-concern": "^0.2", - "ui-awesome/html-core": "^0.1", - "ui-awesome/html-helper": "^0.2", - "ui-awesome/html-interop": "^0.1", - "ui-awesome/html-svg": "^0.2" - }, - "require-dev": { - "maglnet/composer-require-checker": "^4.7", - "php-forge/support": "^0.1", - "phpunit/phpunit": "^10.5", - "roave/infection-static-analysis-plugin": "^1.34", - "symplify/easy-coding-standard": "^12.1", - "vimeo/psalm": "^5.20" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "UIAwesome\\Html\\Core\\Component\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "mit" - ], - "description": "UI Awesome HTML Core Component for PHP.", - "keywords": [ - "core-component", - "html", - "php", - "ui-awesome" - ], - "support": { - "issues": "https://github.com/ui-awesome/html-core-component/issues", - "source": "https://github.com/ui-awesome/html-core-component/tree/0.1.0" - }, - "time": "2024-03-31T13:16:51+00:00" - }, { "name": "ui-awesome/html-helper", "version": "0.2.0", @@ -4241,68 +4118,6 @@ ], "time": "2023-03-08T08:35:38+00:00" }, - { - "name": "yii2-extensions/localeurls", - "version": "0.1.2", - "source": { - "type": "git", - "url": "https://github.com/yii2-extensions/localeurls.git", - "reference": "c6efcdb3cae20b7098b9085585d7f1efc0806da5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yii2-extensions/localeurls/zipball/c6efcdb3cae20b7098b9085585d7f1efc0806da5", - "reference": "c6efcdb3cae20b7098b9085585d7f1efc0806da5", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=8.1", - "yiisoft/yii2": "^2.0.53|^22" - }, - "require-dev": { - "infection/infection": "^0.27|^0.30", - "maglnet/composer-require-checker": "^4.1", - "phpstan/extension-installer": "^1.4", - "phpstan/phpstan-strict-rules": "^2.0.3", - "phpunit/phpunit": "^10.5", - "rector/rector": "^2.1", - "symplify/easy-coding-standard": "^12.5", - "yii2-extensions/phpstan": "^0.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "0.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "yii2\\extensions\\localeurls\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Automatic locale/language management for URLs.", - "keywords": [ - "i18n", - "locale", - "yii2" - ], - "support": { - "issues": "https://github.com/yii2-extensions/localeurls/issues", - "source": "https://github.com/yii2-extensions/localeurls/tree/0.1.2" - }, - "funding": [ - { - "url": "https://github.com/terabytesoftw", - "type": "github" - } - ], - "time": "2025-07-04T14:01:43+00:00" - }, { "name": "yiisoft/yii2", "version": "2.0.53", @@ -5324,20 +5139,20 @@ }, { "name": "codeception/stub", - "version": "4.1.4", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/Codeception/Stub.git", - "reference": "6ce453073a0c220b254dd7f4383645615e4071c3" + "reference": "19014cec368cefc0579499779c451551cd288557" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/6ce453073a0c220b254dd7f4383645615e4071c3", - "reference": "6ce453073a0c220b254dd7f4383645615e4071c3", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/19014cec368cefc0579499779c451551cd288557", + "reference": "19014cec368cefc0579499779c451551cd288557", "shasum": "" }, "require": { - "php": "^7.4 | ^8.0", + "php": "^8.1", "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | ^11 | ^12" }, "conflict": { @@ -5359,9 +5174,9 @@ "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", "support": { "issues": "https://github.com/Codeception/Stub/issues", - "source": "https://github.com/Codeception/Stub/tree/4.1.4" + "source": "https://github.com/Codeception/Stub/tree/4.2.0" }, - "time": "2025-02-14T06:56:33+00:00" + "time": "2025-08-01T08:15:29+00:00" }, { "name": "codeception/verify", @@ -5414,22 +5229,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.9.3", + "version": "7.10.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", - "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.3", - "guzzlehttp/psr7": "^2.7.0", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -5520,7 +5335,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.3" + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" }, "funding": [ { @@ -5536,20 +5351,20 @@ "type": "tidelift" } ], - "time": "2025-03-27T13:37:11+00:00" + "time": "2025-08-23T22:36:01+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.2.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c" + "reference": "481557b130ef3790cf82b713667b43030dc9c957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c", - "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", "shasum": "" }, "require": { @@ -5557,7 +5372,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "type": "library", "extra": { @@ -5603,7 +5418,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.2.0" + "source": "https://github.com/guzzle/promises/tree/2.3.0" }, "funding": [ { @@ -5619,20 +5434,20 @@ "type": "tidelift" } ], - "time": "2025-03-27T13:27:01+00:00" + "time": "2025-08-22T14:34:08+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.7.1", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" + "reference": "21dc724a0583619cd1652f673303492272778051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", - "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", "shasum": "" }, "require": { @@ -5648,7 +5463,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -5719,7 +5534,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.1" + "source": "https://github.com/guzzle/psr7/tree/2.8.0" }, "funding": [ { @@ -5735,7 +5550,7 @@ "type": "tidelift" } ], - "time": "2025-03-27T12:30:47+00:00" + "time": "2025-08-23T21:21:41+00:00" }, { "name": "maglnet/composer-require-checker", @@ -5820,16 +5635,16 @@ }, { "name": "masterminds/html5", - "version": "2.9.0", + "version": "2.10.0", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + "reference": "fcf91eb64359852f00d921887b219479b4f21251" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251", + "reference": "fcf91eb64359852f00d921887b219479b4f21251", "shasum": "" }, "require": { @@ -5881,22 +5696,22 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + "source": "https://github.com/Masterminds/html5-php/tree/2.10.0" }, - "time": "2024-03-31T07:05:07+00:00" + "time": "2025-07-25T09:04:22+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.13.3", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "faed855a7b5f4d4637717c2b3863e277116beb36" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/faed855a7b5f4d4637717c2b3863e277116beb36", - "reference": "faed855a7b5f4d4637717c2b3863e277116beb36", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -5935,7 +5750,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.3" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { @@ -5943,20 +5758,20 @@ "type": "tidelift" } ], - "time": "2025-07-05T12:25:42+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { "name": "nikic/php-parser", - "version": "v5.5.0", + "version": "v5.6.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "ae59794362fe85e051a58ad36b289443f57be7a9" + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9", - "reference": "ae59794362fe85e051a58ad36b289443f57be7a9", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", "shasum": "" }, "require": { @@ -5975,7 +5790,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -5999,9 +5814,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1" }, - "time": "2025-05-31T08:24:38+00:00" + "time": "2025-08-13T20:13:15+00:00" }, { "name": "phar-io/manifest", @@ -6212,16 +6027,16 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.17", + "version": "2.1.22", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053" + "reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/89b5ef665716fa2a52ecd2633f21007a6a349053", - "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/41600c8379eb5aee63e9413fe9e97273e25d57e4", + "reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4", "shasum": "" }, "require": { @@ -6266,20 +6081,20 @@ "type": "github" } ], - "time": "2025-05-21T20:55:28+00:00" + "time": "2025-08-04T19:17:37+00:00" }, { "name": "phpstan/phpstan-strict-rules", - "version": "2.0.4", + "version": "2.0.6", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "3e139cbe67fafa3588e1dbe27ca50f31fdb6236a" + "reference": "f9f77efa9de31992a832ff77ea52eb42d675b094" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/3e139cbe67fafa3588e1dbe27ca50f31fdb6236a", - "reference": "3e139cbe67fafa3588e1dbe27ca50f31fdb6236a", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/f9f77efa9de31992a832ff77ea52eb42d675b094", + "reference": "f9f77efa9de31992a832ff77ea52eb42d675b094", "shasum": "" }, "require": { @@ -6312,22 +6127,22 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.4" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.6" }, - "time": "2025-03-18T11:42:40+00:00" + "time": "2025-07-21T12:19:29+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "12.3.1", + "version": "12.3.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ddec29dfc128eba9c204389960f2063f3b7fa170" + "reference": "7ad0e9bdc72b147600badccd694a2e57ffc9297a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ddec29dfc128eba9c204389960f2063f3b7fa170", - "reference": "ddec29dfc128eba9c204389960f2063f3b7fa170", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7ad0e9bdc72b147600badccd694a2e57ffc9297a", + "reference": "7ad0e9bdc72b147600badccd694a2e57ffc9297a", "shasum": "" }, "require": { @@ -6383,7 +6198,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.3.1" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.3.4" }, "funding": [ { @@ -6403,7 +6218,7 @@ "type": "tidelift" } ], - "time": "2025-06-18T08:58:13+00:00" + "time": "2025-08-29T11:32:44+00:00" }, { "name": "phpunit/php-file-iterator", @@ -6652,16 +6467,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.2.7", + "version": "12.3.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "8b1348b254e5959acaf1539c6bd790515fb49414" + "reference": "b8fa997c49682979ad6bfaa0d7fb25f54954965e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8b1348b254e5959acaf1539c6bd790515fb49414", - "reference": "8b1348b254e5959acaf1539c6bd790515fb49414", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b8fa997c49682979ad6bfaa0d7fb25f54954965e", + "reference": "b8fa997c49682979ad6bfaa0d7fb25f54954965e", "shasum": "" }, "require": { @@ -6671,23 +6486,23 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.3", + "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.3.1", + "phpunit/php-code-coverage": "^12.3.3", "phpunit/php-file-iterator": "^6.0.0", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", "phpunit/php-timer": "^8.0.0", "sebastian/cli-parser": "^4.0.0", - "sebastian/comparator": "^7.1.0", + "sebastian/comparator": "^7.1.3", "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.0.2", + "sebastian/environment": "^8.0.3", "sebastian/exporter": "^7.0.0", "sebastian/global-state": "^8.0.0", "sebastian/object-enumerator": "^7.0.0", - "sebastian/type": "^6.0.2", + "sebastian/type": "^6.0.3", "sebastian/version": "^6.0.0", "staabm/side-effects-detector": "^1.0.5" }, @@ -6697,7 +6512,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "12.2-dev" + "dev-main": "12.3-dev" } }, "autoload": { @@ -6729,7 +6544,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.2.7" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.3.7" }, "funding": [ { @@ -6753,7 +6568,7 @@ "type": "tidelift" } ], - "time": "2025-07-11T04:11:13+00:00" + "time": "2025-08-28T05:15:46+00:00" }, { "name": "psr/http-client", @@ -6917,16 +6732,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.9", + "version": "v0.12.10", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "1b801844becfe648985372cb4b12ad6840245ace" + "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/1b801844becfe648985372cb4b12ad6840245ace", - "reference": "1b801844becfe648985372cb4b12ad6840245ace", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/6e80abe6f2257121f1eb9a4c55bf29d921025b22", + "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22", "shasum": "" }, "require": { @@ -6976,12 +6791,11 @@ "authors": [ { "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" + "email": "justin@justinhileman.info" } ], "description": "An interactive shell for modern PHP.", - "homepage": "http://psysh.org", + "homepage": "https://psysh.org", "keywords": [ "REPL", "console", @@ -6990,9 +6804,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.9" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.10" }, - "time": "2025-06-23T02:35:06+00:00" + "time": "2025-08-04T12:39:37+00:00" }, { "name": "ralouphie/getallheaders", @@ -7040,21 +6854,21 @@ }, { "name": "rector/rector", - "version": "2.1.1", + "version": "2.1.4", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "d0917c069bb0d9bb06ed111cf052510f609015a4" + "reference": "fe613c528819222f8686a9a037a315ef9d4915b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/d0917c069bb0d9bb06ed111cf052510f609015a4", - "reference": "d0917c069bb0d9bb06ed111cf052510f609015a4", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/fe613c528819222f8686a9a037a315ef9d4915b3", + "reference": "fe613c528819222f8686a9a037a315ef9d4915b3", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.1.17" + "phpstan/phpstan": "^2.1.18" }, "conflict": { "rector/rector-doctrine": "*", @@ -7088,7 +6902,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.1.1" + "source": "https://github.com/rectorphp/rector/tree/2.1.4" }, "funding": [ { @@ -7096,7 +6910,7 @@ "type": "github" } ], - "time": "2025-07-10T11:31:31+00:00" + "time": "2025-08-15T14:41:36+00:00" }, { "name": "sebastian/cli-parser", @@ -7157,16 +6971,16 @@ }, { "name": "sebastian/comparator", - "version": "7.1.0", + "version": "7.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "03d905327dccc0851c9a08d6a979dfc683826b6f" + "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/03d905327dccc0851c9a08d6a979dfc683826b6f", - "reference": "03d905327dccc0851c9a08d6a979dfc683826b6f", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dc904b4bb3ab070865fa4068cd84f3da8b945148", + "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148", "shasum": "" }, "require": { @@ -7225,7 +7039,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.0" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.3" }, "funding": [ { @@ -7245,7 +7059,7 @@ "type": "tidelift" } ], - "time": "2025-06-17T07:41:58+00:00" + "time": "2025-08-20T11:27:00+00:00" }, { "name": "sebastian/complexity", @@ -7374,16 +7188,16 @@ }, { "name": "sebastian/environment", - "version": "8.0.2", + "version": "8.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "d364b9e5d0d3b18a2573351a1786fbf96b7e0792" + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d364b9e5d0d3b18a2573351a1786fbf96b7e0792", - "reference": "d364b9e5d0d3b18a2573351a1786fbf96b7e0792", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", "shasum": "" }, "require": { @@ -7426,7 +7240,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.0.2" + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" }, "funding": [ { @@ -7446,7 +7260,7 @@ "type": "tidelift" } ], - "time": "2025-05-21T15:05:44+00:00" + "time": "2025-08-12T14:11:56+00:00" }, { "name": "sebastian/exporter", @@ -7528,16 +7342,16 @@ }, { "name": "sebastian/global-state", - "version": "8.0.0", + "version": "8.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "570a2aeb26d40f057af686d63c4e99b075fb6cbc" + "reference": "ef1377171613d09edd25b7816f05be8313f9115d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/570a2aeb26d40f057af686d63c4e99b075fb6cbc", - "reference": "570a2aeb26d40f057af686d63c4e99b075fb6cbc", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d", "shasum": "" }, "require": { @@ -7578,15 +7392,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.0" + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" } ], - "time": "2025-02-07T04:56:59+00:00" + "time": "2025-08-29T11:29:25+00:00" }, { "name": "sebastian/lines-of-code", @@ -7762,16 +7588,16 @@ }, { "name": "sebastian/recursion-context", - "version": "7.0.0", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "c405ae3a63e01b32eb71577f8ec1604e39858a7c" + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/c405ae3a63e01b32eb71577f8ec1604e39858a7c", - "reference": "c405ae3a63e01b32eb71577f8ec1604e39858a7c", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", "shasum": "" }, "require": { @@ -7814,28 +7640,40 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2025-02-07T05:00:01+00:00" + "time": "2025-08-13T04:44:59+00:00" }, { "name": "sebastian/type", - "version": "6.0.2", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "1d7cd6e514384c36d7a390347f57c385d4be6069" + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/1d7cd6e514384c36d7a390347f57c385d4be6069", - "reference": "1d7cd6e514384c36d7a390347f57c385d4be6069", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", "shasum": "" }, "require": { @@ -7871,15 +7709,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" } ], - "time": "2025-03-18T13:37:31+00:00" + "time": "2025-08-09T06:57:12+00:00" }, { "name": "sebastian/version", @@ -7989,16 +7839,16 @@ }, { "name": "symfony/browser-kit", - "version": "v6.4.19", + "version": "v6.4.24", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "ce95f3e3239159e7fa3be7690c6ce95a4714637f" + "reference": "3537d17782f8c20795b194acb6859071b60c6fac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/ce95f3e3239159e7fa3be7690c6ce95a4714637f", - "reference": "ce95f3e3239159e7fa3be7690c6ce95a4714637f", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/3537d17782f8c20795b194acb6859071b60c6fac", + "reference": "3537d17782f8c20795b194acb6859071b60c6fac", "shasum": "" }, "require": { @@ -8037,7 +7887,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v6.4.19" + "source": "https://github.com/symfony/browser-kit/tree/v6.4.24" }, "funding": [ { @@ -8048,12 +7898,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-02-14T11:23:16+00:00" + "time": "2025-07-10T08:14:14+00:00" }, { "name": "symfony/css-selector", @@ -8122,16 +7976,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v7.3.1", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9" + "reference": "efa076ea0eeff504383ff0dcf827ea5ce15690ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", - "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/efa076ea0eeff504383ff0dcf827ea5ce15690ba", + "reference": "efa076ea0eeff504383ff0dcf827ea5ce15690ba", "shasum": "" }, "require": { @@ -8169,7 +8023,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.3.1" + "source": "https://github.com/symfony/dom-crawler/tree/v7.3.3" }, "funding": [ { @@ -8180,25 +8034,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-15T10:07:06+00:00" + "time": "2025-08-06T20:13:54+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.3.1", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42" + "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", - "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", + "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", "shasum": "" }, "require": { @@ -8210,7 +8068,6 @@ "symfony/console": "<6.4" }, "require-dev": { - "ext-iconv": "*", "symfony/console": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", @@ -8253,7 +8110,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.3.1" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.3" }, "funding": [ { @@ -8264,25 +8121,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/yaml", - "version": "v7.3.1", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb" + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/0c3555045a46ab3cd4cc5a69d161225195230edb", - "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d4f4a66866fe2451f61296924767280ab5732d9d", + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d", "shasum": "" }, "require": { @@ -8325,7 +8186,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.3.1" + "source": "https://github.com/symfony/yaml/tree/v7.3.3" }, "funding": [ { @@ -8336,25 +8197,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-03T06:57:57+00:00" + "time": "2025-08-27T11:34:33+00:00" }, { "name": "symplify/easy-coding-standard", - "version": "12.5.20", + "version": "12.5.24", "source": { "type": "git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "bb44b0fc70dd2148d8a6362bc66a35e23dc31bc4" + "reference": "4b90f2b6efed9508000968eac2397ac7aff34354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/bb44b0fc70dd2148d8a6362bc66a35e23dc31bc4", - "reference": "bb44b0fc70dd2148d8a6362bc66a35e23dc31bc4", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/4b90f2b6efed9508000968eac2397ac7aff34354", + "reference": "4b90f2b6efed9508000968eac2397ac7aff34354", "shasum": "" }, "require": { @@ -8390,7 +8255,7 @@ ], "support": { "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.5.20" + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.5.24" }, "funding": [ { @@ -8402,7 +8267,7 @@ "type": "github" } ], - "time": "2025-05-30T11:42:07+00:00" + "time": "2025-08-21T06:57:14+00:00" }, { "name": "theseer/tokenizer", @@ -8563,16 +8428,16 @@ }, { "name": "yii2-extensions/phpstan", - "version": "0.3.0", + "version": "0.3.1", "source": { "type": "git", "url": "https://github.com/yii2-extensions/phpstan.git", - "reference": "e3647c8bbd61bb85b3a4a21a1e2bc8ef0a86836c" + "reference": "3cc2419f6776088571a7e018fb73a75b58fc35aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/yii2-extensions/phpstan/zipball/e3647c8bbd61bb85b3a4a21a1e2bc8ef0a86836c", - "reference": "e3647c8bbd61bb85b3a4a21a1e2bc8ef0a86836c", + "url": "https://api.github.com/repos/yii2-extensions/phpstan/zipball/3cc2419f6776088571a7e018fb73a75b58fc35aa", + "reference": "3cc2419f6776088571a7e018fb73a75b58fc35aa", "shasum": "" }, "require": { @@ -8615,7 +8480,7 @@ ], "support": { "issues": "https://github.com/yii2-extensions/phpstan/issues", - "source": "https://github.com/yii2-extensions/phpstan/tree/0.3.0" + "source": "https://github.com/yii2-extensions/phpstan/tree/0.3.1" }, "funding": [ { @@ -8623,7 +8488,7 @@ "type": "github" } ], - "time": "2025-06-27T09:08:58+00:00" + "time": "2025-08-16T14:57:16+00:00" }, { "name": "yiisoft/yii2-debug", @@ -8807,9 +8672,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "ui-awesome/html-component-bootstrap5": 20 - }, + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/config/console/app.php b/config/console/app.php index 1910665..33ffc39 100644 --- a/config/console/app.php +++ b/config/console/app.php @@ -3,7 +3,6 @@ declare(strict_types=1); use app\usecase\hello\HelloController; -use yii\console\controllers\ServeController; /** @var string[] $components */ $components = require dirname(__DIR__) . '/common/components.php'; @@ -12,20 +11,9 @@ return [ 'id' => 'console.basic', - 'aliases' => [ - '@root' => dirname(__DIR__, 2), - ], 'basePath' => dirname(__DIR__, 2), - 'bootstrap' => [ - 'log', - ], + 'bootstrap' => ['log'], 'components' => $components, - 'controllerMap' => [ - 'hello' => HelloController::class, - 'serve' => [ - 'class' => ServeController::class, - 'docroot' => '@app/public', - ], - ], + 'controllerMap' => ['hello' => HelloController::class], 'params' => $params, ]; diff --git a/config/web/app.php b/config/web/app.php index 5b31419..fcd9a74 100644 --- a/config/web/app.php +++ b/config/web/app.php @@ -2,9 +2,6 @@ declare(strict_types=1); -use app\framework\event\ContactEventHandler; -use app\usecase\contact\ContactController; -use app\usecase\security\SecurityController; use app\usecase\site\SiteController; /** @phpstan-var string[] $components */ @@ -22,27 +19,14 @@ '@root' => $rootDir, '@npm' => '@root/node_modules', '@bower' => '@npm', - '@public' => '@root/public', '@resource' => '@root/src/framework/resource', '@runtime' => '@root/runtime', - '@web' => '/', ], 'basePath' => $rootDir, - 'bootstrap' => [ - ContactEventHandler::class, - 'log', - ], + 'bootstrap' => ['log'], 'components' => $components, 'controllerMap' => [ - 'contact' => [ - 'class' => ContactController::class, - ], - 'security' => [ - 'class' => SecurityController::class, - ], - 'site' => [ - 'class' => SiteController::class, - ], + 'site' => ['class' => SiteController::class], ], 'language' => 'en-US', 'modules' => $modules, @@ -53,18 +37,7 @@ if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug'; - $config['modules']['debug'] = [ - 'class' => yii\debug\Module::class, - // uncomment the following to add your IP if you aren't connecting from localhost. - //'allowedIPs' => ['127.0.0.1', '::1'], - ]; - $config['bootstrap'][] = 'gii'; - $config['modules']['gii'] = [ - 'class' => yii\gii\Module::class, - // uncomment the following to add your IP if you aren't connecting from localhost. - //'allowedIPs' => ['127.0.0.1', '::1'], - ]; } return $config; diff --git a/config/web/components.php b/config/web/components.php index de6d2d3..9fe0b61 100644 --- a/config/web/components.php +++ b/config/web/components.php @@ -2,17 +2,14 @@ declare(strict_types=1); -use app\usecase\security\Identity; use yii\i18n\PhpMessageSource; -use yii\web\User; -use yii2\extensions\localeurls\UrlLanguageManager; /** @phpstan-var string[] $commonComponents */ $commonComponents = require dirname(__DIR__) . '/common/components.php'; $config = [ 'assetManager' => [ - 'basePath' => '@public/assets', + 'basePath' => '@root/web/assets', ], 'errorHandler' => [ 'errorAction' => 'site/404', @@ -21,8 +18,6 @@ 'translations' => [ 'app.basic' => [ 'class' => PhpMessageSource::class, - 'basePath' => '@resource/message', - 'sourceLanguage' => 'en', ], ], ], @@ -31,23 +26,9 @@ 'enableCsrfValidation' => YII_ENV_DEV === false, ], 'urlManager' => [ - 'class' => UrlLanguageManager::class, - 'languages' => [ - 'de' => 'de-DE', - 'en' => 'en-US', - 'es' => 'es-ES', - 'fr' => 'fr-FR', - 'pt' => 'pt-BR', - 'ru' => 'ru-RU', - 'zh' => 'zh-CN', - ], 'enablePrettyUrl' => true, 'showScriptName' => false, ], - 'user' => [ - 'class' => User::class, - 'identityClass' => Identity::class, - ], ]; $config += $commonComponents; diff --git a/config/web/modules.php b/config/web/modules.php index 0dae23d..f970647 100644 --- a/config/web/modules.php +++ b/config/web/modules.php @@ -2,4 +2,17 @@ declare(strict_types=1); -return []; +$config = [ + 'debug' => [ + 'class' => yii\debug\Module::class, + // uncomment the following to add your IP if you aren't connecting from localhost. + //'allowedIPs' => ['127.0.0.1', '::1'], + ], + 'gii' => [ + 'class' => yii\gii\Module::class, + // uncomment the following to add your IP if you aren't connecting from localhost. + //'allowedIPs' => ['127.0.0.1', '::1'], + ], +]; + +return YII_ENV_DEV ? $config : []; diff --git a/docs/404.png b/docs/404.png deleted file mode 100644 index 9f7a50b..0000000 Binary files a/docs/404.png and /dev/null differ diff --git a/docs/about.png b/docs/about.png deleted file mode 100644 index ff5febe..0000000 Binary files a/docs/about.png and /dev/null differ diff --git a/docs/configuration.md b/docs/configuration.md index 2b1a1d6..9a09736 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -82,7 +82,6 @@ Application configuration in `config/console/app.php`. declare(strict_types=1); use app\usecase\hello\HelloController; -use yii\console\controllers\ServeController; /** @var string[] $components */ $components = require dirname(__DIR__) . '/common/components.php'; @@ -92,21 +91,10 @@ $params = require dirname(__DIR__) . '/params-console.php'; return [ 'id' => 'console.basic', - 'aliases' => [ - '@root' => dirname(__DIR__, 2), - ], 'basePath' => dirname(__DIR__, 2), - 'bootstrap' => [ - 'log', - ], + 'bootstrap' => ['log'], 'components' => $components, - 'controllerMap' => [ - 'hello' => HelloController::class, - 'serve' => [ - 'class' => ServeController::class, - 'docroot' => '@app/public', - ], - ], + 'controllerMap' => ['hello' => HelloController::class], 'params' => $params, ]; ``` @@ -120,9 +108,6 @@ Application configuration in `config/web/app.php`. declare(strict_types=1); -use app\framework\event\ContactEventHandler; -use app\usecase\contact\ContactController; -use app\usecase\security\SecurityController; use app\usecase\site\SiteController; /** @phpstan-var string[] $components */ @@ -139,35 +124,30 @@ return [ 'id' => 'web.basic', 'aliases' => [ '@root' => $rootDir, - '@bower' => '@npm', '@npm' => '@root/node_modules', - '@public' => '@root/public', + '@bower' => '@npm', '@resource' => '@root/src/framework/resource', '@runtime' => '@root/runtime', - '@web' => '/', ], 'basePath' => $rootDir, - 'bootstrap' => [ - ContactEventHandler::class, - 'log', - ], + 'bootstrap' => ['log'], 'components' => $components, 'controllerMap' => [ - 'contact' => [ - 'class' => ContactController::class, - ], - 'security' => [ - 'class' => SecurityController::class, - ], - 'site' => [ - 'class' => SiteController::class, - ], + 'site' => ['class' => SiteController::class], ], 'language' => 'en-US', 'modules' => $modules, 'name' => 'Web application basic', 'params' => $params, ]; + +if (YII_ENV_DEV) { + // configuration adjustments for 'dev' environment + $config['bootstrap'][] = 'debug'; + $config['bootstrap'][] = 'gii'; +} + +return $config; ``` Components configuration in `config/web/components.php`. @@ -177,17 +157,14 @@ Components configuration in `config/web/components.php`. declare(strict_types=1); -use app\usecase\security\Identity; use yii\i18n\PhpMessageSource; -use yii\web\User; -use yii2\extensions\localeurls\UrlLanguageManager; /** @phpstan-var string[] $commonComponents */ $commonComponents = require dirname(__DIR__) . '/common/components.php'; $config = [ 'assetManager' => [ - 'basePath' => '@public/assets', + 'basePath' => '@root/web/assets', ], 'errorHandler' => [ 'errorAction' => 'site/404', @@ -196,8 +173,6 @@ $config = [ 'translations' => [ 'app.basic' => [ 'class' => PhpMessageSource::class, - 'basePath' => '@resource/message', - 'sourceLanguage' => 'en', ], ], ], @@ -206,29 +181,37 @@ $config = [ 'enableCsrfValidation' => YII_ENV_DEV === false, ], 'urlManager' => [ - 'class' => UrlLanguageManager::class, - 'languages' => [ - 'de' => 'de-DE', - 'en' => 'en-US', - 'es' => 'es-ES', - 'fr' => 'fr-FR', - 'pt' => 'pt-BR', - 'ru' => 'ru-RU', - 'zh' => 'zh-CN', - ], 'enablePrettyUrl' => true, 'showScriptName' => false, ], - 'user' => [ - 'class' => User::class, - 'identityClass' => Identity::class, - ], ]; $config += $commonComponents; return $config; +``` + +Modules configuration in `config/web/modules.php`. + +```php + [ + 'class' => yii\debug\Module::class, + // uncomment the following to add your IP if you aren't connecting from localhost. + //'allowedIPs' => ['127.0.0.1', '::1'], + ], + 'gii' => [ + 'class' => yii\gii\Module::class, + // uncomment the following to add your IP if you aren't connecting from localhost. + //'allowedIPs' => ['127.0.0.1', '::1'], + ], +]; +return YII_ENV_DEV ? $config : []; ``` ## Next steps diff --git a/docs/contact.png b/docs/contact.png deleted file mode 100644 index 167648f..0000000 Binary files a/docs/contact.png and /dev/null differ diff --git a/docs/home.png b/docs/home.png deleted file mode 100644 index ddc32e2..0000000 Binary files a/docs/home.png and /dev/null differ diff --git a/docs/images/404-dark.png b/docs/images/404-dark.png new file mode 100644 index 0000000..3cf66f4 Binary files /dev/null and b/docs/images/404-dark.png differ diff --git a/docs/images/404.png b/docs/images/404.png new file mode 100644 index 0000000..45ec140 Binary files /dev/null and b/docs/images/404.png differ diff --git a/docs/images/home-dark.png b/docs/images/home-dark.png new file mode 100644 index 0000000..4b32472 Binary files /dev/null and b/docs/images/home-dark.png differ diff --git a/docs/images/home.png b/docs/images/home.png new file mode 100644 index 0000000..f98b701 Binary files /dev/null and b/docs/images/home.png differ diff --git a/docs/installation.md b/docs/installation.md index e46f7cd..97b82d2 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -56,14 +56,14 @@ composer install Ensure the following directories are writable by the web server. ```bash -chmod 775 public/assets runtime tests/_output +chmod 775 web/assets runtime tests/_output ``` ### Web server configuration #### Apache -Create `public/.htaccess`. +Create `web/.htaccess`. ```apache RewriteEngine on @@ -80,7 +80,7 @@ Add to your Nginx configuration. server { listen 80; server_name myapp.local; - root /path/to/myapp/public; + root /path/to/myapp/web; index index.php; location / { @@ -106,7 +106,7 @@ For development purposes. ```bash # Method 1: Using PHP built-in server -php -S localhost:8080 -t public +php -S localhost:8080 -t web # Method 2: Using Yii console command ./yii serve diff --git a/package.json b/package.json index e2ece03..1a1da95 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "dependencies": { "bootstrap": "^5.3.2", "bootstrap-icons": "^1.10.5", - "flag-icons": "^7.5.0", "inputmask": "^5.0.8", "jquery": "~3.6.4", "jquery-pjax": "^2.0.1", diff --git a/src/framework/ApplicationParameters.php b/src/framework/ApplicationParameters.php index acf0c7f..eedc9ee 100644 --- a/src/framework/ApplicationParameters.php +++ b/src/framework/ApplicationParameters.php @@ -4,6 +4,8 @@ namespace app\framework; +use Yii; + /** * @phpstan-type MenuItem array< * array{ @@ -16,16 +18,6 @@ */ final class ApplicationParameters { - public static function getMailerSender(): string - { - return 'noreply@example.com'; - } - - public static function getMailerSenderName(): string - { - return 'Web application basic'; - } - /** * @phpstan-return MenuItem */ @@ -33,53 +25,8 @@ public static function getMenuIsGuest(): array { return [ [ - 'label' => 'Home', - 'url' => [ - '/site/index', - ], - 'order' => 0, - 'category' => 'app.basic', - ], - [ - 'label' => 'About', - 'url' => [ - '/site/about', - ], - 'order' => 1, - 'category' => 'app.basic', - ], - [ - 'label' => 'Contact', - 'url' => [ - '/contact/index', - ], - 'order' => 2, - 'category' => 'app.basic', - ], - [ - 'label' => 'Login', - 'url' => [ - '/security/login', - ], - 'order' => 3, - ], - ]; - } - - /** - * @phpstan-return MenuItem - */ - public static function getMenuIsLogged(): array - { - return [ - [ - 'label' => 'Logout', - 'url' => ['/security/logout'], - 'linkOptions' => [ - 'class' => 'nav-link', - 'data-method' => 'post', - ], - 'order' => 1, + 'label' => Yii::t('app.basic', 'Home'), + 'url' => ['/site/index'], ], ]; } diff --git a/src/framework/asset/AppAsset.php b/src/framework/asset/AppAsset.php index dc03f20..06b1319 100644 --- a/src/framework/asset/AppAsset.php +++ b/src/framework/asset/AppAsset.php @@ -4,10 +4,8 @@ namespace app\framework\asset; -use yii\bootstrap5\BootstrapAsset; -use yii\bootstrap5\BootstrapPluginAsset; -use yii\web\AssetBundle; -use yii\web\YiiAsset; +use yii\bootstrap5\{BootstrapAsset, BootstrapPluginAsset}; +use yii\web\{AssetBundle, YiiAsset}; final class AppAsset extends AssetBundle { diff --git a/src/framework/asset/LocaleAsset.php b/src/framework/asset/LocaleAsset.php deleted file mode 100644 index 31b1a89..0000000 --- a/src/framework/asset/LocaleAsset.php +++ /dev/null @@ -1,23 +0,0 @@ - [ - 'flag-icons.css', - 'flags/**/*', - ], - ]; - - public $sourcePath = '@npm/flag-icons/'; -} diff --git a/src/framework/event/ContactEventHandler.php b/src/framework/event/ContactEventHandler.php deleted file mode 100644 index c5f9843..0000000 --- a/src/framework/event/ContactEventHandler.php +++ /dev/null @@ -1,33 +0,0 @@ -session->setFlash('success', "{$title}
{$message}"); - }, - ); - } -} diff --git a/src/framework/resource/css/site.css b/src/framework/resource/css/site.css index fe627e9..4ae43d7 100644 --- a/src/framework/resource/css/site.css +++ b/src/framework/resource/css/site.css @@ -25,33 +25,3 @@ html, body { content: "/\00a0"; padding: 0 5px; } - -[data-bs-theme=light] .contact-title { - color: var(--bs-body-color); -} - -[data-bs-theme=dark] .contact-title { - color: var(--bs-light); -} - -[data-bs-theme=light] .contact-subtitle { - color: var(--bs-body-color); -} - -[data-bs-theme=dark] .contact-subtitle { - color: var(--bs-light); -} - -[data-bs-theme=dark] #contactform-verifycode-image { - border: 1px solid rgba(255, 255, 255, 0.1); - box-shadow: 0 1px 3px rgba(0,0,0,0.3); - filter: invert(1) hue-rotate(180deg); -} - -[data-bs-theme=dark] .login-info { - background-color: var(--bs-secondary-bg); -} - -[data-bs-theme=dark] .login-info-user { - color: var(--bs-white); -} diff --git a/src/framework/resource/layout/component/alert.php b/src/framework/resource/layout/component/alert.php deleted file mode 100644 index 2215455..0000000 --- a/src/framework/resource/layout/component/alert.php +++ /dev/null @@ -1,33 +0,0 @@ - 'alert-danger', - 'dark' => 'alert-dark', - 'info' => 'alert-info', - 'light' => 'alert-light', - 'primary' => 'alert-primary', - 'secondary' => 'alert-secondary', - 'success' => 'alert-success', - 'warning' => 'alert-warning', -]; - -$flashes = Yii::$app->session->getAllFlashes(); - -foreach ($flashes as $type => $message) { - if (isset($alertTypes[$type])) { - echo Alert::widget( - [ - 'body' => $message, - 'options' => [ - 'class' => $alertTypes[$type], - ], - ], - ); - - Yii::$app->session->removeFlash($type); - } -} diff --git a/src/framework/resource/layout/component/menu.php b/src/framework/resource/layout/component/menu.php index d9d49c7..2a0d12e 100644 --- a/src/framework/resource/layout/component/menu.php +++ b/src/framework/resource/layout/component/menu.php @@ -3,15 +3,9 @@ declare(strict_types=1); use app\framework\ApplicationParameters; -use yii\bootstrap5\Nav; -use yii\bootstrap5\NavBar; +use yii\bootstrap5\{Nav, NavBar}; use yii\helpers\Html; -$menuItems = match (Yii::$app->user->getIsGuest()) { - false => ApplicationParameters::getMenuIsLogged(), - default => ApplicationParameters::getMenuIsGuest(), -}; - NavBar::begin( [ 'brandLabel' => Html::img( @@ -31,7 +25,7 @@ echo Nav::widget( [ - 'items' => $menuItems, + 'items' => ApplicationParameters::getMenuIsGuest(), 'options' => [ 'class' => 'navbar-nav justify-content-end navbar-collapse', ], diff --git a/src/framework/resource/layout/component/toggle_language.php b/src/framework/resource/layout/component/toggle_language.php deleted file mode 100644 index b05fb45..0000000 --- a/src/framework/resource/layout/component/toggle_language.php +++ /dev/null @@ -1,70 +0,0 @@ -urlManager->languages; - -foreach ($locales as $key => $value) { - $classes = [ - 'dropdown-item', - 'd-flex', - 'align-items-center', - ]; - $icon = match ($key) { - 'en' => 'us', - 'zh' => 'cn', - default => $key, - }; - - if (Yii::$app->language === $value) { - $classes[] = 'active'; - } - - $items[] = Html::a( - ' ' . Yii::t('app.basic', "site.selector.language.{$key}"), - Url::current(['language' => $key]), - [ - 'class' => implode(' ', $classes), - ], - ); -} -?> -
- attributes(['height' => '24', 'width' => '24']) - ->class('w-3 h-3') - ->filePath(Yii::getAlias('@npm/bootstrap-icons/icons/globe.svg')) - ->render(), - [ - 'aria-expanded' => 'true', - 'aria-label' => 'Toggle language dropdown', - 'class' => 'btn btn-primary dropdown-toggle d-flex align-items-center text-white show', - 'data-bs-toggle' => 'dropdown', - 'title' => 'Select language', - 'type' => 'button', - ], - ) ?> - -
diff --git a/src/framework/resource/layout/footer.php b/src/framework/resource/layout/footer.php index 7f86619..62a9a04 100644 --- a/src/framework/resource/layout/footer.php +++ b/src/framework/resource/layout/footer.php @@ -35,7 +35,6 @@
render('component/footer-icons') ?> render('component/toggle_theme') ?> - render('component/toggle_language') ?>
diff --git a/src/framework/resource/layout/head.php b/src/framework/resource/layout/head.php index d56a3f2..948d183 100644 --- a/src/framework/resource/layout/head.php +++ b/src/framework/resource/layout/head.php @@ -2,10 +2,10 @@ declare(strict_types=1); -use yii\{helpers\Html, web\View}; +use yii\helpers\Html; /** - * @var View $this + * @var yii\web\View $this */ ?> diff --git a/src/framework/resource/layout/main.php b/src/framework/resource/layout/main.php index bdd0851..2682a38 100644 --- a/src/framework/resource/layout/main.php +++ b/src/framework/resource/layout/main.php @@ -3,11 +3,10 @@ declare(strict_types=1); use app\framework\asset\AppAsset; -use yii\web\View; /** * @var string $content - * @var View $this + * @var yii\web\View $this */ AppAsset::register($this); ?> @@ -20,7 +19,6 @@
render('component/menu') ?> - render('component/alert') ?> render('component/breadcrumbs') ?>
diff --git a/src/framework/resource/message/de/app.basic.php b/src/framework/resource/message/de/app.basic.php deleted file mode 100644 index 527ccbc..0000000 --- a/src/framework/resource/message/de/app.basic.php +++ /dev/null @@ -1,54 +0,0 @@ - 'Über uns', - 'Because the application is in development mode, the email is not sent but saved as a file under.' => 'Da die Anwendung im Entwicklungsmodus ist, wird die E-Mail nicht gesendet, sondern als Datei gespeichert unter.', - 'Body' => 'Nachrichtentext', - 'Captcha Code' => 'Captcha-Code', - 'Contact us' => 'Kontaktiere uns', - 'Contact' => 'Kontakt', - 'Email' => 'E-Mail', - 'Enter Body Here' => 'Hier Nachricht eingeben', - 'Enter Captcha Code Here' => 'Hier Captcha-Code eingeben', - 'Enter Email Here' => 'Hier E-Mail eingeben', - 'Enter Subject Here' => 'Hier Betreff eingeben', - 'Enter Username Here' => 'Hier Benutzername eingeben', - 'If you think this is a problem with us, please tell us.' => 'Wenn Sie denken, dass dies ein Problem bei uns ist, informieren Sie uns bitte.', - 'Index' => 'Startseite', - 'Name' => 'Name', - 'Note that if you turn on the Yii debugger, you should be able to view the mail message on the mail panel of the debugger.' => 'Beachten Sie, dass Sie, wenn Sie den Yii-Debugger aktivieren, die E-Mail-Nachricht im E-Mail-Panel des Debuggers anzeigen können.', - 'Oops! Looks like you followed a bad link.' => 'Hoppla! Sie sind einem fehlerhaften Link gefolgt.', - 'Please configure the useFileTransport property of the mail application component to be false to enable email sending.' => 'Bitte konfigurieren Sie die Eigenschaft useFileTransport des mail-Anwendungsbausteins als falsch, um das Versenden von E-Mails zu ermöglichen.', - 'Please fill out the following form to contact us.' => 'Bitte füllen Sie das folgende Formular aus, um uns zu kontaktieren.', - 'site.selector.language.de' => 'Deutsch', - 'site.selector.language.en' => 'Englisch', - 'site.selector.language.es' => 'Spanisch', - 'site.selector.language.fr' => 'Französisch', - 'site.selector.language.pt' => 'Portugiesisch', - 'site.selector.language.ru' => 'Russisch', - 'site.selector.language.zh' => 'Chinesisch', - 'Subject' => 'Betreff', - 'Thank you for contacting us. We will respond to you as soon as possible.' => 'Vielen Dank für Ihre Kontaktaufnahme. Wir werden uns so schnell wie möglich bei Ihnen melden.', - 'This is the About page. You may modify the following file to customize its content.' => 'Dies ist die Über-uns-Seite. Sie können die folgende Datei bearbeiten, um ihren Inhalt anzupassen.', - 'Username' => 'Benutzername', - 'Web Application' => 'Webanwendung', -]; diff --git a/src/framework/resource/message/en/app.basic.php b/src/framework/resource/message/en/app.basic.php deleted file mode 100644 index 3f8ba94..0000000 --- a/src/framework/resource/message/en/app.basic.php +++ /dev/null @@ -1,54 +0,0 @@ - '', - 'Because the application is in development mode, the email is not sent but saved as a file under.' => '', - 'Body' => '', - 'Captcha Code' => '', - 'Contact' => '', - 'Contact us' => '', - 'Email' => '', - 'Enter Body Here' => '', - 'Enter Captcha Code Here' => '', - 'Enter Email Here' => '', - 'Enter Subject Here' => '', - 'Enter Username Here' => '', - 'If you think this is a problem with us, please tell us.' => '', - 'Index' => '', - 'Name' => '', - 'Note that if you turn on the Yii debugger, you should be able to view the mail message on the mail panel of the debugger.' => '', - 'Oops! Looks like you followed a bad link.' => '', - 'Please configure the useFileTransport property of the mail application component to be false to enable email sending.' => '', - 'Please fill out the following form to contact us.' => '', - 'Subject' => '', - 'Thank you for contacting us. We will respond to you as soon as possible.' => '', - 'This is the About page. You may modify the following file to customize its content.' => '', - 'Web Application' => '', - 'Yii v.22' => '', - 'site.selector.language.de' => 'German', - 'site.selector.language.en' => 'English', - 'site.selector.language.es' => 'Spanish', - 'site.selector.language.fr' => 'French', - 'site.selector.language.pt' => 'Portuguese', - 'site.selector.language.ru' => 'Russian', - 'site.selector.language.zh' => 'Chinese', -]; diff --git a/src/framework/resource/message/es/app.basic.php b/src/framework/resource/message/es/app.basic.php deleted file mode 100644 index c03ab5d..0000000 --- a/src/framework/resource/message/es/app.basic.php +++ /dev/null @@ -1,55 +0,0 @@ - 'Acerca de', - 'Because the application is in development mode, the email is not sent but saved as a file under.' => 'Debido a que la aplicación está en modo de desarrollo, el correo electrónico no se envía, pero se guarda como un archivo en.', - 'Body' => 'Cuerpo', - 'Captcha Code' => 'Código Captcha', - 'Contact us' => 'Contáctanos', - 'Contact' => 'Contacto', - 'Email' => 'Correo Electrónico', - 'Enter Body Here' => 'Ingresa el Cuerpo Aquí', - 'Enter Captcha Code Here' => 'Ingresa el Código Captcha Aquí', - 'Enter Email Here' => 'Ingresa el Correo Electrónico Aquí', - 'Enter Subject Here' => 'Ingresa el Asunto Aquí', - 'Enter Username Here' => 'Ingresa el Nombre de Usuario Aquí', - 'If you think this is a problem with us, please tell us.' => 'Si crees que esto es un problema con nosotros, por favor cuéntanos.', - 'Index' => 'Índice', - 'Name' => 'Nombre', - 'Note that if you turn on the Yii debugger, you should be able to view the mail message on the mail panel of the debugger.' => 'Ten en cuenta que si habilitas el depurador de Yii, deberías poder ver el mensaje de correo en el panel de correo del depurador.', - 'Oops! Looks like you followed a bad link.' => '¡Ups! Parece que has seguido un enlace incorrecto.', - 'Please configure the useFileTransport property of the mail application component to be false to enable email sending.' => '', - 'Please configure the useFileTransport property of the mail application component to be false to enable email sending.' => '@@Por favor configura la propiedad useFileTransport del componente de aplicación mail en falso para habilitar el envío de correos electrónicos.@@', - 'Please fill out the following form to contact us.' => 'Por favor completa el siguiente formulario para contactarnos.', - 'site.selector.language.de' => 'Alemán', - 'site.selector.language.en' => 'Inglés', - 'site.selector.language.es' => 'Español', - 'site.selector.language.fr' => 'Francés', - 'site.selector.language.pt' => 'Portugués', - 'site.selector.language.ru' => 'Ruso', - 'site.selector.language.zh' => 'Chino', - 'Subject' => 'Asunto', - 'Thank you for contacting us. We will respond to you as soon as possible.' => 'Gracias por contactarnos. Te responderemos lo antes posible.', - 'This is the About page. You may modify the following file to customize its content.' => 'Esta es la página de Acerca de. Puedes modificar el siguiente archivo para personalizar su contenido.', - 'Username' => 'Nombre de Usuario', - 'Web Application' => 'Aplicación web', -]; diff --git a/src/framework/resource/message/fr/app.basic.php b/src/framework/resource/message/fr/app.basic.php deleted file mode 100644 index 96c9f24..0000000 --- a/src/framework/resource/message/fr/app.basic.php +++ /dev/null @@ -1,54 +0,0 @@ - 'À propos', - 'Because the application is in development mode, the email is not sent but saved as a file under.' => 'Parce que l\'application est en mode de développement, l\'e-mail n\'est pas envoyé mais est enregistré en tant que fichier sous.', - 'Body' => 'Corps', - 'Captcha Code' => 'Code Captcha', - 'Contact us' => 'Contactez-nous', - 'Contact' => 'Contact', - 'Email' => 'E-mail', - 'Enter Body Here' => 'Entrez le corps ici', - 'Enter Captcha Code Here' => 'Entrez le code Captcha ici', - 'Enter Email Here' => 'Entrez l\'e-mail ici', - 'Enter Subject Here' => 'Entrez le sujet ici', - 'Enter Username Here' => 'Entrez le nom d\'utilisateur ici', - 'If you think this is a problem with us, please tell us.' => 'Si vous pensez que c\'est un problème avec nous, veuillez nous le dire.', - 'Index' => 'Index', - 'Name' => 'Nom', - 'Note that if you turn on the Yii debugger, you should be able to view the mail message on the mail panel of the debugger.' => 'Notez que si vous activez le débogueur Yii, vous devriez pouvoir voir le message de courrier dans le panneau de courrier du débogueur.', - 'Oops! Looks like you followed a bad link.' => 'Oups ! On dirait que vous avez suivi un mauvais lien.', - 'Please configure the useFileTransport property of the mail application component to be false to enable email sending.' => 'Veuillez configurer la propriété useFileTransport du composant d\'application mail en faux pour activer l\'envoi d\'e-mails.', - 'Please fill out the following form to contact us.' => 'Veuillez remplir le formulaire suivant pour nous contacter.', - 'site.selector.language.de' => 'Allemand', - 'site.selector.language.en' => 'Anglais', - 'site.selector.language.es' => 'Espagnol', - 'site.selector.language.fr' => 'Français', - 'site.selector.language.pt' => 'Portugais', - 'site.selector.language.ru' => 'Russe', - 'site.selector.language.zh' => 'Chinois', - 'Subject' => 'Sujet', - 'Thank you for contacting us. We will respond to you as soon as possible.' => 'Merci de nous avoir contactés. Nous vous répondrons dès que possible.', - 'This is the About page. You may modify the following file to customize its content.' => 'Il s\'agit de la page À propos. Vous pouvez modifier le fichier suivant pour personnaliser son contenu.', - 'Username' => 'Nom d\'utilisateur', - 'Web Application' => 'Application Web', -]; diff --git a/src/framework/resource/message/pt/app.basic.php b/src/framework/resource/message/pt/app.basic.php deleted file mode 100644 index 0fe5067..0000000 --- a/src/framework/resource/message/pt/app.basic.php +++ /dev/null @@ -1,54 +0,0 @@ - 'Sobre', - 'Because the application is in development mode, the email is not sent but saved as a file under.' => 'Como a aplicação está em modo de desenvolvimento, o email não é enviado, mas é salvo como um arquivo em.', - 'Body' => 'Corpo', - 'Captcha Code' => 'Código Captcha', - 'Contact us' => 'Contate-nos', - 'Contact' => 'Contato', - 'Email' => 'Email', - 'Enter Body Here' => 'Digite o corpo aqui', - 'Enter Captcha Code Here' => 'Digite o código Captcha aqui', - 'Enter Email Here' => 'Digite o email aqui', - 'Enter Subject Here' => 'Digite o assunto aqui', - 'Enter Username Here' => 'Digite o nome de usuário aqui', - 'If you think this is a problem with us, please tell us.' => 'Se você acha que isso é um problema conosco, por favor, nos avise.', - 'Index' => 'Índice', - 'Name' => 'Nome', - 'Note that if you turn on the Yii debugger, you should be able to view the mail message on the mail panel of the debugger.' => 'Observe que se você ativar o depurador Yii, deverá ser capaz de ver a mensagem de email no painel de email do depurador.', - 'Oops! Looks like you followed a bad link.' => 'Ops! Parece que você seguiu um link errado.', - 'Please configure the useFileTransport property of the mail application component to be false to enable email sending.' => 'Por favor, configure a propriedade useFileTransport do componente de aplicação mail para falso para habilitar o envio de emails.', - 'Please fill out the following form to contact us.' => 'Por favor, preencha o seguinte formulário para entrar em contato conosco.', - 'site.selector.language.de' => 'Alemão', - 'site.selector.language.en' => 'Inglês', - 'site.selector.language.es' => 'Espanhol', - 'site.selector.language.fr' => 'Francês', - 'site.selector.language.pt' => 'Português', - 'site.selector.language.ru' => 'Russo', - 'site.selector.language.zh' => 'Chinês', - 'Subject' => 'Assunto', - 'Thank you for contacting us. We will respond to you as soon as possible.' => 'Obrigado por entrar em contato conosco. Vamos responder o mais rápido possível.', - 'This is the About page. You may modify the following file to customize its content.' => 'Esta é a página Sobre. Você pode modificar o arquivo a seguir para personalizar seu conteúdo.', - 'Username' => 'Nome de usuário', - 'Web Application' => 'Aplicação Web', -]; diff --git a/src/framework/resource/message/ru/app.basic.php b/src/framework/resource/message/ru/app.basic.php deleted file mode 100644 index df815ed..0000000 --- a/src/framework/resource/message/ru/app.basic.php +++ /dev/null @@ -1,54 +0,0 @@ - 'О нас', - 'Because the application is in development mode, the email is not sent but saved as a file under.' => 'Поскольку приложение находится в режиме разработки, электронное письмо не отправляется, а сохраняется как файл под именем.', - 'Body' => 'Сообщение', - 'Captcha Code' => 'Код Captcha', - 'Contact us' => 'Свяжитесь с нами', - 'Contact' => 'Контакт', - 'Email' => 'Электронная почта', - 'Enter Body Here' => 'Введите текст сообщения здесь', - 'Enter Captcha Code Here' => 'Введите код Captcha здесь', - 'Enter Email Here' => 'Введите адрес электронной почты здесь', - 'Enter Subject Here' => 'Введите тему здесь', - 'Enter Username Here' => 'Введите имя пользователя здесь', - 'If you think this is a problem with us, please tell us.' => 'Если вы считаете, что это проблема с нами, пожалуйста, сообщите нам.', - 'Index' => 'Главная', - 'Name' => 'Имя', - 'Note that if you turn on the Yii debugger, you should be able to view the mail message on the mail panel of the debugger.' => 'Обратите внимание, что если вы включите отладчик Yii, вы сможете просматривать почтовое сообщение на панели почты отладчика.', - 'Oops! Looks like you followed a bad link.' => 'Упс! Похоже, вы перешли по неверной ссылке.', - 'Please configure the useFileTransport property of the mail application component to be false to enable email sending.' => 'Пожалуйста, настройте свойство useFileTransport компонента приложения mail на значение false, чтобы включить отправку электронной почты.', - 'Please fill out the following form to contact us.' => 'Пожалуйста, заполните следующую форму, чтобы связаться с нами.', - 'site.selector.language.de' => 'Немецкий', - 'site.selector.language.en' => 'Английский', - 'site.selector.language.es' => 'Испанский', - 'site.selector.language.fr' => 'Французский', - 'site.selector.language.pt' => 'Португальский', - 'site.selector.language.ru' => 'Русский', - 'site.selector.language.zh' => 'Китайский', - 'Subject' => 'Тема', - 'Thank you for contacting us. We will respond to you as soon as possible.' => 'Спасибо, что связались с нами. Мы ответим вам как можно скорее.', - 'This is the About page. You may modify the following file to customize its content.' => 'Это страница "О нас". Вы можете изменить следующий файл, чтобы настроить ее содержание.', - 'Username' => 'Имя пользователя', - 'Web Application' => 'Веб-приложение', -]; diff --git a/src/framework/resource/message/zh/app.basic.php b/src/framework/resource/message/zh/app.basic.php deleted file mode 100644 index 2902704..0000000 --- a/src/framework/resource/message/zh/app.basic.php +++ /dev/null @@ -1,54 +0,0 @@ - '关于', - 'Because the application is in development mode, the email is not sent but saved as a file under.' => '因为应用程序处于开发模式,电子邮件不会被发送,而会保存为文件。', - 'Body' => '正文', - 'Captcha Code' => '验证码', - 'Contact us' => '联系我们', - 'Contact' => '联系', - 'Email' => '电子邮件', - 'Enter Body Here' => '在此输入正文', - 'Enter Captcha Code Here' => '在此输入验证码', - 'Enter Email Here' => '在此输入电子邮件', - 'Enter Subject Here' => '在此输入主题', - 'Enter Username Here' => '在此输入用户名', - 'If you think this is a problem with us, please tell us.' => '如果您认为这是我们的问题,请告诉我们。', - 'Index' => '主页', - 'Name' => '姓名', - 'Note that if you turn on the Yii debugger, you should be able to view the mail message on the mail panel of the debugger.' => '请注意,如果您启用Yii调试器,您应该能够在调试器的邮件面板上查看邮件消息。', - 'Oops! Looks like you followed a bad link.' => '糟糕!看起来您跟随了一个错误的链接。', - 'Please configure the useFileTransport property of the mail application component to be false to enable email sending.' => '请配置mail 应用程序组件的useFileTransport 属性为false,以启用电子邮件发送。', - 'Please fill out the following form to contact us.' => '请填写以下表单以与我们联系。', - 'site.selector.language.de' => '德国的', - 'site.selector.language.en' => '英语', - 'site.selector.language.es' => '西班牙语', - 'site.selector.language.fr' => '法语', - 'site.selector.language.pt' => '葡萄牙语', - 'site.selector.language.ru' => '俄语', - 'site.selector.language.zh' => '中文', - 'Subject' => '主题', - 'Thank you for contacting us. We will respond to you as soon as possible.' => '感谢您联系我们。我们将尽快回复您。', - 'This is the About page. You may modify the following file to customize its content.' => '这是关于页面。您可以修改以下文件来自定义其内容。', - 'Username' => '用户名', - 'Web Application' => 'Web应用程序', -]; diff --git a/src/usecase/contact/ContactController.php b/src/usecase/contact/ContactController.php deleted file mode 100644 index 2990f0f..0000000 --- a/src/usecase/contact/ContactController.php +++ /dev/null @@ -1,53 +0,0 @@ - [ - 'class' => IndexAction::class, - ], - 'captcha' => [ - 'class' => CaptchaAction::class, - 'fixedVerifyCode' => (YII_ENV === 'tests') ? 'testme' : null, - 'transparent' => true, - ], - ], - parent::actions(), - ); - } - - public function getMailer(): MailerInterface - { - return $this->module->get('mailer'); - } - - public function getViewPath(): string - { - return __DIR__ . '/view'; - } - - public function sendEmail(ContactForm $form): bool - { - return $this->getMailer() - ->compose() - ->setTo($form->email) - ->setFrom([ApplicationParameters::getMailerSender() => ApplicationParameters::getMailerSenderName()]) - ->setReplyTo([$form->email => $form->name]) - ->setSubject($form->subject) - ->setTextBody($form->body) - ->send(); - } -} diff --git a/src/usecase/contact/ContactEvent.php b/src/usecase/contact/ContactEvent.php deleted file mode 100644 index aa97463..0000000 --- a/src/usecase/contact/ContactEvent.php +++ /dev/null @@ -1,12 +0,0 @@ - Yii::t('app.basic', 'Name'), - 'email' => Yii::t('app.basic', 'Email'), - 'subject' => Yii::t('app.basic', 'Subject'), - 'body' => Yii::t('app.basic', 'Body'), - 'verifyCode' => Yii::t('app.basic', 'Captcha Code'), - ]; - } - - public function rules(): array - { - return [ - // name, email, subject and body are required - [['name', 'email', 'subject', 'body'], 'required'], - // email has to be a valid email address - ['email', 'email'], - // verifyCode needs to be entered correctly - ['verifyCode', CaptchaValidator::class, 'captchaAction' => '/contact/captcha', 'message' => ''], - ]; - } -} diff --git a/src/usecase/contact/IndexAction.php b/src/usecase/contact/IndexAction.php deleted file mode 100644 index dcf0ce2..0000000 --- a/src/usecase/contact/IndexAction.php +++ /dev/null @@ -1,27 +0,0 @@ - - */ -final class IndexAction extends Action -{ - public function run(): string - { - $form = new ContactForm(); - $post = $this->controller->request->post(); - - if (is_array($post) && $form->load($post) && $form->validate()) { - if ($this->controller->sendEmail($form)) { - $this->trigger(ContactEvent::EVENT_AFTER_SEND, new ContactEvent()); - } - } - - return $this->controller->render('index', ['model' => $form]); - } -} diff --git a/src/usecase/contact/view/index.php b/src/usecase/contact/view/index.php deleted file mode 100644 index 7651f52..0000000 --- a/src/usecase/contact/view/index.php +++ /dev/null @@ -1,219 +0,0 @@ -title = Yii::t('app.basic', 'Contact'); -$this->params['breadcrumbs'] = [$this->title]; -$tabInput = 1; -?> - -
-
-
-

- title) ?> -

-

- -

-
-
-
- -
-
-
-
- 'contact-form', - 'layout' => ActiveForm::LAYOUT_FLOATING, - 'options' => ['class' => 'needs-validation', 'novalidate' => true], - ], - ) ?> - - -
-
- field($model, 'name')->textInput( - [ - 'autofocus' => true, - 'class' => 'form-control form-control-lg', - 'placeholder' => Yii::t( - 'app.basic', - 'Your full name', - ), - 'required' => true, - 'tabindex' => $tabInput++, - ], - ) ?> -
-
- field($model, 'email')->textInput( - [ - 'class' => 'form-control form-control-lg', - 'placeholder' => Yii::t( - 'app.basic', - 'your.email@example.com', - ), - 'required' => true, - 'tabindex' => $tabInput++, - ], - ) ?> -
-
- - -
- field($model, 'subject')->textInput( - [ - 'class' => 'form-control form-control-lg', - 'placeholder' => Yii::t('app.basic', 'What is this about?'), - 'required' => true, - 'tabindex' => $tabInput++, - ], - ) ?> -
- - -
- field($model, 'body')->textarea( - [ - 'class' => 'form-control', - 'rows' => 6, - 'placeholder' => Yii::t( - 'app.basic', - 'Tell us more about your inquiry...', - ), - 'required' => true, - 'style' => 'resize: vertical; min-height: 150px;', - 'tabindex' => $tabInput++, - ], - ) ?> -
- - -
-
-
Security Verification
-
-
-
- field( - $model, - 'verifyCode', - [ - 'template' => '{input}{error}', - 'options' => [ - 'class' => 'mb-2', - ], - ], - )->widget( - Captcha::class, - [ - 'captchaAction' => 'contact/captcha', - 'template' => '
Captcha Code:{image}
{input}', - 'options' => [ - 'class' => 'form-control form-control-lg text-center', - 'placeholder' => Yii::t( - 'app.basic', - 'Enter the code above', - ), - 'required' => true, - 'tabindex' => $tabInput++, - ], - ], - ) ?> -
-
-
- - -
- 'btn btn-primary btn-lg py fw-semibold rounded-3', - 'name' => 'contact-button', - 'tabindex' => $tabInput++, - ], - ) ?> -
- - -
-
-
- - -
-
-
-
-

Get in Touch

- -
-
-
- -
-
-
-
Address
-

123 Main Street
City, State 12345

-
-
- -
-
-
- -
-
-
-
Phone
-

+1 (555) 123-4567

-
-
- -
-
-
- -
-
-
-
Email
-

contact@example.com

-
-
-
-
Business Hours
-
    -
  • - Monday - Friday - 9:00 AM to 6:00 PM -
  • -
  • - Saturday - 10:00 AM to 4:00 PM -
  • -
  • - Sunday - Closed -
  • -
-
-
-
-
-
-
diff --git a/src/usecase/security/Identity.php b/src/usecase/security/Identity.php deleted file mode 100644 index 3f1e8f0..0000000 --- a/src/usecase/security/Identity.php +++ /dev/null @@ -1,91 +0,0 @@ - - */ - private static array $users = [ - '100' => [ - 'id' => '100', - 'username' => 'admin', - 'password' => 'admin', - 'authKey' => 'test100key', - 'accessToken' => '100-token', - ], - '101' => [ - 'id' => '101', - 'username' => 'demo', - 'password' => 'demo', - 'authKey' => 'test101key', - 'accessToken' => '101-token', - ], - ]; - - public static function findByUsername(string $username): IdentityInterface|null - { - foreach (self::$users as $user) { - if (strcasecmp($user['username'], $username) === 0) { - return new self($user); - } - } - - return null; - } - - public static function findIdentity($id): IdentityInterface|null - { - return isset(self::$users[$id]) ? new self(self::$users[$id]) : null; - } - - public static function findIdentityByAccessToken($token, $type = null): IdentityInterface|null - { - foreach (self::$users as $user) { - if ($user['accessToken'] === $token) { - return new self($user); - } - } - - return null; - } - - public function getAuthKey(): string - { - return $this->authKey; - } - - public function getId(): string - { - return $this->id; - } - - public function validateAuthKey($authKey): bool - { - return $this->authKey === $authKey; - } - - public function validatePassword(string $password): bool - { - return $this->password === $password; - } -} diff --git a/src/usecase/security/LoginAction.php b/src/usecase/security/LoginAction.php deleted file mode 100644 index 4fee2b9..0000000 --- a/src/usecase/security/LoginAction.php +++ /dev/null @@ -1,41 +0,0 @@ - - */ -final class LoginAction extends Action -{ - public function run(): string|Response - { - if ($this->controller->getUser()->isGuest === false) { - return $this->controller->goHome(); - } - - $form = new LoginForm(); - $post = $this->controller->request->post(); - - if (is_array($post) && $form->load($post) && $this->login($form)) { - return $this->controller->goBack(); - } - - return $this->controller->render('login', ['model' => $form]); - } - - private function login(LoginForm $form): bool - { - $identity = $form->getIdentity(); - - if ($identity instanceof Identity && $form->validate()) { - return $this->controller->getUser()->login($identity, $form->rememberMe ? 3600 * 24 * 30 : 0); - } - - return false; - } -} diff --git a/src/usecase/security/LoginForm.php b/src/usecase/security/LoginForm.php deleted file mode 100644 index 134c827..0000000 --- a/src/usecase/security/LoginForm.php +++ /dev/null @@ -1,73 +0,0 @@ -_identity === false) { - $this->_identity = Identity::findByUsername($this->username); - } - - return $this->_identity; - } - - /** - * @phpstan-return array> - */ - public function rules(): array - { - return [ - // username and password are both required - [['username', 'password'], 'required'], - // rememberMe must be a boolean value - ['rememberMe', 'boolean'], - // password is validated by validatePassword() - ['password', 'validatePassword'], - ]; - } - - /** - * Validates the password. - * - * This method serves as the inline validation for password. - * - * @param string $attribute the attribute currently being validated - * - * @param array $params the additional name-value pairs given in the rule - * - * @phpstan-param array $params - */ - public function validatePassword($attribute, $params): void - { - if ($this->hasErrors() === false) { - $identity = $this->getIdentity(); - - if ($identity instanceof Identity && $identity->validatePassword($this->password) === false) { - $this->addError($attribute, 'Incorrect username or password.'); - } - } - } -} diff --git a/src/usecase/security/LogoutAction.php b/src/usecase/security/LogoutAction.php deleted file mode 100644 index 5067fc8..0000000 --- a/src/usecase/security/LogoutAction.php +++ /dev/null @@ -1,21 +0,0 @@ - - */ -final class LogoutAction extends Action -{ - public function run(): Response - { - $this->controller->getUser()->logout(); - - return $this->controller->goHome(); - } -} diff --git a/src/usecase/security/SecurityController.php b/src/usecase/security/SecurityController.php deleted file mode 100644 index 05c31a7..0000000 --- a/src/usecase/security/SecurityController.php +++ /dev/null @@ -1,40 +0,0 @@ - [ - 'class' => LogoutAction::class, - ], - 'login' => [ - 'class' => LoginAction::class, - ], - ], - parent::actions(), - ); - } - - /** - * @phpstan-return User - */ - public function getUser(): User - { - return $this->module->get('user'); - } - - public function getViewPath(): string - { - return __DIR__ . '/view'; - } -} diff --git a/src/usecase/security/view/login.php b/src/usecase/security/view/login.php deleted file mode 100644 index 994a205..0000000 --- a/src/usecase/security/view/login.php +++ /dev/null @@ -1,121 +0,0 @@ -title = 'Login'; -$this->params['breadcrumbs'] = [$this->title]; -$tabInput = 1; -?> - -
-
-
-

- title) ?> -

- -
-
-
-
-
-
-
- 'login-form', - 'layout' => ActiveForm::LAYOUT_FLOATING, - 'options' => ['class' => 'needs-validation', 'novalidate' => true], - ], - ) ?> - - -
- field($model, 'username')->textInput( - [ - 'autofocus' => true, - 'class' => 'form-control form-control-lg', - 'placeholder' => Yii::t('app.basic', 'Enter your username'), - 'required' => true, - 'tabindex' => $tabInput++, - ], - ) ?> -
- - -
- field($model, 'password')->passwordInput( - [ - 'class' => 'form-control form-control-lg', - 'placeholder' => Yii::t('app.basic', 'Enter your password'), - 'required' => true, - 'tabindex' => $tabInput++, - ], - ) ?> -
- - -
-
- field($model, 'rememberMe')->checkbox( - [ - 'labelOptions' => [ - 'class' => 'form-check-label fw-medium text-body', - ], - 'options' => [ - 'class' => 'form-check-input', - ], - ], - ) ?> -
-
- - -
- 'btn btn-primary btn-lg py-3 fw-semibold rounded-3', - 'name' => 'login-button', - ], - ) ?> -
- - - - -
-
Demo Credentials
-
-
- -
-
- -
-
-
- To modify credentials, check -
-
-
-
-
-
-
diff --git a/src/usecase/site/AboutAction.php b/src/usecase/site/AboutAction.php deleted file mode 100644 index 44505bb..0000000 --- a/src/usecase/site/AboutAction.php +++ /dev/null @@ -1,18 +0,0 @@ - - */ -final class AboutAction extends Action -{ - public function run(): string - { - return $this->controller->render('about'); - } -} diff --git a/src/usecase/site/SiteController.php b/src/usecase/site/SiteController.php index 806911c..f63c45d 100644 --- a/src/usecase/site/SiteController.php +++ b/src/usecase/site/SiteController.php @@ -19,12 +19,7 @@ public function actions(): array { return ArrayHelper::merge( [ - '404' => [ - 'class' => ErrorAction::class, - ], - 'about' => [ - 'class' => AboutAction::class, - ], + '404' => ['class' => ErrorAction::class], ], parent::actions(), ); diff --git a/src/usecase/site/view/404.php b/src/usecase/site/view/404.php index 5d379c3..37025db 100644 --- a/src/usecase/site/view/404.php +++ b/src/usecase/site/view/404.php @@ -9,7 +9,7 @@ * @var string $name * @var View $this */ -$this->title = $name; +$this->title = Yii::t('app.basic', $name); ?>
diff --git a/src/usecase/site/view/about.php b/src/usecase/site/view/about.php deleted file mode 100644 index 2ba2595..0000000 --- a/src/usecase/site/view/about.php +++ /dev/null @@ -1,15 +0,0 @@ -title = Yii::t('app.basic', 'About'); -$this->params['breadcrumbs'] = [$this->title]; -?> -
-

title) ?>

-

- -
diff --git a/src/usecase/site/view/index.php b/src/usecase/site/view/index.php index b955590..237e7df 100644 --- a/src/usecase/site/view/index.php +++ b/src/usecase/site/view/index.php @@ -6,7 +6,7 @@ use yii\web\View; /** @var View $this */ -$this->title = Yii::t('app.basic', 'Index'); +$this->title = Yii::t('app.basic', 'Home'); ?>

diff --git a/tests/Acceptance/AboutCest.php b/tests/Acceptance/AboutCest.php deleted file mode 100644 index 353da36..0000000 --- a/tests/Acceptance/AboutCest.php +++ /dev/null @@ -1,22 +0,0 @@ -amGoingTo('navigate to the About page.'); - $I->amOnPage('site/about'); - - $I->wantTo('ensure that About page works.'); - - $I->expectTo('see page index.'); - $I->see('About'); - $I->see('This is the About page.'); - } -} diff --git a/tests/Acceptance/ContactCest.php b/tests/Acceptance/ContactCest.php deleted file mode 100644 index 617693a..0000000 --- a/tests/Acceptance/ContactCest.php +++ /dev/null @@ -1,22 +0,0 @@ -amGoingTo('navigate to the Contact page.'); - $I->amOnPage('contact/index'); - - $I->wantTo('ensure that Contact page works.'); - - $I->expectTo('see page index.'); - $I->see('Contact'); - $I->see('Please fill out the following form to contact us.'); - } -} diff --git a/tests/Acceptance/SiteCest.php b/tests/Acceptance/SiteCest.php index 95bf6ff..d975c4e 100644 --- a/tests/Acceptance/SiteCest.php +++ b/tests/Acceptance/SiteCest.php @@ -17,6 +17,5 @@ public function homePage(AcceptanceTester $I): void $I->expectTo('see page index.'); $I->see('Web Application'); - $I->see('English'); } } diff --git a/tests/Functional/ContactCest.php b/tests/Functional/ContactCest.php deleted file mode 100644 index 02e92df..0000000 --- a/tests/Functional/ContactCest.php +++ /dev/null @@ -1,63 +0,0 @@ -amGoingTo('navigate to the Contact page.'); - $I->amOnRoute('contact/index'); - } - - public function contactFormSubmitFormEmailWrongData(FunctionalTester $I): void - { - $I->amGoingTo('contact form submit form with email wrong.'); - $I->submitForm('#contact-form', [ - 'ContactForm[name]' => 'tester', - 'ContactForm[email]' => 'tester.email', - 'ContactForm[subject]' => 'test subject', - 'ContactForm[body]' => 'test content', - 'ContactForm[verifyCode]' => 'testme', - ]); - - $I->expectTo('Email is not a valid email address'); - $I->dontSee('Name cannot be blank'); - $I->see('Email is not a valid email address.'); - $I->dontSee('Subject cannot be blank'); - $I->dontSee('Body cannot be blank'); - $I->dontSee('The verification code is incorrect'); - } - - public function contactFormSubmitFormEmptyData(FunctionalTester $I): void - { - $I->amGoingTo('contact form submit form with empty data.'); - $I->submitForm('#contact-form', []); - - $I->expectTo('see validations errors.'); - $I->see('Name cannot be blank.'); - $I->see('Email cannot be blank.'); - $I->see('Subject cannot be blank.'); - $I->see('Body cannot be blank.'); - } - - public function contactFormSubmitFormSuccessData(FunctionalTester $I): void - { - $I->amGoingTo('contact form submit form with success data.'); - $I->submitForm('#contact-form', [ - 'ContactForm[name]' => 'tester', - 'ContactForm[email]' => 'tester@example.com', - 'ContactForm[subject]' => 'test subject', - 'ContactForm[body]' => 'test content', - 'ContactForm[verifyCode]' => 'testme', - ]); - - $I->expectTo('success.'); - $I->see('Message sent successfully!.'); - $I->see('Thank you for contacting us. We will respond to you as soon as possible.'); - } -} diff --git a/tests/Functional/SiteCest.php b/tests/Functional/SiteCest.php index 39dc2d8..b4e0689 100644 --- a/tests/Functional/SiteCest.php +++ b/tests/Functional/SiteCest.php @@ -17,9 +17,8 @@ public function homePage(FunctionalTester $I): void $I->seeResponseCodeIs(200); $I->expectTo('see page index.'); - $I->seeInTitle('Index'); + $I->seeInTitle('Home'); $I->seeElement('body'); $I->see('Web Application', 'h1'); - $I->see('English'); } } diff --git a/tests/Unit/ContactControllerTest.php b/tests/Unit/ContactControllerTest.php deleted file mode 100644 index 89670c5..0000000 --- a/tests/Unit/ContactControllerTest.php +++ /dev/null @@ -1,54 +0,0 @@ -attributes = [ - 'name' => 'Tester', - 'email' => 'tester@example.com', - 'subject' => 'very important letter subject', - 'body' => 'body of current message', - 'verifyCode' => 'testme', - ]; - - verify($controller->sendEmail($form))->notEmpty(); - - self::assertNotNull($this->tester, 'Yii2 module is not initialized'); - - $this->tester->seeEmailIsSent(); - $emailMessage = $this->tester->grabLastSentEmail(); - - assert( - $emailMessage instanceof MessageInterface, - 'Last sent email should be an instance of \'MessageInterface\'', - ); - - verify($emailMessage->getTo())->arrayHasKey('tester@example.com'); - verify($emailMessage->getFrom())->arrayHasKey('noreply@example.com'); - verify($emailMessage->getReplyTo())->arrayHasKey('tester@example.com'); - verify($emailMessage->getSubject())->equals('very important letter subject'); - verify($emailMessage->toString())->stringContainsString('body of current message'); - } -} diff --git a/tests/Unit/IdentityTest.php b/tests/Unit/IdentityTest.php deleted file mode 100644 index 6be84c5..0000000 --- a/tests/Unit/IdentityTest.php +++ /dev/null @@ -1,95 +0,0 @@ -getId(), "User ID for access token '100-token' should be '100'."); - self::assertSame('admin', $user->username, "Username property should be 'admin'."); - } - - public function testFindByAccessTokenReturnsNullForInvalidToken(): void - { - self::assertNull( - Identity::findIdentityByAccessToken('invalid-token'), - "Expected 'null' when finding a user by an invalid access token.", - ); - } - - public function testFindByUsernameReturnsIdentity(): void - { - $user = Identity::findByUsername('admin'); - - self::assertInstanceOf(Identity::class, $user, "Expected an instance of 'Identity' for username 'admin'."); - self::assertSame('100', $user->getId(), "User ID for 'admin' should be '100'."); - self::assertSame('admin', $user->username, "Username property should be 'admin'."); - } - - public function testFindByUsernameReturnsNullForNonexistentUser(): void - { - self::assertNull( - Identity::findByUsername('nonexistent'), - "Expected 'null' when finding a user by a 'nonexistent' username.", - ); - } - - public function testValidateAuthKeyReturnsTrueForCorrectAuthKey(): void - { - $user = Identity::findByUsername('admin'); - - self::assertInstanceOf( - Identity::class, - $user, - "Expected an instance of 'Identity' for username 'admin'.", - ); - self::assertTrue( - $user->validateAuthKey('test100key'), - 'Expected auth key validation to return `true` for correct auth key.', - ); - } - - public function testValidatePasswordReturnsTrueForCorrectPassword(): void - { - $user = Identity::findByUsername('admin'); - - self::assertInstanceOf( - Identity::class, - $user, - "Expected an instance of 'Identity' for username 'admin'.", - ); - self::assertTrue( - $user->validatePassword('admin'), - 'Expected password validation to return `true` for correct password.', - ); - } -} diff --git a/tests/Unit/MenuTest.php b/tests/Unit/MenuTest.php deleted file mode 100644 index 9f5a0f2..0000000 --- a/tests/Unit/MenuTest.php +++ /dev/null @@ -1,53 +0,0 @@ -user->login($identity); - - self::assertStringContainsString( - 'Logout', - $view->render('@resource/layout/component/menu.php'), - 'Failed asserting that the logout link is rendered for a logged-in user.', - ); - } -} diff --git a/tests/_envs/php-builtin.yml b/tests/_envs/php-builtin.yml index 929ab08..ce9c804 100644 --- a/tests/_envs/php-builtin.yml +++ b/tests/_envs/php-builtin.yml @@ -1,7 +1,7 @@ extensions: enabled: - Codeception\Extension\RunProcess: - 0: php -d variables_order=EGPCS -S localhost:8085 -t public + 0: php -d variables_order=EGPCS -S localhost:8085 -t web sleep: 1 modules: config: diff --git a/public/.htaccess b/web/.htaccess similarity index 100% rename from public/.htaccess rename to web/.htaccess diff --git a/public/assets/.gitignore b/web/assets/.gitignore similarity index 100% rename from public/assets/.gitignore rename to web/assets/.gitignore diff --git a/public/favicon.ico b/web/favicon.ico similarity index 100% rename from public/favicon.ico rename to web/favicon.ico diff --git a/public/image/yii.svg b/web/image/yii.svg similarity index 100% rename from public/image/yii.svg rename to web/image/yii.svg diff --git a/public/image/yiiframework.svg b/web/image/yiiframework.svg similarity index 100% rename from public/image/yiiframework.svg rename to web/image/yiiframework.svg diff --git a/public/index.php b/web/index.php similarity index 64% rename from public/index.php rename to web/index.php index e8074db..7d8b560 100644 --- a/public/index.php +++ b/web/index.php @@ -2,13 +2,17 @@ declare(strict_types=1); -require_once __DIR__ . '/../vendor/autoload.php'; -require_once __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; +require_once dirname(__DIR__) . '/vendor/autoload.php'; // Load environment variables from .env file $dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__)); $dotenv->safeLoad(); +define('YII_DEBUG', $_ENV['YII_DEBUG'] ?? false); +define('YII_ENV', $_ENV['YII_ENV'] ?? 'prod'); + +require_once dirname(__DIR__) . '/vendor/yiisoft/yii2/Yii.php'; + if (getenv('YII_C3')) { $c3 = dirname(__DIR__) . '/c3.php'; diff --git a/public/robots.txt b/web/robots.txt similarity index 100% rename from public/robots.txt rename to web/robots.txt