【问题标题】:Need Clarification of Laravel Facade需要澄清 Laravel 外观
【发布时间】:2016-05-04 23:04:20
【问题描述】:

所以在 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

我说的对吗?应用程序将该命名空间引导到我相信的别名中?

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

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.2


    【解决方案1】:

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

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

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

    您可以在 cmets 中看到对 \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]);
        }
    }
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 2012-07-18
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2012-06-02
      • 2017-01-18
      • 2016-06-30
      • 1970-01-01
      相关资源
      最近更新 更多