如何在控制器内部获取由视图编辑器传递给某些视图的数据?

时间:2018-10-14 12:39:33

标签: php laravel view controller

“我的View Composer”将一些数据传递到某些视图(当然可以):

use Illuminate\View\View;
use App\Util\Helper

class PublicSettingsComposer
{
    public function compose(View $view)
    {
        $view->with('settings', Helper::readSettingsFromFile()); // json
    }
}

适当的提供程序已添加到配置中,并且它为所有特定视图正确提供了此作曲家:

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

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

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


P.S。 @主持人:请谨慎考虑我的问题是否重复。我知道有很多关于视图编写器,将数据传递到视图以及从控制器内部获取数据的问题。但是,在这种情况下,我真的找不到任何问题(标题经常会引起误解)。

1 个答案:

答案 0 :(得分:1)

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

第一个选择非常容易实现。在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
    }
}