2014-12-27 41 views
0

我正在使用CakePHP 2.5.x,并且使用默认路由正常工作。现在,我想前缀会根据用户登录公司名称参数。在CakePHP中将公司名称前缀为URL

举例来说,目前是这样工作的

http://localhost/Pages/view 
http://localhost/Pages/add 

我想它的工作这样

http://localhost/acme/Pages/view 
http://localhost/acme/Pages/add 

我已经配置routes.php文件的配置文件来照顾实际路由的上面以下行

/** 
* Catch urls like http://www.domain.com/<company>/<controller>/<action>/<parameters> 
*/ 
    Router::connect( 
     '/:company/:controller/:action/*', 
     array(), 
     array ( 
      'company' => '[a-zA-Z0-9]+' // regular expression match for the company parameter 
     ) 
    ); 

/** 
* Catch urls like http://www.domain.com/<company>/<controller>/<action> 
*/ 
    Router::connect( 
     '/:company/:controller/:action', 
     array(), 
     array ( 
      'company' => '[a-zA-Z0-9]+' // regular expression match for the company parameter 
     ) 
    ); 

/** 
* Catch urls like http://www.domain.com/<company>/<controller>/ 
*/ 
    Router::connect( 
     '/:company/:controller', 
     array (
      'action' => 'index' 
     ), 
     array ( 
      'company' => '[a-zA-Z0-9]+' // regular expression match for the company parameter 
     ) 
    ); 

/** 
* Catch urls like http://www.domain.com/<company>/ 
*/ 
    Router::connect( 
     '/:company', 
     array( 
      'controller' => 'Users', // default controller 
      'action' => 'index' // default action 
     ), 
     array ( 
      'company' => '[a-zA-Z0-9]+' // regular expression match for the company parameter 
     ) 
    ); 

我遇到的问题是,在我的应用程序的很多地方我已经使用echo Router::url(''),现在所有这些链接都需要更新。是否有一些通用的方法可以确保用户登录后,为该用户生成的所有链接都将获得相关的公司名称和前缀?

帮助表示赞赏。

+0

去core.php中并添加以下行配置::写入( 'Routing.prefixes',阵列( 'ACME')); –

+0

去你的控制器,并添加公共功能pages_dashboard(){} –

+0

等功能,并查看名称应该是pages_dashboard –

回答

1

你要找的是persist选项,它定义了存在于当前的URL哪些参数应该在生成新的URL时自动包含。

实施例:

Router::connect( 
    '/:company/:controller/:action/*', 
    array(), 
    array ( 
     'company' => '[a-zA-Z0-9]+', 
     'persist' => array(
      'company' 
     ) 
    ) 
); 

如果当前的URL是/acme/pages/view,下面的呼叫

Router::url(array(
    'controller' => 'pages', 
    'action' => 'add' 
)); 

将产生一个URL包括公司名称等

/acme/pages/add 

同样公司名称不会是我万一ncluded它不存在于当前的URL,即在/pages/view生成的URL将

/pages/add 

如果你需要包括公司名称,然后才能发出重定向使公司的名字出现在URL,您可以简单地将其添加到当前请求中,例如在您的控制器中。

$this->request->params['company'] = 'acme'; 

从那里生成的URL将包含公司名称。

参见http://book.cakephp.org/2.0/en/development/routing.html#Router::connect

+0

真棒!我会试试这个。关注问题 - 我如何确保在视图中甚至是'echo $ this-> webroot'都有它们的意义?如果这是不可能的,我可以用一个Router :: url重写这样的语句 - 但我想要求完整性 – ChicagoSky

+0

@ChicagoSky好吧,它需要手动更改,因为持久参数只是反向路由,但是,所以会搞乱所有的资产URL,而不是那些匹配你的路由的URL,所以这可能不是一个好主意。你在视图中使用'$ this-> webroot'的目的是什么? – ndm

+0

只是一些遗留代码 - 我一直在推迟回去并重写这些代码。例如,在某些情况下 - 我有一个AJAX调用,它通过一个'<? echo $ this-> webroot.'Pages/view'?>' – ChicagoSky

0

计算在AppController.php一个$ current_company变量在beforeFilter方法:

public function beforeFilter() { 
    $current_company = 'acme'; //just assigning a value, you can determine this variable in any way 
    $this->set(compact('current_company')); 
} 

然后,如果你的观点,在链接申报公司价值,如:

<?php echo $this->Html->link(__('Link Name'),array('company' => $current_company,'controller' => 'YOUR_CONTOLLER', 'action' => 'YOUR_ACTION'), array('css' => 'my_style')); ?> 

<a href="<?php echo $this->Html->url(array('company' => $current_company,'controller' => 'YOUR_CONTOLLER', 'action' => 'YOUR_ACTION')) ?>" class="my_style" id ="">Link Name</a> 

echo Router::url(array('company' => $current_company,'controller' => 'YOUR_CONTOLLER', 'action' => 'YOUR_ACTION')) 

蛋糕应该会自动添加变量像前缀/ ACME/YOUR_CONTOLLER/YOUR_ACTION

+0

beforeRender()将足以IMO将东西传递到视图。 – mark