2 Commits d287481c35 ... 8edd79fc87

Author SHA1 Message Date
  Sangfroid 8edd79fc87 Ajout des flux atom et rss 10 months ago
  Sangfroid ca6508625b Retour de type sur les extensions twig et markdown 10 months ago

+ 1 - 0
composer.json

@@ -7,6 +7,7 @@
         "php": ">=8.2",
         "php": ">=8.2",
         "ext-ctype": "*",
         "ext-ctype": "*",
         "ext-iconv": "*",
         "ext-iconv": "*",
+        "debril/rss-atom-bundle": "^5.2",
         "doctrine/dbal": "^3",
         "doctrine/dbal": "^3",
         "doctrine/doctrine-bundle": "^2.13",
         "doctrine/doctrine-bundle": "^2.13",
         "doctrine/doctrine-migrations-bundle": "^3.3",
         "doctrine/doctrine-migrations-bundle": "^3.3",

+ 495 - 3
composer.lock

@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
         "This file is @generated automatically"
     ],
     ],
-    "content-hash": "b2e1b9020b00ca5fe63ab065502c4d2e",
+    "content-hash": "60cf25ed2d175f8e4deddc97b211bf25",
     "packages": [
     "packages": [
         {
         {
             "name": "composer/ca-bundle",
             "name": "composer/ca-bundle",
@@ -163,6 +163,129 @@
             ],
             ],
             "time": "2024-09-19T14:15:21+00:00"
             "time": "2024-09-19T14:15:21+00:00"
         },
         },
+        {
+            "name": "debril/feed-io",
+            "version": "v5.3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alexdebril/feed-io.git",
+                "reference": "7c206ea5f07a65e7ccccdcdfbe0803806d54caa5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alexdebril/feed-io/zipball/7c206ea5f07a65e7ccccdcdfbe0803806d54caa5",
+                "reference": "7c206ea5f07a65e7ccccdcdfbe0803806d54caa5",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "guzzlehttp/guzzle": "~6.2|~7.0",
+                "php": ">=8.0",
+                "psr/log": "~1.0|~2.0|~3.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^3.5",
+                "monolog/monolog": "1.*|2.*",
+                "phpstan/phpstan": "^0.12.81",
+                "phpunit/phpunit": "~9.3.0"
+            },
+            "suggest": {
+                "monolog/monolog": "Allows to handle logs"
+            },
+            "bin": [
+                "bin/feedio"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "FeedIo\\": "src/FeedIo"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Alexandre Debril",
+                    "email": "alex.debril@gmail.com"
+                }
+            ],
+            "description": "PHP library built to consume and serve JSONFeed / RSS / Atom feeds",
+            "homepage": "https://feed-io.net",
+            "keywords": [
+                "atom",
+                "cli",
+                "client",
+                "feed",
+                "jsonfeed",
+                "news",
+                "rss"
+            ],
+            "support": {
+                "issues": "https://github.com/alexdebril/feed-io/issues",
+                "source": "https://github.com/alexdebril/feed-io/tree/v5.3.2"
+            },
+            "time": "2023-10-24T15:16:47+00:00"
+        },
+        {
+            "name": "debril/rss-atom-bundle",
+            "version": "v5.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alexdebril/rss-atom-bundle.git",
+                "reference": "29e624c428d4284726e5da5e0d245cbc93d1f17a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alexdebril/rss-atom-bundle/zipball/29e624c428d4284726e5da5e0d245cbc93d1f17a",
+                "reference": "29e624c428d4284726e5da5e0d245cbc93d1f17a",
+                "shasum": ""
+            },
+            "require": {
+                "debril/feed-io": "~3.0|~4.0|~5.0",
+                "php": ">=7.1",
+                "symfony/config": "~3.4|~4.0|^5.0|^6.0|^7.0",
+                "symfony/dependency-injection": "~3.4|~4.0|^5.0|^6.0|^7.0",
+                "symfony/http-foundation": "~3.4|~4.0|^5.0|^6.0|^7.0",
+                "symfony/http-kernel": "~3.4|~4.0|^5.0|^6.0|^7.0"
+            },
+            "require-dev": {
+                "doctrine/common": "~2.3",
+                "phpunit/phpunit": "~7.0",
+                "symfony/browser-kit": ">3.0",
+                "symfony/finder": ">3.0",
+                "symfony/framework-bundle": "^4.3|^5.0|^6.0|^7.0",
+                "symfony/validator": ">3.0",
+                "symfony/yaml": "^4.0|^5.0|^6.0|^7.0"
+            },
+            "type": "symfony-bundle",
+            "autoload": {
+                "psr-4": {
+                    "Debril\\RssAtomBundle\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "RSS / Atom and JSONFeed support for Symfony",
+            "homepage": "http://debril.org/category/rss-atom-bundle/",
+            "keywords": [
+                "Syndication",
+                "atom",
+                "feed",
+                "jsonfeed",
+                "rss"
+            ],
+            "support": {
+                "issues": "https://github.com/alexdebril/rss-atom-bundle/issues",
+                "source": "https://github.com/alexdebril/rss-atom-bundle/tree/v5.2.0"
+            },
+            "time": "2024-01-30T13:37:00+00:00"
+        },
         {
         {
             "name": "dflydev/dot-access-data",
             "name": "dflydev/dot-access-data",
             "version": "v3.0.3",
             "version": "v3.0.3",
@@ -1621,6 +1744,331 @@
             ],
             ],
             "time": "2024-07-24T14:08:11+00:00"
             "time": "2024-07-24T14:08:11+00:00"
         },
         },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "7.9.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "d281ed313b989f213357e3be1a179f02196ac99b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b",
+                "reference": "d281ed313b989f213357e3be1a179f02196ac99b",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
+                "guzzlehttp/psr7": "^2.7.0",
+                "php": "^7.2.5 || ^8.0",
+                "psr/http-client": "^1.0",
+                "symfony/deprecation-contracts": "^2.2 || ^3.0"
+            },
+            "provide": {
+                "psr/http-client-implementation": "1.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "ext-curl": "*",
+                "guzzle/client-integration-tests": "3.0.2",
+                "php-http/message-factory": "^1.1",
+                "phpunit/phpunit": "^8.5.39 || ^9.6.20",
+                "psr/log": "^1.1 || ^2.0 || ^3.0"
+            },
+            "suggest": {
+                "ext-curl": "Required for CURL handler support",
+                "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+                "psr/log": "Required for using the Log middleware"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Jeremy Lindblom",
+                    "email": "jeremeamia@gmail.com",
+                    "homepage": "https://github.com/jeremeamia"
+                },
+                {
+                    "name": "George Mponos",
+                    "email": "gmponos@gmail.com",
+                    "homepage": "https://github.com/gmponos"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://github.com/sagikazarmark"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "Guzzle is a PHP HTTP client library",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "psr-18",
+                "psr-7",
+                "rest",
+                "web service"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/guzzle/issues",
+                "source": "https://github.com/guzzle/guzzle/tree/7.9.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-07-24T11:22:20+00:00"
+        },
+        {
+            "name": "guzzlehttp/promises",
+            "version": "2.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/promises.git",
+                "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
+                "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "phpunit/phpunit": "^8.5.39 || ^9.6.20"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Promise\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "Guzzle promises library",
+            "keywords": [
+                "promise"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/promises/issues",
+                "source": "https://github.com/guzzle/promises/tree/2.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-10-17T10:06:22+00:00"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "2.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/psr7.git",
+                "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
+                "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0",
+                "psr/http-factory": "^1.0",
+                "psr/http-message": "^1.1 || ^2.0",
+                "ralouphie/getallheaders": "^3.0"
+            },
+            "provide": {
+                "psr/http-factory-implementation": "1.0",
+                "psr/http-message-implementation": "1.0"
+            },
+            "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"
+            },
+            "suggest": {
+                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Psr7\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "George Mponos",
+                    "email": "gmponos@gmail.com",
+                    "homepage": "https://github.com/gmponos"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://github.com/sagikazarmark"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://sagikazarmark.hu"
+                }
+            ],
+            "description": "PSR-7 message implementation that also provides common utility methods",
+            "keywords": [
+                "http",
+                "message",
+                "psr-7",
+                "request",
+                "response",
+                "stream",
+                "uri",
+                "url"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/psr7/issues",
+                "source": "https://github.com/guzzle/psr7/tree/2.7.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-07-18T11:15:46+00:00"
+        },
         {
         {
             "name": "laminas/laminas-diactoros",
             "name": "laminas/laminas-diactoros",
             "version": "3.5.0",
             "version": "3.5.0",
@@ -2991,6 +3439,50 @@
             },
             },
             "time": "2024-09-11T13:17:53+00:00"
             "time": "2024-09-11T13:17:53+00:00"
         },
         },
+        {
+            "name": "ralouphie/getallheaders",
+            "version": "3.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ralouphie/getallheaders.git",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2.1",
+                "phpunit/phpunit": "^5 || ^6.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/getallheaders.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ralph Khattar",
+                    "email": "ralph.khattar@gmail.com"
+                }
+            ],
+            "description": "A polyfill for getallheaders.",
+            "support": {
+                "issues": "https://github.com/ralouphie/getallheaders/issues",
+                "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+            },
+            "time": "2019-03-08T08:55:37+00:00"
+        },
         {
         {
             "name": "symfony/apache-pack",
             "name": "symfony/apache-pack",
             "version": "v1.0.1",
             "version": "v1.0.1",
@@ -11128,7 +11620,7 @@
     ],
     ],
     "aliases": [],
     "aliases": [],
     "minimum-stability": "stable",
     "minimum-stability": "stable",
-    "stability-flags": [],
+    "stability-flags": {},
     "prefer-stable": true,
     "prefer-stable": true,
     "prefer-lowest": false,
     "prefer-lowest": false,
     "platform": {
     "platform": {
@@ -11136,6 +11628,6 @@
         "ext-ctype": "*",
         "ext-ctype": "*",
         "ext-iconv": "*"
         "ext-iconv": "*"
     },
     },
-    "platform-dev": [],
+    "platform-dev": {},
     "plugin-api-version": "2.6.0"
     "plugin-api-version": "2.6.0"
 }
 }

+ 1 - 0
config/bundles.php

@@ -13,4 +13,5 @@ return [
     Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
     Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
     Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
     Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
     Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
     Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
+    Debril\RssAtomBundle\DebrilRssAtomBundle::class => ['all' => true],
 ];
 ];

+ 5 - 0
config/packages/rss_atom.yaml

@@ -0,0 +1,5 @@
+debril_rss_atom:
+    # switch to true if you need to set cache-control: private
+    private: false
+    # switch to true if you need to always send status 200
+    force_refresh: false

+ 2 - 0
config/routes/rss_atom.yaml

@@ -0,0 +1,2 @@
+rss_atom_bundle:
+    resource: "@DebrilRssAtomBundle/Resources/config/routing.yml"

+ 2 - 0
config/services.yaml

@@ -6,6 +6,7 @@
 parameters:
 parameters:
     images_directory: '%kernel.project_dir%/public/uploads/images'
     images_directory: '%kernel.project_dir%/public/uploads/images'
     title: '%env(TITLE)%'
     title: '%env(TITLE)%'
+    debril.rss_atom.provider.class: App\Service\BlogFeedProvider
 services:
 services:
     # default configuration for services in *this* file
     # default configuration for services in *this* file
     _defaults:
     _defaults:
@@ -23,3 +24,4 @@ services:
 
 
     # add more service definitions when explicit configuration is needed
     # add more service definitions when explicit configuration is needed
     # please note that last definitions always *replace* previous ones
     # please note that last definitions always *replace* previous ones
+

+ 1 - 1
src/Markdown/Render/ColorRenderer.php

@@ -10,7 +10,7 @@ use League\CommonMark\Util\HtmlElement;
 
 
 class ColorRenderer implements NodeRendererInterface
 class ColorRenderer implements NodeRendererInterface
 {
 {
-    public function render(Node $node, ChildNodeRendererInterface $childRenderer)
+    public function render(Node $node, ChildNodeRendererInterface $childRenderer): \Stringable|string|null
     {
     {
         if (!($node instanceof ColorText)) {
         if (!($node instanceof ColorText)) {
             throw  new \InvalidArgumentException('Le noeud doit être une instance de ColorText');
             throw  new \InvalidArgumentException('Le noeud doit être une instance de ColorText');

+ 1 - 1
src/Markdown/Render/IntroRenderer.php

@@ -10,7 +10,7 @@ use League\CommonMark\Util\HtmlElement;
 
 
 class IntroRenderer implements NodeRendererInterface
 class IntroRenderer implements NodeRendererInterface
 {
 {
-    public function render(Node $node, ChildNodeRendererInterface $childRenderer)
+    public function render(Node $node, ChildNodeRendererInterface $childRenderer): \Stringable|string|null
     {
     {
         IntroBlock::assertInstanceOf($node);
         IntroBlock::assertInstanceOf($node);
         /** @var IntroBlock $node */
         /** @var IntroBlock $node */

+ 66 - 0
src/Service/BlogFeedProvider.php

@@ -0,0 +1,66 @@
+<?php
+
+namespace App\Service;
+
+use App\Entity\Article;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use App\Repository\ArticleRepository;
+use Debril\RssAtomBundle\Provider\FeedProviderInterface;
+use FeedIo\Feed;
+use FeedIo\Feed\Item;
+use FeedIo\Feed\Item\Author;
+use Symfony\Component\HttpFoundation\Request;
+use FeedIo\FeedInterface;
+use Symfony\Component\Routing\RouterInterface;
+
+class BlogFeedProvider implements FeedProviderInterface
+{
+
+    public function __construct(
+        protected ArticleRepository $articleRepository,
+        protected UrlGeneratorInterface $router,
+        protected MarkdownParser $markdownParser
+    )
+    {
+
+    }
+
+    public function getFeed(Request $request): FeedInterface
+    {
+        $feed = new Feed();
+        $feed->setTitle('Opinion sur le réel');
+        $feed->setLink($this->router->generate('app_index', [], RouterInterface::ABSOLUTE_URL));
+        $feed->setLanguage('fr');
+        foreach($this->getItems() as $item) {
+            $feed->add($item);
+        }
+        return $feed;
+    }
+
+    public function getItems(): \Iterator
+    {
+        $articles = $this->articleRepository->findBy(criteria: ['state' => 'published'], orderBy: ['publicationDate' => 'DESC']);
+        foreach($articles as $article) {
+            /** @var Article $article */
+            $item = new Item();
+            $item
+                ->setContent($this->markdownParser->convertToHtml($article->getContent()))
+                ->setTitle($article->getTitle())
+                ->setAuthor((new Author())->setName($article->getAuthor()->getPseudo()))
+                ->setLastModified(\DateTime::createFromImmutable($article->getPublicationDate()))
+                ->setLink($this->router->generate('app_view', ['slug' => $article->getSlug()], RouterInterface::ABSOLUTE_URL))
+            ;
+            yield $item;
+        }
+    }
+
+    public function getFeedMetadata($feedId)
+    {
+        return [
+            'title' => 'Mon Blog',
+            'description' => 'Les derniers articles de mon blog',
+            'link' => 'https://example.com/blog',
+            'ttl' => 60,
+        ];
+    }
+}

+ 1 - 1
src/Twig/LastArticles.php

@@ -7,7 +7,7 @@ use Twig\TwigFunction;
 
 
 class LastArticles extends AbstractExtension
 class LastArticles extends AbstractExtension
 {
 {
-    public function getFunctions()
+    public function getFunctions(): array
     {
     {
         return [
         return [
             new TwigFunction('last_articles', [LastRuntimeExtension::class, 'getLastArticles'])
             new TwigFunction('last_articles', [LastRuntimeExtension::class, 'getLastArticles'])

+ 1 - 1
src/Twig/MarkdownExtension.php

@@ -7,7 +7,7 @@ use Twig\TwigFilter;
 
 
 class MarkdownExtension extends AbstractExtension
 class MarkdownExtension extends AbstractExtension
 {
 {
-    public function getFilters()
+    public function getFilters(): array
     {
     {
         return [
         return [
             new TwigFilter('markdown', [AppRuntimeExtension::class, 'parse'], ['is_safe' => ['html']])
             new TwigFilter('markdown', [AppRuntimeExtension::class, 'parse'], ['is_safe' => ['html']])

+ 13 - 0
symfony.lock

@@ -1,4 +1,17 @@
 {
 {
+    "debril/rss-atom-bundle": {
+        "version": "5.2",
+        "recipe": {
+            "repo": "github.com/symfony/recipes-contrib",
+            "branch": "main",
+            "version": "4.0",
+            "ref": "2c23ed747eda9f4c13f5e7eb55fffa1091fdd505"
+        },
+        "files": [
+            "config/packages/rss_atom.yaml",
+            "config/routes/rss_atom.yaml"
+        ]
+    },
     "doctrine/doctrine-bundle": {
     "doctrine/doctrine-bundle": {
         "version": "2.13",
         "version": "2.13",
         "recipe": {
         "recipe": {