我正试图在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' => '/')
);
注意
{end}
和{optparams}
之间没有/
,否则{end}
之后需要/
,并且您需要在URI中至少有一个附加值(换行符或URI后面的空格+换行符似乎不起作用)*'.*'
"RegEx"甚至应该匹配长度为0的字符串,因此您可以不使用尾随斜杠和/或其他值- 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中有连续的end
0,您可能会遇到类似的情况。
或者,您可以转换到?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);