如何创建与Laravel一个门面类?

问题描述 投票:25回答:4

我在与创建与Laravel一个门面模型类有点小问题。我按照http://laravel.com/docs/facades,但我想我失去了一些东西。

我创建了一个叫做app/modelsfoo的文件夹。在该文件夹我有两个文件。

第一个文件(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'aliasesapp/config/app.php阵列就跑composer updatecomposer dump-autoload

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

php laravel facade
4个回答
49
投票

Step 1

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

Step 2

门面文件夹添加到您的作曲家自动加载。

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

Step 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
}

Step 4

创建app/modelsMyClass.php)的模型。

<?php
namespace MyNamespace;

use Eloquent; // if you're extending Eloquent

class MyClass extends Eloquent {
    ...
}

Step 5

创建一个新的服务提供商(你可以创建应用程序称为serviceproviders一个文件夹并将其添加到自动加载作曲家)(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;
        });
    }
}

在这里,如果你想另一个门面(不要忘了,如果这样去制造假象文件),您可以添加新的绑定。

Step 6

服务提供商加入到providersconfig/app.php阵列。

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

Step 7

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

Step 8

您现在可以访问MyClassAlias::method()作为幌子。


3
投票

它在该职位很好地解释:http://fideloper.com/create-facade-laravel-4

希望能帮助到你


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:创建延伸照亮\支持\外墙\门面类外墙类。

<?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步:注册服务提供商,在配置\ 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();

0
投票

一个简单的Laravel 5梅索德:

要创建一个门面,你需要3个部分组成:

  • 本想将门面类,需要通过成为门面访问的类。
  • 门面所需的类。
  • 服务提供商,其在App容器注册门面类

这里有一个完整的例子:在这个例子中,我创建了门面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';
    }

}

从正面延伸简单的类

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();
© www.soinside.com 2019 - 2024. All rights reserved.