如何在laravel中创建别名?

时间:2017-08-21 10:21:40

标签: php laravel

我想在aliases等laravel中创建Auth,以便我可以在视图中使用它,就像

一样

Auth::user()

例如,我想从我的设置表中返回数据,并希望像

一样使用它

Setting::method()->value。在视图中和use Setting在控制器中。

我应该为此FacadesService Providers创建什么?给我一些程序。 我尝试使用Service Providers,但我很困惑如何在那里调用数据库。

1 个答案:

答案 0 :(得分:3)

使用Laravel 5.4,这将是一个很长的答案。

  1. 你需要一个服务类(在这种情况下,它是一个幕后的具体类)。我在app/Services文件夹:
  2. 中创建了它
    namespace App\Services;
    
    use Illuminate\Database\DatabaseManager;
    
    class Setting
    {
        protected $db;
    
        public function __construct(DatabaseManager $db)
        {
            $this->db = $db;
        }
    
        public function method()
        {
            return;
        }
    }
    

    如您所见,我将数据库注入该具体类中。这是Laravel IoC的神奇之处。它会自动解决你的具体类中的任何依赖。

    1. 接下来,创建一个外观。我在app/Facades文件夹:
    2. 中创建了它
      namespace App\Facades;
      
      use Illuminate\Support\Facades\Facade;
      
      class Setting extends Facade
      {
          /**
           * Get the registered name of the component.
           *
           * @return string
           */
          protected static function getFacadeAccessor()
          {
              return 'setting';
          }
      }
      

      请注意setting返回的getFacadeAccessor字符串。您需要稍后将此服务名称注册到Container(IoC)。这个外观背后的魔力是,它会自动调用(代理)任何静态方法到具体类的实例方法,在这种情况下你可以调用:

      Service::method()
      
      1. 将服务注册到容器。在AppServiceProvider

        命名空间App \ Providers;

        使用App \ Services \ Setting; 使用Illuminate \ Support \ ServiceProvider;

        类AppServiceProvider扩展了ServiceProvider {     // ...

        /**
         * Register any application services.
         *
         * @return void
         */
        public function register()
        {
            // ...
        
            $this->app->singleton(Setting::class);
            $this->app->alias(Setting::class, 'setting');
        }
        

        }

      2. 在此服务提供商中,我声明Setting服务是单件服务。这意味着,您可以在其他地方使用Setting服务而无需重新初始化类,换句话说,您在文件中使用相同的实例。最后,我告诉容器Setting服务有另一个别名,名称setting,因此Container可以找出App/Facade/Setting后面的混凝土类。

        1. 对于别名,如apokryfos所述。在config/app.php中注册您的外观别名,找到aliases部分并添加以下行:
        2. 'aliases' => [
          
              // ...
          
              'Setting' => App\Facades\Setting::class,
          
          ],
          

          在此之后,你可以像这样打电话给你的门面:

          use Setting;
          
          Setting::method();
          

          希望这有帮助。