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:

  1. name: Alınacak parametre adı (boşsa, tüm parametrelerin dizisini alabilir)
  2. 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çin multipart/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ındaki max_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``,OPTIONSveyaHEAD` 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() ve fullUrl() 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() ve setHeader() 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