2016-05-04 6 views
1

In der Laravel-Dokumentation in Laravel 5.2 heißt es, dass so die Fassade in Laravel implementiert wird.Klärung der Laravel-Fassade erforderlich

<?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]); 
 
    } 
 
}

Könnten wir tun, anstatt das?

<?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]); 
 
    } 
 
}

Von dem, was ich sehen kann, ich denke, dass

use Cache; 

nur den Anruf zu

Illuminate\Support\Facades\Cache 

Einkapseln bin ich richtig? Die Anwendung Bootstrap, Namespace in diesem Alias ​​glaube ich?

Mehr Klärung würde definitiv helfen. Ich bin neu bei Laravel.Alles, was ich falsch erklärt oder beschrieben habe, bitte korrigieren Sie mich danke.

Antwort

0

Ja, ich glaube du kannst, aber ich würde es nicht so machen. Betrachten Sie stattdessen den Zweck einer Laravel-Fassade: Eine Klasse, die im globalen Namespace sitzen kann und statischen Zugriff auf die öffentlichen Methoden einer bestimmten Instanz ermöglicht.

Laravel Fassaden sind nichts anderes als syntaktischer Zucker, und ich würde empfehlen, sie zu vermeiden, wenn es überhaupt möglich ist. Obwohl sie sehr praktisch sind, neigen sie dazu, den Code, der sie antreibt, zu verschleiern.

Im Fall der Cache Fassade, können Sie im Grunde die eigentliche Klasse herauszufinden, die durch einen Blick auf beide den Code der Fassade genutzt hat wird, sowie den Service Provider verantwortlich für alle beweglichen Teile des Cache:

Cache Fassade

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

Sie können in den Kommentaren sehen, dass es einen Hinweis auf \Illuminate\Cache\CacheManager und \Illuminate\Cache\Repository. Also was ist es? Der Schlüssel hier ist der Fassaden-Accessor cache. Wenn wir beim Service-Provider suchen, können wir sehen, welche Klasse von der Fassade zurückgeführt wird, wenn dieser Zugriff verwendet wird:

Cache Service Provider

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

Ich würde vorschlagen, Ihre Abhängigkeit wie folgt erklärt:

Ich bin ziemlich sicher, dass PHP Ihnen tatsächlich ermöglicht, auf statische Methoden von einer Instanz zuzugreifen. Wenn das der Fall ist, dann ist der Weg, um es in der Art und Weise zu tun, Sie dachten, würde wie folgt aussehen müssen:

<?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]); 
    } 
} 

hoffe, das hilft!