【问题标题】:Laravel Facade error: Non-static method should not be called staticallyLaravel Facade 错误:不应静态调用非静态方法
【发布时间】:2019-12-02 04:44:56
【问题描述】:

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

模态:国家

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

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

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

控制器

 $nations = Nation::index();

为了做到这一点,我以这种方式创建了一个外观:

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

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

在别名数组中:

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

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

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

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

感谢您的任何建议!

【问题讨论】:

  • 在你的国家模型中,公开索引函数。
  • 尝试不使用别名调用。即)NationFacade::index()。 AFAIK,呼叫直接来自Nation 模型,这不应该发生。调用应该发生在外观中,它应该解析方法并调用它。
  • @NazmulAbedin,谢谢!我错过了。
  • @CerlinBoss。没有别名,我找不到!所以我意识到缺少“使用”(我认为它是由引导程序制作的)。如果我添加“使用 App\Facades\NationFacade;”有用!但现在我很困惑:我必须使用别名做什么?

标签: laravel eloquent laravel-facade


【解决方案1】:

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

在你的例子中,php 检测到一个同名的类存在于它的范围内,所以它会尝试使用它。

解决方案是

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 很好的答案!短而甜。正在寻找一种在模型中使用自定义方法的方法。你的回答让这一切发生了。
    【解决方案3】:

    我通过将static 添加到我的函数来解决了类似的问题:

    public function foo() {}
    

    public static function foo() {}
    

    【讨论】:

      猜你喜欢
      • 2015-05-28
      • 2023-02-22
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      相关资源
      最近更新 更多