【问题标题】:How do I create a facade class with Laravel?如何使用 Laravel 创建外观类?
【发布时间】:2013-06-02 04:58:57
【问题描述】:

我在使用 Laravel 创建外观模型类时遇到了一点问题。我关注了http://laravel.com/docs/facades,但我想我错过了一些东西。

我在app/models 中创建了一个名为foo 的文件夹。在那个文件夹中,我有两个文件。

第一个文件(Foo.php):

<?php
namespace Mynamespace;

class Foo {
    public function method() {

    }
}
?>

第二个文件(FooFacade.php):

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

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

然后我将Foo =&gt; 'Mynamespace\Foo' 添加到app/config/app.php 中的aliases 数组并运行composer updatecomposer dump-autoload

现在当我尝试运行Foo::method() 时,我得到Non-static method Mynamespace\Foo::method() should not be called statically。我做错了什么?

【问题讨论】:

  • 您需要在config/app.php中设置服务提供者和别名。考虑到别名指向外观类,而不是类本身(它在 laravel 文档中令人困惑)。这样就可以避免非静态错误

标签: php laravel facade


【解决方案1】:

第 1 步:创建服务提供者

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

第 2 步:创建扩展 Illuminate\Support\Facades\Facade 类的 Façade 类。

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

第 3 步:创建要添加功能的类 (TestFacade.php)。

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

第四步:在Config\App.php中注册服务提供者并提供别名

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

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

调用函数Route.php:

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

Controller中的调用函数:

return \FacadeTester::dummy();

【讨论】:

    【解决方案2】:

    一个简单的 Laravel 5 方法:

    要创建一个 Facade,您需要 3 个组件:

    • 想要成为外观类,需要通过外观访问的类。
    • 外观所需的类。
    • Service Provider,在 App 容器中注册 Facade 类

    这是一个完整的示例:在示例中,我正在为 ModulesConfigReaderService 类创建外观 ModulesConfig

    1) 需要通过外观访问的服务类

    <?php
    
    namespace Hello\Services\Configuration\Portals;
    
    use Illuminate\Support\Facades\Config;
    
    class ModulesConfigReaderService
    {
    
        public function getSomething()
        {
            return 'Whatever';
        }
    
    }
    

    这是一堂很普通的课

    2)外观所需的类

    <?php
    
    namespace Hello\Services\Configuration\Facade;
    
    use Illuminate\Support\Facades\Facade;
    
    class ModulesConfig extends Facade
    {
    
        protected static function getFacadeAccessor()
        {
            return 'modulesConfigReaderService';
        }
    
    }
    

    从外观扩展的简单类

    3) 服务提供商

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

    将所有东西绑定在一起的服务提供者。

    用法:

    1) 正常注册服务提供者

    2) 通过外观访问服务类

    $whatever = ModulesConfig::getSomething();
    

    【讨论】:

    • 如何正常注册服务商
    【解决方案3】:

    步骤 1

    在您的 app 文件夹 (app/facades) 中创建一个名为 facades 的文件夹。

    第二步

    将外观文件夹添加到您的作曲家自动加载中。

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

    第三步

    在该文件夹 (FooFacade.php) 中创建一个外观文件并添加以下内容:

    <?php
    use Illuminate\Support\Facades\Facade;
    
    class MyClass extends Facade {
        protected static function getFacadeAccessor() { return 'MyClassAlias'; } // most likely you want MyClass here
    }
    

    第四步

    app/models (MyClass.php) 中创建模型。

    <?php
    namespace MyNamespace;
    
    use Eloquent; // if you're extending Eloquent
    
    class MyClass extends Eloquent {
        ...
    }
    

    第 5 步

    创建一个新的服务提供者(您可以在应用程序中创建一个名为serviceproviders 的文件夹并将其添加到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;
            });
        }
    }
    

    如果您想要另一个外观,您可以在此处添加新的绑定(如果需要,请不要忘记创建外观文件)。

    第 6 步

    将服务提供者添加到config/app.php中的providers数组中。

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

    第 7 步

    运行composer dump,以便我们可以访问我们的新类。

    第 8 步

    您现在可以访问 MyClassAlias::method() 作为外观。

    【讨论】:

    • 太棒了!您可能希望将'Foo' =&gt; 'FooFacade' 添加到 config/app.php 中的别名
    【解决方案4】:

    在那篇文章中有很好的解释:http://fideloper.com/create-facade-laravel-4

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 2018-11-18
      • 2014-11-16
      • 2019-01-17
      • 2017-09-29
      • 2015-06-19
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      相关资源
      最近更新 更多