Symfony中if循环的PHP特定优化

Posted

技术标签:

【中文标题】Symfony中if循环的PHP特定优化【英文标题】:PHP Specific optimization for if loop in Symfony 【发布时间】:2022-01-02 08:31:35 【问题描述】:

在 Symfony 应用程序中,我需要使用 switch/case 功能,但请求参数阻止了我,我使用了 uggly if 条件,例如:

        $roles = ["ROLE_USER"];

        if ($request->get('isAdmin')) 
            array_push($roles, "ROLE_ADMIN");
        

        if ($request->get('isFreemium')) 
            array_push($roles, "ROLE_FREEMIUM");
        

        if ($request->get('isPremium')) 
            array_push($roles, "ROLE_PREMIUM");
        

        if ($request->get('isExternal')) 
            array_push($roles, "ROLE_EXTERNAL");
        

        if ($request->get('isVip')) 
            array_push($roles, "ROLE_VIP");
        

你能帮我简化一下吗?

【问题讨论】:

你可以创建一个关联数组并利用 foreach 循环。 【参考方案1】:

您可以尝试以下方法。

$definedRoles = new ArrayObject([
    'Admin',
    'Freemium',
    'Premium',
    'External',
    'Vip',
]);

$roles = new ArrayObject([ 'ROLE_USER' ]);

foreach ($definedRoles as $role) 
    if ($request->get('is' . $role)) 
        $roles->append(strtoupper('role_' . $role));
    

为什么我使用ArrayObject 类?因为它已经像收益一样工作了。与数组不同,对象在迭代时只为当前条目占用内存。因此,您的循环占用的内存很少,并且您不会将所有条目都加载到内存中。

将所有有效角色放入第一个数组$definedRoles。所有角色都将被迭代并检查 if 条件是否在 $request 对象中。如果是这样,角色将被附加到$roles 数组中。

【讨论】:

请注意 $request->get 在 5.4 中已弃用,不应再使用。 symfony.com/blog/…

以上是关于Symfony中if循环的PHP特定优化的主要内容,如果未能解决你的问题,请参考以下文章

通过单元测试访问 Symfony 2 容器?

如何托管多个 symfony 项目?

如何强制为特定 PHP 版本创建新的 Symfony 应用程序?

php多维数组循环优化

如何在PHP的foreach循环中重复特定的迭代?

如何在 LoginListener 中的 onSecurityInteractiveLogin 方法中重定向 - Symfony2