Laravel: установить внедрение зависимости для Service как Controller - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть этот код в моем CompanyController

use App\Services\CompanyService;

public function store(CompanyService $companyService) {

    $result = $companyService->store();

    return response()->json($result);
}

И этот код в моем CompanyService

use stdClass;
use App\Company;
use Illuminate\Http\Request; 

public function store(Request $request, Company $company) {

    // this also not work
    dd($request->all());

    $data = new stdClass;
    $data->status = 1;
    $data->message = 'success';

    return $data;
}

Когда я запускаю этот код, Laravel показывает ошибку

Слишком мало аргументов для функции App \ Services \ CompanyService :: store () 0 прошло, но ровно 1 ожидалось

Я знаю, что инъекция зависимости типа подсказки проблема, потому что она работаетв контроллерах, но не работают в моем CompanyService, когда я вызываю store () без параметров

Как я могу это исправить и заставить его работать в моем CompanyService?

1 Ответ

0 голосов
/ 29 сентября 2019

Редактировать:

Вы можете использовать call() метод service container В вашем случае:

public function store()
    {
        $companyService = app(CompanyService::class);

        $result = $companyService->call('store');

        return response()->json($result);
    }

К сожалению, это невозможно для методавнедрить зависимости, но вы можете внедрить свои зависимости в свой метод construct, так что в вашем случае это будет выглядеть так:

use stdClass;
use App\Company;
use Illuminate\Http\Request;

class Foo
{
    protected $request;

    protected $company;

    public function __construct(Request $request, Company $company)
    {
        $this->request = $request;

        $this->company = $company;
    }

    public function store()
    {

        // this works
        dd($this->request->all());
        // Also injected
        dd($this->company);

        $data = new stdClass;
        $data->status = 1;
        $data->message = 'success';

        return $data;
    }
}

PS: я считаю, что laravel обрабатывает внедрение метода в одномиз его промежуточного программного обеспечения, насколько я знаю, нет никакого способа выполнить внедрение метода, вы можете прочитать о Service Container для получения дополнительной информации

...