Silverstripe 扩展控制器操作

Silverstripe Extending Controller Actions

我正在尝试通过扩展程序向 Page_Controller class 添加控制器操作。

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

但是我对 SilverStripe 中的扩展不熟悉,到目前为止,当我访问 link 控制器操作时,我得到的只是 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,cause action index是默认允许的。

现在,在您的 /mysite/_config/routes.yml 中,您必须定义到控制器的路由:

---
Name: mysite-routes
After: framework/routes#coreroutes
---

Director:
  rules:
    'setlanguage/$Language': 'SetLanguageController'

另请参阅:Docs for routing