我有一个简单的模态,它具有一个从数据库获取数据的索引方法
模式:国家
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Nation extends Model{
function index(){
Nation::where(['visible'=>1])->get();
}
}
现在,我想从控制器调用此函数:
控制器:
$nations = Nation::index();
为此,我以这种方式创建了Facade:
第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",
我还试图清除缓存和作曲家转储。我在这里想念什么?
谢谢您的推荐!
答案 0 :(得分:1)
AFAIK,当您使用不带名称空间的类时,php会假定该文件应与当前文件位于同一目录中。仅当找不到时,它才会调用__autoload
魔术方法。 Laravel / Composer的解析逻辑位于__autoload
方法内(这是Laravel解析您已向其注册的别名的地方)。
在您的情况下,php检测到一个具有相同名称的类,因此尝试使用它。
解决方案是
将Alias更改为不是当前目录的某个类。在这种情况下,您已经为外观指定了不同的名称,因此只需使用
// Register alias
'NationFacade' => App\Facades\NationFacade::class
// Call it like
NationFacade::index()
OR
// 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()
如果您仍有疑问,请在下面随意评论
答案 1 :(得分:1)
我通过向函数添加 static
解决了类似问题:
public function foo() {}
到
public static function foo() {}
答案 2 :(得分:-1)
只需要将“公共”更改为“静态”