Concrete5:Route :: register

时间:2016-05-11 22:41:50

标签: php symfony concrete5

我尝试使用可选参数创建一个从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));

2 个答案:

答案 0 :(得分: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位使得它在end值之后终止URI或在URL上添加尾随/导致传递相同的值。顺便说一下,将它保留为addDefaults(array('optparams' => ''))似乎也可以在我的控制器文件中实现。
  4. 然后在注册的控制器文件(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);