【问题标题】:Kohana 3.3 - dynamic menu creation with rights management possible?Kohana 3.3 - 可以使用权限管理创建动态菜单?
【发布时间】:2013-12-18 16:38:04
【问题描述】:

我想使用 Kohana 3.3 作为我自己编写的“框架”的替代品,我目前正在用于我的 web 应用程序。您能否告诉我是否可以满足以下要求以及如何实现?

  1. 我的应用程序包含几个控制器,我想通过菜单访问它们。这个菜单应该是动态创建的,这样一个新创建的控制器就会立即出现。此外,菜单应排除当前登录用户无法访问的控制器。

  2. 每个控制器必须能够在执行操作之前检查用户的角色(例如,全局管理员、特定于控制器的管理员、普通用户)。根据这个角色,每个控制器必须能够允许或禁止访问。 (考虑基于组成员资格的方法)。

  3. 我想为菜单和每个控制器输出使用单独的模板(据我所知,也就是部分模板)。它们都应该与“框架”模板(带有页眉、页脚、登录信息等)合并。我看到有一个特殊的模板控制器(template_controller iirc)——这是用作我的基本控制器的正确控制器吗?我应该创建一个基本控制器来管理我的“模板”并以某种方式将其他控制器嵌套在其中吗?!

  4. 此外,如果每个控制器都能够将当前请求识别为 ajax 或非 ajax 并相应地调整渲染(在大多数情况下,ajax 不需要再次“渲染”整个站点) .

我将不胜感激每一个答案! 提前致谢。

【问题讨论】:

    标签: php kohana kohana-3 kohana-3.3


    【解决方案1】:
    1. 是的,但您必须自己搜索控制器文件 AFAIK。

    2. 是的,见before()

      2.1 如果你想把它保存在一个地方,你只需要写一点额外的东西来指定哪个动作需要什么权限。查看 Kohana 的 Request 类,了解一些可以用于此目的的好东西(我想说看看 url、uri 和 request 方法,我不知道它们到底做了什么)

      2.2 您也可以基于每个控制器执行此操作;例如Controller_Admin 可以做以下丑陋的单线(检查下面的 2.2 的 sn-p)。我建议把它分开一点,例如给你的基本控制器一个 protected $_user 变量,它填充它的 before() 方法,然后使用 $this->_user 而不是 Auth 的东西。

    3. 我是 Controller_Template,但是是的,你没看错 ;)

    4. 像这样? Request::$current->is_ajax() (http://kohanaframework.org/3.3/guide-api/Request#is_ajax)

    2.2 的代码段:

    if ( ! Auth::instance()->get_user()->has('role', ORM::factory('Role', array('name' => 'admin')))
       throw new HTTP_Exception_403('Permission denied!');
    

    【讨论】:

    • 您的回答很有帮助,谢谢!我以前见过所有东西(除了 is_ajax - 不知道为什么我错过了),但不知道如何使用它。但是关于菜单创建还有一个问题。搜索控制器应该不是问题(虽然我认为可以从路由数组中提取控制器)但是我应该把这个函数/方法放在哪里?也在之前()?还是在我从主控制器调用的 Controller_Menu 中?这对我来说很新,所以请原谅我的愚蠢问题。
    • 我可能会将其放在专用的Controller_Menu 中。 Kohana 是一个HMVC 框架,因此您可以触发内部请求并将这些请求的响应放入模板中。我会把它放在public function after() { if ( ! $this->auto_render OR ! $this->request->is_ajax()) { $this->template->menu = Request::factory('menu')->execute(); }} 或类似的地方
    • 是的,您可以使用$this->request->controller(),但这不会为您提供应用程序中所有可能的控制器。从路由数组中提取所有控制器将强制您单独定义每个路由,而bootstrap.php 中的默认路由涵盖了大多数通用应用程序。我建议你自己编写一些数组来定义控制器和权限,或者让每个控制器实现自己的检查。
    • 我想预定义数组是最简单的方法。我已经考虑在抽象基本控制器中定义一个方法“GetRestrictions”或类似的方法,并在每个控制器实现中实现它。但是要使用这个函数,我必须至少实例化每个控制器一次或使用后期静态绑定,尤其是在较大的环境中,这太耗费资源了,对吧?
    • 嗯,是的,你必须找到每个控制器并至少包含文件,不过你可以缓存这个,Kohana 提供了易于使用的缓存方法,它会是最灵活的。这个缓存可以永久保存,如果你使用git,你可以使用'post-pull'钩子来清除缓存,然后在你的开发环境中禁用它。
    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多