it-blaster / redirect-bundle
辅助 Symfony2 扩展包。将旧站页面重定向到新站页面。
v1.0.0
2015-04-24 07:02 UTC
Requires
- propel/propel: ~2.0@dev
- propel/propel-bundle: >=1.4
- sonata-project/propel-admin-bundle: >=1.0
- symfony/symfony: >=2.2
This package is not auto-updated.
Last update: 2024-09-14 16:08:29 UTC
README
辅助网站重定向扩展包。如果您有旧网站,现在转移到使用 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 可以在实体编辑表单中添加重定向。为此,需要
- 在
config.yml
文件中指定参数it_blaster_redirect.use_model
it_blaster_redirect: locales: ['ru', 'en','uk','cs'] use_model: true
- 在
config.yml
中连接RedirectBehavior
行为
propel: ... behaviors: ... it_blaster_redirect: ItBlaster\RedirectBundle\Behavior\RedirectBehavior
- 在
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()) {
。如果该操作符未执行,则查看 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; }
鸣谢
It-Blaster it-blaster@yandex.ru