Laravel:连接服务

时间:2014-05-08 22:20:38

标签: php laravel laravel-4 composer-php

所以我实现了一个stackoverflow用户在this post向我建议的服务结构。我已经完成了大部分工作,但我遇到了错误:

Class 'App\Services\Mailer\Facades\Mailer' not found

我的服务文件夹结构如下所示:

app
|   App
|   |   Services
|   |   |   Mailer
|   |   |   |   Mailer.php
|   |   |   |   MailerFacade.php
|   |   |   |   MailerServiceProvider.php

Mailer目录中的每个文件都被命名为:

<?php namespace App\Services\Mailer;

this blog中的示例所示的Facade命名空间如下:

<?php namespace App\Services\Mailer\Facades; 

我在我的Mailer.php文件的Mailer课程中添加了一种测试方法:

<?php namespace App\Services\Mailer;
//base service class

class Mailer {

  public function sayHi(){
    return "hello!";
  }      
}

然后我创建了立面:

<?php namespace App\Services\Mailer\Facades; 
// Facade for Mailer

use Illuminate\Support\Facades\Facade;

class Mailer extends Facade {

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

然后我创建了服务提供程序以将它们连接在一起:

<?php namespace App\Services\Mailer;
// Mailer's service provider

use Illuminate\Support\ServiceProvider;

class MailerServiceProvider extends ServiceProvider {
    public function register(){

        $this->app['mailer'] = $this->app->share( function ($app){
            return new App\Services\Mailer\Mailer;
        });

        $this->app->booting( function (){
            $loader = \Illuminate\Foundation\AliasLoader::getInstance();
            $loader->alias('Mailer', 'App\Services\Mailer\Facades\Mailer');
        });
    }
} 

外观的加载器指向正确的命名空间'App\Services\Mailer\Facades\Mailer',但是当我尝试在我的一个控制器中调用该方法时:

public function showMe(){
    return Mailer::sayHi();
}

我收到了我在顶部注明的消息。

我尝试将Facade放入名为Mailer的{​​{1}}目录的子文件夹中,以便命名空间和文件夹结构完全匹配,但我得到了同样的错误。

我阅读并重新阅读了示例,原始stackoverflow帖子,Facade上的作曲家文档,以确保我没有错误地引用任何内容,而我似乎无法想象它出。

有人能指出我正确的方向吗?

修改

所以我退后一步,创建了一个香草laravel项目,并尝试添加一个服务,就像我在我的主项目中尝试一样。它遇到了类似的错误。

这是所涉及的每个文件的屏幕截图:

enter image description here

过程:

  • 我创建了我的新laravel项目
  • 我创建了psr-4目录结构
  • 我将psr-4加载路径添加到我的App/Services/Greetings文件
  • 我创建了我的基础类composer.json
  • 我创建了一个Greetings类,它返回字符串&#39; greetings&#39;对于`getFacadeAccessor方法
  • 我创建了一个问候服务提供程序类GreetingsFacade并添加了 注册方法及其命令
  • 我将我的服务提供商添加到providers数组中的app / config / app.php文件中 enter image description here
  • 我添加了一个返回使用我的新GreetingsServiceProvider服务
  • 的闭包的路由
  • 然后我跑了Greetings并加载了我的路线

当我加载页面时,我收到错误&#34; Class&#39; App \ Services \ Greetings \ App \ Services \ Greetings \ Greetings&#39;找不到&#34; :(

2 个答案:

答案 0 :(得分:2)

psr-4要求您的目录结构反映命名空间结构。

要自动加载课程App\Services\Mailer\Facades\Mailer,它会查找文件App/Services/Mailer/Facades/Mailer.php

此外,mailer已经使用了外观访问器mailer(因此也是IoC-Container slug Illuminate\Support\Facades\Mail)。

尝试不同的内容,例如my_mailer

<?php namespace App\Services\Mailer\Facades; 
// Facade for Mailer

use Illuminate\Support\Facades\Facade;

class Mailer extends Facade {

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

<?php namespace App\Services\Mailer;
// Mailer's service provider

use Illuminate\Support\ServiceProvider;
class MailerServiceProvider extends ServiceProvider {
    public function register(){

        $this->app['my_mailer'] = $this->app->share( function ($app){
            return new App\Services\Mailer\Mailer;
        });

        $this->app->booting( function (){
            $loader = \Illuminate\Foundation\AliasLoader::getInstance();
            $loader->alias('Mailer', 'App\Services\Mailer\Facades\Mailer');
        });
    }
} 

答案 1 :(得分:0)

根据您的目录结构:

app
|   App
|   |   Services
|   |   |   Mailer
|   |   |   |   Mailer.php
|   |   |   |   MailerFacade.php
|   |   |   |   MailerServiceProvider.php

您的类名称空间必须是:

服务

<?php namespace App\Services\Mailer; 

class Mailer {}

服务提供商

<?php namespace App\Services\Mailer; 

class MailerServiceProvider {}

门面

<?php namespace App\Services\Mailer; 

class MailerFacade {}

你自动加载器:

"autoload": {
    "psr-4": {
        "App\\": "app/App"
    },
},

为了让它以您尝试的方式工作,您的目录结构必须是

app
|   App
|   |   Services
|   |   |   Mailer
|   |   |   ├── Facades
|   |   |   |   └── Facade.php
|   |   |   |   Mailer.php
|   |   |   |   MailerServiceProvider.php

编辑:

在您的Greetings名称空间中,更改为:

return new App\Services\Greetings\Greetings;

return new Greetings;

它应该可以工作,因为它们位于相同的命名空间中。为便于阅读代码,请添加

use App\Services\Greetings\Greetings;

在.php文件的顶部。