如何使用Laravel创建外观类?

时间:2013-06-06 08:58:01

标签: php laravel facade

我在使用Laravel创建Facade模型类时遇到了一些问题。我跟着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 => 'Mynamespace\Foo'添加到aliases中的app/config/app.php数组,并运行composer updatecomposer dump-autoload

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

4 个答案:

答案 0 :(得分:49)

第1步

facades文件夹(app)中创建名为app/facades的文件夹。

第2步

将facade文件夹添加到您的composer autoload。

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

第3步

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

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

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

第4步

app/modelsMyClass.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步

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

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

第7步

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

第8步

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

答案 1 :(得分:3)

在帖子中对此进行了很好的解释:http://fideloper.com/create-facade-laravel-4

希望有所帮助

答案 2 :(得分: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:创建Façade类,扩展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'
        } 
    }

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

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

步骤4:注册服务提供商并在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();

答案 3 :(得分:0)

简单的Laravel 5方法:

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

  • 想成为Facade Class,需要通过外观进入的类。
  • Facade要求Class。
  • 服务提供商,在App容器中注册Facade类

以下是一个完整示例:在示例中,我正在为ModulesConfig类创建Facade ModulesConfigReaderService

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

}

从Facade扩展的简单类

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

将所有内容绑定在一起的服务提供商。

<强> USAGE:

1)通常注册服务提供商

2)通过门面访问服务类

$whatever = ModulesConfig::getSomething();