Laravelでは、私が呼び出ししようとしている$input = Request::all();
上でstore()
、私のコントローラのメソッドが、私は次のエラーを取得しています:
互換性のないコンテキストから
Illuminate\Http\Request::all()
想定して$this
、非静的メソッドを静的に呼び出すことはできません
これを修正するための最良の方法を見つける助けはありますか?(私はララキャストをフォローしています)
Laravelでは、私が呼び出ししようとしている$input = Request::all();
上でstore()
、私のコントローラのメソッドが、私は次のエラーを取得しています:
互換性のないコンテキストから
Illuminate\Http\Request::all()
想定して$this
、非静的メソッドを静的に呼び出すことはできません
これを修正するための最良の方法を見つける助けはありますか?(私はララキャストをフォローしています)
use Illuminate\Http\Request;
あなたのコントローラで文を?
Illuminate\Http\Request
/ vendorにパッケージを持っていません。別途ダウンロードする必要がありますか?
Illuminate
パッケージはlaravel /フレームワークパッケージの一部として含まれています。Laravelのソースコードのいずれかを見たい場合は、以下にあります/vendor/laravel/framework/src/Illuminate/...
回答:
エラーメッセージは、コールがRequest
ファサードを通過していないことが原因です。
変化する
use Illuminate\Http\Request;
に
use Request;
そしてそれは働き始めるはずです。
config / app.phpファイルには、クラスエイリアスのリストがあります。ここで、基本クラスRequest
がクラスにエイリアスされていることがわかりますIlluminate\Support\Facades\Request
。このためRequest
、名前空間ファイルでファサードを使用するには、基本クラスを使用するように指定する必要がありますuse Request;
。
この質問はトラフィックが多いようですので、Laravel 5が正式にリリースされたので、答えを少し更新したいと思いました。
上記は技術的には正しく、機能しますが、このuse Illuminate\Http\Request;
ステートメントは新しいコントローラーテンプレートに含まれており、開発者がファサードに依存するのではなく、依存性注入を使用する方向に進むのに役立ちます。
Requestオブジェクトをコンストラクター(またはLaravel 5で使用可能なメソッド)にIlluminate\Http\Request
挿入する場合、挿入する必要があるのはオブジェクトであり、Request
ファサードではありません。
したがって、リクエストファサードで動作するようにコントローラーテンプレートを変更する代わりに、特定のコントローラーテンプレートで動作し、依存性注入の使用に移行することをお勧めします(コンストラクターまたはメソッドを介して)。
メソッドによる例
<?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::all();
中に使用できないのはなぜuse Illuminate\Http\Request;
ですか?
use Illuminate\Support\Facades\Request;
代わりにしなければならない use Illuminate\Http\Request;
Laravelのマジックインジェクションを使用してリクエストオブジェクトをコントローラーにインジェクトしてから、非静的に関数にアクセスします。Laravelは、オートロードされたクラスに具体的な依存関係を自動的に挿入します
class MyController()
{
protected $request;
public function __construct(\Illuminate\Http\Request $request)
{
$this->request = $request;
}
public function myFunc()
{
$input = $this->request->all();
}
}
request()
代わりにヘルパーを使用してください。use
ステートメントについて心配する必要がないため、この種の問題は二度と発生しません。
$input = request()->all();
シンプル
ここで何が起こっているのか、将来の訪問者に少し説明しておくと便利だと思いました。
Illuminate\Http\Request
クラスLaravelのIlluminate\Http\Request
クラスにはという名前のメソッドがありますall
(実際、all
メソッドはRequest
クラスが使用するトレイトで定義され、と呼ばれますIlluminate\Http\Concerns\InteractsWithInput
)。all
執筆時点でのメソッドのシグネチャは次のようになります。
public function all($keys = null)
このメソッドはとして定義されていないstatic
ため、静的コンテキストでメソッドを呼び出そうとすると、Illuminate\Http\Request::all()
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の魔法、つまり次の__callStatic
メソッドを使用します。
all
はパラメーターなしで、静的メソッド呼び出しをリッスンしますgetFacadeAccessor
(この場合はIlluminate\Http\Request
オブジェクト)を使用して、IoCコンテナから基になるオブジェクトを取得しますall
、のインスタンスで非静的に呼び出されますIlluminate\Http\Request
。これが、@ patricusが上記の回答で指摘したようuse
に、ファサードを参照するように/ importステートメントを変更することにより、PHPに関する限り、all
のインスタンスで正しく呼び出されたため、エラーが発生しなくなった理由ですIlluminate\Http\Request
。
エイリアシングは、Laravelが便利に提供するもう1つの機能です。これは、ルート名前空間のファサードを指すエイリアスクラスを効果的に作成することによって機能します。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
、ファサード自体を使用しているかのように、ルート名前空間(構成の文字列キーで参照)で使用可能なクラスを利用できます。
use Request:
class YourController extends Controller
{
public function yourMethod()
{
$input = Request::all();
// ...
}
}
Laravelではファサードとエイリアシングが引き続き提供されていますが、依存性注入ルートをたどることは可能であり、通常は推奨されます。たとえば、コンストラクタインジェクションを使用して同じ結果を達成します。
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.phpファイルにインポートするときにも発生します。これは、ルートクラスが見つからないためにインポートするというIDEの提案によって発生します。
それを取り除くだけで、すべてが正常に機能します。
use Illuminate\Routing\Route;
更新:
このライブラリを追加してもエラーは発生しないようです
use Illuminate\Support\Facades\Route;
スコープ定義で動作させる
public function pagar(\ Illuminate \ Http \ Request $ request){//