Используйте статические переменные в фасадах Laravel

У меня есть фасад (в данном случае синглтон), и я регистрирую его с помощью ServiceProvider:

Поставщик услуг

use App;

class FacilityServiceProvider extends ServiceProvider 
{

    public function register()
    {  
        $this->app->singleton('Facility', function(){
            return new Facility();
        });

        // Shortcut so developers don't need to add an Alias in app/config/app.php
        $this->app->booting(function()
        {
            $loader = \Illuminate\Foundation\AliasLoader::getInstance();
            $loader->alias('Facility', 'CLG\Facility\Facades\FacilityFacade');
        });
    }
}

Фасад

use Illuminate\Support\Facades\Facade;

class FacilityFacade extends Facade {

    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor() { return 'Facility'; }
}

Теперь я хочу иметь статические переменные внутри моего класса Facility:

Facility.php

class Facility
{
    public static $MODEL_NOT_FOUND = '-1';

    public function __construct() { ... }
}

но когда я использую Facility::$MODEL_NOT_FOUND, я получаю Access to undeclared static property.

Что я делаю не так?


person Kousha    schedule 07.12.2014    source источник


Ответы (1)


Это связано с тем, что класс Facade только «перенаправляет» вызовы методов базовому классу. Таким образом, вы не можете получить доступ к свойствам напрямую. Самое простое решение — использовать геттерный метод.

class Facility
{
    public static $MODEL_NOT_FOUND = '-1';

    public function __construct() { ... }

    public function getModelNotFound(){
        return self::$MODEL_NOT_FOUND;
    }
}

Альтернативой может быть написание собственного класса Facade, расширяющего Illuminate\Support\Facades\Facade и использующего < strong>магические методы для прямого доступа к свойствам

person lukasgeiter    schedule 07.12.2014
comment
Да я тоже так думал. Что мне тогда не нравится, так это то, что мне пришлось бы вызывать это как функцию, а не как переменную (т.е. Facility::getModelNotFound(), а не Facility::$ModelNotFound или как там еще). Что вы порекомендуете? - person Kousha; 08.12.2014
comment
Вы не сможете вызвать функцию с помощью класса Laravel Facade. Однако, как я уже упоминал. Вы могли бы написать свой собственный. Дайте мне немного времени... Я собираюсь написать один и обновить ответ. - person lukasgeiter; 08.12.2014
comment
Ну ладно... Я думал, что это возможно с чем-то вроде __getStatic(), но, видимо, ничего подобного нет. Вы должны работать с методами или вообще без Фасада :/ - person lukasgeiter; 08.12.2014
comment
Ха-ха, хорошо, спасибо. Я думаю, я застрял с именем функции - person Kousha; 08.12.2014