2016-02-25 9 views

答えて

13

これはLaravel 5のファサードを実装するための唯一の方法ではないかもしれないが、ここで私はそれをどうやっです。

Fooファサードは、Foobarネームスペースで使用できます。

1.、この例のために、私は私のプロジェクトに新しいフォルダを作成します

ファーストカスタムクラスを作成します。それは簡単に見つけることができる独自のnamespaceを取得します。私の場合はディレクトリがfoobarにと呼ばれる

:ここで

enter image description here

、私たちは私たちのクラス定義を使用して新しいPHPファイルを作成します。私の場合、私はそれをFoo.phpと呼んだ。

<?php 
// %LARAVEL_ROOT%/Foobar/Foo.php 

namespace Foobar; 


class Foo 
{ 
    public function Bar() 
    { 
     return 'got it!'; 
    } 
} 

2.私たちの空想の新しいフォルダではファサードクラス

を作成し、我々は我々のファサードのための新しいPHPファイルを追加することができます。私はそれをFooFacade.phpと呼ぶつもりで、Foobar \ Facadesと呼ばれる別の名前空間に入れています。 この場合のネームスペースは、フォルダ構造を反映していないことに注意してください。あなたが必要になるので、あなたは​​に戻る何

<?php 
// %LARAVEL_ROO%/Foobar/FooFacade.php 

namespace Foobar\Facades; 


use Illuminate\Support\Facades\Facade; 

class Foo extends Facade 
{ 
    protected static function getFacadeAccessor() 
    { 
     return 'foo'; // Keep this in mind 
    } 
} 
  • ベア心​​の中で一瞬でいます。

また、既存のFacadeクラスを拡張しています。

3.だから今、私たちは自分の空想新しいプロバイダ必要php artisan

を使用して新しいプロバイダを作成します。ありがたいことに、我々は素晴らしいartisanツールを持っています。私の場合、私はそれをFooProviderと呼ぶつもりです。

php artisan make:provider FooProvider 

Bam!私たちはプロバイダを持っています。 Read more about service providers here.今のところ2つの機能(bootregister)があることを知り、registerにいくつかのコードを追加します。私たちは、新しいプロバイダ我々のアプリbindするつもりだ:

$this->app->bind('foo', function() { 
    return new Foo; //Add the proper namespace at the top 
}); 

をだからこれbind('foo'部分は、実際にあなたがあなたのFooFacade.phpコードに入れるものと一致する予定です。私が前にreturn 'foo';と言ったところで、私はこのバインドをそれに合わせたいと思っています。 (私はreturn 'wtv';を言っていると思います場合は、私はここにbind('wtv',を言うと思います。)

さらに、我々はどこFooを見つけるためにLaravelを指示する必要があります!

だから、一番上に我々は今、全ファイルチェックアウトの名前空間

use \Foobar\Foo; 

を追加します。

<?php 
// %LARAVEL_ROOT%/app/Providers/FooProvider.php 

namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 
use Foobar\Foo; 

class FooProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap the application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     // 
    } 

    /** 
    * Register the application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->bind('foo', function() { 
      return new Foo; 
     }); 
    } 
} 
  • をあなたはFoobar\FooなくFoobar\Facades\Fooを使用していることを確認してください - あなたのIDEが示唆するかもしれません間違った完了。

4.今、私たちは私たちが作成したこれらのランダムなファイルを使用することに興味を持っているLaravelを伝える必要があり、私たちは私たちのconfig/app.phpファイルでそれを行うことができますconfig/app.php

に私達の参照を追加します。

  1. 'providers'に、あなたのプロバイダクラスの参照を追加します。App\Providers\FooProvider::class

  2. 'aliases'にあなたのファサードクラスの参照を追加します。'Foo' => Foobar\Facades\Foo::class

は覚えておいてください、別名で、私は'Foo'を書いたところ、ファサードを参照したい名前をそこに入れたいと思うでしょう。だから、あなたはあなたのアプリケーションの周りMyBigOlFacade::helloWorld()を使用したい場合は、あなたが'MyBigOlFacade' => MyApp\WhereEverMyFacadesAre\MyBigOlFacade::class

5.アップデートでその行を開始したいあなたが必要とする必要がありますあなたのcomposer.json

最後のコードの変更は、あなたのcomposer.jsonpsr-4スペースを更新することです。あなたはこれを追加する必要があります:

"psr-4": { 
     "Foobar\\" : "Foobar/", 
     // Whatever you had already can stay 
    } 

決勝動くので

オーケー、今あなたが変更されているすべてを持っていることを、あなたが必要とする最後の事は作曲と職人の両方でキャッシュをリフレッシュすることです。これを試してみてください:

composer dumpautoload 
php artisan cache:clear 

が使用& Aクイックテスト:

app/routes.phpにルートを作成します。

Route::get('/foobar', '[email protected]'); 

その後

php artisan make:controller FooBarController 

を実行し、それが今に見えるので、いくつかのコードを追加します。このように:

01あなたが次の文字列で終わる必要があります
<?php 

namespace App\Http\Controllers; 

use Foobar\Facades\Foo; 

use App\Http\Requests; 

class FooBarController extends Controller 
{ 
    public function testFoo() 
    { 
     dd(Foo::Bar()); 
    } 
} 

enter image description here


トラブルシューティング

  • あなたはそれがクラスFoobar\Facades\Fooを見つけることができないと言って終わると、エラーした場合試してみてくださいphp artisan optimize
+0

**お願い!**このガイドを使用しても問題が解決しない場合は、教えてください。 – Martin

+1

最後のコマンドはcache:clear not cache:clean – IlGala

+2

もう1つは、キャッシュをクリアしてLaravelが "Class not found error"を返すため、コマンドを実行しました** php artisan optimize **とすべてが動作しました – IlGala

関連する問題