有没有办法检查Laravel 5中是否存在类?
我为Laravel 4提供了这个解决方案:尝试创建一个特定的类,如果我得到ReflectionException
,我会使用泛型类。
在Laravel 5看起来我无法拦截ReflectionException
并且我得到了“哎呀”。
我想知道是否有更好的方法来做到这一点。
try {
$widgetObject = \App::make($widget_class);
} catch (ReflectionException $e) {
$widgetObject = \App::make('WidgetController');
$widgetObject->widget($widget);
}
答案 0 :(得分:7)
为什么不使用PHP函数class_exists
?
if(class_exists($widget_class)){
// class exists
}
答案 1 :(得分:3)
通过执行
检查您的类是否设置为绑定app()->bound($classname);
答案 2 :(得分:2)
\App::bound()
可能是正确的方式。
默认情况下,最新的laravel版本(可能> = 5.3,我完全不确切)以不同的方式注册服务提供商。
例如,一种新的注册方式:
$this->app->singleton(MyNamespace\MyClass::class, function()
{
/* do smth */ }
);
而不是旧的:
$this->app->singleton('MyClassOrAnyConvenientName', function()
{
/* do smth */ }
);
因此,我们应该使用App::make('\MyNamespace\MyClass')
代替App::make('MyClassOrAnyConvenientName')
来解析服务。
我们维护一个必须支持这两个版本的库。因此,我们使用\App::bound()
来确定是否在容器中注册了旧的或新的服务名称格式。 class_exists()
确实适用于较新的laravel但是没有按照预期的那样工作,因为在旧系统中我们没有为该服务正确命名Facade
(Facade的名称与注册服务名称不同)并class_exists()
返回false
。
答案 3 :(得分:2)
在Application容器上使用getProvider方法:
if (app()->getProvider($classname)) {
// Do what you want when it exists.
}
自5.0以来一直可用,可以查看here。