2016-05-11 34 views
0

我正在尝试使用可选参数在Concrete5(php)中创建一个从Controller扩展的类。我试图冲刷Concrete5和Symfony文档,但是答案不在那里,或者当我在php中使用oop的时候,我很傻。所以,我正在寻找一个小手来让我完成这个过程。混凝土5:Route :: register的可选参数

我的申请\引导的尾\ 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 
); 

导致任何URI与参数超出end产生误差。例如

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的暴露$默认?]),还是有在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

[c5.org后(https://开头WWW .concrete5.org/community/forums/customizing_c5/concrete5-optional-parameters-for-routeregister /) – mpag

回答

0

现在看来我现在工作。这是相关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位使得它在URL的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的某处连续使用/ s,您可能会遇到类似的情况。

或者,也可以大概通过改变爆炸分裂在两个?&过渡到?var1=val&var2=value形式,转移到除掉空的第一元件,则每个阵列元件重新爆炸成在键+值对=字符

*至少在Firefox和我Concrete5安装...因人而异

裁判:Symfony "cookbook" doc,帮助我通过这个问题来打破。

0

在具体的5中,Route :: register方法是为了方便。您可以通过将Symfony路由实例添加到SymfonyRouteCollection来注册自己的symfony路由实例。你可以通过做得到它的引用:

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

另外,在最新的版本中,你应该能够做你的建议:

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

我不确定我在使用哪个版本,但route :: register有第5个“options”参数(相当于$ route-> setoptions())不适用于我。然后,我可能一直在使用该参数的错误语法,因为c5和symfony文档都没有真正涉及到“选项”的含义。基于我有限的阅读理解,我的理解是,这是为了给被叫路由指定值,而不是以任何方式在URI中 - 基本上是提供“隐藏”值的一种方式,但不是允许你引入灵活添加参数的数量。 – mpag