Silverstripe Controller文档令人困惑

时间:2016-11-24 01:15:26

标签: php content-management-system silverstripe

根据文档记录,“我们需要定义可以访问此控制器的URL。在我们的示例中,TeamsController应该在http://yoursite.com/teams/处可见,并且玩家自定义操作位于http://yoursite.com/team/players/。 ”。但控制器定义为

<?php

    class TeamController extends Controller {

    private static $allowed_actions = array(
        'players',
        'index'
    );

    public function index(HTTPRequest $request) {
        // ..
    }

    public function players(HTTPRequest $request) {
        print_r($request->allParams());
    }
}

?>

配置:

Name: mysiteroutes
After: framework/routes#coreroutes
---
Director:
  rules:
    'teams//$Action/$ID/$Name': 'TeamController'

这是对的吗?

1 个答案:

答案 0 :(得分:4)

<强> TLDR;

是的,理论上它是正确的。除了一个小错字。

更长的答案

您希望在访问网址 http://yoursite.com/team/players/ 时看到播放器列表。该URL包含四个部分:

  1. 协议 http://
  2. yoursite.com
  3. 域名后面的第一部分 / team
  4. 域后的第二部分 / player
  5. 您的网络服务器通过SilverStripe安装解析协议和域。现在来了 / team 。这应该映射到您的TeamController课程。因此,我们需要定义路由,因此SilverStripe知道,从 team 开始的所有内容都应该由此控制器处理。我们在yml.config中定义路由,我更喜欢路由的单独文件,例如* / mysite的/ _config / routes.yml':

    Name: mysiteroutes
    After: framework/routes#coreroutes
    ---
    Director:
      rules:
        'team//$Action/$ID/$Name': 'TeamController'
    

    因此,以“团队”一词开头的任何请求(在域之后)(请注意,在您的示例中,您有团队,这是打破一切的重要错字)被路由到{{1 }},并且第二个参数(在我们的示例中“players”作为TeamController参数传递。$Action本身不知道第一部分,它只是得到其他名称为你的参数在你的路线中定义它。

    这是TeamController类中的$allowed_actions映射:

    TeamController

    因此直接映射到呈现输出的private static $allowed_actions = array( 'players', 'index' ); 方法。