你可以有两种方式,我认为最简洁的方式是:
1)有一个描述你的类的接口,让我们称之为LogServiceInterface
2)创建一个实例化您的类的服务提供者,如下所示:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class LoggerServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function register()
{
$this->app->bind(LogServiceInterface::class, function($app)
{
return new LogService();
});
}
}
config/app.ph
3) 在文件中注册此服务提供者:
'providers' => [
// Other Service Providers
App\Providers\LoggerServiceProvider::class,
],
LoggerServiceInterface
4)现在,在控制器中,您可以请求直接在构造函数中实现的东西的实例:
(一些控制器):
<?php namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
use App\Repositories\OrderRepository;
class OrdersController extends Controller {
/**
* The logger service.
* @var LoggerServiceInterface $loggerService
*/
protected $loggerService;
/**
* Create a controller instance.
*
* @param OrderRepository $orders
* @return void
*/
public function __construct(LoggerServiceInterface $loggerService)
{
$this->loggerService = $loggerService;
}
/**
* Show all of the orders.
*
* @return Response
*/
public function index()
{
// $this->loggerService will be an instance of your LoggerService class that
// is instantiated in your service provider
}
}
这样,您就可以轻松地快速更改服务的实现,而且,Phpstorm 可以非常轻松地处理这个问题。
您仍然可以使用app()->make()
来获取您的服务实例。然而,这不会被 Phpstorm 自动拾取。但是您可以帮助它理解,您需要做的就是使用@var
注释,请参阅:
/**
* @var LoggerServiceInterface $logger
*/
$logger = app()->make(LoggerServiceInterface::class);
That way, Phpstorm will know what to expect from that $logger object.