Tôi nghĩ sẽ hữu ích cho những khách truy cập trong tương lai nếu cung cấp một chút giải thích về những gì đang xảy ra ở đây.
các Illuminate\Http\Request
lớp học
Lớp của Laravel Illuminate\Http\Request
có một phương thức được đặt tên all
(trên thực tế, all
phương thức được định nghĩa trong một đặc điểm mà Request
lớp đó sử dụng, được gọi Illuminate\Http\Concerns\InteractsWithInput
). Chữ ký của all
phương thức tại thời điểm viết bài trông như sau:
public function all($keys = null)
Phương thức này không được định nghĩa là static
và vì vậy khi bạn cố gắng gọi phương thức trong ngữ cảnh tĩnh, tức là Illuminate\Http\Request::all()
bạn sẽ gặp lỗi hiển thị trong câu hỏi của OP. Các all
phương pháp là một phương pháp dụ và những giao dịch với các thông tin được trình bày trong một thể hiện của Request
lớp, cho nên gọi nó theo cách này làm cho không có ý nghĩa.
Mặt tiền
Một mặt tiền trong Laravel cung cấp cho các nhà phát triển một cách thuận tiện để truy cập các đối tượng trong vùng chứa IoC và gọi các phương thức trên các đối tượng đó. Một nhà phát triển có thể gọi một phương thức "statically" trên một mặt tiền giống như Request::all()
, nhưng lệnh gọi phương thức thực tế trên đối tượng thực không phảiIlluminate\Http\Request
là static.
Một mặt tiền hoạt động giống như một proxy - nó tham chiếu đến một đối tượng trong vùng chứa IoC và chuyển lời gọi phương thức tĩnh lên đối tượng đó (không tĩnh). Ví dụ, hãy lấy Illuminate\Support\Facades\Request
mặt tiền, nó trông như thế này:
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return 'request';
}
}
Dưới mui xe, Illuminate\Support\Facades\Facade
lớp cơ sở sử dụng một số phép thuật PHP, cụ thể là __callStatic
phương thức để:
- Nghe lệnh gọi phương thức tĩnh, trong trường hợp này là
all
không có tham số
- Lấy đối tượng cơ bản từ vùng chứa IoC bằng cách sử dụng khóa được trả về
getFacadeAccessor
, trong trường hợp này là một Illuminate\Http\Request
đối tượng
- Tự động gọi phương thức mà nó đã nhận tĩnh trên đối tượng mà nó đã truy xuất, trong trường hợp
all
này được gọi là không tĩnh trên một thể hiện của Illuminate\Http\Request
.
Đây là lý do tại sao, như @patricus đã chỉ ra trong câu trả lời của anh ấy ở trên, bằng cách thay đổi use
câu lệnh / import để tham chiếu đến mặt tiền, lỗi không còn ở đó nữa, vì theo như PHP có liên quan, all
đã được gọi chính xác trên một phiên bản của Illuminate\Http\Request
.
Răng cưa
Aliasing là một tính năng khác mà Laravel cung cấp để tạo sự thuận tiện. Nó hoạt động bằng cách tạo hiệu quả các lớp bí danh trỏ đến các mặt tiền trong không gian tên gốc. Nếu bạn xem config/app.php
tệp của mình , dưới aliases
phím, bạn sẽ tìm thấy một danh sách dài các ánh xạ của các chuỗi tới các lớp mặt tiền. Ví dụ:
'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 tạo các lớp bí danh này cho bạn, dựa trên cấu hình của bạn và điều này cho phép bạn sử dụng các lớp có sẵn trong không gian tên gốc (được gọi bằng các khóa chuỗi của aliases
cấu hình) như thể bạn đang sử dụng chính mặt tiền:
use Request:
class YourController extends Controller
{
public function yourMethod()
{
$input = Request::all();
}
}
Một lưu ý về tiêm phụ thuộc
Trong khi các mặt tiền và răng cưa vẫn được cung cấp trong Laravel, có thể và thường được khuyến khích đi xuống con đường tiêm phụ thuộc. Ví dụ: sử dụng hàm tạo chèn để đạt được kết quả tương tự:
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();
}
}
Có một số lợi ích đối với cách tiếp cận này nhưng theo ý kiến cá nhân của tôi, điểm chuyên nghiệp nhất cho việc tiêm phụ thuộc là nó làm cho cách kiểm tra mã của bạn dễ dàng hơn. Bằng cách khai báo các phụ thuộc của các lớp của bạn dưới dạng đối số phương thức hoặc hàm tạo, sẽ rất dễ dàng để mô phỏng những phụ thuộc đó và kiểm tra đơn vị lớp của bạn một cách riêng biệt.