我在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方法吗?
在投票者内部,我避免了像这样的双重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;
}
}