Gelecekteki ziyaretçiler için burada neler olduğuna dair biraz açıklama yapmanın yararlı olacağını düşündüm.
Illuminate\Http\Request
sınıf
Laravel'in Illuminate\Http\Request
sınıfının adlandırılmış bir yöntemi vardır all
(aslında all
yöntem, Request
sınıfın kullandığı, çağrılan bir özellikte tanımlanmıştır Illuminate\Http\Concerns\InteractsWithInput
). all
Yöntemin yazım sırasındaki imzası şu şekildedir:
public function all($keys = null)
Bu yöntem olarak tanımlanmamıştır static
ve bu nedenle yöntemi statik bir bağlamda çağırmaya çalıştığınızda, yani Illuminate\Http\Request::all()
OP'nin sorusunda görüntülenen hatayı alırsınız. all
Bir örnek metot ve bir örneği mevcuttur bilgilerle fırsatlar olduğunu Request
hiç mantıklı bu şekilde çağırmak yüzden, sınıf.
Cepheler
Laravel'deki bir cephe, geliştiricilere IoC konteynerindeki nesnelere erişmenin ve bu nesnelerdeki yöntemlerin çağrılmasının uygun bir yolunu sağlar. Bir geliştirici, benzer bir cephede bir yöntemi "durağan" olarak Request::all()
çağırabilir, ancak gerçek Illuminate\Http\Request
nesnedeki gerçek yöntem çağrısı statik değildir .
Bir cephe, bir proxy gibi çalışır - IoC konteynerindeki bir nesneyi ifade eder ve statik yöntem çağrısını bu nesneye (statik olmayan olarak) iletir. Örneğin Illuminate\Support\Facades\Request
cepheyi ele alalım, göründüğü gibi:
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return 'request';
}
}
Temel olarak, temel Illuminate\Support\Facades\Facade
sınıf bazı PHP sihrini kullanır, yani şu __callStatic
yöntemi kullanır:
- Bu durumda
all
parametre olmadan statik bir yöntem çağrısını dinleyin
getFacadeAccessor
Bu durumda bir Illuminate\Http\Request
nesne tarafından döndürülen anahtarı kullanarak IoC konteynerinden temeldeki nesneyi alın
- Geri getirdiği nesnede statik olarak aldığı yöntemi dinamik olarak çağırın, bu durumda
all
bir örneğinde statik olmayan olarak çağrılır Illuminate\Http\Request
.
Bu nedenle, @patricus'un yukarıdaki cevabında belirttiği gibi, use
/ import ifadesini cepheye atıfta bulunacak şekilde değiştirerek, hata artık orada değildir, çünkü PHP söz konusu olduğunda, all
bir örneğinde doğru şekilde çağrılmıştır Illuminate\Http\Request
.
Aliasing
Aliasing, Laravel'in kolaylık sağladığı bir başka özelliktir. Kök ad alanında cephelere işaret eden takma ad sınıflarını etkili bir şekilde oluşturarak çalışır. config/app.php
Dosyanıza bir göz atarsanız , aliases
anahtarın altında, cephe sınıfları için uzun bir dizi eşleştirmeleri bulacaksınız. Örneğin:
'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, yapılandırmanıza bağlı olarak bu takma ad sınıflarını sizin için oluşturur ve bu, kök ad alanında bulunan sınıfları ( aliases
yapılandırmanın dize anahtarları tarafından anılır ) cephenin kendisini kullanıyormuş gibi kullanmanıza olanak tanır :
use Request:
class YourController extends Controller
{
public function yourMethod()
{
$input = Request::all();
}
}
Bağımlılık ekleme hakkında bir not
Laravel'de cepheler ve örtüşme hala sağlansa da, bağımlılık enjeksiyon yoluna gitmek mümkündür ve genellikle teşvik edilir. Örneğin, aynı sonucu elde etmek için yapıcı enjeksiyonu kullanmak:
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();
}
}
Bu yaklaşımın birçok faydası vardır, ancak kişisel görüşüme göre bağımlılık enjeksiyonunun en büyük yanlısı, kodunuzun test edilmesini kolaylaştırmasıdır. Sınıflarınızın bağımlılıklarını yapıcı veya yöntem argümanları olarak bildirerek, bu bağımlılıkları alay etmek ve sınıfınızı tek başına test etmek çok kolay hale gelir.