Điểm:2

Trong người đăng ký sự kiện, cách chuyển hướng nếu giá trị không tồn tại?

lá cờ zw

Tôi đang cố kiểm tra một điều kiện trước khi tải trang, nếu có giá trị để tải trang nếu không để chuyển hướng.

tôi đang theo dõi cái này trang

Tôi đã tạo tệp /mymodule/mymodule.services.yml và tệp /mymodule/src/MyModuleSubscriber.php.

Trong MyModuleSubscriber.php, tôi muốn kiểm tra xem một giá trị có tồn tại hay không, nếu nó tải trang web như bình thường, nếu giá trị không tồn tại để thực hiện chuyển hướng.

Đây là mã, nhưng không chắc chắn làm thế nào để viết nó một cách chính xác. Tôi có cần đặt một câu lệnh khác hay chỉ để trống?

Đây có phải là cách chính xác để kiểm tra giá trị tồn tại trên mỗi lần tải trang không?

lớp MyModuleSubscriber triển khai EventSubscriberInterface {

      chức năng công khai checkForRedirect(GetResponseEvent $event) {

          $baseUrl = $event->getRequest()->getBaseUrl();

          nếu($value == null &&
             $baseURL !== '/MyModulePage') {
              $event->setResponse(RedirectResponse mới($baseUrl.'/MyModulePage'));
          }
      }


  /**
   * {@inheritdoc}
   */
  hàm tĩnh getSubscribeEvents() {
    $events[KernelEvents::REQUEST][] = array('MyModuleLoad', 200);
    trả lại sự kiện $;
  }
}

Chỉnh sửa:

      $path = \Drupal::service('path.current')->getPath();

      if($path !== '/MyModulePage') {
          $event->setResponse(RedirectResponse mới('/MyModulePage'));
      }
May  avatar
lá cờ zw
Chỉnh sửa: đã cập nhật mã. Điều gì sẽ xảy ra nếu khách truy cập không vào /MyModulePage để chuyển hướng họ đến /MyModulePage. Nhưng không có gì đang xảy ra.
4uk4 avatar
lá cờ cn
Dịch vụ `path.current` được cập nhật trong quá trình định tuyến, ngay từ đầu bạn phải lấy đường dẫn từ `$event->getRequest()->getPathInfo()`.
May  avatar
lá cờ zw
Xin chào, vẫn không hoạt động. Tôi nghĩ rằng đó là một vấn đề bộ nhớ đệm? Nó hoạt động một số lần, những lần khác thì không. Thay vào đó, tôi có cần chạy trên phần mềm trung gian không hay tôi chỉ cần cập nhật mã. Về cơ bản, tôi cần kiểm tra câu lệnh if trên mỗi lần tải trang. Cảm ơn
4uk4 avatar
lá cờ cn
Câu trả lời của tôi giải thích cách Drupal làm cho các chuyển hướng có thể lưu vào bộ nhớ cache. Nếu bạn khăng khăng rằng mã của bạn chạy trên mỗi lần tải trang, điều đó thực tế có nghĩa là bạn hoàn toàn không muốn lưu vào bộ đệm chuyển hướng, thì trước tiên bạn phải quan tâm đến bộ nhớ đệm của trình duyệt, chúng chuyển hướng vào bộ đệm khá tích cực và thứ hai là bạn phải tắt Bộ đệm trang nội bộ. Xem [bình luận](https://drupal.stackexchange.com/questions/278698/disabling-page-cache-for-redirect-response/278703#comment346356_278698) về chủ đề mà tôi đã liên kết ở cuối câu trả lời.
Điểm:4
lá cờ cn

Vâng, đây là một cách tiếp cận chính xác. Bạn không cần một tuyên bố khác. Nếu bạn không đặt phản hồi, quá trình lan truyền sự kiện sẽ không dừng lại và những người đăng ký sự kiện có mức độ ưu tiên thấp hơn sẽ có cơ hội đặt phản hồi. Mức độ ưu tiên phụ thuộc vào giá trị $. Câu hỏi của bạn không rõ ràng, nhưng nếu nó không phụ thuộc vào bất kỳ điều gì cụ thể của Drupal thì hãy đặt mức độ ưu tiên> 300.

Phương pháp hay nhất là sử dụng phản hồi có thể lưu trong bộ nhớ cache và thêm bất kỳ phần phụ thuộc nào của giá trị $ vào phản hồi. Nếu bạn không có thì vẫn sử dụng phản hồi này. Nó nói với Drupal rằng bạn ổn với việc nó được lưu trong bộ nhớ cache theo cách bạn muốn chuyển hướng đường dẫn này.

Ví dụ:

lõi/lib/Drupal/Core/EventSubscriber/RedirectLeadingSlashesSubscriber.php

<?php

không gian tên Drupal\Core\EventSubscriber;

sử dụng Drupal\Core\Cache\CacheableRedirectResponse;
sử dụng Symfony\Thành phần\HttpKernel\Sự kiện\RequestEvent;
sử dụng Symfony\Thành phần\HttpKernel\KernelEvents;
sử dụng Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Chuyển hướng các đường dẫn bắt đầu bằng nhiều dấu gạch chéo thành một dấu gạch chéo.
 */
lớp RedirectLeadingSlashesSubscriber triển khai EventSubscriberInterface {

  /**
   * Chuyển hướng các đường dẫn bắt đầu bằng nhiều dấu gạch chéo thành một dấu gạch chéo.
   *
   * @param \Symfony\Component\HttpKernel\Event\RequestEvent $event
   * RequestEvent để xử lý.
   */
  chuyển hướng chức năng công khai (RequestEvent $event) {
    $request = $event->getRequest();
    // Lấy đường dẫn yêu cầu trừ đi đường dẫn cơ sở.
    $path = $request->getPathInfo();

    // Không thể tạo liên kết hoặc định tuyến đến đường dẫn bắt đầu bằng
    // nhiều dấu gạch chéo đầu. Tuy nhiên, nếu một biểu mẫu được thêm vào trang 404
    // gửi lại cùng một URI, điều này thể hiện một chuyển hướng mở
    // lỗ hổng. Ngoài ra, Drupal 7 hiển thị cùng một trang cho
    // http://www.example.org/foo và http://www.example.org////foo.
    if (strpos($path, '//') === 0) {
      $path = '/' . ltrim($path, '/');
      $qs = $request->getQueryString();
      nếu ($qs) {
        $qs = '?' . $qs;
      }
      $event->setResponse(new CacheableRedirectResponse($request->getUriForPath($path) . $qs));
    }
  }

  /**
   * {@inheritdoc}
   */
  hàm tĩnh công khai getSubscribeEvents() {
    $events[KernelEvents::REQUEST][] = ['chuyển hướng', 1000];
    trả lại sự kiện $;
  }

}

Nếu giá trị $ là dành riêng cho Drupal, chẳng hạn như bạn lấy nó từ một thực thể, hãy sử dụng mức độ ưu tiên mặc định là 0 và đặt thực thể đó làm phần phụ thuộc vào bộ đệm. Trong trường hợp này, bạn cần đặt các tiêu đề phản hồi để ngăn trình duyệt lưu vào bộ nhớ đệm kết quả chuyển hướng cho đường dẫn này. Sử dụng LocalRedirectResponse cho địa phương hoặc TrustedRedirectResponse cho các URL bên ngoài. Xem câu trả lời tuyệt vời này Vô hiệu hóa bộ đệm trang cho phản hồi chuyển hướng

May  avatar
lá cờ zw
Xin chào @4k4 Tôi đã cập nhật bài đăng của mình. Điều gì sẽ xảy ra nếu khách truy cập không truy cập MyModulePage để được chuyển hướng đến MyModulePage.Tuy nhiên không có gì đang xảy ra. Cảm ơn

Đă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.