需要澄清 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]);
    }
}

希望对您有所帮助!