如何将Eloquent模型传递给Knockout.js视图模型构造函数?

时间:2015-05-15 17:26:21

标签: javascript laravel knockout.js eloquent

我有一个解决方案(见下文),但它很笨拙而且很笨拙我想听听其他人如何解决这个问题。

这是一个简单的例子来说明问题:

想象一下,我有一个雄辩的User模型,我正在整理一个“编辑用户”页面,该页面使用Knockout处理从值到DOM元素的绑定。

在我的本页控制器方法中,我正在执行以下操作:

public function getEditUser($id = null)
{
    return View::make("account.edituser")
        ->with("user", User::find($id))
        ->with("groups", Group::all());
}

Group模型适用于我的访问控制组。用户可以是零个或多个组的成员,并且以正常方式为Eloquent模型建立关系。

在模板中,我有一些元素(文本,选择,单选按钮等)设置了data-bind属性,以将我的Knockout视图模型绑定到元素。

在页面的<script>部分,我有以下内容:

var createUserViewModel = function (user, groups) {
    return {
        id: ko.observable(user.id),
        name: ko.observable(user.name),
        groups: ko.observableArray(user.groups),
        // ...other attributes go here

        // the list of available groups
        availableGroups: ko.observableArray(groups)
    };
};

// instantiate the view model
var viewModel = createUserViewModel(
    // note that I'm using Smarty for my templating system. The
    // lines below apply the json_encode method and disable the
    // htmlspecialchars function which I have set up to encode
    // all output by default
    {$user|json_encode nofilter},
    {$groups|json_encode nofilter}
);

ko.applyBindings(viewModel);

user函数的createUserViewModel参数将采用JSON编码,因此它将如下所示:{ id: 1234, name: "Joe Smith", groups: ['group1', 'group2'], ...}

这是一个简单的例子:我有几种表格可以输入比这更复杂的其他信息。

这有几个问题:

  1. 正如我所说,这很尴尬。对于较大的模型,由此产生的源难以阅读。

  2. 我怀疑这里有一个XSS漏洞,因为我通过json_encode将数据直接回显到脚本元素的主体中。我无法利用这一点,但我认为其他人可以找到方法。

  3. 但我想不出另一种方法,它不会从根本上改变应用程序的工作方式(即使用AJAX调用来检索数据)。

    有人可以分享更好的方法吗?

1 个答案:

答案 0 :(得分:1)

Re(1)你需要查看非常有用的映射,它正是为此而设计的 - http://knockoutjs.com/documentation/plugins-mapping.html ...这将替换你的createUserViewModel函数,并且你不必手动转动JSON对象进入可观察的东西。

Re(2)我对安全性和XSS不够专业,无法给出权威的答案,但对我来说看起来还不错。只要在存储用户和组数据之前对其进行了清理,就可以将其作为JSON回显。如果您没有为用户输入文本框或其他输入,那么会影响这些数据,那么攻击者就无法注入恶意脚本。加上JSON编码本身是一个很好的消毒,因为任何JavaScript都会以字符串形式结束。所以,确定,给出:

Oauth2ClientContext

将打印出一些JSON,你可以立即尝试JSON.parse:

OAuth2RestTemplate.createRequest(URI uri, HttpMethod method)

然后再在脚本中对它进行任何操作。

相关问题