PHP

kategorisine ait gönderiler

3 Nisan 2019 Çarşamba günü PHP başlığında

Laravel'de PHPUnit Testinde Class env does not exist Hatası

Laravel (5.8)'de test yazarken

php artisan make:test FooTest

ile testi oluşturup

$response = $this->json('POST', '/api/v1/foo/bar', ['param1' => 'value1']);
$response->assertOk()->assertJsonCounts(1, 'reports');

şeklinde talep testi yapabiliyoruz.

Fakat eğer uygulamanızda Telescope kullanıyorsanız şu hatayı almanız muhtemel:

    [message] => Class env does not exist
    [exception] => ReflectionException
    [file] => /.../vendor/laravel/framework/src/Illuminate/Container/Container.php
    [line] => 794

Bu durumda phpunit.xml dosyanıza <env name="TELESCOPE_ENABLED" value="false"/> satırını eklerseniz, Telescope'u test sırasında pasif duruma getirmiş olursunuz. Böylelikle hatayı almayacaksınız.

Kolay gelsin.

4 Mart 2019 Pazartesi günü PHP başlığında

"Mikro" Ufak PHP Framework

Mikro, küçük, kullanışlı ve hızlı bir PHP framework'tür. İçerisinde ufak tefek işlevsellikler barındırır. İsminden anlaşılabileceği üzere mikro düzeyde işlemler yapmak için idealdir.

composer require yidemir/mikro

komutuyla ilgili dizine projeyi dahil ettiğiniz taktirde fonksiyonlar otomatik olarak işlenecektir.

 Özellikler

  • Basit şifreleme/şifre çözme
  • Veritabanı fonksiyonelliği (oluştur, oku, güncelle, sil, sorgula)
  • Sayfalama (dizi sayfalama/veritabanı ilintili sayfalama)
  • Basit talep işleme (request)
  • Yanıt (response) işlemleri (html, json, yönlendirme)
  • Rotacı (rota metodları, gruplama, kaynak işleme)
  • Doğrulama (basit validasyon işlemleri, form validasyonu)
  • Görünüm (view) işleme (Basit ama kullanışlı gövde ve blok işlemleri)

 Neden ihtiyaç duyayım?

Orta çaplı ya da büyük bir projede, projeden bağımsız servis geliştirmek için idealdir.

 Nasıl kullanırım?

Evvela bir index.php sayfası oluşturalım ve yazmaya başlayalım:

require __DIR__ . '/vendor/autoload.php';

view\path(__DIR__ . '/views'); // görünüm dosyalarının bulunacağı dizin
crypt\secret('foobar'); // şifreleme kullanılacaksa belirlenmesi gereken gizli anahtar

route\get('/', function() {
    $posts = db\table('posts')->get('where comment_count=? and is_published=1', [5]);
    return response\json($posts);
});

route\get('/show/:id', function($id) {
    $post = db\table('posts')->find($id);
    return response\json($post);
});

route\post('/', function() {
    $values = request\all();
    $validator = validator\validate($values, [
        'title' => 'required|maxlen:255',
        'body' => 'required|minlen:5',
        'created_at' => 'required|time',
        'is_published' => 'nullable'
    ]);

    if ($validator->fails) {
        return response\json([
            'message' => 'Form verileri geçersiz',
            'errors' => $validator->errors,
            'status' => 422
        ], 422);
    }

    db\table('posts')->insert($validator->values);
    return response\json([
        'message' => 'Gönderi başarıyla eklendi',
        'code' => 200
    ]);
});

Veya daha karmaşık bir uygulama yazacaksanız rota gruplama ve rota kaynağı oluşturma özelliğini kullanabilirsiniz.

route\get('/', 'App\Controllers\HomeController@index');

route\group([
    'path' => '/admin',
    'namespace' => 'App\Controllers\Admin\\',
    'middleware' => ['check_admin_callback']
], function() {
    route\get('/', 'DashboardController@index');
    route\resource('/posts', 'PostController');
    route\resource('/categories', 'CategoryController');
});

Daha detaylı bilgiler için kaynak kodlarına göz atabilir ve examples dizinini inceleyebilirsiniz. Dökümantasyon için henüz hazır değil.

İyi çalışmalar

18 Aralık 2018 Salı günü PHP başlığında

PHP'de Geriçağırım İşlevleri (Fonksiyon ve Yöntemler) (1)

Bu yazıda, PHP'de geriçağırım işlevlerinden bahsedip, nerelerde nasıl kullanıldığını öğreneceğiz.

Geriçağırım (callback) işlevleri (functions) aslında PHP'de bildiğimiz fonksiyonları ifade eder. PHP'nin 5.4 sürümünden itibarent bir callable türü ile kendilerini belli ederler.

PHP'de iki çeşit işlev (fonksiyon) vardır. Birincisi adı sanı belli olan işlevler, ikincisi anonim işlevler. Adı sanı belli dediğimiz işlevler, şu ana kadar bildiğimiz kullandığımız fonksiyonlardır. Bunları çağırmanın/kullanmanın birden fazla yöntemi vardır. Birazdan bunları işleyeceğiz. İkinci olan anonim işlevler ise, fonksiyonlarla hemen hemen aynı olup, fonksiyonlar gibi tanımlanmaz. Fark olarak anonim işlevler bir değişkene atanabilir. (en basit örneğiyle, bunun dışında farklı şeylere de yarar, göreceğiz).

PHP'de bir değerin çağırılabilir olup olmadığını is_callable işleviyle kontrol edebiliyoruz. İki tane örnek verelim:

function selam_ver(string $isim): string
{
    return "Selamlar sevgili $isim";
}

var_dump(is_callable('selam_ver')); // true

$selamVer = function(string $isim): string {
    return "Selamlar sevgili $isim";
};

var_dump(is_callable($selamVer)); // true
var_dump(is_callable('isset')); // true çünkü böyle bir fonksiyon zaten var, PHP'de öntanımlı
var_dump(is_callable('herhangi_fonksiyon')); // false, çünkü herhangi_fonksiyon adında bir fonksiyon tanımlamadık

Buradan doğru, bir işlevin (fonksiyonun) tanımlı olup olmadığını veya bir değişkenin işlev olup olmadığını öğrenebiliyoruz. Aynı zamanda bir sınıf içerisindeki statik bir işlevin var olup olmadığını da öğrenebiliriz:

class Selamlayici
{
    public static function selamla(string $isim): string
    {
        return "Selamlar sevgili $isim";
    }
}

var_dump(is_callable('Selamlayici::selamla')); // true

Peki sınıf dinamikse nasıl öğreneceğiz? Şöyle:

class Selamlayici
{
    public function selamla(string $isim): string
    {
        return "Selamlar sevgili $isim";
    }
}

var_dump(is_callable([new Selamlayici, 'selamla'])); // true

Dinamik bir sınıfta dize içerisindeki ilk eleman sınıfın örneğini, ikinci eleman ise yöntemi (metodu) bulundurur.

Şimdi, buraya kadar bazı şeylere tamam dedik. Neyin ne olduğunu nasıl öğreneceğimizi anladık. Peki bunları nasıl kullanacağız. İşlevleri kullanmanın en basit yolu, herkesin bildiği gibi selam_ver('Ali') kodu gibidir. Ama PHP'de işlevleri kullanıp çağırabilmek için birden fazla yöntem vardır. Hemen görelim:

selam_ver('Ali'); // "Selamlar sevgili Ali"
$selamVer('Renas'); // "Selamlar sevgili Renas"
Selamlayici::selamla('Deniz'); // "Selamlar sevgili Deniz"
$selamlayici = new Selamlayici;
$selamlayici->selamla('Nar'); // "Selamlar sevgili Nar"

Bu gördüğümüz klasik bir biçimde işlevleri çağırmamıza yarar, birçoğumuz bilir. Başka hangi yöntemler var işlevleri çağırmak için? İlk iki tanesi call_user_func ve call_user_func_array işlevidir. Bunlar tanımlı bir işlevi bir işlev aracılığı ile çağırır. Görelim:

function parametresiz_selamlama(): string
{
    return 'Selamlar sevgili Django!';
}

var_dump(call_user_func('parametresiz_selamlama')); // "Selamlar sevgili Django!"

Yukarıdaki örnekte, parametresi olmayan bir işlevi parametresiz_selamlama() kodu ile değil, farklı bir yöntemle çağırdık. Peki neden böyle bir şeye ihtiyaç duyduk? Pek çok sebebi olabilir. Bunun normal bir fonksiyon değilde, bir sınıf yöntemi olduğunu varsaydığımızda bunu bir MVC uygulaması geliştirirken kullanabilirdik.

Peki ilk başlarda tanımladığımız parametreli işlevleri nasıl çağıracağız:

// artık var_dump işlevini kullanmadan yazacağım, görsel olarak karışık görünmesin diye

call_user_func_array('selam_ver', ['Ali']); // "Selamlar sevgili Ali"
call_user_func_array($selamVer, ['Renas']); // "Selamlar sevgili Renas"
call_user_func_array('Selamlayici::selamla', ['Deniz']); // "Selamlar sevgili Deniz"
call_user_func_array([new Selamlayici, 'selamla'], ['Nar']); // "Selamlar sevgili Nar"
call_user_func_array('parametresiz_selamlama'); // "Selamlar sevgili Django!"

Yukarıda daha normal biçimde çağırdığımız işlevleri, şimdi başka (call_user_func_array) bir işlev aracılığıyla çağırdık. Anonim bir işlevi şu şekilde de çağırabiliriz:

call_user_func(function(){
    echo 'Hoş geldiniz';
});

Peki, anonim işlevleri gerçek hayatta nasıl kullanacağız? En basit haliyle şunu yazalım:

function ozel_selamlama(string $isim, callable $ozelSelamla): string
{
    return call_user_func_array($ozelSelamla, [$isim]);
    // veya $ozelSelamla($isim); bu ikisi aynı şey
}

ozel_selamla('Ali', function($isim): string {
    return "Bu farklı bir selamlama biçimi sevgili {$isim}!";
}); // "Bu farklı bir selamlama biçimi sevgili Ali!"

Yukarıdaki örnekte, özel bir selamlama mesajı vermek için iki parametreli bir işlev/fonksiyon oluşturduk. İlk parametre selamlanacak kişinin adını alıyor, ikinci parametre ise nasıl selamlanacağını ayarlayan anonim bir işlevi alıyor.

Başka bir örnek daha verelim. Bu sefer daha spesifik bir örnek verelim:

function eklemeli_selamla(string $isim, ?callable $ek = null): string
{
    $selamlama = "Selamlar sevgili $isim";

    if (!is_null($ek)) {
        return $selamlama . $ek($isim);
        // veya:
        // return $selamlama . call_user_func_array($ek, [$isim]);
    }

    return $selamlama;
}

eklemeli_selamlama('Deniz'); // "Selamlar sevgili Deniz"
eklemeli_selamlama('Deniz', function($isim): string {
    return ". Adının $isim olduğunu biliyorum!";
}); // "Selamlar sevgili Deniz. Adının Deniz olduğunu biliyorum!"

Şimdilik bahsedeceklerimiz bunlar. Bu yazının bir devamı daha olacak. Devamı niteliğindeki yazıda ise Closure sınıfı, sınıfların bir işlev olarak çağırılabilmesi ve Reflection sınıfından bahsetmeyi planlıyorum.

İyi çalışmalar.

PHP ile Kelime/Metin/Dizge İşlemleri

4 Ekim 2018 Perşembe günü PHP başlığında

PHP ile Kelime/Metin/Dizge İşlemleri

PHP ile kelime işlemleri yapmak için birçok fonksiyon var. Bu fonksiyonlar sayesinde değiştirme, bölme, arama, sayma, kısaltma, sınırlama, silme gibi birçok işlemi yapabiliyoruz.

PHP ile kelime işlemleri yapabilmek için birçok fonksiyon bulunmaktadır. Bunları hepsine, PHP'nin resmi sitesinden Dizge İşlevleri başlığından göz atabilirsiniz. Ben burada size, çok sık kullanılan ve ihtiyaç duyulan kelime/dizge fonksiyonlarından bahsedeceğim.

PHP ile Kelime Değiştirme İşlemleri

PHP ile bir metindeki herhangi bir kelime veya kelimeleri değiştirmek için str_replace fonksiyonu kullanılmaktadır. PHP'de kelime işlemleri oldukça kolay ve basittir.

$cumle = 'Merhaba sevgili kardeşim, nasılsın?';
$eski = 'kardeşim';
$yeni = 'dostum';

$yeniCumle = str_replace($eski, $yeni, $cumle);
// sonuç: Merhabs sevgili dostum, nasılsın?
Devamını okuyun »

8 Eylül 2018 Cumartesi günü PHP başlığında

DemirApp PHP 7 Uygulama Çatısı

Başlarken

DemirApp uygulama çatısı, kendi ihtiyaçlarımdan yola çıkarak yazdığım, basit ve minimal tutmaya çalıştığım bir uygulama. Küçük ve orta çaplı uygulamaları rahatça geliştirebileceğiniz bu PHP çatısında, PHP ile kod yazarken sıkça ihtiyaç duyduğum metod ve fonksiyonları bir araya getirdim. Umarım faydalı olur.

https://github.com/yidemir/App

Gereksinimler

  • PHP 7.1 ve üzeri
  • JSON yardımcısı
  • Apache, NGINX gibi bir sunucu

Kurulum

Kurulum için önerim, composer paket yöneticisini kullanmanızdır. Eğer kullanmıyorsanız, projenin Github kaynağından indirerek de kullanabilirsiniz.

Composer ile kurulum

$ composer require yidemir/app

ve kodlamaya başlayın:

<?php

use Demir\App;

require __DIR__.'/vendor/autoload.php';

App::get('/', function(){
    echo 'Merhaba dünya!';
});

App::run();

Git ile kurulum

$ git clone https://github.com/yidemir/App.git

App dizininin içine index.php dosyası oluşturun ve çalıştırın:

<?php

use Demir\App;

require __DIR__.'/src/App.php';

App::get('/', function(){
    echo 'Merhaba dünya!';
});

App::run();
Devamını okuyun »
PHP'de Rota Sistemi ile Basit ve Hızlı Uygulamalar

20 Ağustos 2018 Pazartesi günü PHP başlığında

PHP'de Rota Sistemi ile Basit ve Hızlı Uygulamalar

Bu yazıda yazacağımız kodlar, MVC'ye alternatif olacak ve nesne yönelimli olmayacak. Bunun yerine fonksiyonel programlama yöntemiyle oluşturacağız ve basit bir düzen oluşturacağız. Ama unutmayın, bu karışık olmayacağı anlamına gelmez!

Daha önceden PHP İle Basit Bir Router Nasıl Yapılır başlıklı bir yazı yazmıştım. Bu yazıda nesne yönelimli programlama ile çok basit bir rota sistemi yazmıştık. Şimdiyse bunun daha basit halini yazacağız.

Hemen bir app.php dosyası oluşturup kodlarımızı yazmaya başlayalım. Çok az kod yazacağız ama çok işleve sahip olacak. Kod satırlarında ne işe yaradıklarını, ne için yazdığımızı vs. anlattım. Es geçmemenizi öneririm.

Devamını okuyun »
PHP'de Blog veya İçerik Yönetim Sistemi Oluşturmak

18 Temmuz 2018 Çarşamba günü PHP başlığında

PHP'de Blog veya İçerik Yönetim Sistemi Oluşturmak

En basit haliyle bir içerik yönetim sistemi veya blog sistemi nasıl tasarlanır, nelere dikkat edilmelidir ve yapısı nasıl olmalıdır bunları konuşacağız.

En popüler içerik yönetim sistemi/blog yazılımı olan Wordpress'i bir çoğumuz kullanmıştır kullanmasına ama bazılarımız var ki Wordpress'in nasıl çalıştığını merak edip, bazılarımız da eklenti/tema geliştirmeye merak salmışızdır. Tüm bunlardan doğru, karşımıza çıkan binlerce fonksiyon, yöntem, ıvır, zıvır vesaire derken kafamız çorba gibi oluyor. Bu çorbalaşmış kafayı netleştirmek için bu yazıda basit bir blog sistemi nasıl yazılır ondan bahsedeceğim. Elbette ki Wordpress alternatifi olmayacak. Sadece işimizi görebilecek, basit ve kullanışlı bir sistem hakkında konuşacağız.

Devamını okuyun »
Eloquent ORM'de Erişimci ve Mutatörler

30 Mart 2018 Cuma günü PHP başlığında

Eloquent ORM'de Erişimci ve Mutatörler

Laravel ve Eloquent ORM'de Erişimci (Accessors) ve Mutatörleri (Mutators) kullanarak öznitelikleri (Attributes) nasıl biçimlendireceğimizi göreceğiz.

Erişimciler (Accessors)

Erişimciler, veritabanından aldığımız bilgileri/verileri önceden tanımlı olarak biçimlendirmemize olanak tanır. İki tane örnek verelim. Öznitelikleri türkçe olarak örneklendireceğim (elbette ki veritabanını tasarlarken ingilizce kullanmak gerekiyor)

Veritabanımızdaki tabloda ad ve soyad adlı iki adet sütun olduğunu varsayalım. Normal şartlarda veritabanındaki ad soyad bilgisini görüntülemek istediğimizde

Ad Soyad: {{ mb_ucfirst($uye->ad) . ' ' . mb_ucfirst($uye->soyad) }}

şeklinde kullanırız. Ama aşağıdaki gibi bir metodu, modelimize tanımlarsak, işimizi, daha kullanışlı hale getirebiliriz.

Devamını okuyun »
Eloquent ORM'in Tek Başına Kullanımı

28 Mart 2018 Çarşamba günü PHP başlığında

Eloquent ORM'in Tek Başına Kullanımı

Aşağıda Laravel'in varsayılan ORM'i olan Eloquent'in tek başına, Laravel'den bağımsız şekilde kendi projelerimizde nasıl kullanabileceğimizden bahsettim.

Evvela composer paket yöneticisiyle projemizi oluşturalım.

PHP 7 altındaki sürümler için kullanmanız gereken sürüm 5.4 olanı. 5.5 ve üstü olanlar PHP 7 gerektiriyor. Eğer PHP 7 ile çalışacaksanız sürüm belirtmeden gerekliliği indirebilirsiniz.

$ composer require illuminate/database:5.4
Devamını okuyun »
Eloquent İlişkilerinde Koşullu Sorgular

28 Mart 2018 Çarşamba günü PHP başlığında

Eloquent İlişkilerinde Koşullu Sorgular

Aşağıda verdiğim örnekte, Eloquent ile koşullu sorguların ne kadar basit kullanıldığından bahsettim. Örnek içeriği olarak fatura, fatura satırları ve stok kartı üçlüsü üzerinden gittim. Buna birçok yerde ihtiyaç duyulabilir; Kitap ve yazar ilişkilerinde, yorum ve gönderi ilişkilerinde vs.

Elimizde stok kartları (Stock), faturalar (Invoice) ve fatura satırları (InvoiceRow) adında üç adet model olduğunu varsayalım. Stok kartını görüntülemek istediğimizde stok bilgilerinin yanında, mevcut stoğun hangi faturalarda işlem gördüğünü de listelemek gerekecek. Faturalar ve fatura satırları modelleri şöyle olsun:

Invoice.php

// ...
use App\Models\InvoiceRow;

class Invoice extends Model
{
    public function rows()
    {
        return $this->hasMany(InvoiceRows::class);
    }
}
Devamını okuyun »