Мы используем Профиль модуль, и я пытаюсь скрыть вкладку меню в учетной записи пользователя для определенных пользователей на основе значения поля для пользователя.
У меня есть набор alterRoute.
пространство имен Drupal\mymodule\Routing;
используйте Drupal\Core\Routing\RouteSubscriberBase;
используйте Symfony\Component\Routing\RouteCollection;
/**
* Слушает события динамического маршрута.
*/
класс RouteSubscriber расширяет RouteSubscriberBase {
/**
* {@inheritdoc}
*/
защищенная функция alterRoutes(RouteCollection $ collection) {
// Изменить доступ для пути '/user/%/myprofile'.
если ($ маршрут = $ коллекция-> получить ('profile.user_page.single')) {
$route->setRequirement('_custom_access', 'Drupal\mymodule\Access\ProfileAccessCheck::access');
}
}
}
Я создал службы в файле mymodule.services.yml.
Сервисы:
мой модуль.route_subscriber:
класс: Drupal\mymodule\Routing\RouteSubscriber
теги:
- {имя: event_subscriber}
мой модуль.profile_access_checker:
класс: Drupal\mymodule\Access\ProfileAccessCheck
теги:
- {имя: access_check, apply_to: _custom_access}
А вот мой ProfileAccessCheck.php
пространство имен Drupal\mymodule\Access;
используйте Drupal\Core\Access\AccessResult;
используйте Drupal\Core\Routing\Access\AccessInterface;
используйте Drupal\Core\Session\AccountInterface;
используйте Symfony\Component\Routing\Route;
используйте Drupal\user\UserInterface;
/**
* Проверяет, позволяет ли тип профиля использовать несколько профилей для каждого пользователя.
*/
класс ProfileAccessCheck реализует AccessInterface {
/**
* Проверяет доступ к одной/нескольким страницам.
*
* @param \Drupal\Core\Session\AccountInterface $account
* Текущая учетная запись.
* @param \Drupal\user\UserInterface $пользователь
* Учетная запись пользователя.
*/
доступ к общедоступной функции (AccountInterface $account, $user) {
$user_access = $user->access('view', $account, TRUE);
если (!$user_access->isAllowed()) {
// Аккаунт не имеет доступа к канонической странице пользователя
// ("/user/{user}"), также не разрешайте доступ ни к каким подстраницам.
вернуть AccessResult::allowed();
}
if(!empty($account->field_pro_profile->getValue()) && $account->field_pro_profile->getValue() == 'Отключить') {
вернуть AccessResult::forbidden();
}
вернуть AccessResult::allowed();
}
}
У меня есть пара проблем. Во-первых, я получаю эту ошибку:
Ошибка: вызов функции-члена access() для строки в Drupal\mymodule\Access\ProfileAccessCheck->access() (строка 26 из modules/custom/mymodule/src/Access/ProfileAccessCheck.php).
Если я удалю этот доступ $пользователь->доступ
строку, то я получаю эту ошибку:
Примечание: Неопределенное свойство: Drupal\Core\Session\AccountProxy::$field_pro_profile в Drupal\mymodule\Access\ProfileAccessCheck->access() (строка 26 модуля/custom/mymodule/src/Access/ProfileAccessCheck.php).
Я также получаю эту ошибку на некоторых других страницах, таких как страница включения/отключения модуля. /админ/модули
:
RuntimeException: Callable "Drupal\mymodule\Access\ProfileAccessCheck::access" требует значения для аргумента "$user". в Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (строка 142 core/lib/Drupal/Component/Utility/ArgumentsResolver.php).
Почему я не могу получить доступ к пользовательскому объекту, что мне не хватает? Кроме того, кажется, что он переопределяет доступ из модуля профиля. Каков правильный способ убедиться, что я также вызываю исходную функцию доступа к модулю? Потому что он не возвращает вкладки, если я делаю AccessResult::neutral(); он скрывает все вкладки, которые соответствуют user/%/%