2016-05-04 27 views
1

laravel 5.2のlaravelドキュメントでは、これがlaravelでファサードがどのように実装されているかを述べています。Laravel Facadeの明確化が必要

<?php 
 

 
namespace App\Http\Controllers; 
 

 
use Cache; 
 
use App\Http\Controllers\Controller; 
 

 
class UserController extends Controller 
 
{ 
 
    /** 
 
    * Show the profile for the given user. 
 
    * 
 
    * @param int $id 
 
    * @return Response 
 
    */ 
 
    public function showProfile($id) 
 
    { 
 
     $user = Cache::get('user:'.$id); 
 

 
     return view('profile', ['user' => $user]); 
 
    } 
 
}

我々は代わりにこれを行うだろうか?

<?php 
 

 
namespace App\Http\Controllers; 
 

 
use Illuminate\Support\Facades\Cache; 
 
use App\Http\Controllers\Controller; 
 

 
class UserController extends Controller 
 
{ 
 
    /** 
 
    * Show the profile for the given user. 
 
    * 
 
    * @param int $id 
 
    * @return Response 
 
    */ 
 
    public function showProfile(Cache $cache, $id) 
 
    { 
 
     $user = $cache->get('user:'.$id); 
 

 
     return view('profile', ['user' => $user]); 
 
    } 
 
}

私は

use Cache; 

がちょうど

Illuminate\Support\Facades\Cache 

への呼び出しをカプセル化していることを考えて見ることができるものから、私は修正していますか?アプリケーションは、その名前空間を私が信じているエイリアスにブートストラップしますか?

もっと明確にすることは間違いありません。私はlaravel.Anewthing私は説明や説明が間違って私を修正してくださいありがとうございます。

答えて

0

はい、私はあなたができると信じていますが、私はそうしないでしょう。代わりに、Laravel Facadeの目的を考えてみましょう。グローバルな名前空間に座って、特定のインスタンスのパブリックメソッドに静的にアクセスできるクラスです。

Laravel Facadesは文法的な砂糖に過ぎません。私は実際に可能な限り使用しないことをお勧めします。非常に便利ですが、それらはそれらを駆動するコードを難読化する傾向があります。キャッシュのファサードの場合

、あなたは基本的にファサードのコードだけでなく、キャッシュの可動部品の全てに責任をサービスプロバイダの両方を見ることにより活用されています実際のクラスを把握することができます:

キャッシュファサード

namespace Illuminate\Support\Facades; 

/** 
* @see \Illuminate\Cache\CacheManager 
* @see \Illuminate\Cache\Repository 
*/ 
class Cache extends Facade 
{ 
    /** 
    * Get the registered name of the component. 
    * 
    * @return string 
    */ 
    protected static function getFacadeAccessor() 
    { 
     return 'cache'; 
    } 
} 

あなたは\Illuminate\Cache\CacheManager\Illuminate\Cache\Repositoryへの参照があることをコメントで見ることができます。それはどちらですか?ここの鍵はファサードアクセサリーcacheです。我々は、サービスプロバイダを見れば、我々はこのアクセサを使用した場合のファサードで返されているものクラスを参照することができます

キャッシュ・サービス・プロバイダ

class CacheServiceProvider extends ServiceProvider 
{ 
    ... 
    public function register() 
    { 
     $this->app->singleton('cache', function ($app) { 
      return new CacheManager($app); 
     }); 

     $this->app->singleton('cache.store', function ($app) { 
      return $app['cache']->driver(); 
     }); 

     $this->app->singleton('memcached.connector', function() { 
      return new MemcachedConnector; 
     }); 

     $this->registerCommands(); 
    } 
    ... 
} 

私はこのようなあなたの依存関係を宣言することをお勧め:

<?php 

namespace App\Http\Controllers; 

use Illuminate\Cache\CacheManager as Cache; 
use App\Http\Controllers\Controller; 

class UserController extends Controller 
{ 
    /** 
    * Show the profile for the given user. 
    * 
    * @param int $id 
    * @return Response 
    */ 
    public function showProfile(Cache $cache, $id) 
    { 
     $user = $cache->get('user:'.$id); 

     return view('profile', ['user' => $user]); 
    } 
} 

PHPは実際にインスタンスから静的メソッドにアクセスすることができます。そうであれば、考えていたやり方でこれを行う方法は、次のようなものにする必要があります。

<?php 

namespace App\Http\Controllers; 

use Illuminate\Support\Facades\Cache; 
use App\Http\Controllers\Controller; 

class UserController extends Controller 
{ 
    /** 
    * Show the profile for the given user. 
    * 
    * @param int $id 
    * @return Response 
    */ 
    public function showProfile(Cache $cacheFacade, $id) 
    { 
     $cache = $cacheFacade->getFacadeRoot() 
     $user = $cache->get('user:'.$id); 

     return view('profile', ['user' => $user]); 
    } 
} 

これは役に立ちます。

関連する問題