How do I create a facade class with Laravel?

2019-01-08 10:00发布

问题:

I'm having a little problem with creating a facade model class with Laravel. I have followed http://laravel.com/docs/facades but I guess I'm missing something.

I have created a folder in app/models called foo. In that folder I have two files.

First file (Foo.php):

<?php
namespace Mynamespace;

class Foo {
    public function method() {

    }
}
?>

Second file (FooFacade.php):

<?php
use Illuminate\Support\Facades\Facade;

class Foo extends Facade {
    protected static function getFacadeAccessor() { return 'foo'; }
}
?>

Then I added Foo => 'Mynamespace\Foo' to the aliases array in app/config/app.php and ran composer update and composer dump-autoload.

Now when I try to run Foo::method() I get Non-static method Mynamespace\Foo::method() should not be called statically. What am I doing wrong?

回答1:

Step 1

Create a folder called facades in your app folder (app/facades).

Step 2

Add the facade folder to your composer autoload.

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

Step 3

Create a Facade file in that folder (FooFacade.php) and add this content:

<?php
use Illuminate\Support\Facades\Facade;

class MyClass extends Facade {
    protected static function getFacadeAccessor() { return 'MyClassAlias'; } // most likely you want MyClass here
}

Step 4

Create a model in app/models (MyClass.php).

<?php
namespace MyNamespace;

use Eloquent; // if you're extending Eloquent

class MyClass extends Eloquent {
    ...
}

Step 5

Create a new service provider (you can create a folder in app called serviceproviders and add it to composer autoload) (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;
        });
    }
}

Here you can add new binding if you want another facade (don't forget to create a facade file if so).

Step 6

Add the service provider to the providers array in config/app.php.

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

Step 7

Run composer dump so we can access our new classes.

Step 8

You can now access MyClassAlias::method() as a facade.



回答2:

It's well explained in that post: http://fideloper.com/create-facade-laravel-4

Hope it helps



回答3:

Step 1: Create Service provider

<?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;
           });
       }
    }

Step 2: Create Façade class which extends Illuminate\Support\Facades\Facade class.

<?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'
        } 
    }

Step 3: Create the class(TestFacade.php) where you want to add functions.

<?php
    namespace App;
    class TestFacade{
        public function dummy(){
            return "Business Logic ";
        }   
    }

Step 4: Register service provider and provide alias name in Config\App.php

'providers' => [ //...
     App\Providers\NewFacadeServiceProvider::class
 ],

 //Class Aliases
 'aliases' => [ //...
    'FacadeTester' => App\Facade\TestFacade::class,
 ]

Call the function Route.php:

Route::get('/skull',function(){
    return FacadeTester::dummy();
});

Call function in Controller:

return \FacadeTester::dummy();


回答4:

A simple Laravel 5 methode:

To create a Facade you need 3 components:

  • The wanna be Facade Class, the class that needs to become accessible via facade.
  • The Facade required Class.
  • The Service Provider, which registers the Facade class in the App container

Here's a full example: in the example I'm creating the Facade ModulesConfig for the ModulesConfigReaderService class.

1) the service class that needs to become accessible via a facade

<?php

namespace Hello\Services\Configuration\Portals;

use Illuminate\Support\Facades\Config;

class ModulesConfigReaderService
{

    public function getSomething()
    {
        return 'Whatever';
    }

}

this is a very normal class

2) the facade required class

<?php

namespace Hello\Services\Configuration\Facade;

use Illuminate\Support\Facades\Facade;

class ModulesConfig extends Facade
{

    protected static function getFacadeAccessor()
    {
        return 'modulesConfigReaderService';
    }

}

simple class extending from the Facade

3) the service provider

<?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');
        });
    }
}

a service provider that binds everything together.

USAGE:

1) register the service providers normally

2) access the service class via the facade

$whatever = ModulesConfig::getSomething();