Ошибка Laravel Facade: нестатический метод не следует вызывать статически

У меня есть простой модальный метод с индексным методом для получения данных из БД.

Модальный: Страна

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 Создать фасад

Я создал папку 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",

Я также попытался очистить кеш и дамп композитора. Что мне здесь не хватает?

Спасибо за любое предложение!

В вашей национальной модели сделайте индексную функцию общедоступной.

Nazmul Abedin 24.07.2019 07:44

Попробуйте вызвать без псевдонима. то есть) NationFacade::index(). Насколько я знаю, вызов происходит напрямую из модели Nation, чего быть не должно. Вызов должен происходить на фасаде, и он должен разрешать метод и вызывать его.

Cerlin 24.07.2019 07:47

@NazmulAbedin, спасибо! Мне этого не хватало.

Uncoke 24.07.2019 07:56

@CerlinBoss. Без псевдонима меня не найти! Итак, я понял, что «использование» отсутствует (я думал, что это было сделано загрузчиком). Если я добавлю «использовать App\Facades\NationFacade;» Оно работает! Но теперь я в замешательстве: что я должен использовать с псевдонимом?

Uncoke 24.07.2019 07:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
4
10 387
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Насколько я знаю, когда вы используете класс без пространства имен, 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()
    

Если у вас все еще есть сомнения, пожалуйста, не стесняйтесь комментировать ниже

Только вам нужно изменить «общедоступный» на «статический»

Отличный ответ! Коротко и мило. Искал способ использования пользовательских методов в модели. Ваш ответ заставил это случиться.

Hmerman6006 17.07.2020 20:51

Я исправил аналогичную проблему, добавив static в свою функцию:

public function foo() {}

к

public static function foo() {}

Другие вопросы по теме