diff --git a/blog/autoload.php b/blog/autoload.php index ccfe29cd..6632ee68 100644 --- a/blog/autoload.php +++ b/blog/autoload.php @@ -5,6 +5,7 @@ use Dotenv\Dotenv; require_once __DIR__ . '/vendor/autoload.php'; +require __DIR__ . '/vendor/attributes.php'; $dotenv = Dotenv::createImmutable(__DIR__); $dotenv->load(); diff --git a/blog/composer.json b/blog/composer.json index 6070af10..d2a18c10 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -26,6 +26,7 @@ "cycle/orm": "^2.0", "doctrine/collections": "^1.6", "fakerphp/faker": "^1.14", + "olvlvl/composer-attribute-collector": "dev-main", "httpsoft/http-message": "^1.1", "php-http/guzzle7-adapter": "^1.0", "psr/container": "^2.0", @@ -34,6 +35,7 @@ "psr/http-server-handler": "^1.0", "psr/http-server-middleware": "^1.0", "psr/log": "^3.0", + "spatie/file-system-watcher": "^1.1", "symfony/console": "^6.0", "vlucas/phpdotenv": "^5.3", "yiisoft/access": "^1.0", @@ -68,7 +70,7 @@ "yiisoft/rbac": "^1.0", "yiisoft/rbac-php": "^1.0", "yiisoft/rbac-rules-container": "^2.0", - "yiisoft/router": "^3.0", + "yiisoft/router": "dev-attributes as 3.0", "yiisoft/router-fastroute": "^3.0", "yiisoft/security": "^1.0", "yiisoft/session": "^2.0", @@ -159,10 +161,15 @@ "composer/package-versions-deprecated": true, "infection/extension-installer": true, "yiisoft/config": true, + "olvlvl/composer-attribute-collector": true, "php-http/discovery": false } }, "repositories": [ + { + "type": "git", + "url": "https://github.com/yiisoft/router" + }, { "type": "composer", "url": "https://asset-packagist.org" diff --git a/blog/config/common/routes/routes.php b/blog/config/common/routes/routes.php index 27cd3612..e1e5131f 100644 --- a/blog/config/common/routes/routes.php +++ b/blog/config/common/routes/routes.php @@ -17,6 +17,7 @@ use App\Middleware\ApiDataWrapper; use App\User\Controller\ApiUserController; use App\User\Controller\UserController; +use olvlvl\ComposerAttributeCollector\Attributes; use Psr\Http\Message\ResponseFactoryInterface; use Psr\Http\Message\ServerRequestInterface; use Yiisoft\Auth\Middleware\Authentication; @@ -37,11 +38,22 @@ use Yiisoft\Yii\RateLimiter\LimitRequestsMiddleware; use Yiisoft\Yii\RateLimiter\Storage\StorageInterface; +$routes = []; +foreach (Attributes::findTargetMethods(Route::class) as $method) { + /** + * @var $attribute Route + */ + $attribute = $method->attribute; + $routes[] = $attribute + ->action([$method->class, $method->name]); +} + return [ + ...$routes, // Lonely pages of site - Route::get('/') - ->action([SiteController::class, 'index']) - ->name('site/index'), + //Route::get('/') + // ->action([SiteController::class, 'index']) + // ->name('site/index'), Route::methods([Method::GET, Method::POST], '/contact') ->action([ContactController::class, 'contact']) ->name('site/contact'), diff --git a/blog/src/Controller/SiteController.php b/blog/src/Controller/SiteController.php index cbceaa93..a1718e37 100644 --- a/blog/src/Controller/SiteController.php +++ b/blog/src/Controller/SiteController.php @@ -4,7 +4,11 @@ namespace App\Controller; +use App\Middleware\ApiDataWrapper; use Psr\Http\Message\ResponseInterface; +use Yiisoft\DataResponse\Middleware\FormatDataResponseAsJson; +use Yiisoft\DataResponse\Middleware\FormatDataResponseAsXml; +use Yiisoft\Router\Route; use Yiisoft\Yii\View\Renderer\ViewRenderer; final class SiteController @@ -14,8 +18,41 @@ public function __construct(private ViewRenderer $viewRenderer) $this->viewRenderer = $viewRenderer->withController($this); } + #[Route( + methods: ['GET'], + pattern: '/', + name: 'site/index', + )] public function index(): ResponseInterface { return $this->viewRenderer->render('index'); } + + #[Route( + methods: ['GET'], + pattern: '/json', + name: 'site/index.json', + middlewares: [ + FormatDataResponseAsJson::class, + ApiDataWrapper::class, + ], + )] + public function json(): ResponseInterface + { + return $this->viewRenderer->render('index'); + } + + #[Route( + methods: ['GET'], + pattern: '/xml', + name: 'site/index.xml', + middlewares: [ + FormatDataResponseAsXml::class, + ApiDataWrapper::class, + ], + )] + public function xml(): ResponseInterface + { + return $this->viewRenderer->render('index'); + } } diff --git a/blog/watcher-build.php b/blog/watcher-build.php new file mode 100644 index 00000000..324c1245 --- /dev/null +++ b/blog/watcher-build.php @@ -0,0 +1,18 @@ +onAnyChange(function (string $type, string $path) { + echo sprintf('File changed: "%s".', $path) . PHP_EOL; + echo 'Run watcher-build...' . PHP_EOL; + `php watcher-build.php`; + echo 'Dumped...' . PHP_EOL; + }) + ->start();