web-dev-qa-db-fra.com

Comment créer un cours de façade avec Laravel?

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?

24
Marwelln

Étape 1

Créez un dossier appelé facades dans votre dossier app (app/facades).

Étape 2

Ajoutez le dossier de façade à votre chargement automatique du compositeur.

"autoload": {
    "classmap": [
        ...
        "app/facades"
    ]
},

Étape 3

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
}

Étape 4

Créez un modèle dans app/models (MyClass.php).

<?php
namespace MyNamespace;

use Eloquent; // if you're extending Eloquent

class MyClass extends Eloquent {
    ...
}

Étape 5

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).

Étape 6

Ajoutez le fournisseur de services au tableau providers dans config/app.php.

'providers' => array(
    ...
    'MyServiceProvider'
)

Étape 7

Exécutez composer dump afin que nous puissions accéder à nos nouvelles classes.

Étape 8

Vous pouvez maintenant accéder à MyClassAlias::method() en tant que façade.

48
Marwelln

C'est bien expliqué dans cet article: http://fideloper.com/create-facade-laravel-4

J'espère que ça aide

3
frenus

É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();
1
Mahantesh Kumbar

Une méthode simple Laravel 5:

Pour créer une façade, vous avez besoin de 3 composants:

  • Vous voulez être une classe de façade, la classe qui doit devenir accessible via une façade.
  • La façade nécessaire classe.
  • Le fournisseur de services, qui enregistre la classe Facade dans le conteneur App

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();
0
Mahmoud Zalt