代码之家  ›  专栏  ›  技术社区  ›  derobert

从模型中调用Catalyst?

  •  4
  • derobert  · 技术社区  · 16 年前

    我在用 Catalyst 具有 Catalyst::Plugin::Authentication Catalyst::Plugin::Authorization::Roles 我想知道是否有更好的 向我看不到的模型添加属性的方法。

    允许每个用户访问一个或多个公司,但是 一次总是一个主要(当前)公司。允许的列表是 存储在数据库中,数据库访问主要通过 DBIC .

    我的第一个倾向是说用户有电流 公司,因此把它作为用户模型的一部分:给用户 包装A sub company { … } “获取/设置用户的当前公司。这个 数据库检查相当简单;只需使用“ $self->search_related “(数据库) 方法,由用户模型继承)。

    我遇到的问题是:

    • 当前的公司需要在请求之间坚持,但我宁愿 不将其存储到数据库(只应为此保留 会议)。自然的地方是会议
    • 有一个类似于Unix的角色 root ,这样你就可以 任何 公司,忽略数据库中的列表。正在检查此角色 可以通过数据库完成,但应用程序中的其他任何地方都可以使用 $c->assert_user_role 和朋友们。

    我听说最好保持模型作为催化剂的独立性 可能的。让一个模型操纵也很奇怪 $c->session .

    当然,我可以把那些检查转移到控制器上,然后 模型接受控制器发送的任何内容,但这违反了dry 非常严重,如果我忘记了一个 支票在某处。

    有什么建议吗?或者我只是耸耸肩,继续在模特身上做?

    谢谢,而且为标题道歉,我想不出一个好标题。

    1 回复  |  直到 16 年前
        1
  •  2
  •   jrockway    16 年前

    关键是为每个请求创建一个模型类的实例,然后传入您需要的部分请求。在这种情况下,您可能希望传入基本结果集。您的模型将通过 $self->resultset->... 对于当前用户,它将“只起作用”。(如果当前用户是根用户,则只需传入 $schema->resultset("Foo") . 如果当前用户是其他人,则传入 $schema->resultset("Foo")->stuff_that_can_be_seen_by($c->user) . 你的模特就不在乎了。)

    我有一些关于这个的幻灯片,但是它们非常过时:

    http://www.jrock.us/doqueue-grr/slide95c.html#end

    (也可以看到前后的内容。)

    请注意,受限结果集和Web ACL是正交的。你想让模型尽可能地紧凑(这样你的应用程序就不会意外地做你不想做的事情,即使代码告诉你),但是各种仅限于Web的细节仍然需要用ACLs编码。(“不允许您查看此页。”与“只能删除自己的对象,不能删除所有人的对象”不同。acl处理第一种情况,受限结果集处理第二种情况。即使你写作 $rs->delete ,因为结果集受到限制,所以没有删除数据库中的所有内容。您只删除了您有权删除的内容。方便!)