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:
- 创建了提供者
- 在 config/app 中注册了提供商。php
- 创建了门面
- 在 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 同名的驻留在其范围内,因此它尝试使用它。
解决方案是
将别名更改为某个 class,这不是当前目录。在这种情况下,您已经将外观命名为不同的名称,因此只需使用
// 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()
如果还有疑问,欢迎在下方留言
只有你需要更改 'public' 为 'static'
我通过在我的函数中添加 static
解决了类似的问题:
public function foo() {}
至
public static function foo() {}
我有一个简单的模式,它有一个索引方法来从数据库中获取数据
模态:国家
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Nation extends Model{
function index(){
Nation::where(['visible'=>1])->get();
}
}
现在我想从控制器调用这个函数:
控制器:
$nations = Nation::index();
为此,我以这种方式创建了一个 Facade:
- 创建了提供者
- 在 config/app 中注册了提供商。php
- 创建了门面
- 在 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 同名的驻留在其范围内,因此它尝试使用它。
解决方案是
将别名更改为某个 class,这不是当前目录。在这种情况下,您已经将外观命名为不同的名称,因此只需使用
// 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()
如果还有疑问,欢迎在下方留言
只有你需要更改 'public' 为 'static'
我通过在我的函数中添加 static
解决了类似的问题:
public function foo() {}
至
public static function foo() {}