«Правильный» способ сделать это, как я узнал больше о «услугах», заключается в прямом выполнении логики в файле RoleActivator.php .
справочная документация для Как внедрить переменные во все шаблоны с помощью служб ссылок Я нашел следующее решение;
ЦСИ / Безопасность / RoleActivator.php
<?php
namespace App\Security;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
use Translation\Bundle\EditInPlace\ActivatorInterface;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class RoleActivator implements ActivatorInterface
{
/**
* @var AuthorizationCheckerInterface
*/
private $authorizationChecker;
/**
* @var TranslatorInterface
*/
private $translate;
/**
* @var RequestStack
*/
private $request;
private $params;
private $path;
private $flag = null;
public function __construct(AuthorizationCheckerInterface $authorizationChecker, TranslatorInterface $translate, RequestStack $request)
{
$this->authorizationChecker = $authorizationChecker;
$this->translate = $translate;
$this->request = $request;
}
/**
* {@inheritdoc}
*/
public function checkRequest(Request $request = null)
{
if ($this->flag === null) { $this->setFlag($request); }
try {
return ($this->authorizationChecker->isGranted(['ROLE_TRANSLATOR']) && $this->flag);
} catch (AuthenticationCredentialsNotFoundException $e) {
return false;
}
}
public function getText()
{
if ($this->flag === null) { $this->setFlag(); }
return ($this->flag) ? 'linkText.translate.finished' : 'linkText.translate.start'; // Translation key's returned
}
public function getHref()
{
if ($this->flag === null) { $this->setFlag(); }
$params = $this->params;
if ($this->flag) {
unset($params['trans']);
} else {
$params['trans'] = 'do';
}
$queryString = '';
if (!empty($params)) {
$queryString = '?';
foreach ($params as $key => $value) {
$queryString.= $key.'='.$value.'&';
}
$queryString = rtrim($queryString, '&');
}
return $this->path.$queryString;
}
private function setFlag(Request $request = null)
{
if ($request === null) {
$request = $this->request->getCurrentRequest();
}
$this->flag = $request->query->has('trans');
$this->params = $request->query->all();
$this->path = $request->getPathInfo();
}
}
config \ packages \ twig.yaml
twig:
# ...
globals:
EditInPlace: '@EditInPlace_RoleActivator'
конфиг \ services.yaml
services:
# ...
EditInPlace_RoleActivator:
class: App\Security\RoleActivator
arguments: ["@security.authorization_checker"]
Итак, я добавил сверх примера php-перевода методы getText
и getHref
и соответствующие переменные private
, которые устанавливаются в checkRequest
и читаются там после.
Теперь в моем шаблоне ветки (в шапке) я просто использую
{% if is_granted('ROLE_TRANSLATOR') %}
<a href="{{ EditInPlace.Href }}">{{ EditInPlace.Text }}</a>
{% endif %}
Добавьте новые ключи в файлы перевода и все готово. параметр запроса trans=do
включается и выключается при каждом нажатии на ссылку. Вы даже можете добавить переключаемые стили с именем класса, просто скопируйте метод getText
в что-то вроде getClass
и верните строку a
или b
с троичным.