2011-04-23 9 views
5

me encontré con un comentario aquí: http://bakery.cakephp.org/articles/PHPdiddy/2006/10/06/custom-urls-from-the-site-rootCakePHP Nombre de usuario URL usando Regex?

Dicho esto:

Sólo cambia última línea.
Router :: connect ('/ ', array ('controller' => 'members', 'action' => 'show'));
a
Router :: connect ('?!. (Administrador | artículos | imágenes) (
*)', array ('controller' => 'miembros', 'action' => 'show'));

Algunas personas fueron capaces de conseguir que funcione ... No parecía del todo bien a mí, sin embargo lo que he intentado lo siguiente, pero todavía no tuvo suerte:

Router::connect('(?!/admin|/items|/images)(/.*)', 
array('controller' => 'members','action' => 'show')); 

En cualquier caso , el objetivo es tener una url como http://domainname/username, asignar a una identificación única de usuarios. Funciona con/*, pero prefiero no usar ese método. Ideas?

Actualización a la solución: Utilicé la respuesta seleccionada a continuación y agregué lo siguiente. Puede ser útil para otra persona.

$misc = array(*your misc webroot, admin route items here...*); 
$notList = array_merge(Configure::listObjects('plugin'),Configure::listObjects('controller')); 
$notListLowerCase = array(); 
foreach ($notList as $key=>$item): 
    $notListLowerCase[] = strtolower(preg_replace("/(.)([A-Z])/","\\1_\\2",$item)); 
endforeach; 
$notList = array_merge($notList,$misc,$notListLowerCase); 
$notList = implode('|', $notList); 

Router::connect('/:username', 
     array(
      'controller'=>'users', 
      'action'=>'view' 
     ), 
     array(
      'username' => '\b(?:(?!'.$notList.')\w)+\b' 
     ) 
    ); 

Respuesta

4

Here ya go. Necesita capturarlo como un parámetro y luego hacer referencia a él en la expresión regular. El nombre de usuario estará disponible en $ this-> params ['username'] en la acción del controlador.

Router::connect('/:username', 
    array(
     'controller'=>'members', 
     'action'=>'show' 
    ), 
    array(
     'username' => '\b(?:(?!admin|items|images)\w)+\b' 
    ) 
); 
+0

Gracias !! Funcionó perfectamente. Agregué información adicional a la pregunta usando tu solución para que no necesites escribir todos los nombres de los controladores, etc. – Parris

-1
$misc = array(*your misc webroot, admin route items here...*); 
    $notList = array_merge(App::objects('plugin'),str_replace('Controller','',App::objects('controller'))); 
    $notListLowerCase = array(); 
    foreach ($notList as $key=>$item): 
     $notListLowerCase[] = strtolower(preg_replace("/(.)([A-Z])/","\\1_\\2",$item)); 
    endforeach; 
    $notList = array_merge($notList,$misc,$notListLowerCase); 
    $notList = implode('|', $notList); 
    Router::connect('/:username', array('controller' => 'members', 'action' => 'show'),array('pass'=>array('username'),'username'=>'\b(?:(?!'.$notList.')\w)+\b')); 
Cuestiones relacionadas