> PHP 프레임워크 > Laravel > laravel의 새로운 추가 기능과 이를 편집할 수 없는 문제는 무엇입니까?

laravel의 새로운 추가 기능과 이를 편집할 수 없는 문제는 무엇입니까?

PHPz
풀어 주다: 2023-04-23 10:28:07
원래의
582명이 탐색했습니다.

최근 Laravel 프레임워크를 사용하여 프로젝트를 개발할 때 새로 추가된 데이터를 편집할 수 없다는 문제를 발견했습니다. 추가 문제 해결 및 분석을 통해 문제를 찾아 해결했습니다. 아래에 몇 가지 솔루션 아이디어를 공유하겠습니다.

우선 HTTP 요청 방식이라는 개념을 명확히 해야 합니다. HTTP 요청 방식은 클라이언트가 서버에 자원을 요청할 때 사용하는 방식으로 GET, POST, PUT, DELETE 등이 있습니다. 그 중 GET 메소드는 리소스 획득에 사용되고, POST 메소드는 리소스 생성에 사용되고, PUT 메소드는 리소스 업데이트에 사용되고, DELETE 메소드는 리소스 삭제에 사용된다.

Laravel에서 양식 제출을 사용할 때 기본 요청 방법은 POST입니다. 예:

<form action="/user" method="POST">
    <input type="text" name="name">
    <button type="submit">提交</button>
</form>
로그인 후 복사

그런 다음 컨트롤러의 store 메서드를 사용하여 이 요청을 처리합니다. store 方法来处理这个请求:

public function store(Request $request)
{
    $user = new User;
    $user->name = $request->input('name');
    $user->save();
    return redirect('/user');
}
로그인 후 복사

在上面的代码中,我们创建了一个新的 User 对象,将表单提交的 name 字段赋值给 User 对象的 name 属性,然后保存数据并重定向到 /user 页面。

但是,上述代码有时候会出现一个问题:新增的数据无法编辑。我们在访问编辑页面时,会发现页面中没有原先创建的数据信息。这是为什么呢?我们可以先看一下编辑页面的代码:

<form action="/user/{{ $user->id }}" method="POST">
    {{ method_field('PUT') }}
    <input type="text" name="name" value="{{ $user->name }}">
    <button type="submit">提交</button>
</form>
로그인 후 복사

在这个代码中,我们使用了 method_field 方法来指定请求方法为 PUT,因为在 HTTP 协议中,更新资源需要使用 PUT 方法。但是,在 Laravel 框架中,默认的 POST 请求是无法识别 PUT 请求的,因此,在访问编辑页面时,Laravel 会根据默认的 POST 请求来处理,而不是按照我们期望的 PUT 请求来处理。

解决这个问题的思路有两个:一是使用 PUT 请求方法来创建数据;二是在使用 POST 方法创建数据时,使用 _method 参数来指定请求方法。

第一种解决思路是比较干脆的方法,但是需要改动较多的代码。我们需要在表单中使用 PUT 请求方法:

<form action="/user/{{ $user->id }}" method="POST">
    {{ method_field('PUT') }}
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="text" name="name" value="{{ $user->name }}">
    <button type="submit">提交</button>
</form>
로그인 후 복사

然后,在控制器中处理 PUT 请求:

public function update(Request $request, $id)
{
    $user = User::findOrFail($id);
    $user->name = $request->input('name');
    $user->save();
    return redirect('/user');
}
로그인 후 복사
로그인 후 복사

使用这种方式,我们需要在表单中指定采用 PUT 方法,并且需要传递一个 _token 参数来防止 CSRF 攻击,这样会增加不少的代码工作量。

第二种解决思路则要简单得多。我们需要在表单中使用 POST 方法,但是在提交时加上 _method 参数指定请求方法为 PUT:

<form action="/user/{{ $user->id }}" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="text" name="name" value="{{ $user->name }}">
    <button type="submit">提交</button>
</form>
로그인 후 복사

然后,在控制器中处理 POST 请求时,使用 method

public function update(Request $request, $id)
{
    $user = User::findOrFail($id);
    $user->name = $request->input('name');
    $user->save();
    return redirect('/user');
}
로그인 후 복사
로그인 후 복사
In the 위의 코드에서는 새 User 개체를 만들고 양식에서 제출한 이름 필드를 User 개체의 이름 속성에 할당한 다음 데이터를 저장하고 /user 페이지로 리디렉션합니다.

그러나 위 코드에는 때때로 문제가 있습니다. 새로 추가된 데이터를 편집할 수 없습니다. 편집 페이지에 접속해 보면 해당 페이지에는 원래 생성된 데이터 정보가 없다는 것을 알 수 있습니다. 왜 이런거야? 먼저 편집 페이지의 코드를 살펴보겠습니다.

rrreee

이 코드에서는 method_field 메서드를 사용하여 요청 메서드를 PUT으로 지정합니다. 왜냐하면 HTTP 프로토콜에서 리소스를 업데이트하려면 다음이 필요하기 때문입니다. PUT 방식을 사용합니다. 그러나 Laravel 프레임워크에서는 기본 POST 요청이 PUT 요청을 인식할 수 없으므로, Laravel은 편집 페이지에 접근할 때 우리가 기대하는 PUT 요청 대신 기본 POST 요청에 따라 처리합니다. 🎜🎜이 문제를 해결하기 위한 두 가지 아이디어가 있습니다. 하나는 PUT 요청 메소드를 사용하여 데이터를 생성하는 것이고, 다른 하나는 POST 메소드를 사용하여 데이터를 생성할 때 _method 매개변수를 사용하여 요청 메소드를 지정하는 것입니다. 데이터. 🎜🎜첫 번째 해결 방법은 더 간단한 방법이지만 더 많은 코드 변경이 필요합니다. 🎜rrreee🎜 형식의 PUT 요청 메서드를 사용해야 합니다. 그런 다음 컨트롤러에서 PUT 요청을 처리합니다. 🎜rrreee🎜이 메서드를 사용하여 형식에 PUT 메서드를 지정하고 _token 매개변수를 전달해야 합니다. CSRF 공격을 방지하기 위해 코드 작업량이 많이 증가합니다. 🎜🎜두 번째 해결 방법은 훨씬 간단합니다. 양식에서 POST 메서드를 사용해야 하지만 제출 시 _method 매개변수를 추가하여 요청 메서드를 PUT으로 지정합니다. 🎜rrreee🎜 그런 다음 컨트롤러에서 POST 요청을 처리할 때 메서드를 사용하세요. PUT 요청을 식별하는 방법: 🎜rrreee🎜이 방법을 사용하면 양식에 _method 매개변수만 추가하면 되기 때문에 더 읽기 쉽고 코딩 작업이 덜 필요합니다. 🎜🎜Laravel 프로젝트를 개발하는 과정에서 문제가 발생하는 것은 불가피합니다. 문제를 해결하려면 인내심과 주의가 필요하며, 프레임워크와 기술에 대한 심층적인 이해와 숙달이 필요합니다. 이 글이 독자들에게 참고가 되고 도움이 되기를 바랍니다. 🎜

위 내용은 laravel의 새로운 추가 기능과 이를 편집할 수 없는 문제는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿