所以我实现了一个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项目,并尝试添加一个服务,就像我在我的主项目中尝试一样。它遇到了类似的错误。
这是所涉及的每个文件的屏幕截图:
过程:
psr-4
目录结构App/Services/Greetings
文件composer.json
Greetings
类,它返回字符串&#39; greetings&#39;对于`getFacadeAccessor方法GreetingsFacade
并添加了
注册方法及其命令GreetingsServiceProvider
服务Greetings
并加载了我的路线当我加载页面时,我收到错误&#34; Class&#39; App \ Services \ Greetings \ App \ Services \ Greetings \ Greetings&#39;找不到&#34; :(
答案 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文件的顶部。