是否有可能在控制器之外使用generateUrl()方法?
我尝试在$this->get('router')
的自定义存储库类中使用它,但它不起作用。
更新
我在这里找到了一个临时解决方案:
http://www.phamviet.net/2012/12/09/symfony-2-inject-service-as-dependency-in-to-repository/
我将整个服务容器注入我的存储库,尽管它“不推荐”。
但它现在有效。
UPDATE2
注入路由器而不是整个容器可能是一个更好的主意:)
答案 0 :(得分:15)
如果您查看the source code of Controller::generateUrl()
,就会看到它是如何完成的:
$this->container->get('router')->generate($route, $parameters, $referenceType);
基本上你只需输入路线的名称($route
这里);如果存在,一些参数($parameters
)和引用类型(UrlGeneratorInterface
的常量之一)
答案 1 :(得分:9)
不要将容器注入您的存储库......真的,不要!
如果我是你,我会创建一个服务并在其中注入路由器。在这项服务中,我将创建一个方法,该方法使用存储库并使用路由器添加所需的代码。
对于另一位开发人员而言,这种方式不那么脏,易于使用/理解。
答案 2 :(得分:2)
将路由器本身注入您的EntityRepository(如开发生活博客文章Symfony 2: Injecting service as dependency into doctrine repository中所述),然后您可以使用$this->router->generate('acme_route');
答案 3 :(得分:0)
在 symfony 4 和 Sylius 中,当 FormType 扩展一个(例如)AbstractResourceType
class PostType extends AbstractResourceType
{
private $router;
public function __construct(RouterInterface $router, $dataClass, $validationGroups = [])
{
$this->router = $router;
parent::__construct($dataClass, $validationGroups);
}
}
服务.yaml:
app.post.form.type:
class: App\Form\Admin\Post\PostType
tags:
- { name: form.type }
arguments: ['@router.default', '%app.model.post.class%' ]