Вспомогательный бандл для работы с редиректами на сайте. Если у вас был старый сайт, а теперь вы переехали на новый сайт, написанный на symfony 2, и вы хотите чтобы по старым ссылкам открывались страницы нового сайта, то этот бандл для вас.
Добавьте 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(),
);
}
С помощью RedirectBundle редиректы можно добавлять в формы редактирования сущностей. Для этого необходимо:
- указать в файле
config.yml
параметрit_blaster_redirect.use_model
it_blaster_redirect:
locales: ['ru', 'en','uk','cs']
use_model: true
- подключить бихейвор
RedirectBehavior
вconfig.yml
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
Далее в методе 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;
}
It-Blaster it-blaster@yandex.ru