我有一个需要允许多个网址结构的网站。例如:
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
文件,但我无法确定如何实现这一目标。
答案 0 :(得分:0)
我在网络应用程序farm.ba中使用了这种方法(不再由所有者维护)。
我做了什么:
这很像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;
}
在路由中查找正则表达式,并进行修改以匹配您的传入数据。