Laravel 요구::all()을 스태틱하게 호출하지 말 것
라라벨에서, 내가 전화하려고 하는데$input = Request::all();
store()
method는 컨트롤러에 있습니다만, 다음의 에러가 표시됩니다.
방식 " " "
Illuminate\Http\Request::all()
는 안 .$this
incompatible context(호환되지 않는 )
이 문제를 해결할 수 있는 최선의 방법을 찾는 데 도움이 필요하십니까? (라캐스트를 팔로우하고 있습니다.
는, 이 「」, 「」, 「」를 하지 않았기 입니다.Request
외관
바꾸다
use Illuminate\Http\Request;
로.
use Request;
작동하기 시작할 겁니다.
aliasesconfig/app.php . 「」가 됩니다.Request
가 되어 .Illuminate\Support\Facades\Request
에 '수업하다'를 하려고 합니다이것때 、 그문,그에 、Request
에서는 namesize된 names파파파를 사용하도록 해야 합니다.기본 클래스를 사용하도록 지정해야 합니다.use Request;
.
편집
이 질문은 트래픽이 다소 몰리는 것 같기 때문에, Larabel 5가 정식으로 발매되었기 때문에, 답변을 조금 업데이트 하고 싶었습니다.
의 내용은 만, 이 은 기능하고 있습니다.use Illuminate\Http\Request;
스테이트먼트가 새로운 컨트롤러 템플릿에 포함되어 있어 개발자가 Passide에 의존하지 않고 Dependence Injection을 사용할 수 있도록 지원합니다.
5에서 사용 한 메서드 Request가 .Illuminate\Http\Request
가 있는 Request
외관
따라서 컨트롤러 템플릿을 Request passide와 연동하도록 변경하는 것이 아니라 지정된 컨트롤러 템플릿을 사용하여 (컨스트럭터 또는 메서드를 통해) 의존성 주입을 사용하는 것이 좋습니다.
방법을 통한 예
<?php namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserController extends Controller {
/**
* Store a newly created resource in storage.
*
* @param Illuminate\Http\Request $request
* @return Response
*/
public function store(Request $request) {
$name = $request->input('name');
}
}
생성자를 통한 예
<?php namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserController extends Controller {
protected $request;
public function __construct(Request $request) {
$this->request = $request;
}
/**
* Store a newly created resource in storage.
*
* @return Response
*/
public function store() {
$name = $this->request->input('name');
}
}
request()
대신 도우미를 불러주세요.안 돼요.use
이런 종류의 문제는 다시 발생하지 않을 것입니다.
$input = request()->all();
간단하죠.
Larabel의 마법 주입을 사용하여 컨트롤러에 요청 개체를 주입한 후 정적 이외의 함수에 액세스합니다.Larabel은 자동으로 자동 로드된 클래스에 구체적인 종속성을 주입합니다.
class MyController()
{
protected $request;
public function __construct(\Illuminate\Http\Request $request)
{
$this->request = $request;
}
public function myFunc()
{
$input = $this->request->all();
}
}
파사드는 다른 Request 클래스입니다.풀 패스로 액세스 합니다.
$input = \Request::all();
에서 Larabel 5를 할 수 .request()
★★★★
$input = request()->all();
나는 여기서 무슨 일이 일어나고 있는지 미래의 방문객들에게 약간의 설명을 해주는 것이 도움이 될 것이라고 생각했다.
Illuminate\Http\Request
표시
의 ★★★★★★★★★★★★★★★★★」Illuminate\Http\Request
에는 class라는 의 방법이 .all
all
는 법은은그 the the the the that that that that that 라는 특성으로 됩니다.Request
사용, "" " " "''Illuminate\Http\Concerns\InteractsWithInput
의 .all
작성 시의 방법은 다음과 같습니다.
public function all($keys = null)
은 '어리다'로 되어 있지 .static
스태틱한 하려고 하면 (즉, '콜을'하는 경우,Illuminate\Http\Request::all()
OP op op op op op op op op 。all
로 메서드의 )Request
수업이라 이런 식으로 부르는 건 말이 안 돼요
전면
Laravel의 파사드는 개발자들에게 IOC 컨테이너 내의 객체에 접근하기 위한 편리한 방법 및 객체에 대한 호출 방법을 제공합니다.개발자는 다음과 같은 정적인 방법으로 메서드를 호출할 수 있습니다.Request::all()
, 그러나 실제 메서드 호출은 실제입니다. Illuminate\Http\Request
오브젝트는 스태틱하지 않습니다.
파사드는 프록시처럼 동작합니다.즉, IoC 컨테이너 내의 오브젝트를 참조해, 스태틱 메서드 호출을 그 오브젝트에 전달합니다(비정적).를 들면, 「」를 예로 ,Illuminate\Support\Facades\Request
츠키다
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return 'request';
}
}
후드 밑에는Illuminate\Support\Facades\Facade
클래스는 일부 PHP 매직, 즉 다음을 수행하는 메서드를 사용합니다.
- 이 경우 스태틱 메서드콜을 리슨합니다
all
파라미터 없이 - 에서 반환된 키를 사용하여 IoC 컨테이너에서 기본 개체를 가져옵니다.
getFacadeAccessor
(이 경우 a)Illuminate\Http\Request
물건 - 취득한 오브젝트에서 수신한 메서드를 동적으로 호출합니다(이 경우).
all
non-statically 라고 불립니다.Illuminate\Http\Request
.
이것이 바로 @patricus가 위의 답변에서 지적한 바와 같이,use
/import 스테이트먼트는 파사드를 참조하는 것으로, 에러는 없어졌습니다.PHP에 관한 한,all
의 인스턴스에서 올바르게 호출되었습니다.Illuminate\Http\Request
.
앨리어싱
에일리어스는 Laravel이 편의상 제공하는 또 다른 기능입니다.루트 네임스페이스의 패이스를 가리키는 에일리어스 클래스를 효과적으로 작성함으로써 동작합니다.이 사진을 보시면config/app.php
파일, 아래aliases
키를 누르면 스트링과 파사드클래스의 매핑 리스트가 표시됩니다.예를 들어 다음과 같습니다.
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
'Auth' => Illuminate\Support\Facades\Auth::class,
// ...
'Request' => Illuminate\Support\Facades\Request::class,
Laravel은 설정에 따라 이러한 에일리어스 클래스를 만듭니다.이것에 의해, 루트 네임스페이스에서 사용 가능한 클래스를 사용할 수 있습니다(의 문자열 키로 참조).aliases
config)는, 전면 자체를 사용하고 있는 것처럼 합니다.
use Request:
class YourController extends Controller
{
public function yourMethod()
{
$input = Request::all();
// ...
}
}
의존관계 주입에 관한 주의사항
라라벨에서는 아직 패드와 에일리어싱이 제공되고 있습니다만, 의존성 주입 루트를 따라가는 것이 가능하고, 통상은 권장됩니다.예를 들어, 생성자 주입을 사용하여 동일한 결과를 얻을 수 있습니다.
use Illuminate\Http\Request;
class YourController extends Controller
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function yourMethod()
{
$input = $this->request->all();
// ...
}
}
이 접근법에는 많은 이점이 있지만, 제 개인적인 의견으로는 의존성 주입의 가장 큰 장점은 코드를 테스트하기 쉽게 만든다는 것입니다.클래스의 의존성을 컨스트럭터 또는 메서드 인수로 선언함으로써 이러한 의존성을 시뮬레이션하고 클래스를 분리하여 유닛 테스트하는 것이 매우 쉬워집니다.
또한 다음 라이브러리를 api.disc 파일에 Import할 때도 발생합니다.루트 클래스를 찾을 수 없기 때문에 Import하도록 IDE가 제안했기 때문에 이 문제가 발생합니다.
제거만 하면 다 잘 될 거예요.
use Illuminate\Routing\Route;
업데이트:
이 라이브러리를 추가하면 오류가 발생할 것 같습니다.
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;
public function store(Request $request){
dd($request->all());
}
문맥상으로는 같다
use Request;
public function store(){
dd(Request::all());
}
저는 이 문제에 직면해 있었습니다.use Illuminate\Http\Request;
내 컨트롤러 맨 위에 있는 라인.머리를 계속 잡아당겨서 내가 하고 있다는 걸 깨닫고 나서$request::ip()
대신$request->ip()
밤새 잠을 못 자고 새벽 6시에 반쯤 뜬 눈으로 코드를 보고 있으면 발생할 수 있습니다.
이게 앞으로 누군가를 도울 수 있기를 바랍니다.
스코프 정의로 동작하게 한다.
퍼블릭 함수 페이지(\Iluminate\)Http\Request $Request) {//
언급URL : https://stackoverflow.com/questions/28573860/laravel-requestall-should-not-be-called-statically
'programing' 카테고리의 다른 글
Django에서 고정 장치를 로드할 때 내용 유형에 문제가 있습니다. (0) | 2022.10.10 |
---|---|
PHP에서 진행률 표시줄 업로드 (0) | 2022.10.10 |
Maria DB 도커 액세스가 사용자 'root'@'localhost'에 대해 거부되었습니다. (0) | 2022.10.10 |
심플한 Java 인메모리 캐시를 찾고 있다 (0) | 2022.10.10 |
phpMyAdmin을 통해 원격 사용자 허용 (0) | 2022.10.10 |