28

我在用 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 => 'Mynamespace\Foo'aliases数组中app/config/app.php并运行composer updateand composer dump-autoload

现在,当我尝试跑步时,Foo::method()我得到了Non-static method Mynamespace\Foo::method() should not be called statically. 我究竟做错了什么?

4

4 回答 4

56

步骤1

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

第2步

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

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

第 3 步

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

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

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

第4步

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

<?php
namespace MyNamespace;

use Eloquent; // if you're extending Eloquent

class MyClass extends Eloquent {
    ...
}

第 5 步

创建一个新的服务提供者(您可以在 app 中创建一个名为的文件夹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 步

将服务提供者添加providersconfig/app.php.

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

第 7 步

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

第 8 步

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

于 2013-11-06T11:34:38.983 回答
4

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

希望能帮助到你

于 2013-06-06T09:09:56.987 回答
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();
});

控制器中的调用函数:

return \FacadeTester::dummy();
于 2017-05-17T11:02:28.673 回答
0

一个简单的 Laravel 5 方法:

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

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

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

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

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

用法:

1) 正常注册服务提供者

2)通过门面访问服务类

$whatever = ModulesConfig::getSomething();
于 2016-06-12T16:45:27.287 回答