Lograr que cakephp soporte subdominios

Hola a todos, por si algunos no lo sabian cakePHP no es muy bueno a la hora de manejar urls con subdominio, en este post voy a escribir sobre como hacer posible manejar subdominios haciendo la menor cantidad de modificaciones posibles.

Basicamente la idea es que pase el subdominio por el named parameter subdomain. Todo esto sin tocar el .htaccess

Para esta solucion necesitamos poner unas pocas lineas en el config/bootstrap.php , otras en el config/routes.php (ya que hay que agregar el domain a las rutas), luego agregamos una constante en webroot/index.php y finalmente usar un nuevo htmlhelper para hacer links correctamente que por supuesto extiende de htmlhelper

Primero:

En el archivo config/bootstrap.php agrega al final:
(Recuerda cambiar test.domain.com por el nombre de tu dominio ejemplo: miweb.com tambien puedes usar un subdominio, es importante que siempre lo escribas en minusculas)

// sub domain in lower
define('MYDOMAIN','test.larompe.com.ar');

if(!isset($_GET['url']))$_GET['url']='';

$token=parse_url($_SERVER['SERVER_NAME']);
if((($pos=strpos($token['path'],MYDOMAIN))>0)){
$subdomain=strtolower(substr($token['path'],0,$pos-1));

}else{
$subdomain='www'

}
$_GET['url']=$subdomain.'/'.$_GET['url'];

Segundo

Vas a tener que modificar las rutas de tu aplicacion, estas se encuentran en config/routes.php

Ejemplo;

La ruta;
Router::connect(‘/’, array(‘controller’ => ‘pages’, ‘action’ => ‘display’, ‘home’));

Pasa a llamarse;
Router::connect(‘/:subdomain/’, array(‘controller’ => ‘pages’, ‘action’ => ‘display’, ‘home’),array(‘subdomain’));

Finalmente tenemos que atrapar los /controller /controller/action;
Router::connect(‘/:subdomain/:controller/:action/*’, array(‘subdomain’));
Router::connect(‘/:subdomain/:controller/*’, array(‘subdomain’));

Recuerda que por defecto si el subdominio no esta seteado pone www, osea que las rutas para la aplicacion principal es;
Router::connect(‘/www/users/*’, array(‘controller’=>’users’,’action’=>’index’));

Tercero

Agregar la siguiente linea al principio de webroot/index.php

define(‘WEBROOT_DIR’, ‘/’);

Cuarto

Crea el helper HtmlSubdomain, para ello crea el archivo views/helpers/html_subdomain.php


<?php
class HtmlSubdomainHelper extends HtmlHelper{
function link($title, $url = null, $options = array(), $confirmMessage = false) {
$escapeTitle = true;
if ($url !== null) {
$url = $this->url($url);
}
return parent::link($title,$url,$options,$confirmMessage);
}
function url($url=null,$full=false){
if(is_array($url)){
if(!isset($url['subdomain'])) $url['subdomain'] = 'www';
$subdomain=$url['subdomain'];
$url=parent::url($url);
$pos=strpos($url,'/'.$subdomain.'/')+strlen('/'.$subdomain);
$url=substr($url,$pos);
return 'http://'.$subdomain.'.'.MYDOMAIN.$url;
}
return parent::url($url,$full);
}
}

Por ultimo

Debes recordar agregar el Helper HtmlSubdomain para crear los links en tu vista, ejemplo;

echo $this->HtmlSubdomain->link(‘hola’,array(‘controller’=>’pages’,’view’=>’display’,’home’,’subdomain’=>’subdom1′);

Anuncios

2 thoughts on “Lograr que cakephp soporte subdominios

  1. hola ..interesante articulo pero sabes soy nuevo.podrias darme o publicar la estructura de tus carpetas,,, para ver como manejas los subdominios

    saluos gracias

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s