Laravel 模組開發包 (nWidart/Laravel-modules) 原始碼解讀

myAdream發表於2019-08-16

服務註冊

composer 自動載入

先看 composer.php 檔案中自動載入服務提供者

其中註冊了 laravel 模組開發的服務提供者和門面別名

"extra": {
  "laravel": {
    "providers": [
      "LittleSuperman\\Modules\\LaravelModulesServiceProvider"
    ],
    "aliases": {
      "Module": "LittleSuperman\\Modules\\Facades\\Module"
    }
  }
}

服務提供者註冊

tip: 由於服務提供者是先執行 register 方法, 然後在執行 boot 方法

<?php

namespace LittleSuperman\Modules;

use LittleSuperman\Modules\Contracts\RepositoryInterface;
use LittleSuperman\Modules\Support\Stub;

class LaravelModulesServiceProvider extends ModulesServiceProvider
{
    /**
     * Booting the package.
     */
    public function boot()
    {
        $this->registerNamespaces();
        $this->registerModules();
    }

    /**
     * Register the service provider.
     */
    public function register()
    {
        $this->registerServices();
        $this->setupStubPath();
        $this->registerProviders();
    }

    /**
     * Setup stub path.
     */
    public function setupStubPath()
    {
        Stub::setBasePath(__DIR__ . '/Commands/stubs');

        $this->app->booted(function ($app) {
            /** @var RepositoryInterface $moduleRepository */
            $moduleRepository = $app[RepositoryInterface::class];
            if ($moduleRepository->config('stubs.enabled') === true) {
                Stub::setBasePath($moduleRepository->config('stubs.path'));
            }
        });
    }

    /**
     * {@inheritdoc}
     */
    protected function registerServices()
    {
        $this->app->singleton(Contracts\RepositoryInterface::class, function ($app) {
            $path = $app['config']->get('modules.paths.modules');

            return new Laravel\LaravelFileRepository($app, $path);
        });
        $this->app->alias(Contracts\RepositoryInterface::class, 'modules');
    }
}

register 方法中註冊了

  1. 單例 LittleSuperman\Modules\Laravel\LaravelFileRepository,
  2. 用於建立模板路徑
  3. 註冊其他服務提供者

說明

由於本人也是一邊看一寫文件可能會出現錯誤, 更新可能持續更新

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章