DatabaseServiceProvider.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. namespace Illuminate\Database;
  3. use Faker\Factory as FakerFactory;
  4. use Faker\Generator as FakerGenerator;
  5. use Illuminate\Contracts\Queue\EntityResolver;
  6. use Illuminate\Database\Connectors\ConnectionFactory;
  7. use Illuminate\Database\Eloquent\Model;
  8. use Illuminate\Database\Eloquent\QueueEntityResolver;
  9. use Illuminate\Support\ServiceProvider;
  10. class DatabaseServiceProvider extends ServiceProvider
  11. {
  12. /**
  13. * The array of resolved Faker instances.
  14. *
  15. * @var array
  16. */
  17. protected static $fakers = [];
  18. /**
  19. * Bootstrap the application events.
  20. *
  21. * @return void
  22. */
  23. public function boot()
  24. {
  25. Model::setConnectionResolver($this->app['db']);
  26. Model::setEventDispatcher($this->app['events']);
  27. }
  28. /**
  29. * Register the service provider.
  30. *
  31. * @return void
  32. */
  33. public function register()
  34. {
  35. Model::clearBootedModels();
  36. $this->registerConnectionServices();
  37. $this->registerEloquentFactory();
  38. $this->registerQueueableEntityResolver();
  39. }
  40. /**
  41. * Register the primary database bindings.
  42. *
  43. * @return void
  44. */
  45. protected function registerConnectionServices()
  46. {
  47. // The connection factory is used to create the actual connection instances on
  48. // the database. We will inject the factory into the manager so that it may
  49. // make the connections while they are actually needed and not of before.
  50. $this->app->singleton('db.factory', function ($app) {
  51. return new ConnectionFactory($app);
  52. });
  53. // The database manager is used to resolve various connections, since multiple
  54. // connections might be managed. It also implements the connection resolver
  55. // interface which may be used by other components requiring connections.
  56. $this->app->singleton('db', function ($app) {
  57. return new DatabaseManager($app, $app['db.factory']);
  58. });
  59. $this->app->bind('db.connection', function ($app) {
  60. return $app['db']->connection();
  61. });
  62. $this->app->singleton('db.transactions', function ($app) {
  63. return new DatabaseTransactionsManager;
  64. });
  65. }
  66. /**
  67. * Register the Eloquent factory instance in the container.
  68. *
  69. * @return void
  70. */
  71. protected function registerEloquentFactory()
  72. {
  73. $this->app->singleton(FakerGenerator::class, function ($app, $parameters) {
  74. $locale = $parameters['locale'] ?? $app['config']->get('app.faker_locale', 'en_US');
  75. if (! isset(static::$fakers[$locale])) {
  76. static::$fakers[$locale] = FakerFactory::create($locale);
  77. }
  78. static::$fakers[$locale]->unique(true);
  79. return static::$fakers[$locale];
  80. });
  81. }
  82. /**
  83. * Register the queueable entity resolver implementation.
  84. *
  85. * @return void
  86. */
  87. protected function registerQueueableEntityResolver()
  88. {
  89. $this->app->singleton(EntityResolver::class, function () {
  90. return new QueueEntityResolver;
  91. });
  92. }
  93. }