symfony - Symfony 4 投票者 - OnetoMany 关系
问题描述
我有一个应用程序实体,它存储一个带有用户 ID 的广告 ID
class User implements UserInterface, \Serializable
{
/**
* @ORM\OneToMany(targetEntity="App\Entity\Application", mappedBy="author", orphanRemoval=true)
*/
private $applications;
}
应用实体
class Application
{
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Advert", inversedBy="applications")
* @ORM\JoinColumn(nullable=false)
*/
private $advert;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="applications")
* @ORM\JoinColumn(nullable=false)
*/
private $author;
}
我想要的是一个选民,如果当前用户已经申请了一个特定的广告(在查看广告时),它可以拒绝一个动作
类 AdvertApplicationsVoter 扩展选民 {
protected function supports($attribute, $subject)
{
return in_array($attribute, ['APP_APPLY', 'ADVERT_APPLY']) && $subject instanceof Application;
}
/**
* @param string $attribute
* @param mixed $subject
* @param TokenInterface $token
* @return bool
*/
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
$user = $token->getUser();
$apl = $user->getApplications();
// if the user is anonymous, do not grant access
if (!$user instanceof User) {
return false;
}
switch ($attribute) {
case 'APP_APPLY':
return $this->dw($user, $subject);
break;
case 'ADVERT_APPLY':
// logic to determine if the user can VIEW
// return true or false
break;
}
return false;
}
private function applied(?User $user, Advert $app)
{
return $user->getId() === $app->getApplications()->getKeys();
}
private function aa(?User $user, Application $app)
{
return $user->getApplications() === $app->getAdvert();
}
private function dw(?User $user, Application $app)
{
foreach($user->getApplications() as $app) {
if ($app->getAdvert() === $app) {
return false;
}
}
return true;
}
}
我被弃权了,我不知道如何调试选民
提前致谢
解决方案
假设您正确设置了您的选民(因此使用support和voteOnAttribute方法)。
然后你只需要改变你的方法:
private function dw(?User $user, Advert $advert)
{
foreach($user->getApplications() as $userApplication) {
if ($userApplication->getAdvert() === $advert) {
return false;
}
}
return true;
}
}
您的方法的问题是您正在将ArrayCollection与应用程序对象进行比较。
推荐阅读
- firebase - 时间戳和 HTTPS 可调用 - RangeError:超出最大调用堆栈大小
- python - 如何使用正则表达式检查 21 个字符的序列?
- asp.net-core - 如何在构建 .net 核心时发布协议合同?
- data-structures - 以下算法的时间复杂度如何为0(n^2)
- python - The "pip install pgmpy" statement for Python in Jupyter Notebook does not work
- android - 如何使用材料设计来挑选时间?
- angular - 如何以角度编写单元测试以测试订阅块内的路由代码
- google-sheets - 如何将 Google 表格中的一组可变单元格动态复制并粘贴到文档中?
- python - django rest框架评论系统
- react-native - React-Native Screen 未生成基本滚动