DatabaseServiceProvider.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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->registerFakerGenerator();
  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->bind('db.schema', function ($app) {
  63. return $app['db']->connection()->getSchemaBuilder();
  64. });
  65. $this->app->singleton('db.transactions', function ($app) {
  66. return new DatabaseTransactionsManager;
  67. });
  68. }
  69. /**
  70. * Register the Faker Generator instance in the container.
  71. *
  72. * @return void
  73. */
  74. protected function registerFakerGenerator()
  75. {
  76. $this->app->singleton(FakerGenerator::class, function ($app, $parameters) {
  77. $locale = $parameters['locale'] ?? $app['config']->get('app.faker_locale', 'en_US');
  78. if (! isset(static::$fakers[$locale])) {
  79. static::$fakers[$locale] = FakerFactory::create($locale);
  80. }
  81. static::$fakers[$locale]->unique(true);
  82. return static::$fakers[$locale];
  83. });
  84. }
  85. /**
  86. * Register the queueable entity resolver implementation.
  87. *
  88. * @return void
  89. */
  90. protected function registerQueueableEntityResolver()
  91. {
  92. $this->app->singleton(EntityResolver::class, function () {
  93. return new QueueEntityResolver;
  94. });
  95. }
  96. }