我尝试使用可选参数创建一个从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
);
会导致参数超出end
的任何URI产生错误。 e.g。
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 {
如果行&#34; 1&#34; (在第一个块中)被修改为读取
'/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]],或者是否有办法产生&#34;重载&#34; 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));
答案 0 :(得分:0)
我觉得我现在有效了。这是相关的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长度的字符串,因此您可以不使用尾部斜杠和/或其他值。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中连续/
,你可能会遇到类似的事情。
或者,您可以通过更改爆炸以在?var1=val&var2=value
和?
上拆分来转换为&
形式,转移以消除空的第一个元素,然后重新将每个数组元素分解为=
字符
*至少在使用我的Concrete5安装的Firefox上... YMMV
参考:Symfony "cookbook" doc帮助我解决了这个问题。
答案 1 :(得分:0)
在concrete5中,Route :: register方法是为了方便起见。您可以通过将它们添加到SymfonyRouteCollection来注册自己的symfony路由实例。您可以通过执行以下操作来获取对它的引用:
$collection = Route::getList();
$collection->add($handle, $customRoute);
同样在最新版本中,您应该能够按照您的建议行事:
$route = Route::register(...);
$route->setOptions($options);