Подтвердить что ты не робот

Как создать класс фасада с помощью Laravel?

У меня возникла небольшая проблема с созданием класса модели фасадов с Laravel. Я следил за http://laravel.com/docs/facades, но, похоже, я что-то пропустил.

Я создал папку в app/models под названием foo. В этой папке у меня есть два файла.

Первый файл (Foo.php):

<?php
namespace Mynamespace;

class Foo {
    public function method() {

    }
}
?>

Второй файл (FooFacade.php):

<?php
use Illuminate\Support\Facades\Facade;

class Foo extends Facade {
    protected static function getFacadeAccessor() { return 'foo'; }
}
?>

Затем я добавил Foo => 'Mynamespace\Foo' в массив aliases в app/config/app.php и запустил composer update и composer dump-autoload.

Теперь, когда я пытаюсь запустить Foo::method(), я получаю Non-static method Mynamespace\Foo::method() should not be called statically. Что я делаю неправильно?

4b9b3361

Ответ 1

Шаг 1

Создайте папку с именем facades в папке app (app/facades).

Шаг 2

Добавьте папку фасада в автозагрузку композитора.

"autoload": {
    "classmap": [
        ...
        "app/facades"
    ]
},

Шаг 3

Создайте файл фасада в этой папке (FooFacade.php) и добавьте это содержимое:

<?php
use Illuminate\Support\Facades\Facade;

class MyClass extends Facade {
    protected static function getFacadeAccessor() { return 'MyClassAlias'; } // most likely you want MyClass here
}

Шаг 4

Создайте модель в app/models (MyClass.php).

<?php
namespace MyNamespace;

use Eloquent; // if you're extending Eloquent

class MyClass extends Eloquent {
    ...
}

Шаг 5

Создайте нового поставщика услуг (вы можете создать папку в приложении под названием serviceproviders и добавить ее в автозагрузку композитора) (app/models/MyClassServiceProvider.php).

<?php
use Illuminate\Support\ServiceProvider;

class MyClassServiceProvider extends ServiceProvider {
    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register() {
        $this->app->bind('MyClassAlias', function(){
            return new MyNamespace\MyClass;
        });
    }
}

Здесь вы можете добавить новое связывание, если хотите другой фасад (не забудьте создать файл фасада, если да).

Шаг 6

Добавьте поставщика услуг в массив providers в config/app.php.

'providers' => array(
    ...
    'MyServiceProvider'
)

Шаг 7

Запустите composer dump, чтобы мы могли получить доступ к нашим новым классам.

Шаг 8

Теперь вы можете получить доступ к MyClassAlias::method() как к фасаду.

Ответ 3

Шаг 1: Создание поставщика услуг

<?php
    namespace App\Providers;
    use Illuminate\Support\ServiceProvider;
    class NewFacadeServiceProvider extends ServiceProvider{
       public function register(){
           $this->app->singleton('TestFacades',function() {
            //'TestFacades' alias name for the façade class
               return new \App\TestFacade;
           });
       }
    }

Шаг 2: Создайте класс Фасад, который расширяет класс Illuminate\Support\Facades\Facade.

<?php
    namespace App\Facade; //created 'facade' folder in app directory
    use Illuminate\Support\Facades\Facade;
    class TestFacade extends Facade{
        protected static function getFacadeAccessor() { 
            return 'TestFacades'; //'TestFacades' alias name for the façade class declare in the class 'NewFacadeServiceProvider'
        } 
    }

Шаг 3. Создайте класс (TestFacade.php), где вы хотите добавить функции.

<?php
    namespace App;
    class TestFacade{
        public function dummy(){
            return "Business Logic ";
        }   
    }

Шаг 4: Зарегистрируйте поставщика услуг и укажите имя псевдонима в Config\App.php

'providers' => [ //...
     App\Providers\NewFacadeServiceProvider::class
 ],

 //Class Aliases
 'aliases' => [ //...
    'FacadeTester' => App\Facade\TestFacade::class,
 ]

Вызвать функцию Route.php:

Route::get('/skull',function(){
    return FacadeTester::dummy();
});

Функция вызова в контроллере:

return \FacadeTester::dummy();

Ответ 4

Простой метод Laravel 5:

Чтобы создать фасад, вам понадобятся 3 компонента:

  • Вы хотите стать классом фасадов, который должен стать доступным через фасад.
  • Требуется класс Facade.
  • Поставщик услуг, который регистрирует класс Facade в контейнере App

Вот полный пример: в примере я создаю Facade ModulesConfig для класса ModulesConfigReaderService.

1) класс обслуживания, который должен стать доступным через фасад

<?php

namespace Hello\Services\Configuration\Portals;

use Illuminate\Support\Facades\Config;

class ModulesConfigReaderService
{

    public function getSomething()
    {
        return 'Whatever';
    }

}

это очень нормальный класс

2) требуемый класс фасада

<?php

namespace Hello\Services\Configuration\Facade;

use Illuminate\Support\Facades\Facade;

class ModulesConfig extends Facade
{

    protected static function getFacadeAccessor()
    {
        return 'modulesConfigReaderService';
    }

}

простой класс, простирающийся от фасада

3) поставщик услуг

<?php

namespace Hello\Services\Configuration\Providers;

use Hello\Modules\Core\Providers\Abstracts\ServiceProvider;

class ModulesConfigServiceProvider extends ServiceProvider
{

    public function register()
    {
        $this->app->bind('modulesConfigReaderService', function(){
            return $this->app->make('Hello\Services\Configuration\Portals\ModulesConfigReaderService');
        });
    }
}

поставщик услуг, который связывает все вместе.

ПРИМЕНЕНИЕ:

1) обычно регистрируйте поставщиков услуг

2) получить доступ к классу службы через фасад

$whatever = ModulesConfig::getSomething();