У меня есть простой модальный метод с индексным методом для получения данных из БД.
Модальный: Страна
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Nation extends Model{
function index(){
Nation::where(['visible'=>1])->get();
}
}
Теперь я хочу вызвать эту функцию из контроллера:
Контроллер:
$nations = Nation::index();
Для этого я создал Фасад таким образом:
Шаг 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';
}
}
Шаг 4: Зарегистрируйте псевдоним в config/app.php
В массиве псевдонимов:
'Nation' => App\Facades\NationFacade::class
Но когда я запускаю контроллер, я получаю сообщение об ошибке:
"message": "Non-static method App\\Models\\Nation::index() should not be called statically",
Я также попытался очистить кеш и дамп композитора. Что мне здесь не хватает?
Спасибо за любое предложение!
Попробуйте вызвать без псевдонима. то есть) NationFacade::index(). Насколько я знаю, вызов происходит напрямую из модели Nation, чего быть не должно. Вызов должен происходить на фасаде, и он должен разрешать метод и вызывать его.
@NazmulAbedin, спасибо! Мне этого не хватало.
@CerlinBoss. Без псевдонима меня не найти! Итак, я понял, что «использование» отсутствует (я думал, что это было сделано загрузчиком). Если я добавлю «использовать App\Facades\NationFacade;» Оно работает! Но теперь я в замешательстве: что я должен использовать с псевдонимом?






Насколько я знаю, когда вы используете класс без пространства имен, 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()
Если у вас все еще есть сомнения, пожалуйста, не стесняйтесь комментировать ниже
Только вам нужно изменить «общедоступный» на «статический»
Отличный ответ! Коротко и мило. Искал способ использования пользовательских методов в модели. Ваш ответ заставил это случиться.
Я исправил аналогичную проблему, добавив static в свою функцию:
public function foo() {}
к
public static function foo() {}
В вашей национальной модели сделайте индексную функцию общедоступной.