【问题标题】:How to get data, passed by a view composer to certain views, inside the controller?如何在控制器内部获取由视图编辑器传递给某些视图的数据?
【发布时间】:2018-10-16 02:56:25
【问题描述】:

我的 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


附: @moderators:请小心将我的问题视为重复问题。我知道关于视图编写器以及将数据传递给视图以及从控制器中获取数据有很多问题。但是,在这种情况下,我真的找不到任何问题(标题通常具有误导性)。

【问题讨论】:

  • 是否有什么特殊原因不能简单地使用控制器中的视图编辑器中使用的Helper::readSettingsFromFile()
  • 目前我正在这样做。我只是想知道是否有(更好的)方法可以避免两次读取我的文件。所以,我认为可以在控制器中检索由 View Composer 传递的数据。
  • 我对视图作曲家不太熟悉,但我假设如果您手动将视图作曲家包含在控制器中并且它也会自动附加到视图中,那么该文件也会被读取两次.因此我的建议是使用单例模式或在返回之前缓存Helper::readSettingsFromFile() 的读取数据。在并发方法调用上,您可以只返回缓存的数据。就像你对单身人士所做的那样。
  • 谢谢。好主意。我也想过。但是,只有在对文件进行更改后重新读取数据(更新缓存)时,缓存数据才有意义。实施它只是时间问题。
  • 那么,文件多久更改一次?也许我可以建议你一个非常非常简单和快速的解决方案。

标签: php laravel view controller


【解决方案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
    }
}

【讨论】:

    猜你喜欢
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    相关资源
    最近更新 更多