2014-06-06 5 views
1

서비스 제공 업체의 부팅 기능 범위에서 사용할 때 facade가 작동하는 데 문제가 있습니다. 예제 코드는 아래와 같습니다.Laravel 4.1 - 서비스 제공 업체의 부팅 기능에서 호출했을 때 Facade가 작동하지 않음

클래스

namespace Vendor\Libraries; 

class Foo { 
    public function bar() 
    { 
     echo 'bar'; 
    } 
} 

외관

namespace Vendor\Facades; 

use Illuminate\Support\Facades\Facade; 

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

서비스 제공 업체

namespace Vendor\Package; 

use Illuminate\Support\ServiceProvider; 

class MyServiceProvider extends ServiceProvider { 

    public function boot() 
    { 
     $this->package('vendor/package'); 
    } 

    public function register() 
    { 
     $this->app['foo'] = $this->app->share(function ($app) { 
       return new \Vendor\Libraries\Foo; 
     }); 
     $this->app->booting(function() { 
       $loader = \Illuminate\Foundation\AliasLoader::getInstance(); 
       $loader->alias('Foo', 'Vendor\Facades\Foo'); 
     }); 
    } 
} 

이 잘 작동하고 다른 패키지의 서비스 공급자의 부팅 기능 범위 내에서 사용하려고 할 때를 제외하고는 예상대로 Facade를 사용할 수 있습니다. 예 : 오류

namespace OtherVendor\OtherPackage; 

use Illuminate\Support\ServiceProvider; 

class AnotherServiceProvider extends ServiceProvider { 

    public function boot() 
    { 
     $this->package('othervendor/overpackage'); 
     \Foo::bar(); 
    } 

    public function register() 
    { 
    } 
} 

결과 : 나는 app.php에 별칭 배열에 별칭을 추가하는 경우

Class 'Foo' not found 

가 이상하게의 외관 작업 파일.

'aliases' => array(
    'Foo' => 'Vendor\Facades\Foo', 
) 

나는 또한 대신 Foo::bar()를 사용하는 함수를 호출 할 $this->app['foo']->bar()를 사용하여 작동시킬 수있다; 그러나 bar() 함수의 몸체 범위에서 파사드를 사용하는 경우 해당 클래스를 찾을 수 없다는 오류가 발생합니다.

요약하면 AliasLoader 클래스를 사용하여 별칭을 추가하려고하면 app.php의 별칭 배열에 추가하는 대신 다른 서비스 공급자의 범위 내에서 호출 할 때 facade가 작동하지 않는 것으로 보입니다. 부팅 기능. 그것은 예상대로 모든 곳에서 작동합니다.

이 문제에 대한 도움이 될 것입니다.

미리 감사드립니다.

답변

0

이것은 오래된 게시물이지만 boot()register()이라고합니다. 따라서 boot()AnotherServiceProvider 인 경우 앞에 register()이 호출됩니다. 어쨌든 내 이해에서. 나는 이것이 register()boot() 사이의 주된 차이라고 생각합니다. 그래서 MyServiceProviderregister()에있는 것을 boot()에 놓고 작동하는지 확인하십시오.