【问题标题】:Figuring out Laravel 5 app namespace from a package从包中找出 Laravel 5 应用程序命名空间
【发布时间】:2015-04-10 08:45:36
【问题描述】:

我正在为 Laravel 5 开发一个包,需要知道应用程序的命名空间,我该如何获取它?

我看到有 Illuminate\Console\AppNamespaceDetectorTrait,但它需要一些 Foundation 助手以及应用程序容器的实例才能使它们工作,并且在开发包的过程中测试很棘手。 p>

编辑:目前我正在将该特性包装到一个接口中以创建隔离,但想知道是否有更好的解决方案。

【问题讨论】:

    标签: php laravel namespaces package laravel-5


    【解决方案1】:

    我不知道AppNamespaceDetectorTrait 不能使用什么。只需使用它并致电getAppNamespace()

    class Foo {
        use Illuminate\Console\AppNamespaceDetectorTrait;
    
        public function bar(){
            echo $this->getAppNamespace();
        }
    }
    

    【讨论】:

    • 是的,问题是AppNamespaceDetectorTrait 将我的包与用户应用程序紧密结合在一起,我无法进行单元测试。目前我正在将该特征包装到一个接口中以创建隔离,但想知道是否有更好的解决方案。
    • 啊,现在我看到了问题所在。好吧,或者你可以从你的一个类中复制特征中的代码并删除 Laravel 依赖项。毕竟只是一个解析composer.json的函数。
    【解决方案2】:

    尝试将 getAppNamespace() 函数复制到一个通用的帮助文件中,该文件可以在您的应用程序的任何位置访问。然后,您不需要将 AppNamespaceDetectorTrait 特征绑定到您的类。

    helpers.php

    function getAppNamespace()
    {
        $composer = json_decode(file_get_contents(base_path().'/composer.json'), true);
        foreach ((array) data_get($composer, 'autoload.psr-4') as $namespace => $path)
        {
            foreach ((array) $path as $pathChoice)
            {
                if (realpath(app_path()) == realpath(base_path().'/'.$pathChoice)) return $namespace;
            }
        }
        throw new RuntimeException("Unable to detect application namespace.");
    }
    

    然后在 YourClass.php

    $namespace = getAppNamespace();  // App\
    

    【讨论】:

      猜你喜欢
      • 2015-05-13
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      • 2016-03-14
      • 1970-01-01
      相关资源
      最近更新 更多