2016-09-05 4 views
1

私はスーパーシンプルなフレームワークを構築しようとしています。私はconstrollersを使用したくない...基本的にすべてがうまくいく、これは簡単なWebサイトの素晴らしいスタートですが、私は問題があるもう一つの機能が欲しいです。symfonyのルートからリダイレクトされたシンプルなフレームワーク301

私は可能な限り単純な解決策を得て、ルートページに301のリダイレクトを追加します。たとえば、301/http://facebook.com/exampleの/ facebookが必要です。ここで

は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(); 

そして、私のroutes.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リダイレクトを追加することができます...しかし、これは面倒なアプローチです。ルート内のリダイレクトを直接定義するにはどうすればよいですか?あなたは次の操作を行うことができますあなたの場合は

答えて

2

:あなたのindex.php

//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; 

次に、:

//... 

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) { 
    //... 
} 
+0

はsymfony /フレームワーク・バンドルそれは大きなパッケージです。私はsymfony/http-foundationとsymfony/routingしか持っていませんがもう1つはOKですが、symfony/framework-bundleのものはすべて良い考えではありません。 Btw。それは私のtryメソッドでindex.phpで動作しますか?私はそうは思わない。 – Krystus

+0

はい、これは基本的に呼び出し可能な関数で動作します。 – yceruto

+0

警告:include(/home/vagrant/Web/example.com/public/../resources/view/twitter.php):ストリームを開くことに失敗しました:/ home/vagrant/Web/exampleにそのようなファイルやディレクトリはありません。 com/public/index.php on line 22 – Krystus

関連する問題