Laravel 5,检查是否在容器中注册了类

时间:2015-02-15 18:05:09

标签: laravel laravel-5

有没有办法检查Laravel 5中是否存在类?

我为Laravel 4提供了这个解决方案:尝试创建一个特定的类,如果我得到ReflectionException,我会使用泛型类。
在Laravel 5看起来我无法拦截ReflectionException并且我得到了“哎呀”。

我想知道是否有更好的方法来做到这一点。

try {
    $widgetObject = \App::make($widget_class);
} catch (ReflectionException $e) {
    $widgetObject = \App::make('WidgetController');
    $widgetObject->widget($widget);
}

4 个答案:

答案 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