Я разрабатываю пакет для 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\