控制器路由在silverstripe 3.1中无法正常工作

时间:2013-08-02 03:47:19

标签: php silverstripe

我正在设置路由到控制器,我不断获得404,或者“开始使用silverstripe框架”页面。

在routes.yaml中,我有:

---
Name: nzoaroutes
After: framework/routes#coreroutes
---
Director:
  rules:
    'view-meetings/$Action/$type': 'ViewMeeting_Controller'

我的控制器看起来像这样:

class ViewMeeting_Controller extends Controller {

  public static $allowed_actions = array('HospitalMeetings');

  public static $url_handlers = array(
        'view-meetings/$Action/$ID' => 'HospitalMeetings'
    );

  public function init() {
    parent::init();
    if(!Member::currentUser()) {
      return $this->httpError(403);
    }
  }

  /* View a list of Hospital meetings of a specified type for this user */
  public function HospitalMeetings(SS_HTTPRequest $request) {

    print_r($arguments, 1);

  }
}

我创建了一个简单输出$ Content的模板(ViewMeeting.ss),但是当我刷新网站缓存并访问/ view-meetings / HospitalMeetings / 6?flush = 1

我得到了默认的“Silverstripe框架开始”页面

我知道routes.yaml中的路由工作正常,因为如果我在那里更改路由并访问旧URL我得到404,但请求似乎没有触发我的$ Action ...

3 个答案:

答案 0 :(得分:2)

您的YAML和控制器中有2个不同的规则($ type vs $ ID)。另外,我认为你不需要在YAML和Controller中定义路由。

试试这个,YAML告诉SS将以“view-meetings”开头的所有内容发送到您的Controller,然后$url_handlers告诉Controller如何处理请求,具体取决于“view-meetings”之后的所有内容网址。

routes.yaml

---
Name: nzoaroutes
After: framework/routes#coreroutes
---
Director:
  rules:
    'view-meetings': 'ViewMeeting_Controller'

ViewMeeting_Controller.php

class ViewMeeting_Controller extends Controller {

  private static $allowed_actions = array('HospitalMeetings');

  public static $url_handlers = array(
      '$Action/$type' => 'HospitalMeetings'
  );

  public function init() {
    parent::init();
    if(!Member::currentUser()) {
      return $this->httpError(403);
    }
  }

  public function HospitalMeetings(SS_HTTPRequest $request) {
  }
}

答案 1 :(得分:2)

关于路由的Silverstripe文档在这一点上一点也不清楚,但要正确解释$Action,你应该在routes.yml文件中使用双斜杠:

view-meetings//$Action/$type

根据the documentation,这设定了一个叫做“换档点”的东西。究竟是什么意思没有在文档中或在与规则匹配的URL source code中得到很好的描述。

答案 2 :(得分:0)

我在这里做一些猜测,但是如果放弃

会怎么样
public static $url_handlers = array(
    'view-meetings/$Action/$ID' => 'HospitalMeetings'
);

部分并将Action方法更改为:

// View a list of Hospital meetings of a specified type for this
public function HospitalMeetings(SS_HTTPRequest $request) {

// Should print 8 if url is /view-meetings/HospitalMeetings/6
print_r($request->param('type');

}