【问题标题】:Passing computed parameters to middleware将计算参数传递给中间件
【发布时间】:2019-12-29 19:03:47
【问题描述】:

我想通过我的 web.php 路由文件将计算值传递给我的中间件。我有这个模型配置:

地球有很多国家

国家有很多城市

城市有许多建筑物

在我的所有路线中,我需要构建一个菜单来帮助在行星之间导航。所以,无论我在做什么,我都需要能够访问行星-> id。现在,在我的中间件中,我有一系列 if/elseif 检查以查看 URL 中存在哪些参数:

if (isset($parameters['planet'])) 
    $planetId = $parameters['planet']->id;
else if (isset($parameters['country'])) 
    $planetId = $parameters['country']->planet->id;
else if (isset($parameters['building'])) 
    $planetId = $parameters['building']->country->planet->id;

显然这很快就会变得非常笨拙,我觉得应该有更好的方法将 planetId 传递到中间件中,但我找不到任何优雅的方法......

非常感谢您的帮助!

【问题讨论】:

    标签: laravel laravel-5 laravel-5.8 laravel-middleware


    【解决方案1】:

    您最好将“planet_id”添加到所有经常使用行星参考的模型中。

    使用一堆嵌套关系引用编写逻辑确实会影响应用程序的速度。编写起初看起来违反直觉的额外数据实际上会很有帮助。您希望在合理的情况下优先考虑 SELECT 查询的速度而不是数据库的大小。您的 SELECT 查询将是您的应用程序数据库使用的大部分。在我们现代,有几个额外的字节并不是什么大不了的事,它在这里会起到很大的作用。

    • 将planet_id 添加到您的国家和建筑物迁移表中。
    • 将关系方法“planet”添加到您的国家和建筑模型类。

    然后您可以轻松地执行以下操作:

    function getPlanetFromRequest($request)
    {
        $parameters = $request->all();
        $planetParameterNames = ['building', 'country', 'planet'];
    
        foreach ($planetParameterNames as $planetParameterName) {
            if (isset($parameters[$planetParameterName])) {
                $model = $parameters[$planetParameterName];
    
                // if the model is a planet, just return its self.
                if ($model instanceof Planet) {
                    return $model;
                }
    
                // $model would be country or building.
                return $model->planet;
            }
        }
    
        return null;
    }
    

    如果您只需要行星 ID,请为自己保存一个查询并仅引用模型 planet_id,而不是引用其行星然后获取 ID。

    $country->planet_id; // NOT $country->planet->id;
    

    【讨论】:

      猜你喜欢
      • 2014-10-28
      • 2022-01-12
      • 2016-04-22
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      相关资源
      最近更新 更多