เรากำลังใช้ ประวัติโดยย่อ โมดูล และฉันกำลังพยายามซ่อนแท็บเมนูในบัญชีของผู้ใช้สำหรับผู้ใช้บางรายตามค่าของฟิลด์ผู้ใช้
ฉันมีชุด alterRoute
เนมสเปซ Drupal\mymodule\Routing;
ใช้ Drupal\Core\Routing\RouteSubscriberBase;
ใช้ Symfony\Component\Routing\RouteCollection;
/**
* ฟังเหตุการณ์เส้นทางแบบไดนามิก
*/
คลาส RouteSubscriber ขยาย RouteSubscriberBase {
/**
* {@inheritdoc}
*/
ฟังก์ชันที่ได้รับการป้องกัน alterRoutes (RouteCollection $collection) {
// เปลี่ยนการเข้าถึงสำหรับเส้นทาง '/user/%/myprofile'
ถ้า ($route = $collection->get('profile.user_page.single')) {
$route->setRequirement('_custom_access', 'Drupal\mymodule\Access\ProfileAccessCheck::access');
}
}
}
ฉันได้สร้างบริการในไฟล์ mymodule.services.yml
บริการ:
mymodule.route_subscriber:
คลาส: Drupal\mymodule\Routing\RouteSubscriber
แท็ก:
- { ชื่อ: event_subscriber }
mymodule.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 $บัญชี
* บัญชีที่เข้าสู่ระบบในปัจจุบัน
* @param \Drupal\user\UserInterface $user
* บัญชีผู้ใช้
*/
การเข้าถึงฟังก์ชั่นสาธารณะ (AccountInterface $account, $user) {
$user_access = $user->access('ดู', $account, TRUE);
ถ้า (!$user_access->ได้รับอนุญาต()) {
// บัญชีไม่สามารถเข้าถึงหน้าบัญญัติของผู้ใช้
// ("/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)
ถ้าฉันลบการเข้าถึงนั้น $user->การเข้าถึง
บรรทัดแล้วฉันได้รับข้อผิดพลาดนี้:
ประกาศ: คุณสมบัติที่ไม่ได้กำหนด: Drupal\Core\Session\AccountProxy::$field_pro_profile ใน Drupal\mymodule\Access\ProfileAccessCheck->access() (บรรทัดที่ 26 ของ modules/custom/mymodule/src/Access/ProfileAccessCheck.php)
ฉันยังได้รับข้อผิดพลาดนี้ในหน้าอื่นๆ บางหน้า เช่น หน้าเปิด/ปิดโมดูล /ผู้ดูแลระบบ/โมดูล
:
RuntimeException: "Drupal\mymodule\Access\ProfileAccessCheck::access" ที่เรียกได้ต้องใช้ค่าสำหรับอาร์กิวเมนต์ "$user" ใน Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (บรรทัดที่ 142 ของ core/lib/Drupal/Component/Utility/ArgumentsResolver.php)
เหตุใดฉันจึงเข้าถึงวัตถุผู้ใช้ไม่ได้ ฉันพลาดอะไรไป นอกจากนี้ ดูเหมือนว่าจะลบล้างการเข้าถึงจากโมดูลโปรไฟล์ วิธีที่ถูกต้องเพื่อให้แน่ใจว่าฉันเรียกฟังก์ชันการเข้าถึงโมดูลเดิมด้วยคืออะไร เนื่องจากไม่ส่งคืนแท็บหากฉันทำ AccessResult::neutral(); มันซ่อนแท็บทั้งหมดที่ตรงกับ user/%/%