我有一个表单生成器类,它继承自AbstractType,我需要解决这样的路径:
$uri = $router->generate('blog_show',array('slug' => 'my-blog-post'));
由于该类不是Controller的子级,因此无法访问路由器.有任何想法吗?
在建设时间将路由器传递给班级怎么样?
您可以通过构造函数将路由器服务传递给表单类型.使用form.type标记将您的表单注册为服务,并将路由器服务注入其中.
<?PHP namespace Vendor\Bundle\AppBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Bundle\FrameworkBundle\Routing\Router; class PostType extends AbstractType { /** * @var Router */ private $router; /** * @param Router */ public function __construct(Router $router) { $this->router = $router; } /** * @return string */ public function getName() { return 'post'; } // ... }
将其注册为服务:
services: form.type.post: class: Vendor\Bundle\AppBundle\Form\Type\PostType arguments: [ @router ] tags: - { name: form.type }
并在你的控制器中使用它像这样:
public function addAction(Request $request) { $post = new Post(); $form = $this->createForm('post',$post); // ... }
由于您使用form.type标记将表单类型注册为服务,因此您只需使用其名称而不是新的PostType().您可以在您的类型中以$this->路由器的形式访问路由器服务.