Symfony主义典藏获得单一价值

问题描述 投票:0回答:1

我在ManyToMany关系中有两个实体User和Product。在投票者内部,如果用户在$ product-> getUsers中,我想授予对产品的删除权限。到目前为止,我设法做到了这样的事情

foreach ($user->getProducts() as $userProduct) {
    foreach ($userProduct->getUsers() as $productUser) {
        if($productUser->getId() === $user->getId()) {
            return true;
                break;
        }
   }
}

用户变量是:

$user = $token->getUser();

我检查是否是:

    // if the user is anonymous, do not grant access
    if (!$user instanceof UserInterface) {
        return false;
    }

每个用户都有一个产品集合->此集合中的每个产品都有一个用户集合。我检查代码中产品的用户集合的ID中是否包含当前通过身份验证的用户($ user-> getId())的ID:

if($productUser->getId() === $user->getId()) {
        return true;
            break;
    }

并且我退出循环。如果不是,则拒绝访问。

是否有更好,更优雅,更有效的方法来完成此任务?我应该为此目的使用任何内置的Symfony方法吗?

arrays symfony foreach collections doctrine
1个回答
0
投票

在投票者内部,我避免了像这样的双重foreach循环(传递产品实例)

    class ProductVoter extends Voter
    {
        protected function supports($attribute, $subject) {
            return in_array($attribute, ['PRODUCT_EDIT', 'PRODUCT_DELETE'])
                && $subject instanceof \App\Entity\Product;
        }

        protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
        {
            $user = $token->getUser();

            // if the user is anonymous, do not grant access
            if (!$user instanceof UserInterface) {
                return false;
            }

            $product = $subject;

            // ... (check conditions and return true to grant permission) ...
            switch ($attribute) {
                case 'PRODUCT_EDIT':
                    // logic to determine if the user can EDIT
                    // return true or false
                    return $user === $product->getUsers();
                    break;
                case 'PRODUCT_DELETE':   
                    return $product->getId() === $user->getProducts()->first()->getId();
                    //@Lunin Roman version works too
//return $product->getUsers()->contains($user);
                    break;
            }

            return false;
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.