1

一意の 8 文字の英数字文字列を含む UNIQUE 列を持つ DB テーブルがあります。

私は(ついに)自分の MVC フレームワークから symfony に移行しました。今までは、CREATE で呼び出されるモデルにプライベート メソッドがありました。メソッド内のループは、ランダム ハッシュを生成し、テーブルに対して READ を実行して一意かどうかを確認します。一意である場合は、ハッシュが返され、CREATE 要求に挿入されます。

私が見ている問題は、symfony ではエンティティ クラス内からリポジトリにアクセスできないため、ライフサイクル コールバックを使用できないことです。この背後にある理由を理解しています。一方、ハッシュ生成はコントローラーとは関係ありません。私にとっては、モデルに属するのは内部ロジックです。後でデータ構造を変更する場合は、コントローラーを編集する必要があります。

私の質問は、アーキテクチャに関して、ハッシュ生成メソッドをどこに置くべきですか?

4

3 に答える 3

1

リスナーを使用できます。リポジトリへのアクセスが必要なため、ライフサイクル コールバックが正しいソリューションではないことは正しかったです。ただし、ライフサイクル コールバックと同じイベントをリッスンするリスナーを定義できますが、これはサービスであるため、依存関係としてリポジトリを持つことができます。

于 2013-10-16T12:06:35.090 に答える
1

私自身の質問に答える:

doctrine エンティティ マネージャーにアクセスできるカスタム リポジトリを作成しました。

リポジトリにはcreateNewHashメソッドがあります:

class HashRepository extends EntityRepository
{
    public function createNewHash()
    {
        $hash = new Hash();
        $hash->setHash($this->_getUniqueHash());
        $em = $this->getEntityManager();
        $em->persist($hash);
        $em->flush();
        return $hash;
    }

    private function _getUniqueHash()
    {
        $hash = null;
        $hashexists = true;
        while ($hashexists) {
            $hash = $this->_generateRandomAlphaNumericString();
            if (!$hashobject = $this->findOneByHash($hash)) {
                $hashexists = false;
            }
        }
        return $hash;
    }

    private function _generateRandomAlphaNumericString( $length=8 )
    {
        $bits = $length / 2;
        return bin2hex(openssl_random_pseudo_bytes($bits));
    }
}

その後createNewHash()、コントローラーからメソッドを呼び出すことができ、コントローラーはハッシュの作成に関与する必要はありません。

編集:リスナーはそれを行う別の方法です。

于 2013-10-16T10:16:28.320 に答える
0

エンティティコンストラクターで、これを追加できます:

<?php

namespace Acme\DemoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * MyEntity
 *
 * @ORM\Table(name="my_entity")
 */
class MyEntity
{
    /**
     * @ORM\Column(type="string", length=8, unique=true, nullable=false)
     * @var string
     */
    private $uniqId;

    public function __construct()
    {
        $this->uniqId = hash('crc32b', uniqid());
    }

    // ...

}

お役に立てれば

于 2013-10-16T09:53:34.617 に答える