gpt4 book ai didi

laravel - 在 Laravel 中持久化静态数据的选项

转载 作者:行者123 更新时间:2023-12-04 13:48:05 24 4
gpt4 key购买 nike

我正在通过收银台和一个小型 Laravel 应用程序学习 Stripe API。我的目标是将订阅计划存储在数据库以外的本地数据源中。理想情况下,我希望以 Collection 结束。静态(即永久)数据,可能采用 Plan 的形式对象。每个计划将包含 name , description , 和 price几乎不会被修改,所以数据可以简单地用 PHP 硬编码。我想像对待任何 Eloquent 模型一样对待这些数据:

class MembershipController extends Controller
{
public function index() // dependency injection here? hmm..
{
return view('membership')->with('plans', Plan::all());
}
到目前为止,这是我对数据源/结构的考虑:
  • Eloquent 模型 .首先,我可以简单地创建一个 Planplans 中对三个计划进行建模和持久化 table 。但是,因为我的计划很少会改变,所以我必须获取 在每个 HTTP 请求中一遍又一遍地从数据库中获取数据。更糟糕的是,如果我将来碰巧改变了我的计划,我将需要在两个地方更新它们——Stripe 仪表板和本地数据库,这既麻烦又违反直觉。如果我或任何其他人只是忘记了怎么办?我觉得需要有一个单一的数据源。
  • 条纹Plan型号 .在这种情况下,我必须获取 Plan s 使用 Stripe API。同样,此操作将(甚至更)昂贵,因为每次向服务器发出请求时,都会向 Stripe 发出同步请求以获取计划,并且应用程序将处于空闲状态,直到 API 以数据响应.对我来说,这非常缓慢且效率低下。
  • 服务商 .经过一些研究,我最终想到将我的计划以包含我的硬编码计划集合的单例形式存储在服务提供商中。 Laracasts 上提到了这种方法(大约 1:20),但没有真正解释太多。如果我做对了,提供者将允许缓存数据并仅在需要时快速提供它。


  • 你能提出任何其他在这种情况下有用的设计模式或数据结构吗?如果服务提供商是最好的推荐方法,您能否举一个简单的例子来说明如何使用它?我阅读了文档,虽然给定的例子含糊不清,但我最终得到了以下内容:
    class PlanProvider extends ServiceProvider
    {
    protected $defer = true;

    public function boot() { }

    public function register()
    {
    $this->app->singleton(Collection::class, function ($app) {
    return new Collection([ // that's probably not right...
    'basic' => [
    new Plan([
    'name' => 'basic',
    'description' => 'Basic Plan',
    'price' => 999
    ])
    ]
    ]);
    });
    }

    public function provides()
    {
    return [Collection::class];
    }
    }
    我觉得不太对。无论如何,我将如何将此集合注入(inject) Controller ?
    谢谢

    最佳答案

    来自 stack answer ,您可以使用 view()->share()在全局范围内在所有 Controller 之间共享数据。

    只需按照给定的三个步骤即可完成。

    更新

    您也可以使用 Repository在其他 Controller 使用全局数据的方法。这类似于以下内容:

    创建 PlanRepository.phpapp/Http/Repository/ :

    <?php
    namespace App\Http\Repository;
    /**
    * Plan Repository class
    */
    class PlanRepository
    {
    /**
    * Get a list of all plans
    *
    * @return array Array containing list of all plans
    */
    public function getPlanData()
    {
    return [
    'name' => 'basic',
    'description' => 'Basic Plan',
    'price' => 999
    ];
    }
    }

    并通过注入(inject)上述存储库来使用到相应的 Controller ,例如:
    public $planList; 
    public function __construct(PlanRepository $plan)
    {
    $this->planList = $plan->getPlanData();
    }

    甚至你可以传递这些数据来查看:
    public function index(PlanRepository $plan)
    {
    $planList = $plan->getPlanData();

    return view('welcome', compact('planList'));
    }

    关于laravel - 在 Laravel 中持久化静态数据的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41436762/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com