在CakePHP中将公司名称前缀为URL

时间:2014-12-27 10:27:44

标签: php cakephp cakephp-2.0

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

例如,目前它以这种方式工作

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(''),现在所有这些链接都需要更新。是否有一些通用的方法可以确保一旦用户登录,为该用户生成的所有链接都将获得相关的公司名称和前缀?

非常感谢帮助。

2 个答案:

答案 0 :(得分:1)

您要查找的是persist选项,它定义了在生成新网址时应自动包含当前网址中存在的哪些参数。

示例:

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

如果当前网址为/acme/pages/view,请执行以下调用

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

会生成包含公司名称的网址,例如

/acme/pages/add

同样,如果公司名称在当前网址中不存在,则不会包含公司名称,即在/pages/view生成的网址

/pages/add

如果您需要在发布重定向之前包含公司名称,以便公司名称出现在URL中,您只需将其添加到当前请求中,例如在控制器中

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

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

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

答案 1 :(得分:0)

beforeFilter 方法中的 AppController.php 中计算$ current_company变量:

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'))

Cake应该自动将变量添加为/ acme / YOUR_CONTOLLER / YOUR_ACTION等前缀