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

Posted

技术标签:

【中文标题】Laravel 形式的最佳实践?隐藏输入或路由参数?【英文标题】:Laravel form best practice ? Hidden input OR Route parameter? 【发布时间】:2017-02-21 17:33:19 【问题描述】:

我想知道在通过 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();

表单隐藏输入

/*** 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();

你怎么看?

非常感谢您的意见。

【问题讨论】:

【参考方案1】:

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

在您的示例中,您要实现的目标不是很清楚,即有两个预定义的值作为隐藏输入并且只有一个提交按钮,这似乎不是一个非常实际的现实场景。

说,如果您有一个表单将给定用户与帐户相关联,您可以做的是将user_id 作为路由参数的一部分,并将@​​987654323@ 作为下拉列表。这样你的表单可能看起来像这样:

-- /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 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 开始,您可以将模型隐式绑定到您的路由,在此之前您必须先注册它们。

【讨论】:

感谢@JofryHS,这很有趣,尤其是您可以通过一个简单的键在控制器中使用模型绑定的 2 个优势。【参考方案2】:

这不是关于 Laravel 的问题,而是关于路由的问题。这实际上是关于您希望如何设计应用程序的路线,以及对您以及可能使用它的其他人来说什么是合乎逻辑的。

如果您要采用更 RESTful 的方法,则前者会更好(而且我更喜欢这种方法)。它使您的路线看起来有条理,更适合制作其他人可能会使用的 api。

否则,如果您不打算将您的应用程序扩展得那么远,并且不希望有一个带有 smexy url 的 api,那么请使用后一种方法。我只建议您与您选择的一致。

除非我错过了什么(这是可能的),否则它看起来就像给猫剥皮的两种方法。

【讨论】:

感谢@captain-hypertext,提供详细的答案和建议。我可能会选择 RESTful 方法。我会牢记坚持将一种方法作为一种良好做法。

以上是关于Laravel 形式的最佳实践?隐藏输入或路由参数?的主要内容,如果未能解决你的问题,请参考以下文章

Rails URL 的嵌套路由和参数(最佳实践)

使用 Laravel API 的最佳实践

Laravel 后端、Vue 前端、api 最佳实践?

Laravel 5.4:发布没有表单或隐藏 url 的路由

监控系统实践第12天:5天上手Laravel8.5之路由篇(1/5)

Laravel 工匠优化最佳实践