Laravel Facade类没有加载根类,而是返回未找到的方法


Laravel Facade class not loading root class instead returns method not found

我正试图让我的Facade类工作,但Laravel似乎在我的Facadeclass上调用该方法,而不是在我的根类上调用它。所以我得到了方法未定义的错误。当我直接从绑定创建提要类时(App::make('feed')->addArticle();)它是有效的。所以我觉得我的外表有一些问题。有什么想法吗?提前感谢。

控制器

class RssController extends BaseController 
{
    public function getArticles() {
         Feed::addArticle();
    }
}

服务提供商

use Illuminate'Support'ServiceProvider;

class FeedServiceProvider extends ServiceProvider  {    
    public function register()
    {
        $this->app->bind('feed', function()
        {
            return new Feed;
        });
    }
}

立面等级

use Illuminate'Support'Facades'Facade;
class FeedFacade extends Facade {
 protected static function getFacadeAccessor() 
 { 
    return 'feed'; 
 }
}

根类

class Feed {
//vars

    public function __construct()
    {
    }
    public function make() {
        return new Feed();
    }
    public function addArticle() {
        return '@addArticle';
    }

问题似乎是您希望您的Laravel Facade(Feed::)和服务提供商的实现类(class Feed)具有相同的名称。立面之所以有效,是因为在app/config/app.php中有一个别名部分

'aliases' => array(
    'App'             => 'Illuminate'Support'Facades'App',
    'Artisan'         => 'Illuminate'Support'Facades'Artisan',
    'Auth'            => 'Illuminate'Support'Facades'Auth',
    'Blade'           => 'Illuminate'Support'Facades'Blade',

这种混叠意味着无论何时使用App facade

`App::someMethod`

Laravel实际上在Illuminate'Support'Facades'App上调用了getFacadeAccessor。系统中没有全局类App。如果真的存在的话,它会导致立面出现类似的问题。

在系统中获取Feed=>Illuminate'Support'Facades'Facade'FeedFacade的别名,并从全局命名空间中获取实现类Feed(将文件移动到适当的位置)

<?php
namespace My'Namespace;
class Feed
{
}

return new 'My'Namespace'Feed;

你应该做好一切准备。

此外,冒着让你感到困惑的风险,你不需要把自己的类放在Illuminate'Etc'...命名空间中,你可能应该把它们放在自己的命名空间中,除非你试图让核心Laravel团队接受你的类作为官方提要服务。