Php 如何在控制器内获取视图生成器传递给特定视图的数据?

Php 如何在控制器内获取视图生成器传递给特定视图的数据?,php,laravel,view,controller,Php,Laravel,View,Controller,My View Composer将一些数据传递给某些视图(当然,它是有效的): 将相应的提供程序添加到配置中,并为所有特定视图正确提供此编写器: view()->compose('public.layouts.*', 'App\Http\ViewComposers\PublicSettingsComposer'); 但是,在(仅)我的一个视图中,我需要数据库中的特定信息,因此我必须使用一些由我的视图生成器传递的数据: class BranchController extends Co

My View Composer将一些数据传递给某些视图(当然,它是有效的):


将相应的提供程序添加到配置中,并为所有特定视图正确提供此编写器:

view()->compose('public.layouts.*', 'App\Http\ViewComposers\PublicSettingsComposer');

但是,在(仅)我的一个视图中,我需要数据库中的特定信息,因此我必须使用一些由我的视图生成器传递的数据:

class BranchController extends Controller
{
    public function branches()
    {
        $settings = retrieve_settings_passed_by_PublicSettingsComposer; // This is what I need
        $headquartersId = $settings->headquartersid;
        return view('public.layouts.branches', [
            'headquarters' => Branch::find($headquartersId) // Branch is a Model
        ]);
    }
}

仅供参考:我使用的Laravel版本为:5.5



主持人:请注意,我的问题是重复的。我知道在视图生成器、将数据传递到视图以及从控制器中获取数据方面存在很多问题。然而,在这种情况下,我真的找不到任何问题(标题往往会产生误导)。

我看到了两个相当简单的解决方案。第一个是在每个请求中缓存解析的文件。另一种方法是为该作业使用实际缓存

第一个选项是非常直接的实现。在
Helper
类中,必须引入一个静态属性来保存读取文件的解析内容。然后,就像您在单例模式中所做的那样,您要么返回缓存的数据,要么首先解析文件,缓存数据,然后返回。此场景解决了在应用程序的两个位置使用时,每个请求两次解析设置的实际问题

class Helper
{
    protected static $cachedSettings;

    public function readSettingsFromFile()
    {
        if (!self::$cachedSettings) {
            self::$cachedSettings = // Do the parsing here. This should be your current implementation of Helper::readSettingsFromFile(). You can also put this in its own function.
        }

        return self::$cachedSettings;
    }
}

另一个选项是使用实际缓存(外部缓存)。您可以将解析后的文件缓存特定的时间(例如1、3、5或10分钟,甚至更长)。或者,您将其永久缓存,并在更新设置时使缓存无效(如果在应用程序中发生这种情况,并且您知道它已更新)

但是,只有在设置更改不太频繁的情况下,此解决方案才有意义。这还取决于您对应用程序的期望请求量。如果您的设置更改不太频繁(少于每x分钟一次),并且您的应用经常使用(每x分钟有多个请求),那么它可能是一个可行的解决方案

class Helper
{
    public function readSettingsFromFile()
    {
        return Cache::remember(function () {
            $settings = // Put your current calculation here

            return $settings;
        }, 3 * 60); // 3 * 60 = 180 seconds
    }
}

是否有特殊原因使您不能简单地在控制器中使用视图生成器中使用的
Helper::readSettingsFromFile()
。我只是想知道是否有(更好的)方法避免我的文件被读取两次。因此,我认为可以在控制器中检索视图生成器传递的数据。我对视图生成器不太熟悉,但我认为如果手动将视图生成器包含在控制器中,并且该文件也会自动附加到视图,则该文件也会被读取两次。因此,我的建议是使用单例模式或在返回之前缓存
Helper::readsetingsfromfile()
的读取数据。在并发方法调用时,您可以只返回缓存的数据。就像你对待单身汉一样,谢谢。好主意我也考虑过。但是,只有在对文件进行更改后重新读取数据(更新缓存)时,缓存数据才有意义。实现它只是时间问题。那么,文件多久更改一次?也许我可以给你推荐一个非常简单快速的解决方案。
class Helper
{
    public function readSettingsFromFile()
    {
        return Cache::remember(function () {
            $settings = // Put your current calculation here

            return $settings;
        }, 3 * 60); // 3 * 60 = 180 seconds
    }
}