Супер простой фреймворк 301 редирект с маршрутов Symfony
Я пытаюсь построить супер простой фреймворк. Я не хочу использовать constrollers... в основном все работает хорошо, и это хорошее начало для простых сайтов, но я хочу еще одну функцию, с которой у меня есть проблемы.
Я стараюсь найти максимально простое решение для добавления в страницы маршрутов с 301 редиректом. Например, я хочу /facebook с 301 до http://facebook.com/example.
Вот мой код... index.php ниже:
<?php
require_once __DIR__.'/../vendor/autoload.php';
$dotenv = new Dotenv\Dotenv(__DIR__.'/../');
$dotenv->load();
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing;
$request = Request::createFromGlobals();
$routes = include __DIR__.'/../routes/web.php';
$context = new Routing\RequestContext();
$context->fromRequest($request);
$matcher = new Routing\Matcher\UrlMatcher($routes, $context);
try {
extract($matcher->match($request->getPathInfo()), EXTR_SKIP);
ob_start();
include sprintf(__DIR__.'/../resources/views/%s.php', $_route);
$response = new Response(ob_get_clean());
} catch (Routing\Exception\ResourceNotFoundException $e) {
$response = new Response();
$response->setStatusCode(404);
include __DIR__.'/../resources/views/errors/404.php';
} catch (Exception $e) {
$response = new Response();
$response->setStatusCode(500);
include __DIR__.'/../resources/views/errors/500.php';
}
$response->send();
И мой код route.php:
<?php
use Symfony\Component\Routing;
$routes = new Routing\RouteCollection();
// 200
$routes->add('index', new Routing\Route('/'));
$routes->add('index', new Routing\Route('/about'));
$routes->add('index', new Routing\Route('/contact'));
// 301
// redirect from /facebook to -> http://facebook.com/example
// redirect from /twitter to -> http://twitter.com/example
return $routes;
Теперь я могу сделать конкретный файл для этого маршрута, как и для других, и внутри этого файла я могу добавить перенаправление заголовка php... но это утомительный подход. Что я могу сделать, чтобы определить это перенаправление внутри маршрутов напрямую?
1 ответ
В вашем случае вы можете сделать следующее:
//routes.php
use Symfony\Component\HttpFoundation\RedirectResponse;
$permanentRedirect = function ($url) {
return new RedirectResponse($url, 301);
};
//...
$routes->add('facebook', new Routing\Route('/facebook', array(
'_controller' => $permanentRedirect,
'url' => 'http://facebook.com/example',
)));
//...
return $routes;
Далее в вашем index.php
:
//...
try {
extract($matcher->match($request->getPathInfo()), EXTR_SKIP);
if (isset($_controller) && isset($url)) {
$response = call_user_func($_controller, $url);
} else {
ob_start();
include sprintf(__DIR__.'/../resources/views/%s.php', $_route);
$response = new Response(ob_get_clean());
}
} catch (Routing\Exception\ResourceNotFoundException $e) {
//...
} catch (Exception $e) {
//...
}