【发布时间】:2016-08-29 16:41:44
【问题描述】:
在我们的 Laravel 项目中检查供应商是否存在的最佳方法是什么?
我的解决方案:
$foo = 'Foo\Foo';
if (class_exists($foo)) {
// class exists
}
有没有更好的解决方案?一个我不知道的 Laravel 方法?
谢谢!
【问题讨论】:
标签: php laravel laravel-5.2 exists vendor
在我们的 Laravel 项目中检查供应商是否存在的最佳方法是什么?
$foo = 'Foo\Foo';
if (class_exists($foo)) {
// class exists
}
有没有更好的解决方案?一个我不知道的 Laravel 方法?
谢谢!
【问题讨论】:
标签: php laravel laravel-5.2 exists vendor
这是正确的做法,在 Laravel 中没有这样的功能。
但最正确的方法是使用完整的命名空间检查类的存在,例如:
$foo = 'Symfony\Component\HttpFoundation\Request';
if (class_exists($foo)) {
// class exists
}
【讨论】:
我真的不认为有一个真正最好的方法 - 也就是说,我所知道的没有很好的 API。
但是,使用非 Laravel 方式,您可以检查 Composer installed.json 文件(我过去做过,位于 vendor/composer/installed.json),或者如您所说,类存在检测。
使用 Laravel 方式,如果您知道第 3 方库是具有服务提供者的 Laravel 库,或者在 IoC 容器中注册了某些内容,您可以在那里查看 - 查看 config('app.providers')看看它是否包含你期望的服务提供者类,或者看看app('the.binding.name') 是否返回你期望的东西(或者使用$app->bound('the.binding.name') 可能)。
更好的是,如果它是驱动程序,例如数据库引擎,您可以查询数据库管理器以查看驱动程序是否已注册。这可能是您最好的方法,但更取决于您要检测的第 3 方库。
【讨论】:
我认为你应该像这样使用应用容器以 laravel 的方式尝试它:
try {
app($foo);
} catch (\ReflectionException $e) {
// here you know that class dosen't exists
}
【讨论】: