【问题标题】:Laravel: Issue with calling custom FacadeLaravel:调用自定义外观的问题
【发布时间】:2020-10-28 15:12:58
【问题描述】:

我正在使用 Laravel 8 并且我正在创建一个自定义外观,但我无法使用 LogActivity::log($payload) 调用它,而只能使用 LogActivityFacade::log($payload)

看不出我的错在哪里...

app\Helpers\LogActivityFacade.php

<?php


namespace App\Helpers;


use Illuminate\Support\Facades\Facade;

class LogActivityFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'logactivity';
    }
}

app\Helpers\LogActivityHelper.php

<?php


namespace App\Helpers;


use App\Repositories\LogActivityRepository;

class LogActivityHelper
{
    public function log($payload)
    {
        $repository = new LogActivityRepository();
        $repository->store($payload);
    }
}

app\Providers\LogActivityServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\Facades\App;
use App\Helpers\LogActivityHelper;
use Illuminate\Support\ServiceProvider;

class LogActivityServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('logactivity', function() {
            return new LogActivityHelper();
        });
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

config/app.php

在提供者数组中

[...]
App\Providers\LogActivityServiceProvider::class,

在别名数组中

'LogActivity' => App\Helpers\LogActivityFacade::class,

我也尝试了composer dump-autoloadphp artisan config:clear,但我只能使用LogActivityFacade::log() 而不是LogActivity 来访问Facade(并且它有效...)。

【问题讨论】:

    标签: laravel laravel-8


    【解决方案1】:

    这是预期的行为。 Laravel 不会为您创建新类,它只是使用 __call 魔术方法从外观中的服务类代理方法。例如,如果您看一下供应商目录中的AuthRoute 外观,您会看到它们分别被命名为AuthRoute,而不是AuthFacadeRouteFacade。因此,只需将您的外观命名为LogActivity。如果您需要将其与服务类区分开来,您可以使用命名空间或只是在服务类名称后加上您已经完成的内容。

    【讨论】:

      【解决方案2】:

      您可以这样做以便于访问外墙

      namespace App\Facade;
      
      use Illuminate\Support\Facades\Facade;
      
      abstract  class BaseFacade extends Facade
      {
      
          /**
           * @return string
           */
          public static function getFacadeAccessor()
          {
              return static::class ;
          }
      
          /**
           * @param $class
           */
          static function shouldProxyTo($class)
          {
              app()->singleton(self::getFacadeAccessor(),$class);
          }
      
      }
      

      扩展其他外观

      namespace App\Facade\Plugins;
      
      
      use App\Facade\BaseFacade;
      
      /**
       * @method static convertPersianNumberToEnglish($number)
       * @method static bool checkDataIsTrue(array  $results = [])
       * @method static string|null removeFileTypeName(string $string = null)
       */
      class GlobalPluginsFacade extends BaseFacade
      {
      
      }
      

      在服务提供商处注册

      public function boot()
      {
      
        // global facades
        GlobalPluginsFacade::shouldProxyTo(GlobalPluginsRepo::class);
      
      }
      

      而且易于使用。

      GlobalPluginsFacade::getFunction();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-14
        • 1970-01-01
        • 2017-07-05
        • 2011-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多