【问题标题】:Where to put entity 'helper functions'?在哪里放置实体“辅助功能”?
【发布时间】:2012-06-24 12:54:25
【问题描述】:

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

我正在开发一个网站,用户可以在该网站上创建内容,然后使用秘密网址将其发送给其他人。像 www.yoursite.com/{secret-identifier-string} 之类的东西。

我打算这样做:

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

我的问题是:

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

非常感谢!

【问题讨论】:

  • 标识符是否必须是双向加密字符串?为什么不直接生成一个长的随机字符串(甚至是内容的单向哈希)并将其存储为索引? ID和时间戳加解密的原因/优势是什么?
  • 我看到了不生成必须存储在数据库中的不必要数据的优势。

标签: symfony


【解决方案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);
    }
}

【讨论】:

    【解决方案2】:

    充分尊重 DI 和面向服务的设计、命名空间以及我们从中受益的所有好东西,

    我仍然拒绝打字或阅读:

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

    简单的地方

    do($the_entity);
    

    是我项目中 150 个实例所需的全部内容,其中 do 是项目中每个人都知道的内容。

    这就是 helper 的意义——可读性和简单性。只要它不依赖于其他服务。

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

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

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

    【讨论】:

      最近更新 更多