0

私は、ユーザーがアカウントに関連付けられているアプリケーションを構築しています(たとえば、複数のユーザーがすべてアカウントを共有しています)。次に、他のエンティティ-製品がアカウントに関連付けられていると呼びましょう。製品はアカウントに関連付けられており、そのアカウントに関連付けられているユーザーのみが製品を編集できます。

私の場合の違いは、同じモデルで共有されている多くの異なるエンティティがあります。

それが1つの(製品)エンティティである場合、次のようなメソッドがProductRepositoryにあることは問題ではありません。

public function checkOwnership($id, $account)
{
    $count = $this->createQueryBuilder('s')
        ->select('count(s.id)')
        ->where('s.account = :acc')
        ->andWhere('s.id = :id')
        ->setParameters(array('id' => $id, 'acc' => $account))
        ->getQuery()
        ->getSingleScalarResult();

    if($count == 0)
        throw $this->createNotFoundException('ye..');

    return;
}

製品のIDがユーザーのアカウントに関連付けられていることを確認します。

account引数は、次を使用してこの関数に渡されます。

$this->getUser();

コントローラ内。

コードの重複を防ぐために、この関数を他のエンティティで利用できるようにするための最良の方法は何ですか?(現在)他のエンティティは3つしかないため、各リポジトリにそれを置くだけで世界の終わりにはなりませんが、「共通」またはグローバルリポジトリを作成する方法があるかどうか疑問に思っています。良い基準に従っていますか?ぜひ知りたいです。

編集:

それとも私はこれを完全に考えすぎたのでしょうか?「MainBundle」に「Common」ディレクトリを作成し、名前空間を定義して、関数へのアクセスが必要なコントローラーの先頭にuseステートメントを追加できますか?

4

1 に答える 1

1

あなたの質問を完全に理解できることを願っています。

解決策 1、複製、簡単:@ParamConverter仕事を任せる (404存在しない場合の自動応答)

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

/**
 * @Route("/pets/{id}")
 */
public function showAction(Pet $pet)
{
    // Current logged user
    $currentUser = $this->get('security.context')->getToken()->getUser();

    // Owner
    $ownerUser = $pet->getUser();

    if(!$currentUser->equals($ownerUser)) {
        // 401, 403 o 404 depends on you
    }
}

ソリューション 2、DRY、少し難しい: JMSAOPBundleを使用し、コントローラーとアクション (表示、削除など) へのすべての要求をインターセプトするインターセプターを定義します。ポイントカット (インターセプターに接続) は、コンテキストから現在のユーザーを取得し、エンティティから所有者を取得します。その後、チェックを行います...

于 2013-02-19T16:23:26.453 に答える