在Laravel中保留静态数据的选项

时间:2017-01-03 05:08:21

标签: laravel laravel-5.3

我正在使用一个小型Laravel应用程序通过Cashier学习Stripe API。我的目标是将订阅计划存储在除DB之外的本地数据源中。理想情况下,我希望最终得到Collection静态(即永久)数据,可能是Plan个对象的形式。每个计划都包含namedescriptionprice几乎不会被修改,因此数据可以简单地在PHP中进行硬编码。我设想像任何Eloquent模型一样处理这些数据:

class MembershipController extends Controller
{
    public function index() // dependency injection here? hmm..
    {
        return view('membership')->with('plans', Plan::all());
    }

以下是我对数据源/结构的考虑因素:

  1. 雄辩模型。首先,我可以简单地创建一个Plan模型,并将这三个计划保存在plans表中。但是,因为我的计划很少会改变,所以我必须在每个HTTP请求上反复从DB中获取相同的数据。更糟糕的是,如果我确实在将来改变我的计划,我需要在两个地方更新它们 - 条纹仪表板和本地数据库,这很麻烦且反直觉。如果我或任何其他人忘记了怎么办?我觉得需要有一个数据源。
  2. 条纹Plan模型。在这种情况下,我必须使用Stripe API获取Plan。同样,这个操作会(甚至更)昂贵,因为每次向服务器发出请求时,都会向Stripe发出同步请求以获取计划,并且应用程序将处于空闲状态,直到API响应数据。对我来说,这是非常缓慢和低效的。
  3. 服务提供商。经过一些研究,我最终想到了以包含我的硬编码计划集合的单身形式将我的计划存储在服务提供商中。这种方法在Laracasts上提到(大约1:20),但并没有真正解释得太多。如果我做对了,提供商将允许缓存数据并仅在需要时快速提供数据。
  4. 问题

    您能否建议在这种情况下有用的任何其他设计模式或数据结构?如果服务提供商是最佳推荐的方法,您能举一个如何使用它的简单示例吗?我阅读了文档,虽然给出的例子含糊不清,但我最终得到了以下内容:

    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];
        }
    }
    

    我觉得这不对。如何将这个集合注入控制器呢?

    由于

1 个答案:

答案 0 :(得分:1)

stack answer,您可以使用view()->share()在全球所有控制器之间共享数据。

按照给定的三个步骤完成。

<强>更新

您还可以使用Repository方法在其他控制器上使用全局数据。这就像下面这样:

PlanRepository.php下创建app/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
    ];
  }
}

通过注入上面的存储库来使用到相应的控制器中:

public $planList; 
public function __construct(PlanRepository $plan)
{
   $this->planList = $plan->getPlanData();
}

即使你可以传递这些数据,如:

public function index(PlanRepository $plan)
{
    $planList = $plan->getPlanData();

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