Php Laravel 5存储库内部服务提供商
我在我的laravel 5项目中有以下问题。我有一个名为MacroServiceProvider.php的表单宏服务提供程序。一些宏应该从数据库接收数据,我目前正在使用该模型并通过Elount获得结果,但我想使用存储库,因此我创建了存储库,但无法将其直接注入到我的服务提供商 我想要这样的东西:Php Laravel 5存储库内部服务提供商,php,laravel-5,Php,Laravel 5,我在我的laravel 5项目中有以下问题。我有一个名为MacroServiceProvider.php的表单宏服务提供程序。一些宏应该从数据库接收数据,我目前正在使用该模型并通过Elount获得结果,但我想使用存储库,因此我创建了存储库,但无法将其直接注入到我的服务提供商 我想要这样的东西: ... public function register(MyRepoInterface $repo) { $registers = $repo->findAll();
...
public function register(MyRepoInterface $repo)
{
$registers = $repo->findAll();
Form::macro...
}
...
我该怎么做
谢谢。我认为你不能满足你的要求,而且我认为你误解了供应商的工作方式和目的 在提供者中,您通常会说接口和实现之间的绑定是什么,这样当您在应用程序代码中进行依赖项注入时,它就可以工作了。我很确定他们不是为了做真正的事情 对于您所说的代码,我设想如下:
...
public function register(MyRepoInterface $repo)
{
$registers = $repo->findAll();
Form::macro...
}
...
- 一个存储库接口(
),具有使用MyRepoInterface
(比如Eloquent
)的实际实现EloquentMyRepo
- 一个门面,比如说
,这样你就可以做Macro
,Macro::myMacro1()
,等等Macro::myMacro2()
- 方法
,myMacro1()
等使用存储库从数据库获取一些数据,然后从myMacro2()
表单调用一些方法
MyRepoInterface.php
中使用
interface MyRepoInterface
{
public function findAll();
// ... your other repo methods
}
class EloquentMyRepo implements MyRepoInterface
{
public function findAll()
{
// ... do what you need
}
}
以及一个带有
interface MyRepoInterface
{
public function findAll();
// ... your other repo methods
}
class EloquentMyRepo implements MyRepoInterface
{
public function findAll()
{
// ... do what you need
}
}
外观
使用以下命令定义一个facade文件MacroFacade.php
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');
}
}
现在,当我们需要注册为macro
的facade时,将使用MacroService
的实例
配置
我们最后需要对配置进行一些更改。打开config/app.php
文件,添加新的提供者
...
'providers' => [
...
'App\Providers\AppServiceProvider',
...
'App\Providers\MacroServiceProvider',
],
(请注意,MacroServiceProvider
在AppServiceProvider
之后声明)
添加立面的别名:
'aliases' => [
...
'Macro' => 'App\MacroFacade',
],
完成了
发生了什么
假设你打电话来
...
Macro::myMacro1();
...
在你的代码中。如何调用正确的方法
Macro
是由MacroFacade
类处理的别名macrofacadeaccessor()的getFacadeAccessor()方法在IoC中使用macro
名称注册facade
MacroServiceProvider
将MacroService
类注册为macro
MacroService
的实例,但它将MyRepoInterface
作为依赖项AppServiceProvider
表示,如果需要MyRepoInterfice
,Laravel将使用EloquentMyRepo
EloquentMyRepo
的实例,它用于创建MacroService
Macro
已解析为MacroService
myMacro1()
方法我希望这能澄清一下发生了什么。我会尝试做你提到的事情。我没有在服务提供者中定义宏,我有一个扩展了light\Html\FormBuilder的文件,因此我可以将我的宏调用为Form::macro,而不是使用Facade。在我的服务提供商中,我调用:$this->app->bindShared('form',…$form=新宏(…)。我不确定我是否理解:您想使用
form::macro()
并访问您的macro()
方法扩展了FormBuilder
类?它成功了!我按照你说的做了,现在它成功了。唯一不同的是,我使用了一个HtmlServiceProvider,而不是默认的服务提供商,还使用了一个宏类来扩展FormBuilder类来构建我的宏,但我所有的查询都是我自己做的正面,谢谢。