使用CakePHP路由的不同级别的URL

时间:2016-09-06 22:16:43

标签: php url cakephp routes cakephp-2.4

我有一个需要允许多个网址结构的网站。例如:

    let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:#selector(labelTapped))
    testLabel.userInteractionEnabled = true
    testLabel.addGestureRecognizer(tapGestureRecognizer)

每个网址都应该能够根据网址检测出哪家公司。

到目前为止,我已经能够解析网址,以确定它是哪家公司,但是如何将这些额外的www.examplesite.com/people/add // <-- example company www.otherexample.com/xyz/people/add // <-- "xyz" company (not location based) www.otherexample.com/florida/abc/people/add //<-- "abc" company (location based) 部分添加到路由中以允许其余的应用程序工作?

我尝试了很多东西,包括在路径文件的顶部设置一个变量到'/ florida / abc'(或者不管它是什么),然后在每个路由之前添加它,但是不能处理每一个控制器/动作,似乎非常受欢迎或错过/越野车。

我也使用/florida/abc/前缀,例如,它也需要像这样工作:

admin

我的假设是我需要使用www.otherexample.com/admin/florida/abc/people/add 文件,但我无法确定如何实现这一目标。

2 个答案:

答案 0 :(得分:0)

我在网络应用程序farm.ba中使用了这种方法(不再由所有者维护)。

我做了什么:

  • 创建表&#34;节点&#34; with fields id,slug,model,foreign_key,type,..
  • 创建处理节点模型的自定义路由(1),(2)类
  • 在节点模型
  • 中保存帖子,存储和缓存slug之后
  • 删除帖子后,删除缓存和节点记录

这很像wordpress路由,允许你输入自定义slug等。

修改

在App / Lib / Routing / Router / MultiRoute.php中创建自定义路由类,如:

<?php
App::uses('CakeRoute', 'Routing/Route');
/**
* MultiRoute
*/
class MultiRoute extends CakeRoute
{

    public function parse($url)
    {
        // debug($url); '/florida/abc/people/add'

        // Add custom params
        $params = array(
            'location' => null,
            'company' => null,
            'controller' => 'peoples',
        );

        $params += parent::parse($url);
        // debug($params);
        /** 
         * array(
         *  'location' => null,
         *  'company' => null,
         *  'controller' => 'peoples',
         *  'named' => array(),
         *  'pass' => array(
         *      (int) 0 => 'florida', // location
         *      (int) 1 => 'abc', //company
         *      (int) 2 => 'people', // controller
         *      (int) 3 => 'add' // action, default index
         *  ),
         *  'action' => 'index',
         *  'plugin' => null
         * )
         * 
         */

        // reverse passed params
        $pass = array_reverse($params['pass']);
        // debug($pass);
        /**
         *  array(
         *      (int) 0 => 'add',
         *      (int) 1 => 'people',
         *      (int) 2 => 'abc',
         *      (int) 3 => 'florida'
         *  )
         */

        if(isset($pass[3])) { $params['location'] = $pass[3]; }
        if(isset($pass[2])) { $params['company'] = $pass[2]; }
        // if you need load model and find by slug, etc...
        return $params;
    }

    public  function match($url)
    {
        // implement your code
        $params = parent::match($url);
        return $params;
    }
}
在routes.php中

App::uses('MultiRoute', 'Lib/Routing/Route');

Router::connect('/admin/*', 
    array('admin' => true),// we set controller name in MultiRoute class
    array('routeClass' => 'MultiRoute')
    );

Router::connect('/*', 
    array(),// we set controller name in MultiRoute class
    array('routeClass' => 'MultiRoute')
    );

在您的控制器中使用额外的请求参数查找结果,例如:

$this->request->location;
$this->request->company;

我希望这有用。

答案 1 :(得分:0)

为每种情况创建一条路线似乎是一条路:

Router::connect('/people/add', array('controller' => 'people', 'action' => 'add'));
Router::connect('/:company/people/add', array('controller' => 'people', 'action' => 'add'), array('pass' => array('company'), 'company' => '[a-z]+'));
Router::connect('/:location/:company/people/add', array('controller' => 'people', 'action' => 'add'), array('pass' => array('company', 'location'), 'company' => '[a-z]+', 'location' => '[a-z]+'));

然后控制器可以接收以下值:

public function add($company = '', $location = '') {
    var_dump($company, $location); exit;
}

在路由中查找正则表达式,并进行修改以匹配您的传入数据。