Можно ли переопределить введенный запрос из пакета Laravel? - PullRequest
0 голосов
/ 05 июня 2019

Я создаю специальный пакет в Laravel, в котором есть контроллер ресурсов. Для этого примера ресурсом является Organization. В этом контроллере определены основные действия index, show, store и т. Д.

Это мой store метод в контроллере:

     /**
     * Store a newly created Organization in storage.
     *
     * @param  OrganizationStoreRequest  $request
     * @return JsonResponse
     */
    public function store($request): JsonResponse
    {
        $newOrganization = new Organization($request->all());

        if ($newOrganization->save()) {
            return response()->json($newOrganization, 201);
        }

        return response()->json([
            'message' => trans('organilations::organisation.store.error')
        ], 500);
    }

Мой OrganzationStoreRequest пока довольно прост:

class OrganizationStoreRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    public function rules(): array
    {
        return [
            'name' => 'required'
        ];
    }
}

Метод store может вызываться через API, когда пакет используется в приложении Laravel. Моя проблема здесь в том, что я хочу дать пользователям моего пакета возможность переопределять мои OrganizationStoreRequest собственными запросами, поскольку им, возможно, придется использовать разные методы авторизации или проверки.

Я пытался создать промежуточное программное обеспечение и связать свой собственный экземпляр с OrganizationStoreRequests, но я не получаю желаемых результатов.

Есть ли у пользователя пакета возможность переопределить OrganizationStoreRequets в контроллере моего пакета?

1 Ответ

0 голосов
/ 05 июня 2019

С помощью коллег-разработчиков из Larachat мы пришли к следующему (простому) решению:

При создании собственного запроса мы можем привязать его экземпляр к контейнеру IoC.Например, создав OrganizationOverrideRule и расширив оригинал:

class OrganizationOverrideRules extends OrganizationStoreRequest
{    
    public function rules(): array
    {
        return [
            'name' => 'required',
            'website' => 'required',
            'tradename' => 'required'
        ];
    }
}

Затем в AppServiceProvider вы можете связать новый экземпляр следующим образом:

App::bind(
    OrganizationStoreRequest::class,
    OrganizationOverrideRules::class
);

Затем OrganizationOverrideRules будет использоваться для проверки и авторизации.

...