Symfony URL Manipulation

From Chorke Wiki
Jump to navigation Jump to search

Some times it's very needy to Manipulate URL base on different condition. This example presents how to manipulate URL

namespace Chorke\Bundle\WebappBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

/**
 * @Template
 * @Route("/home")
 */
class HomeController extends Controller
{
    private $lingos;
    private $locals;

    public function __construct()
    {
        $lingos = "ar|bn|en|fr|tk|zz";
        $this->lingos = str_replace("|zz", "", $lingos);
        $this->locals = explode('|', $this->lingos);
    }

    /**
     * @Route("/{_locale}",
     *  name="home_index", defaults={"_locale"="zz"},
     *  requirements={"_locale"="ar|bn|en|fr|tk|zz"})
     */
    public function indexAction($_locale)
    {
        if(!$this->hasLocal($_locale))
        {
            return $this->redirectToLocal('home_index');
        }
        $parameters = array(
           'locale'   => $_locale,
           'javapull' => $this->getAbsolutePath('java_pull'),
           'zendpull' => $this->getAbsolutePath('zend_pull')
        );
        return $parameters;
    }

    private function hasLocal($locale)
    {
        return in_array($locale, $this->locals);
    }

    private function redirectToLocal($route)
    {
        $parameters = array('_locale' => 'en');
        return $this->redirectToRoute($route, $parameters, Response::HTTP_TEMPORARY_REDIRECT);
    }

    private function getAbsolutePath($route, $parameters=array())
    {
       $absolutePath = $this->generateUrl(
          $route, $parameters, UrlGeneratorInterface::ABSOLUTE_URL
       );
       return $absolutePath;
    }

    private function getContextPath(Request $request)
    {
        $server = $this->getServerPath($request);
        $base   = $request->getBasePath();
        $contextPath = "{$server}{$base}";
        return $contextPath;
    }

    private function getServerPath(Request $request)
    {
       $scheme = $request->getScheme();
       $host   = $request->getHost();
       $port   = $request->getPort();
       
       $isDefaultHttp  = ($scheme == 'http' ) && ($port ==  80);
       $isDefaultHttps = ($scheme == 'https') && ($port == 443);
       $port = ($isDefaultHttp||$isDefaultHttps) ? '' : ":{$port}";
       $serverPath = "{$scheme}://{$host}{$port}";
       return $serverPath;
    }

}