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' => '/')
);
笔记
{end}
和 {optparams}
之间没有 /
,否则 {end}
之后需要 /
并且您需要在 URI 中至少有一个附加值(URI 后的换行符或 space+换行符似乎不起作用)*.
'.*'
"RegEx" 甚至应该匹配长度为 0 的字符串,因此您可以不用尾部斜杠 and/or 其他值。
- 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);
我正在尝试使用可选参数在 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' => '/')
);
笔记
{end}
和{optparams}
之间没有/
,否则{end}
之后需要/
并且您需要在 URI 中至少有一个附加值(URI 后的换行符或 space+换行符似乎不起作用)*.'.*'
"RegEx" 甚至应该匹配长度为 0 的字符串,因此您可以不用尾部斜杠 and/or 其他值。- 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);