it-blaster/redirect-bundle

Auxiliary Symfony2 bundle. Perenapravlenie from the pages of the old site to the new site page.


Keywords
symfony, redirect, forward
License
MIT

Documentation

RedirectBundle

Build Status Scrutinizer Code Quality

Вспомогательный бандл для работы с редиректами на сайте. Если у вас был старый сайт, а теперь вы переехали на новый сайт, написанный на symfony 2, и вы хотите чтобы по старым ссылкам открывались страницы нового сайта, то этот бандл для вас.

Installation

Добавьте ItBlasterRedirectBundle в composer.json:

{
    "require": {
        "it-blaster/redirect-bundle": "dev-master"
    },
}

Теперь запустите композер, чтобы скачать бандл командой:

$ php composer.phar update it-blaster/redirect-bundle

Композер установит бандл в папку проекта vendor/it-blaster/redirect-bundle.

Далее подключите бандл в ядре AppKernel.php:

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new ItBlaster\RedirectBundle\ItBlasterRedirectBundle(),
    );
}

Use redirect in models

С помощью RedirectBundle редиректы можно добавлять в формы редактирования сущностей. Для этого необходимо: 1. указать в файле config.yml параметр it_blaster_redirect.use_model

it_blaster_redirect:
    locales: ['ru', 'en','uk','cs']
    use_model: true
  1. подключить бихейвор RedirectBehavior в config.yml
 propel:
     ...
     behaviors:
         ...
         it_blaster_redirect: ItBlaster\RedirectBundle\Behavior\RedirectBehavior
  1. в файле schema.yml добавить бихейвор it_blaster_redirect к описанию молели:
    <table name="news" description="Новости">
        <column name="id"                   type="integer"  required="true" primaryKey="true" autoIncrement="true" />
        <column name="title"                type="varchar"  required="true" primaryString="true" />
        <column name="alias"                type="varchar"  required="true" />
        <column name="date"                 type="date"     required="true" />
        <column name="short_desc"           type="longvarchar" />
        <column name="full_desc"            type="longvarchar" />
        <column name="active"               type="boolean" />

        <behavior name="i18n">
            <parameter name="i18n_columns" value="title, short_desc, full_desc" />
        </behavior>

        <behavior name="it_blaster_redirect" >
            <parameter name="i18n" value="false" />
        </behavior>
    </table>

    <table name="news_i18n" description="Новости. Языковые версии">
        <behavior name="it_blaster_redirect" >
            <parameter name="i18n" value="true" />
        </behavior>
    </table>

Use Redirect

Для начала необходимо переопределить контроллер 404 ошибки. Для этого в файле config.yml

twig:
    exception_controller: AppMainBundle:Layout:showException

Далее в методе showException контроллера Layout перед тем как отдать 404-страницу проверяем есть ли текущий адрес в таблице редиректов:

    public function showExceptionAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null)
    {
        $redirect = $this->oldRedirect($request, $exception);
        if ($redirect) {
            return $this->redirect($redirect);
        }
        ...
    }

    /**
     * Если ссылка пользователя ведёт на старый сайт, редиректим на новый сайт
     *
     * @param Request $request
     * @param FlattenException $exception
     */
    protected function oldRedirect(Request $request, FlattenException $exception)
    {
        $redirect_object = RedirectQuery::create()
            ->filterByOldUrl('%'.$request->getUri().'%', \Criteria::LIKE)
            ->findOne();
        if ($redirect_object) { //ща средиректим
            return $redirect_object->getNewUrl(); //адрес на указанную ссылку
        }
    }

Если у вас стоит параметр use_model: true, то в операторе if ($redirect_object) { необходимо добавить проверку if ($redirect_object->getNewUrl()) {. Если этот оператор не выполняется, то смотреть на поля model, object_id и пытаться средиректить на страницу объекта. Например:

    protected function oldRedirect(Request $request, FlattenException $exception)
    {
        $redirect_object = RedirectQuery::create()
            ->filterByOldUrl('%'.$request->getUri().'%', \Criteria::LIKE)
            ->findOne();
        if ($redirect_object) { //ща средиректим
            if ($redirect_object->getNewUrl()) {
                return $redirect_object->getNewUrl(); //адрес на указанную ссылку
            } else {
                $model = $redirect_object->getModel();
                $object_id = $redirect_object->getObjectId();
                if ($model && $object_id) {
                    $route_name = false;
                    $route_params = array();
                    switch ($model) {
                        case 'news_i18n':
                            $object = NewsQuery::create()->findOneById($object_id);
                            if ($object) {
                                $route_name = 'news-item';
                                $route_params = array('alias'=>$object->getAlias());
                            }
                            break;
                        ...
                    }
                    if ($route_name) {
                        return $this->generateUrl($route_name, $route_params); //адрес на объект
                    }
                }
            }
        }
        return false;
    }

Credits

It-Blaster it-blaster@yandex.ru