Laravel Facade error: Non-static method should not be called statically

Laravel Facade error: Non-static method should not be called statically

我有一个简单的模式,它有一个索引方法来从数据库中获取数据

模态:国家

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Nation extends Model{
  function index(){
     Nation::where(['visible'=>1])->get();
  }
}

现在我想从控制器调用这个函数:

控制器:

 $nations = Nation::index();

为此,我以这种方式创建了一个 Facade:

  1. 创建了提供者
  2. 在 config/app 中注册了提供商。php
  3. 创建了门面
  4. 在 config/app 中注册了别名。php

第 1 步 - 提供商

php artisan make:provider NationServiceProvider

public function register()    {
    $this->app->bind('nation',function(){
        return new Nation();
    });
}

步骤 2:在 config/app.php

中注册提供商

在供应商数组中:

    App\Providers\NationServiceProvider::class,

步骤 3 创建外观

我创建了一个文件夹 App/Facades/ 并在文件中 NationFacade.php

namespace App\Facades;
use Illuminate\Support\Facades\Facade;

class NationFacade extends Facade{
protected static function getFacadeAccessor(){
    return 'nation';
   }
}

第四步:在config/app中注册别名。php

在别名数组中:

    'Nation' => App\Facades\NationFacade::class

但是,当我 运行 控制器时,我得到了错误:

"message": "Non-static method App\Models\Nation::index() should not be called statically",

我还尝试清除缓存和作曲家转储。我在这里缺少什么?

感谢您的任何建议!

AFAIK,当您使用不带名称空间的 class 时,php 假定该文件应与当前文件位于同一目录中。只有当它没有找到时,它才会调用 __autoload 魔术方法。 Laravel's/Composer 的解析逻辑位于 __autoload 方法中(这是 Laravel 解析您注册的别名的地方)。

在你的例子中,php 检测到一个 class 同名的驻留在其范围内,因此它尝试使用它。

解决方案是

  1. 将别名更改为某个 class,这不是当前目录。在这种情况下,您已经将外观命名为不同的名称,因此只需使用

    // Register alias
    'NationFacade' => App\Facades\NationFacade::class
    
    // Call it like
    NationFacade::index()
    

    // Import
    use App\Facades\NationFacade
    
    // Call it like
    NationFacade::index()
    
  2. 使用 php 的别名而不是 Laravel 的别名(我不是 100% 确定这是否有效)

    // Import the facade
    use App\Facades\NationFacade as Nation;
    
    // Call it like
    Nation::index()
    

如果还有疑问,欢迎在下方留言

只有你需要更改 'public' 为 'static'

我通过在我的函数中添加 static 解决了类似的问题:

public function foo() {}

public static function foo() {}