Laravel形成最佳实践?隐藏输入或路由参数?

时间:2016-10-12 19:17:14

标签: php forms laravel routes

我想知道在Laravel或一般情况下通过路由参数或隐藏输入发送数据之间的最佳效果是什么。例如,您认为最佳方式是什么:

路径路径参数

/*** Html form --> User and Account ID are sent as route parameters ***/

<form method="post" action="/associate/user/10/account/34">
    {{ csrf_field() }}
    <input type="submit" />
</form>

/*** Route ***/

Route::post('/associate/user/{user_id}/account/{account_id}', 'UserController@associate');

/*** Controller ***/

public function associate($user_id, $account_id) {

    $user = App\User::find($user_id);

    $account = App\Account::find($account_id);

    $user->account()->associate($account);

    $user->save();

    return back();
}

OR

表格隐藏输入

/*** Html form --> User and Account ID are sent as hidden inputs ***/

<form method="post" action="/associate/user-account">
    {{ csrf_field() }}
    <input type="hidden" name="user_id" value="10" />
    <input type="hidden" name="account_id" value="34" />
    <input type="submit" />
</form>

/*** Route ***/

Route::post('/associate/user-account', 'UserController@associate');

/*** Controller ***/

public function associate(Request $request) {

    $user = App\User::find($request->input('user_id'));

    $account = App\Account::find($request->input('account_id'));

    $user->account()->associate($account);

    $user->save();

    return back();
}

您怎么看?

非常感谢您的意见。

2 个答案:

答案 0 :(得分:1)

我对此的看法是在有意义的地方使用路线参数。

在您的示例中,您要尝试实现的内容并不十分清楚,即将两个预定义值作为隐藏输入,而提交按钮似乎不是一个非常实用的真实场景。

比如说,如果您有一个表单将给定用户与一个帐户相关联,那么您可以做的是将user_id作为路径参数的一部分,将account_id作为下拉列表。这样您的表单可能如下所示:

{{-- /user/{user_id}/associate-account --}}
<form action="{{ route('user.associate-account', [
        'user_id' => $userId 
    ]) }}>
   {{ csrf_field() }}

   <select name="account_id">...</select>

</form>

您的控制器

public function associate(Request $request, $userId)
{         
}

这样做的好处:

1。您可以始终对与用户对象相关的路由进行分组。

示例:

Route::group(['prefix' => 'user/{user_id}'], function ()
{
    Route::post('/associate-account', 'UserController@associate');
    Route::post('/upgrade-account',   'UserController@upgradeAccount');
    Route::post('/delete',            'UserController@delete');
});

正如您所看到的,从路线中可以清楚地看出,这三个POST动作都与给定的user_id

相关联

2。您可以使用Model Binding

模型绑定实际上将您的Model键转换为实际的Model实例,这样您就可以将控制器操作编写为:

public function associate(Request $request, User $user)
{         
    // Here `user_id` has been converted into actual User model instance
    // by default Laravel also throws ModelNotFoundException when User 
    // can't be found with given `user_id`
    $user->account()->associate($request->get('account_id'));
}
  

从Laravel 5.2开始,您可以隐式地将模型绑定到您的路线,在此之前您必须先注册它们。

答案 1 :(得分:0)

这不是一个关于Laravel的问题,而是关于路由的问题。这真的是关于你想要如何设计你的应用程序的路线,以及你和那些可能使用它的其他人合理的。

如果你想采用更加RESTful的方法,那么前者会更好(而且我倾向于更喜欢)。它使您的路线显得逻辑有序,这更适合制作其他人可能使用的api。

否则,如果您不打算将应用程序扩展到那么远,并且不关心使用肮脏的网址,请使用后一种方法。我只建议你与你选择的那个保持一致。

除非我遗漏了某些东西(这是可能的),否则看起来只有两种方法可以给猫皮肤涂抹。