I've followed the Controllers and templates documentation after having integrated Symfony CMF and the AutoRoutingBundle into my application. My issue is similar to #50450338 but even when naming the argument correctly, I can't solve the problem.
I can create a Page
Document and an AutoRoute
gets created for it automatically, but when trying to use a controller to show that page, I can't get the $contentDocument
parameter into my controller action as the doc suggests. When adding the argument, I get this error:
Could not resolve argument $contentDocument of "App\ContentBundle\Controller\PageController::pageaction()", maybe you forgot to register the controller as a service or missed tagging it with the "controller.service_arguments"?
Even when the controller is tagged as suggested, the error persists.
If I render the page template without the $contentDocument
argument, I can see it, but I'm then unable to get the Page
attributes.
Here is my Page
document:
/**
* Class Page
* @package App\ContentBundle\Document
*
* @Document(translator="attribute", referenceable=true)
*/
class Page implements
TranslatableInterface,
RouteReferrersReadInterface
{
/**
* @var string
* @Id()
*/
protected $id;
/**
* @var string
* @Uuid()
*/
protected $uuid;
/**
* @var object
* @ParentDocument()
*/
protected $parent;
/**
* @Referrers(
* referringDocument="Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route",
* referencedBy="content"
* )
*/
protected $routes;
/**
* @var string|boolean
* @Locale()
*/
private $locale;
/**
* @var string|null
* @Nodename()
*/
private $slug;
/**
* @var string|null
* @Field(type="string", nullable=false)
*/
private $title;
/**
* @var \Sonata\BlockBundle\Model\BlockInterface[]
* @Children()
*/
private $blocks;
public function __construct ()
{
$this->blocks = [];
}
/**
* @return string
*/
public function getId ()
: string
{
return $this->id;
}
/**
* @return object
*/
public function getParentDocument ()
: object
{
return $this->parent;
}
/**
* @param object $parent
*/
public function setParentDocument ( $parent )
: void
{
$this->parent = $parent;
}
/**
* @return mixed
*/
public function getRoutes ()
{
return $this->routes;
}
/**
* @return bool|string
*/
public function getLocale ()
{
return $this->locale;
}
/**
* @param bool|string $locale
*/
public function setLocale ( $locale )
: void
{
$this->locale = $locale;
}
/**
* @return string|null
*/
public function getSlug ()
: ?string
{
return $this->slug;
}
/**
* @param string|null $slug
*/
public function setSlug ( ?string $slug )
: void
{
$this->slug = $slug;
}
/**
* @return string|null
*/
public function getTitle ()
: ?string
{
return $this->title;
}
/**
* @param string|null $title
*/
public function setTitle ( ?string $title )
: void
{
$this->title = $title;
}
/**
* @return \Sonata\BlockBundle\Model\BlockInterface[]
*/
public function getBlocks ()
: array
{
return $this->blocks;
}
/**
* @param \Sonata\BlockBundle\Model\BlockInterface[] $blocks
*/
public function setBlocks ( array $blocks )
: void
{
$this->blocks = $blocks;
}
}
Symfony CMF config:
cmf_routing:
chain:
routers_by_id:
router.default: 200
cmf_routing.dynamic_router: 100
dynamic:
persistence:
phpcr:
enabled: true
manager_name: default
controllers_by_class:
App\ContentBundle\Document\Page: App\ContentBundle\Controller\PageController::pageAction
cmf_routing_auto.yml
in my Bundle:
App\ContentBundle\Document\Page:
definitions:
main:
uri_schema: /{slug}
token_providers:
slug: [content_method, {method: getSlug}]
And the controller action:
/**
* @Template()
* @param $contentDocument
*
* @return array
*/
public function pageAction ( $contentDocument )
{
return [
'page' => $contentDocument,
];
}