Laravel Facade错误:不应静态调用非静态方法

时间:2019-07-24 05:40:24

标签: laravel eloquent laravel-facade

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

模式:国家

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 创建外观

我在文件 NationFacade.php

中创建了一个App / Facades /文件夹。
namespace App\Facades;
use Illuminate\Support\Facades\Facade;

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

步骤4 :在config / app.php中注册别名

在“别名”数组中:

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

但是,当我运行控制器时,出现错误:

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

我还试图清除缓存和作曲家转储。我在这里想念什么?

谢谢您的推荐!

3 个答案:

答案 0 :(得分:1)

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

在您的情况下,php检测到一个具有相同名称的类,因此尝试使用它。

解决方案是

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

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

    OR

    // 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()
    

如果您仍有疑问,请在下面随意评论

答案 1 :(得分:1)

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

public function foo() {}

public static function foo() {}

答案 2 :(得分:-1)

只需要将“公共”更改为“静态”