Score:5

ในเบ็ด ฉันจะแยกความแตกต่างระหว่างผู้ใช้เว็บกับผู้ใช้ JSON:API ได้อย่างไร

ธง cn

ฉันมีเว็บไซต์ Drupal ที่โฮสต์แอป Ionic ผ่าน JSON:API ฉันต้องการให้เปลี่ยนเส้นทางผู้ใช้เว็บไซต์ในการแทรกเอนทิตี ดังนั้นฉันจึงเพิ่มการเปลี่ยนเส้นทางดังนี้:

ฟังก์ชัน MYMODULE_flagging_insert (FlaggingInterface $flagging) {
  $redirect_url = Url::fromRoute(MYCLASS::SECRET_ROUTE)->toString();
  $response = ใหม่ RedirectResponse($url);
  $response->send();
}

รหัสนี้จะเปลี่ยนเส้นทางผู้ใช้เว็บตามที่คาดไว้เมื่อพวกเขาเพิ่มแฟล็ก อย่างไรก็ตาม รหัสนี้ทำให้แอป JSON:API เสียหาย เมื่อฉันเพิ่มการตั้งค่าสถานะกับผู้ใช้จาก JSON:API ฉันได้รับข้อผิดพลาดนี้:

    RuntimeException: ไม่สามารถเริ่มเซสชันได้เนื่องจากส่วนหัวถูกส่งไปแล้วโดย "/app/vendor/symfony/http-foundation/Response.php" ที่บรรทัด 384ใน Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage->start() (บรรทัดที่ 152 ของ /app/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php)
#0 /app/web/core/lib/Drupal/Core/Session/SessionManager.php(162): Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage->start()
#1 /app/web/core/lib/Drupal/Core/Session/SessionManager.php(193): Drupal\Core\Session\SessionManager->startNow()
#2 /app/vendor/symfony/http-foundation/Session/Session.php(189): Drupal\Core\Session\SessionManager->save()
#3 /app/web/core/lib/Drupal/Core/StackMiddleware/Session.php(60): Symfony\Component\HttpFoundation\Session\Session->save()
#4 /app/web/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(47): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, จริง)
#5 /app/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(106): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, จริง)
#6 /app/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(85): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, จริง)
#7 /app/vendor/asm89/stack-cors/src/Asm89/Stack/Cors.php(60): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, จริง)
#8 /app/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(47): Asm89\Stack\Cors->handle(Object(Symfony\Component\HttpFoundation\Request), 1, จริง)
#9 /app/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(52): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, จริง)
#10 /app/vendor/stack/builder/src/Stack/StackedHttpKernel.php(23): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, จริง)
#11 /app/web/core/lib/Drupal/Core/DrupalKernel.php(716): Stack\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, จริง)
#12 /app/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#13 {หลัก}

มีวิธีตรวจสอบใน hook แทรก (หรือ hooks อื่น ๆ ) ว่าผู้ใช้เข้าสู่ระบบผ่านเว็บไซต์ Drupal หรือผ่าน JSON:API หรือไม่

ฉันต้องการเพิ่มการเปลี่ยนเส้นทางหากผู้ใช้เข้าถึง Drupal ผ่านเว็บไซต์ แต่ฉันไม่ต้องการใช้การเปลี่ยนเส้นทางหากผู้ใช้เข้าถึง Drupal ผ่านแอป

No Sssweat avatar
ua flag
บางทีคุณอาจแยกแยะได้โดยตรวจสอบว่าพวกเขาใช้เบราว์เซอร์ใด ดู [วิธีรับชื่อเบราว์เซอร์และเวอร์ชันที่แน่นอน](https://stackoverflow.com/questions/8754080/how-to-get-exact-browser-name-and-version/8754134)
cn flag
@NoSssweat ฉันใช้ Ionic framework สำหรับแอปของฉัน ซึ่งแสดงเนื้อหาในมุมมองเว็บ ดังนั้นสตริงของเบราว์เซอร์จะเหมือนกันสำหรับผู้ใช้แอพมือถือและผู้ใช้ที่เข้าถึงเว็บไซต์ผ่านอุปกรณ์พกพา
apaderno avatar
us flag
`hook_entity_insert()` เป็น hook ที่ไม่ถูกต้องในการเปลี่ยนเส้นทางผู้ใช้ จะถือว่าผู้ใช้กำลังสร้างเอนทิตีจาก UI แต่ก็ไม่เป็นเช่นนั้นเสมอไป เนื่องจากจะมีการเรียกใช้ hook เมื่อมีการสร้างเอนทิตีด้วยโปรแกรม ข้อผิดพลาดที่คล้ายกันคือการเปลี่ยนเส้นทางผู้ใช้ใน `hook_entity_view()` ซึ่งถูกเรียกใช้เมื่อทำงาน cron ด้วย: เป็นเบ็ดที่ใช้จากโมดูลการค้นหาไปยังโหนดดัชนี
Score:3
ธง cn

ใช้การเปลี่ยนเส้นทางด้วย $response->send() เช่นนี้เคยทำงาน:

  $response = ใหม่ RedirectResponse($url);
  $response->send();

แต่สิ่งนี้ใช้ไม่ได้อีกต่อไปใน Drupal 9.2 นอกจากนี้ยังทำลาย JSON:API ในเวอร์ชันก่อน 9.2 วิธีการทำที่ถูกต้องมีรายละเอียดอยู่ใน คำตอบที่ยอดเยี่ยมนี้.

โดยพื้นฐานแล้ว คุณต้องสร้างแบบของคุณเอง http_middleware เพื่อจัดการกับการเปลี่ยนเส้นทาง เนื่องจาก http_middleware ใช้กับคำขอ http/web เท่านั้น ไม่รบกวน JSON:API ดังนั้นปัญหาจึงได้รับการแก้ไข

4uk4 avatar
cn flag
วิธีการนี้อาจใช้ได้กับคำขอ POST เฉพาะนี้ แต่ในคำขอ Drupal GET ปกติ ฉันจะใช้ TrustedRedirectResponse ที่แคชได้โดยเร็วที่สุด ตัวอย่างเช่น หากขึ้นอยู่กับผู้ใช้ที่ผ่านการรับรองความถูกต้องเท่านั้นในผู้สมัครสมาชิกเหตุการณ์คำขอทันทีหลังจากการรับรองความถูกต้องเกิดขึ้น หรือในผู้ติดตามเหตุการณ์ข้อยกเว้นหรือการตอบสนอง หากคุณจำเป็นต้องรอจนกว่าจะมีข้อยกเว้นเกิดขึ้นหรือมีการสร้างการตอบกลับ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา