Điểm:5

Tóm lại, làm cách nào tôi có thể phân biệt giữa người dùng web và người dùng JSON:API?

lá cờ cn

Tôi có một trang web Drupal cũng lưu trữ ứng dụng Ionic qua JSON:API. Tôi muốn người dùng trang web được chuyển hướng khi chèn thực thể, vì vậy tôi đã thêm một chuyển hướng như sau:

function MYMODULE_flagging_insert(FlaggingInterface $flagging) {
  $redirect_url = Url::fromRoute(MYCLASS::SECRET_ROUTE)->toString();
  $response = new RedirectResponse($url);
  $ phản hồi-> gửi();
}

Mã này sẽ chuyển hướng người dùng web như mong đợi khi họ thêm cờ. Tuy nhiên, mã này phá vỡ ứng dụng JSON:API. Khi tôi thêm cờ có người dùng từ JSON:API, tôi gặp lỗi này:

    RuntimeException: Không thể bắt đầu phiên vì các tiêu đề đã được gửi bởi "/app/vendor/symfony/http-foundation/Response.php" ở dòng 384.trong Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage->start() (dòng 152 của /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, true)
#5 /app/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(106): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#6 /app/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(85): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#7 /app/vendor/asm89/stack-cors/src/Asm89/Stack/Cors.php(60): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, thật)
#8 /app/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(47): Asm89\Stack\Cors->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#9 /app/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(52): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#10 /app/vendor/stack/builder/src/Stack/StackedHttpKernel.php(23): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#11 /app/web/core/lib/Drupal/Core/DrupalKernel.php(716): Stack\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#12 /app/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#13 {chính}

Vậy có cách nào để phát hiện trong hook chèn (hoặc các hook khác) xem người dùng có đăng nhập thông qua trang web Drupal hay thông qua JSON:API không?

Tôi muốn thêm chuyển hướng nếu người dùng đang truy cập Drupal thông qua trang web, nhưng tôi không muốn sử dụng chuyển hướng nếu người dùng đang truy cập Drupal thông qua ứng dụng.

No Sssweat avatar
lá cờ ua
Có lẽ bạn có thể phân biệt bằng cách kiểm tra xem họ đang sử dụng trình duyệt nào? Xem [Cách lấy tên và phiên bản trình duyệt chính xác?](https://stackoverflow.com/questions/8754080/how-to-get-exact-browser-name-and-version/8754134)
lá cờ cn
@NoSssweat Tôi đang sử dụng khung Ionic cho ứng dụng của mình, hiển thị nội dung trong chế độ xem web. Vì vậy, chuỗi trình duyệt sẽ giống nhau đối với người dùng ứng dụng dành cho thiết bị di động và người dùng truy cập trang web thông qua thiết bị di động của họ.
apaderno avatar
lá cờ us
`hook_entity_insert()` là hook sai để chuyển hướng người dùng. Nó giả định rằng người dùng đang tạo một thực thể từ giao diện người dùng, nhưng không phải lúc nào cũng vậy, vì hook cũng sẽ được gọi khi thực thể được tạo theo chương trình. Lỗi tương tự là chuyển hướng người dùng trong `hook_entity_view()`, lỗi này cũng được gọi khi các tác vụ định kỳ chạy: Đó là hook được sử dụng từ mô-đun Tìm kiếm tới các nút chỉ mục.
Điểm:3
lá cờ cn

Sử dụng chuyển hướng với $ phản hồi-> gửi() như thế này được sử dụng để làm việc:

  $response = new RedirectResponse($url);
  $ phản hồi-> gửi();

Tuy nhiên, điều này không còn hoạt động trong Drupal 9.2. Ngoài ra, nó phá vỡ JSON:API trong các phiên bản trước 9.2. Cách chính xác để làm điều đó được mô tả chi tiết trong câu trả lời tuyệt vời này.

Về cơ bản, bạn cần tạo tùy chỉnh của riêng mình http_middleware để xử lý các chuyển hướng. Từ http_middleware chỉ áp dụng cho các yêu cầu http/web, nó không can thiệp vào JSON:API, vì vậy vấn đề đã được giải quyết.

4uk4 avatar
lá cờ cn
Cách tiếp cận này có thể hoạt động trong yêu cầu POST cụ thể này, nhưng trong yêu cầu GET Drupal bình thường, tôi sẽ sử dụng TrustedRedirectResponse có thể lưu trong bộ nhớ cache càng sớm càng tốt. Ví dụ: nếu nó chỉ phụ thuộc vào người dùng được xác thực trong người đăng ký sự kiện yêu cầu ngay sau khi xác thực xảy ra. Hoặc trong trường hợp ngoại lệ hoặc người đăng ký sự kiện phản hồi nếu bạn cần đợi cho đến khi một ngoại lệ được nêu ra hoặc phản hồi được tạo.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.