2

Symfony 2 の重要な概念を理解するのに苦労しています。

私は、ユーザーが秘密の URL を使用して他の人に送信できるコンテンツを作成できる Web サイトに取り組んでいます。www.yoursite.com/{secret-identifier-string} のようなもの。

これを次のように行う予定です。

  • ユーザーのコンテンツを永続化します。
  • 双方向の暗号化方式 ( などmcrypt_encrypt) を使用して、コンテンツ ID と作成タイムスタンプ (または追加の安全機能として、二度と変更されないその他のコンテンツ) を含む識別子文字列を作成します。
  • リンクを作成し、それをユーザーに表示して配布します
  • URL が呼び出されるたびに、識別子文字列が復号化されます。指定されたタイムスタンプがコンテンツ ID 行の対応する値と一致する場合、ページが表示されます。

私の質問は次のとおりです。

  • これは一般的に良い手順だと思いますか?
  • Symfony2 の外ではgetIdentifierString()、 やのようなヘルパー メソッドを作成しますgetContentPageLink()。対応するコードを Symfony2 のどこに配置すればよいですか? エンティティクラス内に属していますか? その場合、暗号化にサービス クラスを使用しているため、問題が発生しています。このサービスはコントローラーでのみ使用できます。

どうもありがとう!

4

2 に答える 2

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);
    }
}
于 2012-06-24T17:29:05.277 に答える
1

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

于 2018-08-24T14:12:18.637 に答える