我想要这样的东西:
... public function register(MyRepoInterface $repo) { $registers = $repo->findAll(); Form::macro... } ...
我怎样才能做到这一点?
谢谢.
在提供程序中,您通常会说接口和实现之间的绑定是什么,因此当您在应用程序代码中执行依赖项注入时,它可以正常工作.我很确定他们不打算做真正的事情.
对于你对代码的看法,我想象这样的事情:
>一个存储库接口(MyRepoInterface),带有使用Eloquent的真实实现(比如说EloquentMyRepo)
>一个外观,比如Macro,这样你就可以做Macro :: myMacro1(),Macro :: myMacro2()等.
>方法myMacro1(),myMacro2()等使用存储库从数据库中获取一些数据,然后从表单外观调用一些方法
如果我是对的,那么我建议这样的事情.
知识库
interface MyRepoInterface { public function findAll(); // ... your other repo methods }
和一个实现EloquentMyRepo.PHP
class EloquentMyRepo implements MyRepoInterface { public function findAll() { // ... do what you need } }
正面
use Illuminate\Support\Facades\Facade; class MacroFacade extends Facade { protected static function getFacadeAccessor() { return 'macro'; } }
服务类
在文件MacroService.PHP中定义宏服务类,您可以在其中使用依赖项注入并访问存储库.在本课程中,您可以定义myMacro1()…方法.
class MacroService { protected $myRepo; public function __construct(MyRepoInterface $myRepo) { $this->myRepo = $myRepo; } public function myMacro1() { // access the repo $items = $this->myRepo->findAll(); // ... do something with $items and finally return a string return Form::macro(...); } public function myMacro2($arg1,$arg2) { // ... use the parameters to do something else } }
绑定
在Providers / AppServiceProvider.PHP文件中,转到register()方法并添加
public function register() { // ... $this->app->bind('App\MyRepoInterface','App\EloquentMyRepo'); // ... }
因此,当您在依赖注入中使用MyRepoInterface时,Laravel知道它必须使用EloquentMyRepo的实例.
现在,让我们为您的宏服务创建一个服务提供者.创建一个文件Providers / MacroServiceProvider.PHP并放入其中
namespace App\Providers; use Illuminate\Support\ServiceProvider; class MacroServiceProvider extends ServiceProvider { public function register() { $this->app->bind('macro','App\MacroService'); } }
现在,当我们需要注册为宏的Facade时,使用MacroService的一个实例.
组态
我们最终需要对配置进行一些更改.打开config / app.PHP文件,添加新提供程序
... 'providers' => [ ... 'App\Providers\AppServiceProvider',... 'App\Providers\MacroServiceProvider',],
(请注意,MacroServiceProvider是在AppServiceProvider之后声明的.)
添加外观的别名:
'aliases' => [ ... 'Macro' => 'App\MacroFacade',
完成!
怎么了
我们假设你打电话
... Macro::myMacro1(); ...
> Macro是MacroFacade类处理的别名
>通过MacroFacade的getFacadeAccessor()方法在IoC中使用宏名称注册Facade
> MacroServiceProvider将MacroService类注册为宏的实现
>必须创建MacroService实例,但它具有MyRepoInterface作为依赖项
>当需要MyRepoInterfice时,AppServiceProvider说Laravel使用EloquentMyRepo
>因此创建了一个EloquentMyRepo实例,它用于创建MacroService实例
>宏已解析为MacroService的实例
> Laravel调用该实例的myMacro1()方法
我希望这可以澄清一下会发生什么.