我正在使用一个小型Laravel应用程序通过Cashier学习Stripe API。我的目标是将订阅计划存储在除DB之外的本地数据源中。理想情况下,我希望最终得到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());
}
以下是我对数据源/结构的考虑因素:
Plan
模型,并将这三个计划保存在plans
表中。但是,因为我的计划很少会改变,所以我必须在每个HTTP请求上反复从DB中获取相同的数据。更糟糕的是,如果我确实在将来改变我的计划,我需要在两个地方更新它们 - 条纹仪表板和本地数据库,这很麻烦且反直觉。如果我或任何其他人忘记了怎么办?我觉得需要有一个数据源。Plan
模型。在这种情况下,我必须使用Stripe API获取Plan
。同样,这个操作会(甚至更)昂贵,因为每次向服务器发出请求时,都会向Stripe发出同步请求以获取计划,并且应用程序将处于空闲状态,直到API响应数据。对我来说,这是非常缓慢和低效的。您能否建议在这种情况下有用的任何其他设计模式或数据结构?如果服务提供商是最佳推荐的方法,您能举一个如何使用它的简单示例吗?我阅读了文档,虽然给出的例子含糊不清,但我最终得到了以下内容:
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];
}
}
我觉得这不对。如何将这个集合注入控制器呢?
由于
答案 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'));
}