Laravel - Как передать переменные из представления в контроллер с помощью формы - PullRequest
1 голос
/ 14 июля 2020

Я создаю систему запросов с Laravel 7. На странице индекса есть форма для заполнения пользователем и кнопка отправки. Если кнопка нажата, данные в форме будут отправлены руководителю по электронной почте. Электронное письмо, которое получает руководитель, все данные, введенные пользователем, будут перечислены вместе с кнопками «Утвердить» и «Отклонить». Если нажать кнопку «Утвердить», введенные пользователем данные будут сохранены в базе данных. Все данные, вводимые пользователем, хранятся в $data и доступны в виде шаблона электронной почты. Итак, как в шаблоне электронной почты передать данные ввода пользователя и Auth::user()->id контроллеру, чтобы начался процесс сохранения? Я прочитал этот пост , и он кажется мне полезным, но он использует <a> для перенаправления для запуска контроллера. Можно ли передать блейд-переменные из <form> в представлении шаблона электронной почты в контроллер, чтобы я мог использовать <button>?

Обновление: index.blade. php:

<form action="/sendSupervisor" method="post">
  <input type="text">
  <input type="text">

  <button type="submit">Send</button>
</form>

web. php:

Route::post('/sendSupervisor', 'CatViewController@sendSupervisor')->middleware('auth')->middleware('verified');

CatViewController. php:

// one of the methods
public function sendSupervisor()
    {
        $data = request();
        Mail::to('supervisor@abc.com')->send(new ApprovalMail($data));

        return redirect('/');
    }

одобрение. лезвие . php:

<!-- Email Template -->
User Input: {{ $data->name }}

<form action="/approve">
    <button>Approve</button>
</form>

<form action="/reject">
    <button>Reject</button>
</form>

Ответы [ 3 ]

3 голосов
/ 14 июля 2020

Электронная почта - это не браузер, и почти во всех случаях тег <form> не действует. Вы не можете получить ввод пользователя из электронного письма, однако в вашем случае, если у вас есть две кнопки в электронном письме, и это электронное письмо отправляется пользователю, который существует в вашей системе, И ввод, который вы получаете, - это 'принять' или 'отклонить 'в зависимости от того, какую кнопку они нажимают, это выполнимо.

Вы можете иметь два общедоступных маршрута и создать две «кнопки» с hrefs, которые будут выполнять эти действия. Например:

Route::get('email/accept/{user_id}', 'EmailController@accept');
Route::get('email/reject/{user_id}', 'EmailController@reject');

Затем свяжите эти маршруты в своем храме электронной почты, например:

<a href="{{ action('EmailController@accept', ['user_id' => $user->id ]) }}">Accept</a>
<a href="{{ action('EmailController@reject', ['user_id' => $user->id ]) }}">Reject</a>

Затем в этом контроллере вы можете разрешить пользователя на основе идентификатора в этих методах, и вы может выполнять любые логические операции c по вашему желанию.

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

1 голос
/ 14 июля 2020

Более подходящий подход:

Лучше сохранить запрос пользователя после его публикации с флагом столбца под названием «статус», который содержит либо («Ожидает», «Утверждено», «Отклонено») и затем отправьте электронное письмо руководителю

index.blade

<form action="/sendRequest" method="post">
     <input type="text">
     <input type="text">

     <button type="submit">Send</button>
</form>

web. php

Route::get('/sendRequest', 'MyController@sendRequest)

MyController. php

public function sendRequest(Request $request){
       // UserRequest table should has column 'status' with default value 'Pending'
       $userRequest = UserRequest::create($request->all());
       Mail::to('supervisor@abc.com')->send(new ApprovalMail($userRequest));

       return redirect('/');
}

Шаблон электронной почты должен только уведомлять супервизора о необходимости выполнить действие с запросом с помощью кнопки «Выполнить действие», которая открывает страницу в браузер, чтобы он совершил действие.

email-template.blade

<!-- User data displayed for example in a table --> 
<a href={{ route('takeAction', $userRequest->id) }}>
   <button> Take Action <button>
</a>

web. php

Route::get('/take-action/{requestId}', 'SupervisorController@takeAction')
     ->name('taleAction');

SupervisorController. php

public function takeAction($requestId){
       $userRequest = UserRequest::find($requestId);
       return view('take-action', [$userRequest]);
}

take-action.blade

<-- User data displayed for example in a table --> 
<form method='POST' action={{ route('takeActionPost', $userRequest->id) }}>
      @csrf
      <input type='hidden' name='action' value='Approved'>
      <button type='submit'>Approve</button>
</form>

<form method='POST' action={{ route('takeActionPost', $userRequest->id) }}>
      @csrf
      <input type='hidden' name='action' value='Rejected'>
      <button type='submit'>Rejected</button>
</form>

web. php

Route::post('/take-action/{requestId}', 'SupervisorController@takeActionPost')
     ->name('takaActionPost');

SupervisorController. php

public function takeActionPost(Request $request, $requestId){
       $userRequest = UserRequest::find($requestId);
       $userRequest->update(['status', $request->action]);
} 

Конечно, я здесь использую очень плохо, я просто хочу объяснить свою идею

1 голос
/ 14 июля 2020

Добавить в форму скрытые поля ввода, значения которых являются пользовательскими данными. Но я думаю, что для вашей системы есть лучший дизайн, который я объясню в отдельном ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...