web-dev-qa-db-ja.com

Laravelでファサードクラスを作成するにはどうすればよいですか?

Laravelでファサードモデルクラスを作成するときに少し問題があります。私は http://laravel.com/docs/facades に従いましたが、何かが足りないようです。

_app/models_にfooというフォルダを作成しました。そのフォルダーには2つのファイルがあります。

最初のファイル(Foo.php):

_<?php
namespace Mynamespace;

class Foo {
    public function method() {

    }
}
?>
_

2番目のファイル(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 update_および_composer dump-autoload_を実行しました。

Foo::method()を実行しようとすると、Non-static method Mynamespace\Foo::method() should not be called staticallyが表示されます。何が悪いのですか?

26
Marwelln

ステップ1

facadesフォルダー(_app/facades_)にappというフォルダーを作成します。

ステップ2

composer autoloadにfacadeフォルダーを追加します。

_"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/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()にアクセスできるようになりました。

49
Marwelln

それはその記事でよく説明されています: http://fideloper.com/create-facade-laravel-4

それが役に立てば幸い

3
frenus

ステップ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 ";
        }   
    }

手順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();
});

コントローラの関数を呼び出す:

return \FacadeTester::dummy();
1

簡単なLaravel 5メソッド:

ファサードを作成するには、3つのコンポーネントが必要です。

  • ファサードからアクセスできるようにする必要があるクラスであるファサードクラスになりたい。
  • ファサードにはクラスが必要です。
  • アプリコンテナーに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から拡張された単純なクラス

)サービスプロバイダー

<?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();
0
Mahmoud Zalt