it-blaster/redirect-bundle

辅助 Symfony2 扩展包。将旧站页面重定向到新站页面。

安装: 96

依赖者: 0

建议者: 0

安全性: 0

星标: 0

关注者: 6

分支: 0

开放问题: 0

类型:symfony-bundle

v1.0.0 2015-04-24 07:02 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:08:29 UTC


README

Build Status Scrutinizer Code Quality

辅助网站重定向扩展包。如果您有旧网站,现在转移到使用 Symfony 2 开发的新网站,并且希望使用旧链接打开新网站的页面,那么这个扩展包适合您。

安装

ItBlasterRedirectBundle 添加到 composer.json

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

现在运行 composer,使用命令下载扩展包

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

composer 将扩展包安装到项目文件夹 vendor/it-blaster/redirect-bundle 中。

接下来,在 AppKernel.php 中连接扩展包

<?php
// app/AppKernel.php

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

在模型中使用重定向

使用 RedirectBundle 可以在实体编辑表单中添加重定向。为此,需要

  1. config.yml 文件中指定参数 it_blaster_redirect.use_model
it_blaster_redirect:
    locales: ['ru', 'en','uk','cs']
    use_model: true
  1. config.yml 中连接 RedirectBehavior 行为
 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>

使用重定向

首先需要重写 404 错误控制器。为此,在 config.yml 文件中

twig:
    exception_controller: AppMainBundle:Layout:showException

接下来,在 Layout 控制器的 showException 方法中,在发送 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()) {。如果该操作符未执行,则查看 modelobject_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;
    }

鸣谢

It-Blaster it-blaster@yandex.ru