Silverstripe扩展控制器动作


Silverstripe Extending Controller Actions

我试图通过扩展添加一个控制器动作到Page_Controller类。

期望的结果是能够转到www.mysite.com/setlanguage/spanish,例如,并通过浏览器cookie将网站的语言更新为西班牙语。

然而,我对SilverStripe中的扩展并不熟悉,到目前为止,当我访问到控制器动作的链接时,我得到的只是一个404错误。

请看看我的代码…

class Page_ControllerLanguageExtension extends Extension {
    private static $allowed_actions = array(
        'setLanguage'
    );
    public function setLanguage(SS_HTTPRequest $request) {
        $requestedLanguage = $request->param('ID');
        $languageCookie = new Cookie;
        $languageCookie->set('site_language', $requestedLanguage);
        return $this->owner->RedirectBack();
    }
}

我用一个YML配置文件调用扩展名:

Page_Controller:
  extensions:
    - Page_ControllerLanguageExtension

所以如果你需要/setlanguage/<language>作为url你必须路由url /setlanguage/到一个单独的控制器:

class SetLanguageController extends Controller {
    public function index(SS_HTTPRequest $request) {
        $requestedLanguage = $request->param('Language'); //as defined in config below
        $languageCookie = new Cookie;
        $languageCookie->set('site_language', $requestedLanguage);
        return $this->RedirectBack();
    }
}

在这种情况下我们不需要定义$allowed_actions,因为默认允许动作索引。

现在在/mysite/_config/routes中。Yml 你必须定义到控制器的路由:

---
Name: mysite-routes
After: framework/routes#coreroutes
---
Director:
  rules:
    'setlanguage/$Language': 'SetLanguageController'

参见:Docs路由