Heim >Backend-Entwicklung >PHP-Tutorial >Problem mit Laravel-Dienstanbietern

Problem mit Laravel-Dienstanbietern

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-08-04 09:20:321940Durchsuche

Meine Gedanken:

Ich habe selbst eine Tool-Klasse geschrieben. Da sie an mehreren Stellen im Projekt verwendet wird und ich sie nicht jedes Mal instanziieren möchte, möchte ich dieses Tool im Service-Container von Laravel registrieren. Aber leider gibt es einige Probleme. Ich werde den Code und meine eigenen Ideen direkt unten einfügen. ? ? Vielen Dank! ! !

Schritt eins: Registrieren Sie zuerst den Container

<code>php artisan make:provider QcloudVideoServiceProvider</code>

Der Code lautet wie folgt:

<code><?php

namespace App\Providers;

use App\Xiaoteng\QCVod;
use Illuminate\Support\ServiceProvider;

class QcloudVideoServiceProvider extends ServiceProvider
{

    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('qcloud.vod', function ($app) {
            $glass = new QCVod(config('QCLOUD_KEY'), config('QCLOUD_SECRET'));
            return $glass->setRegion('gz');
        });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return ['qcloud.vod'];
    }
}
</code>

Schritt 2: Registrieren Sie sich für Fassaden

Erstellen Sie Foundation/Facades/QcloudFacades.php im App-Verzeichnis. Der Code lautet wie folgt:

<code><?php
namespace App\Foundation\Facades;

use Illuminate\Support\Facades\Facade;

class QCvodFacades extends Facade
{

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

}</code>

Schritt 3: Dienst registrieren

Dienstanbieter und Fassaden in config/app.php registrieren

<code>providers => [
    //...
    App\Providers\QcloudVideoServiceProvider::class,
]

aliases => [
    //...
    'QCvod' => App\Foundation\Facades\QCvodFacades::class,
]</code>

Schritt 4: Rufen Sie

an
<code>dd(ACvod::getRegion());</code>

getRegion() ist eine Getter-Methode in der Tool-Klasse

Das Problem tritt auf:

<code>Class qcloud.vod does not exist</code>

Vielen Dank für Ihre Geduld beim Lesen! Vielen Dank!

Bitte lösen Sie es?

Antwortinhalt:

Meine Gedanken:

Ich habe selbst eine Tool-Klasse geschrieben. Da sie an mehreren Stellen im Projekt verwendet wird und ich sie nicht jedes Mal instanziieren möchte, möchte ich dieses Tool im Service-Container von Laravel registrieren. Aber leider gibt es einige Probleme. Ich werde den Code und meine eigenen Ideen direkt unten einfügen. ? ? Vielen Dank! ! !

Schritt eins: Registrieren Sie zuerst den Container

<code>php artisan make:provider QcloudVideoServiceProvider</code>

Der Code lautet wie folgt:

<code><?php

namespace App\Providers;

use App\Xiaoteng\QCVod;
use Illuminate\Support\ServiceProvider;

class QcloudVideoServiceProvider extends ServiceProvider
{

    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('qcloud.vod', function ($app) {
            $glass = new QCVod(config('QCLOUD_KEY'), config('QCLOUD_SECRET'));
            return $glass->setRegion('gz');
        });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return ['qcloud.vod'];
    }
}
</code>

Schritt 2: Registrieren Sie sich für Fassaden

Erstellen Sie Foundation/Facades/QcloudFacades.php im App-Verzeichnis. Der Code lautet wie folgt:

<code><?php
namespace App\Foundation\Facades;

use Illuminate\Support\Facades\Facade;

class QCvodFacades extends Facade
{

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

}</code>

Schritt 3: Dienst registrieren

Dienstanbieter und Fassaden in config/app.php registrieren

<code>providers => [
    //...
    App\Providers\QcloudVideoServiceProvider::class,
]

aliases => [
    //...
    'QCvod' => App\Foundation\Facades\QCvodFacades::class,
]</code>

Schritt 4: Rufen Sie

an
<code>dd(ACvod::getRegion());</code>

getRegion() ist eine Getter-Methode in der Tool-Klasse

Das Problem tritt auf:

<code>Class qcloud.vod does not exist</code>

Vielen Dank für Ihre Geduld beim Lesen! Vielen Dank!

Bitte lösen Sie es?

QcloudVideoServiceProvider um

<code>$this->app->singleton('qcloud.vod', function ($app) {
   return new QCVod(config('QCLOUD_KEY'), config('QCLOUD_SECRET'));
});</code>

Das sollte es sein.

Ich habe „Dienstleister“ und „Fassade“ noch nicht geschrieben. Ich habe das Gefühl, singleton()ich muss hier den vollständigen Namensraum schreiben.

Wenn es sich nur um eine Werkzeugklasse handelt, beziehen Sie sich bitte auf die Laravel-Hilfsfunktion

composer dump-autoload

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn