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
が表示されます。何が悪いのですか?
facades
フォルダー(_app/facades
_)にapp
というフォルダーを作成します。
composer autoloadにfacadeフォルダーを追加します。
_"autoload": {
"classmap": [
...
"app/facades"
]
},
_
そのフォルダー(_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
}
_
_app/models
_(_MyClass.php
_)でモデルを作成します。
_<?php
namespace MyNamespace;
use Eloquent; // if you're extending Eloquent
class MyClass extends Eloquent {
...
}
_
新しいサービスプロバイダーを作成します(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;
});
}
}
_
別のファサードが必要な場合は、ここで新しいバインディングを追加できます(ファサードファイルを作成することを忘れないでください)。
_config/app.php
_のproviders
配列にサービスプロバイダーを追加します。
_'providers' => array(
...
'MyServiceProvider'
)
_
_composer dump
_を実行して、新しいクラスにアクセスできるようにします。
ファサードとしてMyClassAlias::method()
にアクセスできるようになりました。
それはその記事でよく説明されています: http://fideloper.com/create-facade-laravel-4
それが役に立てば幸い
ステップ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();
簡単なLaravel 5メソッド:
ファサードを作成するには、3つのコンポーネントが必要です。
これが完全な例です。この例では、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();