Kullanıcıları farklı bir sayfaya yönlendirmek için hangi işlevi / yöntemi kullanabilirim?


12

Drupal 7'de aşağıdaki kodu kullanıyorum.

function my_goto($path) { 
  drupal_goto($path, array(), 301);
}

Drupal 8'de hangi kodu kullanmalıyım?


3
drupal.org/node/2023537 , drupal_goto () için değişiklik kaydıdır, belirli bir işlevin yerini değiştirmeyi her aradığınızda önce oraya bakın.
— Berdir

Yanıtlar:



8

Anu Mathew'in cevabı üzerine inşa etmek için ;

Bir durum kodu eklemek için, bu kod RedirectResponse sınıfındaki ikinci parametredir;

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path, 302);
  $response->send();
  return;
}

1
Benim için bu sadece bir kez çalışıyor gibi görünüyor ve tekrar çalışmasını istediğiniz her zaman temizlenmiş önbellek gerekir. Bunun etrafında bir yol var mı?
— Matt


4

drupal_gotoDrupal 8'de henüz çalışmadım ama belgelere göre Drupal 8'den kaldırıldı.

Yerine drupal_gotoyazman gerek:

return new RedirectResponse(\Drupal::url('route.name'));

ve parametrelerle böyle bir şey:

return new RedirectResponse(\Drupal::url('route.name', [], ['absolute' => TRUE]));

Https://www.drupal.org/node/2023537 ve sınıf RedirectResponse'yi buradan kontrol edin


Cevabınız için teşekkürler.Ama geçerli url'den rota adını nasıl alabilirim (çünkü url yapılandırma formunu kullanarak ayarlanıyor)
— Anu Mathew

Yani yönlendirme yolu dinamik mi ???
— Sumit Madan

Evet, hakkınız dinamik ..
— Anu Mathew

Tamam \Drupal::url('route.name'), URL'nizle veya belki de mutlak URL'nizle değiştirmeyi deneyin .
— Sumit Madan

yeni RedirectResponse ($ absolute_url) döndür; benim için çalıştı :) Ama gösteren "yönlendirme etmektir example.com/absolute_url ekranda" mesajı
— Anu Mathew

4

Bu, yerleşik senfoni EventDispatcher Bileşeni kullanılarak sağlanabilir. Tek yapmanız gereken özel bir modül oluşturmak. Services.yml dosyanızı ekleyin ve uygun servis yapılandırmasını sağlayın.

services:
  mymodue.subscriber:
    class: Drupal\my_module\EventSubscriber
    tags:
      - { name: event_subscriber }

modül src dizininizde EventSubscriber.php sınıfınızı oluşturun ve yöntemleri burada açıklayın.

    <?php
       use Symfony\Component\HttpFoundation\RedirectResponse;

        public function checkForCustomRedirect(GetResponseEvent $event) {     
            $route_name = \Drupal::request()->attributes->get(RouteObjectInterface::ROUTE_NAME);
            if($route_name === 'module.testPage') {
              $event->setResponse(new RedirectResponse($url, $status = 302,$headers);
            }
         }

          /**
           * {@inheritdoc}
           */
        public static function getSubscribedEvents() {
            $events = [];
            $events[KernelEvents::REQUEST][] = array('checkForCustomRedirect');
            return $events;
        }

$ url tanımlanmadı.
— Dan Shumaker

1

Benim için mükemmel çalışan yönlendirme kodu şudur:

$response = new RedirectResponse($path);
return $response->send();

Diğer durumlarda, bazı istisnalar veya hatalar alıyorum, örneğin: LogicException: Denetleyici bir yanıt döndürmelidir ...

VEYA

https://www.drupal.org/project/drupal/issues/2852657

Bu konuda zaten bir tartışma var, umarım yardımcı olur!


0

dahili veya harici yönlendirme için çalışır:

use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\Core\Url;

   $url = Url::fromUri('internal:/node/27'); // choose a path
   // $url =  Url::fromUri('https://external_site.com/');
    $destination = $url->toString();
    $response = new RedirectResponse($destination, 301);
    $response->send();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.