在哪里放置实体'辅助功能'?

时间:2012-06-24 12:54:25

标签: symfony

我无法理解Symfony 2的关键概念。

我正在一个网站上工作,用户可以使用秘密网址创建内容然后发送给其他人。比如www.yoursite.com/{secret-identifier-string}。

我计划如下:

  • 保留用户的内容。
  • 使用双向加密方法(如mcrypt_encrypt)创建包含内容ID和创建时间戳(或任何其他永远不会再次更改的内容作为额外安全功能的内容)的标识符字符串。
  • 创建链接并将其显示给用户以便将其提供
  • 每当调用url时,标识符字符串将被解密。如果提供的时间戳与内容id行的对应值匹配,则将显示该页面。

我的问题是:

  • 你认为这是一个好的程序吗?
  • 在Symfony2之外我会创建辅助方法,如getIdentifierString()getContentPageLink()。我在哪里将相应的代码放在Symfony2中?它属于实体类吗?如果是这样,我遇到了问题,因为我正在使用服务类进行加密。该服务仅在控制器中可用。

非常感谢!

2 个答案:

答案 0 :(得分:1)

一般的想法是你创建“辅助类”而不是“辅助函数”。这些类可能依赖于其他类,在这种情况下,您将它们定义为服务。

听起来您的方法确实存在依赖关系(加密),因此您可以创建一个负责生成链接的新服务。在它的构造函数中,它将采用加密器,并且方法将传递给实体以生成链接/字符串。

例如,您的服务:

<service id="app_core.linkifier" class="App\CoreBundle\Linkifier">
    <argument type="service" id="the.id.for.encryptor"/>
</service>

和班级:

class Linkifier
{
    private $encryptor;

    public function __construct(Encryptor $encryptor)
    {
        $this->encryptor = $encryptor;
    }

    public function generateContentPageLink(Entity $the_entity)
    {
        return $this->encryptor->encrypt($the_entity);
    }
}

答案 1 :(得分:0)

在充分考虑到DI和面向服务的设计,命名空间以及我们从中受益的所有好处之后,

我仍然拒绝输入或阅读:

$this->mysyperfancyservice->dowhatevertheseviceissupposedtodowith($the_entity);

简单的

do($the_entity);
我需要在整个项目中的150个实例上使用

,其中do是每个从事该项目的人都应该知道的东西。

这就是帮助程序的意思-可读性和简单性。只要不依赖其他服务即可。

我的解决方案是在Composer的基本功能中: "autoload": { ... "files": [ "src/helper/functions.php" ] }

我在src/helper/functions.php文件中放入了数量非常有限的非常有用的函数,并像这样将其添加到项目中。

为使该功能在整个项目范围内可用,需要运行: composer dump-autoload