【问题标题】:Laravel - How to pass variables from view to controller with formLaravel - 如何使用表单将变量从视图传递到控制器
【发布时间】:2020-11-03 12:57:43
【问题描述】:

我正在使用 Laravel 7 构建一个请求系统。在索引页面中,有一个供用户填写的表单和一个提交按钮。如果单击该按钮,表格中的数据将通过电子邮件发送给主管。主管收到的电子邮件,所有用户输入数据将与“批准”按钮和“拒绝”按钮一起列出。如果单击“批准”按钮,则用户输入的数据将存储在数据库中。所有用户输入数据都存储在$data 中,并且可以在电子邮件模板视图中访问。那么,在电子邮件模板中,如何将用户输入数据和Auth::user()->id 传递给控制器​​以便开始存储过程? 我读了this post,它看起来对我很有用,但它使用<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('/');
    }

approval.blade.php:

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

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

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

【问题讨论】:

  • 能否提供代码sn-p
  • @YomnaHesham 嗨。代码sn-p更新了

标签: php html laravel


【解决方案1】:

电子邮件不是浏览器,几乎在所有情况下,&lt;form&gt; 标记都不起作用。您无法从电子邮件中检索用户输入,但是在您的情况下,如果电子邮件中有两个按钮,并且该电子邮件正在发送给系统中存在的用户,并且您收到的输入是“接受”或“拒绝” ' 根据他们点击的按钮,这是可行的。

您可以拥有两条可公开访问的路线,并构建两个带有 href 的“按钮”来执行这些操作。喜欢:

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>

然后在该控制器中,您可以在这些方法中根据 id 解析用户,并且您可以执行任何您想要的逻辑。

注意:由于这些链接需要公开访问,因此使用 id 并不理想。您应该生成某种令牌来解析用户。

【讨论】:

  • 以及数据将如何保存在数据库中?
  • 嗨。该解决方案部分适用于我,我现在可以在邮件控制器中触发相应的方法。但是,如何在控制器中获取$data?我尝试在动作函数数组中添加这个:`data` =&gt; $data,但这不起作用
  • @keanehui 不幸的是,正如我上面所说,您无法从用户那里获得任何数据,从电子邮件。出于多种安全原因,这是正确的。您无法从电子邮件中获取用户输入(几乎在所有情况下)。您可以做的最好的事情是创建一组他们可以单击的与操作相关联的安全链接,或者将它们引导到您可以从中接收更多用户输入的页面。
  • @keanehui 如果您正在谈论从发起发送电子邮件的表单中接收 $data,那么您应该将请求中的 $data 存储在处理该请求的控制器的表中,并关联如果用户接受,则将其发送给用户,如果他们拒绝,则将其删除。
【解决方案2】:

更好的方法:

最好保存用户请求,一旦他使用名为“status”的列标志(包含“Pending”、“Approved”、“Rejected”),然后向主管发送电子邮件

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]);
} 

当然我这里用的名字很不好,我只是想说明一下我的想法

【讨论】:

  • 感谢您的回答。因此,您的方法基本上是使用附加表来保存所有用户请求并访问表以在控制器中获取这些用户输入。但实际上有几十种不同的用户输入形式。在索引页面中,有一个下拉列表供用户选择并显示相应的输入形式,不相关的将被隐藏。这意味着,即使每次只有一种全部有用,附加表也必须非常大以存储每种输入形式。有没有办法不使用附加表?
  • 您在问题中说(如果单击“批准”按钮,用户输入数据将存储在数据库中)..所以,您已经有一个用户数据表。我所说的是一旦用户提交这些数据而不是在主管批准它们时存储这些数据。我不是说做一个额外的表,我说的是在现有表中添加额外的列来保存“状态”
  • @keanehui “这意味着,附加表必须非常大才能存储每种输入表单”这是不正确的,如果是临时数据,请将其存储在文本或中等文本字段中json,然后在需要时像请求一样处理它。
  • @KurtFriars 我有来自$data = request(); 表单的所有用户输入。你的意思是我可以将$data 保存在表格的一个单元格中,当我需要任何input 时,我只需从单元格中取回它并使用$data-&gt; 访问特定的输入框?那么迁移文件$table-&gt;string('user_input');应该是这样的呢?
【解决方案3】:

在表单中添加隐藏的输入字段,其值为用户数据。但我认为您的系统有更好的设计,我将在单独的答案中解释。

【讨论】:

    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多