当前位置: 首页 > 知识库问答 >
问题:

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

堵睿范
2023-03-14

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

模态:国家

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:提供者NationServiceProvider

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

第2步:在config/app.php中注册提供程序

在提供者数组中:

    App\Providers\NationServiceProvider::class,

步骤3创建立面

我创建了一个文件夹应用程序/Facades/和文件内的国家acade.php

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个答案

邹晟睿
2023-03-14

我通过在函数中添加静态来解决类似问题:

public function foo() {}

public static function foo() {}
穆鸿飞
2023-03-14

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

燕光熙
2023-03-14

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

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

解决方案是

>

  • 将别名更改为非当前目录的某个类。在这种情况下,您已经为外观命名了不同的名称,因此只需使用该名称即可

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

    // Import
    use App\Facades\NationFacade
    
    // Call it like
    NationFacade::index()
    

    使用php的命名空间和别名而不是Laravel的别名(我不能100%确定这是否有效)

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

    如果您仍有疑问,请随时在下面发表评论

  •  类似资料:
    • 我正在使用存储库模式并尝试建立模型之间的关系。当我尝试运行存储()方法(在控制器中),该方法试图使用用户()方法(与方模型建立关系)时,我收到以下错误消息: 非静态方法不应该静态调用::user(),假设$this来自不兼容的上下文 我不明白为什么在尝试运行user()relationship方法时会出现此错误,但所有其他方法(包括$this- 以下是相关代码:

    • 我最近对 PHP 5.4 进行了更新,但收到有关静态和非静态代码的错误。 这是错误: 这是第371行: 我希望有人能帮忙。

    • 我一直试图用我的验证代码进行php pear验证,但我收到的都是严格标准错误--问题是什么?我如何修复它? 电子邮件验证.php

    • PHP严格标准:不应在第33行的/web/sites/blah/somescript.PHP中静态调用非静态方法pear::iserror() 我在MDB2上看到了类似的错误。稍后再详细介绍。 somescript.php: 问题 是否有不同的方法来调用而不会产生错误?

    • 我正在尝试在varGrant CentOS VM上本地运行一个codegniter站点。我已经下载了所有文件,并设置了yaml/host文件等。 我在屏幕上看到这个错误。 遇到 PHP 错误 严重性:8192 消息:非静态方法 MY_Loader::d efine_module() 不应静态调用,假设$this来自不兼容的上下文 文件名:controllers/Front _ controller

    • 我正在努力得到一个用户的基础上,他的id或电子邮件后,他登录通过一个表单。这个函数是在user.class.php中定义的,我想在另一个名为profile.php的php文件中调用它,但它仍然给我带来语法错误,我不知道如何修复它。 错误:不推荐使用:不应静态调用非静态方法User::GetUserId()注意:未定义变量:email in 使用getters和setters,函数 下面是profi