需要澄清Laravel Facade

时间:2016-05-04 23:04:20

标签: php laravel laravel-5 laravel-5.2

因此,在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]);
    }
}
&#13;
&#13;
&#13;

我们可以这样做吗?

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

从我所看到的,我认为

use Cache;

只是将调用封装到

Illuminate\Support\Facades\Cache
我是对的吗?应用程序引导哪个命名空间到我认为的别名?

更多的澄清肯定会有所帮助。我是laravel的新手。我解释或描述错误的任何事情请指正。谢谢。

1 个答案:

答案 0 :(得分:1)

是的,我相信你可以,但我不这样做。相反,请考虑Laravel Facade的目的:一个能够坐在全局命名空间中的类,它允许静态访问给定实例的公共方法。

Laravel Facades只不过是语法糖,我实际上建议尽可能避免使用它们。虽然非常方便,但它们往往会混淆驱动它们的代码。

对于Cache外观,您基本上可以通过查看Facade的代码以及负责所有Cache移动部件的服务提供商来找出正在使用的实际类:

缓存外观

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。如果我们查看服务提供者,我们可以看到使用此访问器时Facade返回的类:

缓存服务提供商

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

希望这有帮助!