Açıklama
İstek Nesnesini Alma
webman, istek nesnesini action metodunun ilk parametresine otomatik olarak enjekte eder, örneğin:
Örnek
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
$default_name = 'webman';
// get isteğinden name parametresini al, eğer name parametresi gönderilmemişse $default_name'ı döndür
$name = $request->get('name', $default_name);
// Tarayıcıya bir string döndür
return response('hello ' . $name);
}
}
$request
nesnesi ile isteğe bağlı her türlü veriyi alabiliriz.
Bazen başka bir sınıfta geçerli olan $request
nesnesini almak isteyebiliriz, bu durumda sadece request()
yardımcı fonksiyonunu kullanmamız yeterlidir.
GET İstek Parametrelerini Alma
Tüm get dizisini alma
$request->get();
Eğer istekte get parametresi yoksa, boş bir dizi döner.
Get dizisinden belirli bir değeri alma
$request->get('name');
Eğer get dizisinde bu değer yoksa, null döner.
Get metoduna ikinci bir parametre olarak bir varsayılan değer de verebilirsiniz. Eğer get dizisinde karşılık gelen değeri bulamazsanız varsayılan değeri döner. Örneğin:
$request->get('name', 'tom');
POST İstek Parametrelerini Alma
Tüm post dizisini alma
$request->post();
Eğer istekte post parametresi yoksa, boş bir dizi döner.
Post dizisinden belirli bir değeri alma
$request->post('name');
Eğer post dizisinde bu değer yoksa, null döner.
Get metoduyla aynı şekilde, post metoduna ikinci bir parametre olarak bir varsayılan değer de verebilirsiniz. Eğer post dizisinde karşılık gelen değeri bulamazsanız varsayılan değeri döner. Örneğin:
$request->post('name', 'tom');
input() Yardımcı Fonksiyonu
$request->input()
fonksiyonuna benzer şekilde, tüm parametreleri alabilir, input() yardımcı fonksiyonunun toplamda iki parametresi vardır:
- name: Alınacak parametre adı (boşsa, tüm parametrelerin dizisini alabilir)
- default: Varsayılan değer (ilk parametre ile alma başarısız olduğunda, bu parametrenin değeri kullanılacaktır)
Örneğin
// name parametresini al
$name = input('name');
// name parametresini al, eğer yoksa varsayılan değeri kullan
$name = input('name','张三');
// Tüm parametreleri al
$all_params = input();
Ham İstek POST Gövdesini Alma
$post = $request->rawBody();
Bu fonksiyon, php-fpm
içindeki file_get_contents("php://input");
işlemi ile benzerdir. HTTP ham istek gövdesini almak için kullanılır. Bu, application/x-www-form-urlencoded
formatındaki post istek verilerini alırken çok yararlıdır.
Header'ı Alma
Tüm header dizisini alma
$request->header();
Eğer istekte header parametresi yoksa, boş bir dizi döner. Tüm anahtarların küçük harfle yazıldığını unutmayın.
Header dizisinden belirli bir değeri alma
$request->header('host');
Eğer header dizisinde bu değer yoksa, null döner. Tüm anahtarların küçük harfle yazıldığını unutmayın.
Get metoduyla aynı şekilde, header metoduna ikinci bir parametre olarak bir varsayılan değer de verebilirsiniz. Eğer header dizisinde karşılık gelen değeri bulamazsanız varsayılan değeri döner. Örneğin:
$request->header('host', 'localhost');
Cookie'yi Alma
Tüm cookie dizisini alma
$request->cookie();
Eğer istekte cookie parametresi yoksa, boş bir dizi döner.
Cookie dizisinden belirli bir değeri alma
$request->cookie('name');
Eğer cookie dizisinde bu değer yoksa, null döner.
Get metoduyla aynı şekilde, cookie metoduna ikinci bir parametre olarak bir varsayılan değer de verebilirsiniz. Eğer cookie dizisinde karşılık gelen değeri bulamazsanız varsayılan değeri döner. Örneğin:
$request->cookie('name', 'tom');
Tüm Girdileri Alma
post
ve get
birleşimini içerir.
$request->all();
Belirli Girdi Değerini Alma
post
ve get
birleşiminden bir değeri alma.
$request->input('name', $default_value);
Kısmi Girdi Verilerini Alma
post
ve get
birleşiminden kısmi verileri alma.
// username ve password dizisini al, eğer karşılık gelen anahtar yoksa yok say
$only = $request->only(['username', 'password']);
// avatar ve age dışında tüm girdileri al
$except = $request->except(['avatar', 'age']);
Kontrolör Parametreleri ile Girdi Alma
<?php
namespace app\controller;
use support\Response;
class UserController
{
public function create(string $name, int $age = 18): Response
{
return json(['name' => $name, 'age' => $age]);
}
}
Kod mantığı şu şekildedir:
<?php
namespace app\controller;
use support\Request;
use support\Response;
class UserController
{
public function create(Request $request): Response
{
$name = $request->input('name');
$age = (int)$request->input('age', 18);
return json(['name' => $name, 'age' => $age]);
}
}
Daha fazla bilgi için lütfen Kontrolör Parametre Bağlama başlığına bakın.
Yüklenen Dosyaları Alma
İpucu
Dosyaların yüklenmesi içinmultipart/form-data
formatında bir form kullanılmalıdır.
Tüm yüklenen dosya dizisini alma
$request->file();
Form şu şekilde olabilir:
<form method="post" action="http://127.0.0.1:8787/upload/files" enctype="multipart/form-data" />
<input name="file1" multiple="multiple" type="file">
<input name="file2" multiple="multiple" type="file">
<input type="submit">
</form>
$request->file()
dönen format şu şekildedir:
array (
'file1' => object(webman\Http\UploadFile),
'file2' => object(webman\Http\UploadFile)
)
Bu, webman\Http\UploadFile
örneklerinin bir dizisidir. webman\Http\UploadFile
sınıfı, PHP'nin yerleşik SplFileInfo
sınıfını genişletir ve bazı kullanışlı yöntemler sunar.
<?php
namespace app\controller;
use support\Request;
class UploadController
{
public function files(Request $request)
{
foreach ($request->file() as $key => $spl_file) {
var_export($spl_file->isValid()); // Dosya geçerli mi, örneğin true|false
var_export($spl_file->getUploadExtension()); // Yüklenen dosya uzantısı, örneğin 'jpg'
var_export($spl_file->getUploadMimeType()); // Yüklenen dosyanın mime tipi, örneğin 'image/jpeg'
var_export($spl_file->getUploadErrorCode()); // Yükleme hata kodunu al, örneğin UPLOAD_ERR_NO_TMP_DIR UPLOAD_ERR_NO_FILE UPLOAD_ERR_CANT_WRITE
var_export($spl_file->getUploadName()); // Yüklenen dosya adı, örneğin 'my-test.jpg'
var_export($spl_file->getSize()); // Dosya boyutunu al, örneğin 13364, birim byte
var_export($spl_file->getPath()); // Yüklenen dizini al, örneğin '/tmp'
var_export($spl_file->getRealPath()); // Geçici dosya yolunu al, örneğin `/tmp/workerman.upload.SRliMu`
}
return response('ok');
}
}
Dikkat:
- Dosya yüklendikten sonra geçici bir dosya adı alır, örneğin
/tmp/workerman.upload.SRliMu
- Yüklenen dosyanın boyutu defaultMaxPackageSize ile sınırlıdır, varsayılan 10M,
config/server.php
dosyasındakimax_package_size
değerini değiştirebilirsiniz. - İstek sona erdikten sonra geçici dosya otomatik olarak temizlenecektir.
- Eğer istek yüklenmiş dosya yoksa,
$request->file()
boş bir dizi döner. - Yüklenen dosyalar
move_uploaded_file()
metodunu desteklemez, bunun yerine$file->move()
metodunu kullanmalısınız, aşağıdaki örneğe bakınız.
Belirli Yüklenen Dosyayı Alma
$request->file('avatar');
Eğer dosya varsa karşılık gelen dosyanın webman\Http\UploadFile
örneğini döner, aksi takdirde null döner.
Örnek
<?php
namespace app\controller;
use support\Request;
class UploadController
{
public function file(Request $request)
{
$file = $request->file('avatar');
if ($file && $file->isValid()) {
$file->move(public_path().'/files/myfile.'.$file->getUploadExtension());
return json(['code' => 0, 'msg' => 'yükleme başarılı']);
}
return json(['code' => 1, 'msg' => 'dosya bulunamadı']);
}
}
Host'u Alma
İsteğin host bilgilerini alma.
$request->host();
Eğer istek adresi standart 80 ya da 443 portu dışında bir port kullanıyorsa, host bilgisi port numarasını içerebilir, örneğin example.com:8080
. Port numarasını istemiyorsanız, ilk parametreye true
verebilirsiniz.
$request->host(true);
İstek Metodunu Alma
$request->method();
Dönen değer GET``,
POST, `PUT
, DELETE``,
OPTIONSveya
HEAD` olabilir.
İstek URI'sini Alma
$request->uri();
İsteğin URI'sini, path ve queryString kısmını içerir.
İstek Yolunu Alma
$request->path();
İsteğin path kısmını döner.
İstek QueryString'ini Alma
$request->queryString();
İsteğin queryString kısmını döner.
İstek URL'sini Alma
url()
metodu, Query
parametresi olmadan URL'yi döner.
$request->url();
Döner: //www.workerman.net/workerman-chat
fullUrl()
metodu ise Query
parametresi ile birlikte URL'yi döner.
$request->fullUrl();
Döner: //www.workerman.net/workerman-chat?type=download
Dikkat
url()
vefullUrl()
protokol kısmını döndürmez (http veya https yoktur).
Tarayıcıda//example.com
şeklinde bir adres kullandığınızda, bu adres otomatik olarak mevcut sitenin protokolünü tanır ve isteği otomatik olarak http veya https ile başlatır.
Eğer nginx proxy kullanıyorsanız, proxy_set_header X-Forwarded-Proto $scheme;
satırını nginx konfigürasyonuna ekleyin, nginx proxy'sini inceleyin,
böylece $request->header('x-forwarded-proto');
kullanarak http veya https'yi belirleyebilirsiniz, örneğin:
echo $request->header('x-forwarded-proto'); // http veya https çıktısı
İstek HTTP Versiyonunu Alma
$request->protocolVersion();
Döner: 1.1
veya 1.0
.
İstek sessionId'sini Alma
$request->sessionId();
Harf ve rakamlardan oluşan bir dizi döner.
İstemcinin IP'sini Alma
$request->getRemoteIp();
İstemcinin Portunu Alma
$request->getRemotePort();
İstemcinin Gerçek IP'sini Alma
$request->getRealIp($safe_mode=true);
Proje bir proxy (örneğin nginx) kullanıyorsa, $request->getRemoteIp()
ile genellikle proxy sunucusunun IP'sini (örneğin 127.0.0.1
192.168.x.x
) alırsınız ve bu, istemcinin gerçek IP'si olmayabilir. Bu durumda, $request->getRealIp()
ile istemcinin gerçek IP'sini almaya çalışabilirsiniz.
$request->getRealIp()
gerçek IP'yi HTTP başlıklarından x-forwarded-for
, x-real-ip
, client-ip
, x-client-ip
, via
alanlarından almaya çalışır.
HTTP başlıklarının kolayca sahte olduğunu unutmayın, bu yüzden bu yöntemle elde edilen istemci IP'si %100 güvenilir değildir, özellikle
$safe_mode
false olduğunda. Proxy aracılığıyla istemcinin gerçek IP'sini elde etmenin daha güvenilir yolu, güvenli proxy sunucusu IP'sine sahip olmak ve gerçek IP'yi taşıyan HTTP başlığını açıkça bilmektir. Eğer$request->getRemoteIp()
dönen IP, bilinen güvenli proxy sunucusu IP'siyse, o zaman$request->header('gerçek IP taşıyan HTTP başlığı')
ile gerçek IP'yi alabilirsiniz.
Sunucu IP'sini Alma
$request->getLocalIp();
Sunucu Portunu Alma
$request->getLocalPort();
AJAX İsteği Olup Olmadığını Kontrol Etme
$request->isAjax();
PJAX İsteği Olup Olmadığını Kontrol Etme
$request->isPjax();
JSON Döndürülmesi Bekleniyor mu Kontrol Etme
$request->expectsJson();
İstemci JSON Döndürülmesini Kabul Ediyor mu Kontrol Etme
$request->acceptJson();
İsteğin Eklenti Adını Alma
Eklenti olmayan istekler boş string ''
döner.
$request->plugin;
İsteğin Uygulama Adını Alma
Tek uygulama olduğunda her zaman boş string ''
döner, çoklu uygulama durumunda uygulama adını döner.
$request->app;
Kapanış (closure) fonksiyonları herhangi bir uygulamaya ait olmadığından, kapanış yönlendirmesinden gelen istekler için
$request->app
her zaman boş string''
döner.
Kapanış yönlendirmeleri için Yönlendirme bölümüne bakın.
İsteğin Kontrolör Sınıf Adını Alma
Kontrolöre ait sınıf adını alma:
$request->controller;
Döner: app\controller\IndexController
Kapanış (closure) fonksiyonları herhangi bir kontrolöre ait olmadığından, kapanış yönlendirmesinden gelen istekler için
$request->controller
her zaman boş string''
döner.
Kapanış yönlendirmeleri için Yönlendirme bölümüne bakın.
İsteğin Metot Adını Alma
İstek ile ilişkili kontrolör metot adını alma:
$request->action;
Döner: index
Kapanış (closure) fonksiyonları herhangi bir kontrolöre ait olmadığından, kapanış yönlendirmesinden gelen istekler için
$request->action
her zaman boş string''
döner.
Kapanış yönlendirmeleri için Yönlendirme bölümüne bakın.
Parametreleri Yeniden Yazma
Bazen istek parametrelerini yeniden yazmak isteyebiliriz, örneğin istekleri filtrelemek ve ardından istek nesnesine yeniden atamak istiyorsak, setGet()
, setPost()
veya setHeader()
metodlarını kullanabiliriz.
GET Parametrelerini Yeniden Yazma
$request->get(); // varsayalım ['name' => 'tom', 'age' => 18]
$request->setGet(['name' => 'tom']);
$request->get(); // final olarak ['name' => 'tom'] döner
Dikkat
Örnekte olduğu gibi,setGet()
tüm GET parametrelerini yeniden yazmaktadır,setPost()
vesetHeader()
da aynı davranışa sahiptir.
POST Parametrelerini Yeniden Yazma
$post = $request->post();
foreach ($post as $key => $value) {
$post[$key] = htmlspecialchars($value);
}
$request->setPost($post);
$request->post(); // Filtrelenmiş post parametrelerini döner
HEADER Parametrelerini Yeniden Yazma
$request->setHeader(['host' => 'example.com']);
$request->header('host'); // example.com döner