3

我正在设置到控制器的路由,并且不断收到 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);

  }
}

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

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

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

4

3 回答 3

2

关于路由的 Silverstripe 文档在这一点上并不明确,但为了$Action正确解释,您应该在routes.yml文件中使用双斜杠:

view-meetings//$Action/$type

根据文档,这设置了称为“转移点”的东西。在文档或将 URL 与规则匹配的源代码中都没有很好地描述这意味着什么。

于 2013-10-05T12:31:27.860 回答
2

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

试试这个,YAML 告诉 SS 将以“view-meetings”开头的所有内容发送到您的 Controller,然后$url_handlers根据 URL 中“view-meetings”之后的所有内容告诉控制器如何处理请求。

路线.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) {
  }
}
于 2013-08-09T08:01:35.117 回答
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');

}

于 2013-08-06T02:00:33.780 回答