murph-doc/docs/controller.md
Simon Vieille 385af624a6
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
update theme
2023-02-09 21:50:06 +01:00

111 lines
2.9 KiB
Markdown

# Controller
## Controller
The default controller of a node is `App\Core\Controller\Site\PageController::show`.
`PageController` extends `Symfony\Bundle\FrameworkBundle\Controller\AbstractController` and implements very basic features: a Response builder which retrieves the good template and injects variables to the view.
To create a custom controller, do this way:
```php-inline title="src/Controller/MyController.php"
namespace App\Controller;
use App\Core\Controller\Site\PageController;
class MyController extends PageController
{
public function myAction()
{
if (!$this->siteRequest->getPage()) {
throw $this->createNotFoundException();
}
return $this->defaultRender($this->siteRequest->getPage()->getTemplate(), [
// view datas
]);
}
}
```
Then edit `config/packages/app.yaml` and add your controller:
```yaml
core:
site:
controllers:
- {name: 'My action', action: 'App\Controller\MyController::myAction'}
```
## UrlGenerator
If your controller represents entities and if the associated node is visible in the sitemap, you can use a `App\Core\Annotation\UrlGenerator` in annotations and implement a generator. See the example below.
```php-inline title="src/UrlGenerator/MyEntityGenerator"
namespace App\UrlGenerator;
use App\Core\Entity\Site\Node;
use App\Repository\MyEntityRepositoryQuery;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class MyEntityGenerator
{
protected MyEntityRepositoryQuery $query;
protected UrlGeneratorInterface $urlGenerator;
public function __construct(MyEntityRepositoryQuery $query, UrlGeneratorInterface $urlGenerator)
{
$this->query = $query;
$this->urlGenerator = $urlGenerator;
}
public function myActionGenerator(Node $node, array $options): array
{
$entities = $this->query->create()->find();
$urls = [];
foreach ($entities as $entity) {
$urls[] = $this->urlGenerator->generate(
$node->getRouteName(),
[
'entity' => $entity->getId(),
'_domain' => $options['_domain'],
],
UrlGeneratorInterface::ABSOLUTE_URL
);
}
return $urls;
}
}
```
Then, the have to annotate the controller like this (note: `options` is optional):
```php-inline title="src/Controller/MyController.php"
namespace App\Controller;
use App\Core\Annotation\UrlGenerator;
use App\Core\Controller\Site\PageController;
use App\UrlGenerator\MyEntityGenerator;
class MyController extends PageController
{
#[UrlGenerator(service: MyEntityGenerator::class, method: 'myActionGenerator', options=[])]
public function myAction(MyEntity $entity)
{
// do stuff
}
}
```
Finally, update `config/services.yaml`:
```yaml
services:
# ...
App\UrlGenerator\MyEntityGenerator:
public: true
```