Concrete5:Route::register的可选参数


Concrete5: optional parameters for Route::register

我正试图在Concrete5(php)中创建一个从Controller扩展的类,该类具有可选参数。我已经尝试过搜索Concrete5和Symfony文档,但要么没有答案,要么我对php中的oop很愚蠢。所以,我想找一只小手来帮助我度过这个过程。

我的应用程序''bootstrap''app.php 的尾部

Route::register(
     '/plotdata/{start}/{end}' //1 below
   , 'Application'Controller'SinglePage'getplotdata::getData' //2
   , NULL //3
   , array() //4
   , array('var1' <= NULL, 'var2' <= NULL, 'var3' <= NULL, 'var4' <= NULL) //5 
//1 rtPath | path - start and end are required params /{var1}/{var2}/{var3}/{var4} are optional,
//2 callback
//3 rtHandle
//4 requirements = array() see e.g. line below
//      array('start' => '[0-9]{4}(-[0-9]{2}){2} [ 0-2][0-9](:[0-5][0-9]){2}(.[0-9]{3})?'
//5 options | additionalAttributes
);

导致任何参数超过CCD_ 2的URI产生错误。例如

plotdata/2015-02-01 00%3A00%3A00/2016-02-09 23%3A59%3A00/blah

产生404错误。如果我在最后关闭/blah(尽管没有设置$var1=blah),它将加载,假设getplotdata.php存在于适当的目录中,并且在头附近有这些行。

namespace Application'Controller'SinglePage;
class getplotdata extends Controller {

如果行"1"(在第一个块中)被修改为读取

     '/plotdata/{start}/{end}/{var1}/{var2}/{var3}/{var4}'

让其他行(包括5行)保持不变,我需要对每个行进行参数化。例如plotdata/2015-02-01 00%3A00%3A00/2016-02-09 23%3A59%3A00/blah

也不是plotdata/2015-02-01 00%3A00%3A00/2016-02-09 23%3A59%3A00工作,

plotdata/2015-02-01 00%3A00%3A00/2016-02-09 23%3A59%3A00/1/2/3/4能进行

那么,我该如何指定可选参数(有或没有默认值[通过从Symfony公开$defaults?]),或者有没有方法在Concrete5中生成"重载"类定义?我做一些类似的事情吗

$bob = Route::register(
    '/plotdata/{start}/{end}'
  , 'Application'Controller'SinglePage'getplotdata::getData'
); //end $bob
$bob->addDefaults(array('var1' <= NULL, 'var2' <= NULL, 'var3' <= NULL, 'var4' <= NULL));

我现在似乎已经开始工作了。这是相关的app.php代码:

Route::register(
    '/plotdata/{start}/{end}{optparams}'
   , 'Application'Controller'SinglePage'getplotdata::getData'
 )->addRequirements(
    array('optparams' => '.*')
 )->addDefaults(
    array('optparams' => '/')
 );

注意

  1. {end}{optparams}之间没有/,否则{end}之后需要/,并且您需要在URI中至少有一个附加值(换行符或URI后面的空格+换行符似乎不起作用)*
  2. '.*'"RegEx"甚至应该匹配长度为0的字符串,因此您可以不使用尾随斜杠和/或其他值
  3. addDefaults位使得在end值之后终止URI或在URL上添加尾随的/都会导致传递相同的值。顺便说一句,鉴于我在下面的控制器文件中的实现,将其保留为addDefaults(array('optparams' => ''))似乎也有效

然后在注册的控制器文件(getplotdata.php)中:

$in_ar = explode('/',Request::getInstance()->get('optparams'));
array_shift($in_ar);    //get rid of "empty" parameter at start

这将用任何后续/s之间的每个值填充数组变量$in_ar。在一些可选参数之后用/终止将导致最终数组元素的空字符串。如果在某个URI中有连续的end0,您可能会遇到类似的情况。

或者,您可以转换到?var1=val&var2=value形式,方法是在?&上更改分解以拆分,移位以去掉空的第一个元素,然后在=字符上将每个数组元素重新分解为键+值对

*至少在安装了Concrete5的Firefox上。。。YMMV

参考:帮助我解决这个问题的Symfony"食谱"医生。

在concrete5中,Route::register方法是为了方便。您可以通过将自己的symfony路由实例添加到SymfonyRouteCollection来注册它们。你可以通过以下操作获得它的参考:

$collection = Route::getList();
$collection->add($handle, $customRoute);

同样在最新版本中,你应该能够按照你的建议进行:

$route = Route::register(...);
$route->setOptions($options);