Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 从实体类访问generateURL()_Symfony - Fatal编程技术网

Symfony 从实体类访问generateURL()

Symfony 从实体类访问generateURL(),symfony,Symfony,我想在实体类中访问generateUrl。您可以在控制器类中访问generateUrl,如下所示: $url = $this->generateUrl('your_route_name', array(/* parameters */)); 为此,我应该尝试“创建一个服务,并在其中注入路由器组件”。然后我正在阅读并尝试配置,但我仍然无法完成 在app/config/config.yml中 services: router: class: ??? a

我想在实体类中访问generateUrl。您可以在控制器类中访问generateUrl,如下所示:

$url = $this->generateUrl('your_route_name', array(/* parameters */));
为此,我应该尝试“创建一个服务,并在其中注入路由器组件”。然后我正在阅读并尝试配置,但我仍然无法完成

在app/config/config.yml中

services:
    router:
        class: ???
        arguments: ???
如何使路由器成为服务

更新

为什么要在实体类中使用
generateUrl


我正在使用。它需要在实体中实现getFeedItemLink()。我需要将URL作为该函数的返回值。

简单的回答是:您不在实体内部使用路由器,也不将实体创建为服务。您应该创建一个单独的服务,负责创建URL(如果您写了更多关于您试图实现的内容,那么给您提供更合适的示例会更简单)

例如:

use Symfony\Bundle\FrameworkBundle\Routing\Router;

class YourCustomUrlGenerator
{
    private $router;

    public function __construct(Router $router)
    {
        $this->router = $router;
    }

    public function generateUrl(YourEntity $entity)
    {
        // generate the url
    }
}
然后定义您的DIC服务:

services:
    custorm_url_generator:
        class: Namespace\YourCustomUrlGenerator
        arguments: [@router]

它在实体内不可用,因为你不应该在实体内使用它,你想做什么?@ra_htial“你不应该质疑上帝,也不应该质疑国王说什么”好吧。。。为什么?然后你得到2张赞成票。好极了@Toskan因为有规则,如果你不遵守,事情迟早会破裂,提问是好的,这就是为什么我问他想做什么,也许我可以用更好的方法来帮助他。不,我不是想让实体成为服务。我想让路由器成为一种服务,然后在实体类中使用它。在实体中不使用服务。真糟糕!路由器是一项服务,你不需要让它成为一项。我完全同意。正如@IgorPantović所说的,您不应该让servce==entity,您不应该在实体内部使用服务。如果您需要一个基于实体创建url的方法,您可以创建单独的服务(不是实体)并将此方法放在那里。然后可以将实体作为参数传递到此方法中。这样,您就可以实现您想要的,而无需将任何服务放在实体中。开玩笑的是,我没有回答,我只是发表了评论。实体是不应该测试的数据对象,因此将业务逻辑放入其中是一个坏主意。此外,它们将在代码中的不同位置实例化,如果它们需要访问服务,那么您将需要在所有这些位置访问这些服务,从而使代码更耦合,更不易维护。它违反了SRP(但该死,activerecord也违反了,而且大多数人都不介意),所以这是否不好还是有争议的。工厂模式在这里使用是正确的。