2015-02-15 7 views
5

C'è un modo per verificare se esiste una classe in Laravel 5?Laravel 5, controlla se la classe è registrata nel container

Ho avuto questa soluzione per Laravel 4: prova a creare una classe specifica, e se ottengo un ReflectionException, utilizzo una classe generica.
In Laravel 5 sembra che non sia possibile intercettare lo ReflectionException e ottengo un "Whoop".

Mi chiedevo se c'è un modo migliore per farlo.

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

risposta

4

Perché non basta usare la funzione PHP class_exists?

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

Beh, forse non ho usato il termine giusto; la classe ovviamente non esiste per php fino a quando non è stata iniettata da laravel. App :: make dovrebbe iniettare la classe o restituire un ReflectionError se non può archiviare il file della classe. –

+0

Ma dopotutto forse funziona ... È davvero così facile? Grazie! –

+0

Vedo ... In realtà la funzione "ReflectionException" dovrebbe funzionare. Ti manca forse una dichiarazione di importazione o una barra rovesciata? '\ ReflectionException $ e' – lukasgeiter

1

\App::bound() potrebbe essere il modo corretto.

Le versioni di laravel più recenti (forse> = 5.3, non so esattamente) registrano i provider di servizi in un modo diverso per impostazione predefinita.

Per esempio, un nuovo modo di registrazione:

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

al posto di quello vecchio:

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

Di conseguenza dovremmo usare App::make('\MyNamespace\MyClass') invece di App::make('MyClassOrAnyConvenientName') per risolvere un servizio.

Manteniamo una libreria che deve supportare entrambe le versioni. Quindi usiamo \App::bound() per determinare se il vecchio o il nuovo formato del nome del servizio è registrato nel contenitore. class_exists() ha effettivamente funzionato per laravel più recenti ma non ha funzionato come previsto per i vecchi perché nei vecchi sistemi non avevamo un nome corretto Facade per quel servizio (il nome della facciata differiva dal nome del servizio registrato) e class_exists() restituito false.

1

utilizzare il metodo GetProvider sul contenitore Applicazione:

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

E 'stato disponibile dal 5.0 e può essere visualizzato here.