Concrete5:Route::register 的可选参数

Concrete5: optional parameters for Route::register

我正在尝试使用可选参数在 Concrete5 (php) 中创建一个从 Controller 扩展而来的 class。我试图搜索 Concrete5 和 Symfony 文档,但要么没有找到答案,要么在 php 中谈到 oop 时我很愚蠢。所以,我正在寻找一些 hand-holding 来帮助我完成这个过程。

我的尾巴application\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
);

导致参数超过 end 的任何 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?]),或者有没有办法在中生成 "overloaded" class 定义具体5?我会做类似

的事情吗
$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 后的换行符或 space+换行符似乎不起作用)*.
  2. '.*' "RegEx" 甚至应该匹配长度为 0 的字符串,因此您可以不用尾部斜杠 and/or 其他值。
  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

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

或者,您可以通过更改爆炸以在 ?& 上拆分来过渡到 ?var1=val&var2=value 形式,移动以摆脱空的第一个元素,然后在 = 字符

上将每个数组元素重新分解为键值对

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

ref: Symfony "cookbook" doc 帮助我解决了这个问题。

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

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

同样在最新版本中,您应该能够执行您建议的操作:

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