F3框架:hive变量的范围和用法

时间:2017-07-22 21:46:39

标签: php fat-free-framework

我已经使用Fat Free Framework 3.6一段时间了,我在确定与所用变量相关的一些事情时遇到了一些麻烦。另请注意,作为一名PHP程序员,我不是那么知识渊博。 以下是一些示例(我正在为SQL映射器使用一些“快捷方式”方法,但我猜它仍然可读):

function testroute() {

    // Q1 - Using f3-access to authorize a logged in user to advance on a route
    $this->access->authorize($this->f3->get('SESSION.user.group_id'));


    // Q2 - Change the f3 UPLOADS variable
    $this->f3->update('UPLOADS', '/different/location');


    // Q3 - Instantiante Users and User Groups from DB
    $users = new User($this->db);
    $userGroups = new UserGroups($this->db);

    // Load all records to array
    $arrayOfUsers = $users->all();
    $arrayOfUserGroups = $userGroups->all();

    // Make the arrays available to the template
    $this->f3->set('arrayOfUsers', $arrayOfUsers );
    $this->f3->set('arrayOfUserGroups', $arrayOfUserGroups );

    // Render the View
    $this->f3->set('view','content.test.htm');
    $template=\Template::instance();
    echo $template->render('layout.sidebar.htm');
}

考虑上面的示例代码:

  1. SESSION.user.group_id变量是否可以被登录用户篡改/利用,更改为其用户组存储的值?如果是这样,那么/更安全的做事方式是什么,例如在登录时设置isAdmin标志?
  2. 更改UPLOADS变量是否会使整个配置单元(即所有用户)不同,或者仅对当前用户进行更改?
  3. 在模板中,有没有办法使用给定group_id的{​​{1}}值来获取相关user的不同键,就像它的slug?在下面的示例中,我试图避免循环userGroup,为此我尝试使用array_search,但它返回空(实际上它返回 id = 0 @arrayOfGroups >),即:

    slug

    <include href="{{ 'navbar.htm' }} />

    <repeat group="{{ @arrayOfUsers }}" value="{{ @item }}" >

    <tr class=""> <td>{{ @item.username }}</td> <td>{{ @item.usergroup_id }}</td> <td>{{ @arrayOfUserGroups[array_search(@item.usergroup_id].slug }}</td> </tr>

  4. 在最后一个示例中,我有一个导航栏的</repeat>参考,导航栏中会有导航项的<include>元素。使用此<li></li>控制器将testroute()应用于特定项目的适当方法是什么?

  5. 干杯

1 个答案:

答案 0 :(得分:1)

问题#1:登录用户可以更改其群组吗?

不,用户无法直接修改SESSION的内容(除非您为他提供了一种方法)。唯一可以被利用的是访问本身,如果会话ID被盗(又名&#34;会话劫持&#34; cf。herethere)。

现在,为了灵活性,您最好在SESSION内保存最低限度。在会话中存储用户组会阻止您动态更改已登录用户的组(更改将在下次登录时生效)。我建议只存储用户ID并从中检索组。

问题2:更改UPLOADS变量是否会使整个配置单元(即所有用户)不同,或者仅对当前用户进行更改?

仅适用于当前用户。

注意:整个配置单元仅适用于当前用户&#34;。只共享缓存的变量。

问题3:如何从$arrayOfUserGroups检索特定群组?

$arrayOfUserGroups是根据$userGroups->all()计算的,我猜这是DB\SQL\Mapper->find()方法的结果。该方法不会通过id索引结果,只能按SQL输出中的出现顺序进行索引。

因此解决问题的一种方法是在返回结果之前重新索引结果。类似的东西:

function all() {
  $groups=$this->mapper->find('');
  $all=[];
  foreach ($groups as $group)
    $all[$group->id]=$group;
  return $all;
  // or if you prefer a one-liner:
  return array_combine(array_map(function($g){return $g->id;},$groups),$groups);
}

现在在你的模板中:

{{ @arrayOfUserGroups[@item.usergroup_id].slug }}

问题#4:如何激活导航项?

有多种方法可以实现这一点,它取决于几个因素,如导航栏层次结构深度,路由结构(URL或别名的命名约定,静态或动态路由)等。

因此,我假设您使用的是具有一级层次结构,没有别名且没有dynamic route的基本导航栏。在这种情况下,您可以在一个变量中保存导航项列表(路径+标签),并将它们与当前PATH进行比较。 E.g:

<repeat group="@navItems" value="@item">
  <li class="{{ @item.path==@PATH ? 'active' : '' }}">
    <a href="{{ @item.path }}">{{ @item.label }}</a>
  </li>
</repeat>