Как сконфигурировать перенаправление без пользовательского контроллера

Как сконфигурировать перенаправление без пользовательского контроллера

Иногда URL'у может понадобиться перенаправление на другой URL. Вы можете сделать это создав новое действие контроллера, единственной задачей которого будет перенаправление, но использовать RedirectController пакета FrameworkBundle даже легче.

Вы можете перенаправлять по определённому пути (например, /about) или по определённому маршруту, используя его имя (например, homepage).

Перенаправление с использованием пути

Представьте, что не существуем контроллера по умолчанию для пути / вашего приложения, и вы хотите перенаправить эти запросы на /app. Вам нужно будет использовать действие urlRedirectAction(), чтобы перенаправить по этому новому URL:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    # app/config/routing.yml
    
    # загрузите некоторые маршруты - один должен обязательно иметь путь "/app"
    AppBundle:
        resource: '@AppBundle/Controller/'
        type:     annotation
        prefix:   /app
    
    # перенаправление корня
    root:
        path: /
        defaults:
            _controller: FrameworkBundle:Redirect:urlRedirect
            path: /app
            permanent: true
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <!-- app/config/routing.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing
            http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <!-- загрузите некоторые маршруты - один должен обязательно иметь путь "/app" -->
        <import resource="@AppBundle/Controller/"
            type="annotation"
            prefix="/app"
        />
    
        <!-- перенаправление корня -->
        <route id="root" path="/">
            <default key="_controller">FrameworkBundle:Redirect:urlRedirect</default>
            <default key="path">/app</default>
            <default key="permanent">true</default>
        </route>
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // app/config/routing.php
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    
    // загрузите некоторые маршруты - один должен обязательно иметь путь "/app"
    $appRoutes = $loader->import("@AppBundle/Controller/", "annotation");
    $appRoutes->setPrefix('/app');
    
    $collection->addCollection($appRoutes);
    
    // перенаправление корня
    $collection->add('root', new Route('/', array(
        '_controller' => 'FrameworkBundle:Redirect:urlRedirect',
        'path'        => '/app',
        'permanent'   => true,
    )));
    
    return $collection;
    

В этом примере, вы сконфигурировали маршрут для пути / и позволили RedirectController перенаправить его на /app. Переключатель permanent сообщает действию выдать статус-код HTTP 301 вместо статус-кода HTTP 302 , установленного по умолчанию.

Перенаправление с использованием маршрута

Представьте, что вы переносите ваш веб-сайт с WordPress на Symfony, и вы хотите перенаправить /wp-admin по маршруту sonata_admin_dashboard. Вы не знаете пути, только имя маршрута. Этого можно достичь, используя действие redirectAction():

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    # app/config/routing.yml
    
    # ...
    
    # перенаправление админа домой (на домашнюю страницу)
    root:
        path: /wp-admin
        defaults:
            _controller: FrameworkBundle:Redirect:redirect
            route: sonata_admin_dashboard
            permanent: true
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    <!-- app/config/routing.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing
            http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <!-- ... -->
    
        <!-- перенаправление админа домой (на домашнюю страницу) -->
        <route id="root" path="/wp-admin">
            <default key="_controller">FrameworkBundle:Redirect:redirect</default>
            <default key="route">sonata_admin_dashboard</default>
            <default key="permanent">true</default>
        </route>
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    // app/config/routing.php
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    // ...
    
    // перенаправление корня
    $collection->add('root', new Route('/wp-admin', array(
        '_controller' => 'FrameworkBundle:Redirect:redirect',
        'route'       => 'sonata_admin_dashboard',
        'permanent'   => true,
    )));
    
    return $collection;
    

Caution

Так как вы перенаправляете к корню, а не к пути, обязательная опция в действии redirect() называется route, вместо опции path в действии urlRedirect().

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.