J'ai un petit problème avec la création d'une classe de modèle de façade avec Laravel. J'ai suivi http://laravel.com/docs/facades mais je suppose qu'il me manque quelque chose.
J'ai créé un dossier dans app/models
appelé foo
. Dans ce dossier, j'ai deux fichiers.
Premier fichier (Foo.php):
<?php
namespace Mynamespace;
class Foo {
public function method() {
}
}
?>
Deuxième fichier (FooFacade.php):
<?php
use Illuminate\Support\Facades\Facade;
class Foo extends Facade {
protected static function getFacadeAccessor() { return 'foo'; }
}
?>
Ensuite, j'ai ajouté Foo => 'Mynamespace\Foo'
au tableau aliases
dans app/config/app.php
et ai exécuté composer update
et composer dump-autoload
.
Maintenant, lorsque j'essaie d'exécuter Foo::method()
, j'obtiens Non-static method Mynamespace\Foo::method() should not be called statically
. Qu'est-ce que je fais mal?
Créez un dossier appelé facades
dans votre dossier app
(app/facades
).
Ajoutez le dossier de façade à votre chargement automatique du compositeur.
"autoload": {
"classmap": [
...
"app/facades"
]
},
Créez un fichier de façade dans ce dossier (FooFacade.php
) et ajoutez ce contenu:
<?php
use Illuminate\Support\Facades\Facade;
class MyClass extends Facade {
protected static function getFacadeAccessor() { return 'MyClassAlias'; } // most likely you want MyClass here
}
Créez un modèle dans app/models
(MyClass.php
).
<?php
namespace MyNamespace;
use Eloquent; // if you're extending Eloquent
class MyClass extends Eloquent {
...
}
Créez un nouveau fournisseur de services (vous pouvez créer un dossier dans l'application appelée serviceproviders
et l'ajouter au chargement automatique du composeur) (app/models/MyClassServiceProvider.php
).
<?php
use Illuminate\Support\ServiceProvider;
class MyClassServiceProvider extends ServiceProvider {
/**
* Register the service provider.
*
* @return void
*/
public function register() {
$this->app->bind('MyClassAlias', function(){
return new MyNamespace\MyClass;
});
}
}
Ici, vous pouvez ajouter une nouvelle liaison si vous voulez une autre façade (n'oubliez pas de créer un fichier de façade si c'est le cas).
Ajoutez le fournisseur de services au tableau providers
dans config/app.php
.
'providers' => array(
...
'MyServiceProvider'
)
Exécutez composer dump
afin que nous puissions accéder à nos nouvelles classes.
Vous pouvez maintenant accéder à MyClassAlias::method()
en tant que façade.
C'est bien expliqué dans cet article: http://fideloper.com/create-facade-laravel-4
J'espère que ça aide
Étape 1: Créer un fournisseur de service
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class NewFacadeServiceProvider extends ServiceProvider{
public function register(){
$this->app->singleton('TestFacades',function() {
//'TestFacades' alias name for the façade class
return new \App\TestFacade;
});
}
}
Étape 2: créez une classe de façade qui étend la classe Illuminate\Support\Facades\Facade.
<?php
namespace App\Facade; //created 'facade' folder in app directory
use Illuminate\Support\Facades\Facade;
class TestFacade extends Facade{
protected static function getFacadeAccessor() {
return 'TestFacades'; //'TestFacades' alias name for the façade class declare in the class 'NewFacadeServiceProvider'
}
}
Étape 3: Créez la classe (TestFacade.php) à laquelle vous souhaitez ajouter des fonctions.
<?php
namespace App;
class TestFacade{
public function dummy(){
return "Business Logic ";
}
}
Étape 4: Enregistrez le fournisseur de services et indiquez le nom d'alias dans Config\App.php
'providers' => [ //...
App\Providers\NewFacadeServiceProvider::class
],
//Class Aliases
'aliases' => [ //...
'FacadeTester' => App\Facade\TestFacade::class,
]
Appelez la fonction Route.php:
Route::get('/skull',function(){
return FacadeTester::dummy();
});
Fonction d'appel dans le contrôleur:
return \FacadeTester::dummy();
Une méthode simple Laravel 5:
Pour créer une façade, vous avez besoin de 3 composants:
Voici un exemple complet: dans l'exemple, je crée la façade ModulesConfig
pour la classe ModulesConfigReaderService
.
1) la classe de service devant devenir accessible via une façade
<?php
namespace Hello\Services\Configuration\Portals;
use Illuminate\Support\Facades\Config;
class ModulesConfigReaderService
{
public function getSomething()
{
return 'Whatever';
}
}
c'est une classe très normale
2) la façade requise classe
<?php
namespace Hello\Services\Configuration\Facade;
use Illuminate\Support\Facades\Facade;
class ModulesConfig extends Facade
{
protected static function getFacadeAccessor()
{
return 'modulesConfigReaderService';
}
}
classe simple s'étendant de la façade
3) le prestataire de services
<?php
namespace Hello\Services\Configuration\Providers;
use Hello\Modules\Core\Providers\Abstracts\ServiceProvider;
class ModulesConfigServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind('modulesConfigReaderService', function(){
return $this->app->make('Hello\Services\Configuration\Portals\ModulesConfigReaderService');
});
}
}
un fournisseur de services qui lie tout ensemble.
UTILISATION:
1) enregistrer les fournisseurs de services normalement
2) accéder à la classe de service via la façade
$whatever = ModulesConfig::getSomething();