>백엔드 개발 >PHP 튜토리얼 >Laravel 서비스 제공자 문제

Laravel 서비스 제공자 문제

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB원래의
2016-08-04 09:20:321940검색

내 생각:

프로젝트의 여러 곳에서 사용될 도구 클래스를 직접 작성했고, 사용할 때마다 인스턴스화하고 싶지 않기 때문에 이 도구를 Laravel의 서비스 컨테이너에 등록하려고 합니다. 하지만 안타깝게도 몇 가지 문제가 있습니다. 아래에 직접 코드와 아이디어를 붙여넣겠습니다. 문제가 있는 곳을 알려주세요. ? ? 매우 감사합니다! ! !

1단계: 먼저 컨테이너 등록

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

코드는 다음과 같습니다.

<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>

2단계: 외관 등록

앱 디렉토리 아래에 Foundation/Facades/QcloudFacades.php를 생성합니다. 코드는 다음과 같습니다.

<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>

3단계: 서비스 등록

config/app.php에 서비스 제공업체 및 Facade를 등록하세요

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

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

4단계: 전화

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

getRegion()은 도구 클래스의 getter 메소드입니다.

문제 발생:

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

인내심을 갖고 읽어주셔서 진심으로 감사드립니다! 매우 감사합니다!

해결해주세요?

답글 내용:

내 생각:

프로젝트의 여러 곳에서 사용될 도구 클래스를 직접 작성했고, 사용할 때마다 인스턴스화하고 싶지 않기 때문에 이 도구를 Laravel의 서비스 컨테이너에 등록하려고 합니다. 하지만 안타깝게도 몇 가지 문제가 있습니다. 아래에 직접 코드와 아이디어를 붙여넣겠습니다. 문제가 있는 곳을 알려주세요. ? ? 매우 감사합니다! ! !

1단계: 먼저 컨테이너 등록

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

코드는 다음과 같습니다.

<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>

2단계: 외관 등록

앱 디렉토리 아래에 Foundation/Facades/QcloudFacades.php를 생성합니다. 코드는 다음과 같습니다.

<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>

3단계: 서비스 등록

config/app.php에 서비스 제공업체 및 Facade를 등록하세요

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

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

4단계: 전화

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

getRegion()은 도구 클래스의 getter 메소드입니다.

문제 발생:

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

인내심을 갖고 읽어주셔서 진심으로 감사드립니다! 매우 감사합니다!

해결해주세요?

QcloudVideoServiceProvider

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

그러면 됩니다.

아직 "service Provider"와 "facade"를 작성하지 않았습니다. singleton() 여기에 전체 네임스페이스를 작성해야 할 것 같습니다.

그냥 툴 클래스라면 라라벨 보조기능을 참고하세요

composer dump-autoload

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.