2015-02-15 10 views
5

Czy istnieje sposób sprawdzenia, czy klasa istnieje w Laravel 5?Laravel 5, sprawdź czy klasa jest zarejestrowana w kontenerze

Miałem to rozwiązanie dla Laravel 4: spróbuj zrobić konkretną klasę, a jeśli dostanę ReflectionException, używam klasy ogólnej.
W Laravel 5 wygląda na to, że nie mogę przechwycić ReflectionException i otrzymuję komunikat "Whoops".

Zastanawiam się, czy jest jakiś lepszy sposób na zrobienie tego.

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

Odpowiedz

4

Dlaczego nie można po prostu użyć funkcji PHP class_exists?

if(class_exists($widget_class)){ 
    // class exists 
} 
+1

Cóż, może nie użyłem właściwego terminu; klasa oczywiście nie istnieje dla php, dopóki nie zostanie wstrzyknięta przez laravel. App :: make powinien wstrzyknąć klasę lub zwrócić ReflectionError, jeśli nie może złożyć pliku klasy. –

+0

Ale przecież może to działa ... To naprawdę takie proste? Dziękuję Ci! –

+0

Widzę ... Właściwie łapanie 'ReflectionException' powinno działać. Czy może brakuje Ci instrukcji importowania lub ukośnika odwrotnego? '\ ReflectionException $ e' – lukasgeiter

1

\App::bound() może być właściwą drogą.

Najnowsze wersje laravel (Być może> = 5.3, nie wiem dokładnie) domyślnie rejestrują usługodawców w nieco inny sposób.

Na przykład, nowy sposób rejestracji:

$this->app->singleton(MyNamespace\MyClass::class, function() 
{ 
    /* do smth */ } 
); 

zamiast starego:

$this->app->singleton('MyClassOrAnyConvenientName', function() 
{ 
    /* do smth */ } 
); 

W efekcie powinniśmy używać App::make('\MyNamespace\MyClass') zamiast App::make('MyClassOrAnyConvenientName') rozwiązać usługę.

Prowadzimy bibliotekę, która musi obsługiwać obie wersje. Dlatego używamy \App::bound(), aby określić, czy stary lub nowy format nazwy usługi jest zarejestrowany w kontenerze. class_exists() faktycznie działał na nowszą wersję laravel, ale nie działał zgodnie z oczekiwaniami dla starszych, ponieważ w starych systemach nie mieliśmy odpowiednio nazwanej Facade dla tej usługi (nazwa fasadowa różniła się od zarejestrowanej nazwy usługi) i class_exists() zwróciła false.

1

Użyj metody getProvider na pojemniku Application:

if (app()->getProvider($classname)) { 
    // Do what you want when it exists. 
} 

To był dostępny od 5,0 i mogą być przeglądane here.