php – 服务提供商内部的Laravel 5存储库
我的laravel 5项目中存在以下问题.我有一个名为MacroServiceProvider.php的表单宏的服务提供程序.有些宏应该从数据库接收数据,我目前正在使用该模型并以雄辩的方式获得结果,但我想使用存储库,所以我创建了我的存储库,但我不能将它直接注入我的服务提供者.
我想要这样的东西: ... public function register(MyRepoInterface $repo) { $registers = $repo->findAll(); Form::macro... } ... 我怎样才能做到这一点? 谢谢. 解决方法
我认为你不能做你想问的事情,我认为你误解了提供商的工作方式和他们的目标.
在提供程序中,您通常会说接口和实现之间的绑定是什么,因此当您在应用程序代码中执行依赖项注入时,它可以正常工作.我很确定他们不打算做真正的事情. 对于你对代码的看法,我想象这样的事情: >一个存储库接口(MyRepoInterface),带有使用Eloquent的真实实现(比如说EloquentMyRepo) 如果我是对的,那么我建议这样的事情. 知识库 在文件MyRepoInterface.php中定义接口 interface MyRepoInterface { public function findAll(); // ... your other repo methods } 和一个实现EloquentMyRepo.php class EloquentMyRepo implements MyRepoInterface { public function findAll() { // ... do what you need } } 正面 使用此定义外观文件MacroFacade.php use IlluminateSupportFacadesFacade; 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('AppMyRepoInterface','AppEloquentMyRepo'); // ... } 因此,当您在依赖注入中使用MyRepoInterface时,Laravel知道它必须使用EloquentMyRepo的实例. 现在,让我们为您的宏服务创建一个服务提供者.创建一个文件Providers / MacroServiceProvider.php并放入其中 namespace AppProviders; use IlluminateSupportServiceProvider; class MacroServiceProvider extends ServiceProvider { public function register() { $this->app->bind('macro','AppMacroService'); } } 现在,当我们需要注册为宏的Facade时,使用MacroService的一个实例. 组态 我们最终需要对配置进行一些更改.打开config / app.php文件,添加新提供程序 ... 'providers' => [ ... 'AppProvidersAppServiceProvider',... 'AppProvidersMacroServiceProvider',], (请注意,MacroServiceProvider是在AppServiceProvider之后声明的.) 添加外观的别名: 'aliases' => [ ... 'Macro' => 'AppMacroFacade', 完成! 怎么了 我们假设你打电话 ... Macro::myMacro1(); ... 在你的代码中.如何调用正确的方法? > Macro是MacroFacade类处理的别名 我希望这可以澄清一下会发生什么. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |