首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在我的案例中关于Laravel中的控制器和请求的新手问题

在我的案例中关于Laravel中的控制器和请求的新手问题
EN

Stack Overflow用户
提问于 2021-10-28 08:09:41
回答 2查看 232关注 0票数 0

我在Laravel是新来的,我试图实现的是非常简单的事情,我想使用Laravel提供的FormRequest来验证请求,但是我遇到了一些难题(如果你在Laravel有经验的话,这肯定是很容易解决的)。

以下是我尝试过的:

我有到控制器的路线图:

代码语言:javascript
运行
复制
Route::put('user/{name}', 'UserController@show');

我可以在name函数中获得show参数:

代码语言:javascript
运行
复制
class UserController {
  public function show($name)
  {
     // validtion rules to apply
    ...
  }
}

我有适用于请求的验证规则,所以我决定由php artisan make:request ShowRequest创建表单请求,它创建表单请求类:

代码语言:javascript
运行
复制
class ShowRequest extends FormRequest {
  public function authorize()
  {
     return true;
  }

  public function rules()
    {
        return [
            // my validation rules here
        ];
    }
}

由于我有上面的请求类,所以我重构了控制器中的show函数以接收ShowRequest

代码语言:javascript
运行
复制
class UserController {
  public function show(ShowRequest $request)
  {
     // now I don't need validtion rules in this function 
     // but how can I access the 'name' parameter now
    ...
  }
}

我有两个问题要问:

  1. 在重构的show函数中,我现在如何访问路由参数name ?

  1. --如果我们忘记了参数是名称(请不要关注要验证名称的内容,想象它通常是一个要验证的对象或值)。如何添加用于处理验证错误的自定义逻辑,而不是使用Laravel默认行为。我想在下面注入像虚拟代码一样的代码:

代码语言:javascript
运行
复制
if (!$validator->pass()) 
{ 
  //my custom code for handling validation failure
}

现在将处理验证错误的自定义代码放在哪里?我的意思是,我不知道在哪里有这种逻辑,在控制器?在请求课上?多么?

EN

Stack Overflow用户

发布于 2021-10-28 08:15:39

您仍然可以将参数$name添加到控制器的show()方法中,因为它是路由url的一部分,而不是经过验证的表单/数据。(重新指挥)

代码语言:javascript
运行
复制
class UserController {
    public function show(ShowRequest $request, $name)
    {
        //...
    }
}

您还可以从请求对象访问它。

代码语言:javascript
运行
复制
class UserController {
    public function show(ShowRequest $request)
    {
        $request->input('name');
    }
}

对于错误消息(不是异常),可以将messages()方法添加到ShowRequest::class中。

代码语言:javascript
运行
复制
class ShowRequest extends FormRequest
{
    /**
     * @return array
     */
    public function messages()
    {
        return [
            'name.required' => 'The name is required',
            'name.numeric' => 'The name must be a number',
            //...
        ];
    }
}

如果您需要验证路由所捕获的名称是否仅由字母OR组成,则需要在您的DB中作为字段存在(就像post的一个片段),您需要在路由声明中添加一些验证。

  1. 设置了一条路由,只有当它由字母组成时才能捕获请求。

代码语言:javascript
运行
复制
Route::get('/user/{name}', 'Controller@show')->where(['name' => '[a-z]+']);

  1. 设置一个路由,该路由仅在DB:

中存在“名称”时捕获请求。

User.php

代码语言:javascript
运行
复制
Class User //..
{
    /**
     * Get the route key for the model.
     *
     * @return string
     */
    public function getRouteKeyName()
    {
        return 'name';
    }
}

web.php

代码语言:javascript
运行
复制
//
Route::get('/user/{user:name}', 'Controller@show');

并调整您的控制器以直接接收用户。

代码语言:javascript
运行
复制
class UserController {
    public function show(ShowRequest $request, User $user)
    {
        //...
    }
}
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69750446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档