从包中找出Laravel 5应用程序命名空间


Figuring out Laravel 5 app namespace from a package

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

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

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

我不知道什么应该不适用于AppNamespaceDetectorTrait。只需使用它并调用getAppNamespace():

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

尝试将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'