Laravel DI:调用控制器方法而不传递注入变量,是否可能?

时间:2018-01-24 07:44:53

标签: php laravel

doOne()

那么如何在不传递注入资源的情况下从doALot()调用Request,但doOne()中有$request? <{1}}遍布整个地方感觉不好。

解决方案tl; dr不可能,但还有其他方法 - 阅读Alexey Mezenin的简短回答

长版(可能不是最好的)。

$ php artisan make:provider SomeServiceProvider

然后在创建的提供者编辑register()中调用某些内容:

public
function register() {
    $this -> app -> bind('App\Services\SomeService', function ($app) {
        return new SomeService();
    });
}

然后继续创建将资源注入属性的服务类。

<?php

namespace App\Services;

use \Illuminate\Support\Facades\Request;

class SomeService {
    private $request;

    /**
     * SomeService constructor.
     */
    public
    function __construct(Request $request) {
        $this -> request = $request;
    }

    public function doOne($someOtherVariable) {}
}

然后将您的方法从控制器移动到服务,并将服务注入控制器。

权衡:( - )两个无用的文件来执行基本功能,(+)从控制器中分离逻辑实现,(〜)可能更干净的代码。

1 个答案:

答案 0 :(得分:2)

手动调用控制器操作不是一个好主意。业务logic should be in the service class。您可以在我的Laravel最佳实践回购中看到这样的示例。如果您不想每次都传递if(current time is in the given range) yourButton.Enabled = True else yourButton.Enabled = False 对象,可以在服务类或控制器构造函数中注入$request类。

使用Request数据的另一种方法是使用Request帮助程序:

request()

request('key') request()->has('key') 门面:

Request

或者你可以在方法中手动注入它:

Request::has('key')