28

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

次に、配列 inに追加Foo => 'Mynamespace\Foo'し、and を実行しました。aliasesapp/config/app.phpcomposer updatecomposer 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

そのフォルダー ( ) に Facade ファイルを作成し、次の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

providersの配列にサービス プロバイダーを追加しますconfig/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 ";
        }   
    }

ステップ 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();
于 2017-05-17T11:02:28.673 に答える