Skip to content

Commit 32a0605

Browse files
committed
Merge branch '7.4' into 8.0
* 7.4: [Security] improve VoteObject adding extraData
2 parents 8e4006c + f0c630b commit 32a0605

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

security/voters.rst

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,17 @@ would look like this::
207207
}
208208
}
209209

210+
.. tip::
211+
212+
Votes define an ``$extraData`` property that you can use to store any data
213+
that you might need later::
214+
215+
$vote->extraData['key'] = 'value'; // values can be of any type
216+
217+
.. versionadded:: 7.4
218+
219+
The ``$extraData`` property was introduced in Symfony 7.4.
220+
210221
That's it! The voter is done! Next, :ref:`configure it <declaring-the-voter-as-a-service>`.
211222

212223
To recap, here's what's expected from the two abstract methods:
@@ -507,6 +518,60 @@ option to use a custom service (your service must implement the
507518
;
508519
};
509520
521+
When creating custom decision strategies, you can store additional data in votes
522+
to be used later when making a decision. For example, if not all votes should
523+
have the same weight, you could store a ``score`` value for each vote::
524+
525+
// src/Security/PostVoter.php
526+
namespace App\Security;
527+
528+
use App\Entity\Post;
529+
use App\Entity\User;
530+
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
531+
use Symfony\Component\Security\Core\Authorization\Voter\Vote;
532+
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
533+
534+
class PostVoter extends Voter
535+
{
536+
// ...
537+
538+
protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token, ?Vote $vote = null): bool
539+
{
540+
// ...
541+
$vote->extraData['score'] = 10;
542+
543+
// ...
544+
}
545+
}
546+
547+
Then, access that value when counting votes to make a decision::
548+
549+
// src/Security/MyCustomAccessDecisionStrategy.php
550+
use Symfony\Component\Security\Core\Authorization\Strategy\AccessDecisionStrategyInterface;
551+
552+
class MyCustomAccessDecisionStrategy implements AccessDecisionStrategyInterface
553+
{
554+
public function decide(\Traversable $results, $accessDecision = null): bool
555+
{
556+
$score = 0;
557+
558+
foreach ($results as $key => $result) {
559+
$vote = $accessDecision->votes[$key];
560+
if (array_key_exists('score', $vote->extraData)) {
561+
$score += $vote->extraData['score'];
562+
} else {
563+
$score += $vote->result;
564+
}
565+
}
566+
567+
// ...
568+
}
569+
}
570+
571+
.. versionadded:: 7.4
572+
573+
The feature to store arbitrary data inside votes was introduced in Symfony 7.4.
574+
510575
Custom Access Decision Manager
511576
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
512577

0 commit comments

Comments
 (0)