如何在Laravel中创建Controller Singleton?

时间:2019-01-06 21:06:29

标签: php laravel-5.7

我正在制作航空公司的网络应用程序。目前,我正在编码保留航班的流程,为此,我有多个视图,例如reserve.blade.phpchooseFlights.blade.phppassengersInfo.blade.php等。 所有这些视图都使用相同的ReserveController类。路由在web.php文件中指定,如下所示:

Route::get('/reserve', 'ReserveController@searchFlights');
Route::get('/reserve/choose_flights', 'ReserveController@chooseFlights');
Route::post('/reserve/storeFlightsIds', 'ReserveController@storeFlightsIds');
Route::get('/reserve/passengers_info', 'ReserveController@retrievePassengersInfo');

这些方法在其中返回各自的视图,并显示所需的数据。

视图的保留工作流程为/reserve(返回视图reserve.blade.php),该视图向-> /reserve/choose_flights(返回视图chooseFlights.blade.php)发出视图对-> /reserve/storeFlightsIds的发布请求(返回视图passengersInfo.blade.php)。

reserve.blade.php等信息中,例如所需航班的始发地和目的地,将乘客的日期和人数发送到管制员。问题在于,passengersInfo.blade.php中需要进一步采取步骤的乘客数才能使视图知道必须显示多少表格才能检索所有乘客的信息。

无论何时访问涉及ReserveController的请求,我都想使用相同的实例,这样我就可以在属性中存储所需的数据,并在所有这些属性中共享与当前保留过程相对应的相同数据。视图。

有可能吗?

1 个答案:

答案 0 :(得分:0)

  

每当访问涉及它的请求时,我都想使用ReserveController的相同实例,这样我就可以在属性中存储所需的数据,并在所有这些视图中共享与当前保留过程相对应的相同数据。

     

有可能吗?

是的,您可以在应用的服务容器中注册一个单例实例

$this->app->singleton('MySingleton', function ($app) {
     return new SomeSharedClass(...);
});

,然后将共享状态存储在该类中。并将其注入您的控制器中。

class ReserveController extends Controller 
{
     private $singleton;

     function __construct(MySingleton $singleton) {
         $this->singleton = $singleton;
     }

     ...
}

警告!不建议这样做。请记住,如果2个不同的用户将调用相同的控制器方法,那么他们还将共享单例实例。 共享状态是邪恶的!

在此处详细了解共享状态。 http://henrikeichenhardt.blogspot.com/2013/06/why-shared-mutable-state-is-root-of-all.html