需要澄清 Laravel 门面
Need Clarification of Laravel Facade
因此在 laravel 5.2 的 laravel 文档中指出,这就是 laravel 中的门面实现方式。
<?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
我说的对吗?我相信应用程序 bootstrap 那个命名空间变成了那个别名?
更多的说明肯定会有帮助。我是新手laravel.Anything,我解释或描述错误请指正谢谢。
是的,我相信你可以,但我不会那样做。相反,请考虑 Laravel Facade 的目的:一个 class 能够位于全局命名空间中,允许静态访问给定实例的 public 方法。
Laravel Facades 只不过是语法糖,实际上我建议尽可能避免使用它们。虽然非常方便,但它们往往会混淆驱动它们的代码。
对于 Cache facade,您基本上可以通过查看 Facade 的代码以及负责 Cache 的所有移动部件的服务提供者来找出实际使用的 class :
缓存门面
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:
缓存服务提供商
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]);
}
}
希望对您有所帮助!
因此在 laravel 5.2 的 laravel 文档中指出,这就是 laravel 中的门面实现方式。
<?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
我说的对吗?我相信应用程序 bootstrap 那个命名空间变成了那个别名?
更多的说明肯定会有帮助。我是新手laravel.Anything,我解释或描述错误请指正谢谢。
是的,我相信你可以,但我不会那样做。相反,请考虑 Laravel Facade 的目的:一个 class 能够位于全局命名空间中,允许静态访问给定实例的 public 方法。
Laravel Facades 只不过是语法糖,实际上我建议尽可能避免使用它们。虽然非常方便,但它们往往会混淆驱动它们的代码。
对于 Cache facade,您基本上可以通过查看 Facade 的代码以及负责 Cache 的所有移动部件的服务提供者来找出实际使用的 class :
缓存门面
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:
缓存服务提供商
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]);
}
}
希望对您有所帮助!