在 Laravel 5.1 中,服务提供者可以注册带有构造参数的服务。

3
我可以帮您翻译成中文:

我使用的是Laravel 5.1,我遇到了以下问题。

在AppServiceProvider.php文件的register方法中:

$this->app->singleton('PingppServices', function ($app, $params) {
    return new \App\Services\PingppServices($params['sid']);
});

在PingppServices.php文件中

private $sid;

public function __construct($params)
{
    $this->sid = $params['sid'];
}

public function foo()
{
    echo $this->sid;
}

在控制器中,我使用以下代码来调用它:

$pingppServices = app('PingppServices', ['sid' => 1]);
$pingppServices->foo();

我的问题是,在laravel 5.0中,我可以这样做app('PingppServices', 1);,在5.1中第二个参数必须是一个数组。我看到app()方法没有改变,所以有什么变化吗?
这样解决构造函数参数的服务方式正确吗?
谢谢。
2个回答

0

没有了解类的目的和整个代码的概述,很难说。

一般来说,你传递给类构造函数的东西大多是依赖项和配置变量。任何与运行时数据相关的内容都应该有自己的 setter 或者应该作为参数传递给需要它的方法。

就像我说的那样,如果没有更多的了解,很难说。

例如:

class Foobar {
   private $pingppService;
   public function __construct(PingppServices $pingppService) {
      $this->pingppService = $pingppService; 
   }

   public function wtf() {
      $this->pingppService->setParams(Request::all());
      $this->pingppService->foo();
   }
}

0

不像你所说,在Laravel 5.1中,app()方法是

/**
 * Get the available container instance.
 *
 * @param  string  $make
 * @param  array   $parameters
 * @return mixed|\Illuminate\Foundation\Application
 */
function app($make = null, $parameters = [])
{
    if (is_null($make)) {
        return Container::getInstance();
    }

    return Container::getInstance()->make($make, $parameters);
}

最后,它将调用函数build($concrete, array $parameters = [])
因此,第二个参数必须是一个数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接