2015-02-15 8 views
5

Gibt es eine Möglichkeit zu überprüfen, ob in Laravel 5 eine Klasse existiert?Laravel 5, überprüfen, ob die Klasse im Container registriert ist

Ich hatte diese Lösung für Laravel 4: Versuchen Sie, eine bestimmte Klasse zu machen, und wenn ich eine ReflectionException bekomme, verwende ich eine generische Klasse.
In Laravel 5 sieht aus wie ich die ReflectionException nicht abfangen kann und ich bekomme ein "Whoops".

Ich fragte mich, ob es einen besseren Weg gibt, dies zu tun.

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

Antwort

4

Warum nicht Sie verwenden nur die PHP-Funktion class_exists?

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

Nun, vielleicht habe ich nicht den richtigen Begriff verwendet; Die Klasse existiert natürlich nicht für PHP, bis sie von Laravel injiziert wurde. App :: make sollte die Klasse injizieren oder einen ReflectionError zurückgeben, wenn sie die Datei der Klasse nicht ablegen kann. –

+0

Aber schließlich funktioniert es vielleicht ... Es ist wirklich so einfach? Vielen Dank! –

+0

Ich sehe ... Eigentlich sollte 'ReflectionException' greifen. Vermissen Sie vielleicht eine Importanweisung oder einen Backslash? '\ ReflectionException $ e' – lukasgeiter

1

\App::bound() könnte der richtige Weg sein.

Die neuesten Laravel-Versionen (Maybe> = 5.3, ich weiß es nicht genau) registrieren Dienstanbieter standardmäßig auf andere Weise.

Zum Beispiel wird eine neue Art der Registrierung:

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

anstelle der alten:

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

Als Ergebnis wir App::make('\MyNamespace\MyClass') statt App::make('MyClassOrAnyConvenientName') lösen einen Dienst verwendet werden soll.

Wir unterhalten eine Bibliothek, die beide Versionen unterstützen muss. Daher verwenden wir \App::bound(), um festzustellen, ob das alte oder neue Format des Servicenamens im Container registriert ist. class_exists() hat tatsächlich für neuere Laravel funktioniert aber nicht funktioniert wie erwartet für ältere, weil in alten Systemen hatten wir keinen richtig mit Facade für diesen Dienst (Facade Name unterscheidet sich von registrierten Dienstname) und class_exists() zurückgegeben false.

1

die GetProvider Methode auf dem Anwendungscontainer Anwendung:

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

Es ist seit 5.0 verfügbar und here betrachtet werden kann.

Verwandte Themen