chúng tôi đang sử dụng Hồ sơ mô-đun và tôi đang cố ẩn tab menu trên tài khoản của người dùng đối với một số người dùng nhất định dựa trên giá trị của một trường trên người dùng.
Tôi có bộ alterRoute.
không gian tên Drupal\mymodule\Routing;
sử dụng Drupal\Core\Routing\RouteSubscriberBase;
sử dụng Symfony\Component\Routing\RouteCollection;
/**
* Lắng nghe các sự kiện tuyến đường năng động.
*/
lớp RouteSubscriber mở rộng RouteSubscriberBase {
/**
* {@inheritdoc}
*/
chức năng được bảo vệ alterRoutes(RouteCollection $collection) {
// Thay đổi quyền truy cập cho đường dẫn '/user/%/myprofile'.
if ($route = $collection->get('profile.user_page.single')) {
$route->setRequirement('_custom_access', 'Drupal\mymodule\Access\ProfileAccessCheck::access');
}
}
}
Tôi đã tạo các dịch vụ trong tệp mymodule.services.yml.
dịch vụ:
mymodule.route_subscriber:
lớp: Drupal\mymodule\Routing\RouteSubscriber
thẻ:
- { tên: event_subscriber }
mymodule.profile_access_checker:
lớp: Drupal\mymodule\Access\ProfileAccessCheck
thẻ:
- { name: access_check, apply_to: _custom_access }
Và đây là ProfileAccessCheck.php của tôi
không gian tên Drupal\mymodule\Access;
sử dụng Drupal\Core\Access\AccessResult;
sử dụng Drupal\Core\Routing\Access\AccessInterface;
sử dụng Drupal\Core\Session\AccountInterface;
sử dụng Symfony\Component\Routing\Route;
sử dụng Drupal\user\UserInterface;
/**
* Kiểm tra xem loại cấu hình có cho phép nhiều cấu hình trên mỗi người dùng hay không.
*/
lớp ProfileAccessCheck triển khai AccessInterface {
/**
* Kiểm tra quyền truy cập cho một/nhiều trang.
*
* @param \Drupal\Core\Session\AccountInterface $account
* Tài khoản hiện đang đăng nhập.
* @param \Drupal\user\UserInterface $user
* Tài khoản người dùng.
*/
truy cập chức năng công khai(AccountInterface $account, $user) {
$user_access = $user->access('view', $account, TRUE);
if (!$user_access->isAllowed()) {
// Tài khoản không có quyền truy cập vào trang chuẩn của người dùng
// ("/user/{user}"), cũng không cho phép truy cập vào bất kỳ trang phụ nào.
trả về AccessResult::allowed();
}
if(!empty($account->field_pro_profile->getValue()) && $account->field_pro_profile->getValue() == 'Disable') {
trả về AccessResult::forbidden();
}
trả về AccessResult::allowed();
}
}
Tôi có một vài vấn đề. Đầu tiên là, tôi gặp lỗi này:
Lỗi: Gọi hàm thành viên access() trên chuỗi trong Drupal\mymodule\Access\ProfileAccessCheck->access() (dòng 26 của mô-đun/tùy chỉnh/mymodule/src/Access/ProfileAccessCheck.php).
Nếu tôi xóa quyền truy cập đó $user->truy cập
dòng thì tôi gặp lỗi này:
Lưu ý: Thuộc tính không xác định: Drupal\Core\Session\AccountProxy::$field_pro_profile trong Drupal\mymodule\Access\ProfileAccessCheck->access() (dòng 26 của mô-đun/tùy chỉnh/mymodule/src/Access/ProfileAccessCheck.php).
Tôi cũng gặp lỗi này trên một số trang khác như trang bật/tắt mô-đun /admin/mô-đun
:
RuntimeException: "Drupal\mymodule\Access\ProfileAccessCheck::access" có thể gọi được yêu cầu một giá trị cho đối số "$user". trong Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (dòng 142 của core/lib/Drupal/Component/Utility/ArgumentsResolver.php).
Tại sao tôi không thể truy cập đối tượng người dùng, tôi đang thiếu gì? Ngoài ra, nó dường như ghi đè quyền truy cập từ mô-đun hồ sơ. Cách chính xác để đảm bảo rằng tôi cũng gọi chức năng truy cập mô-đun ban đầu là gì? Bởi vì nó không trả về các tab nếu tôi thực hiện AccessResult::neutral(); nó ẩn tất cả các tab phù hợp với người dùng/%/%