MacOSX üzerinde php ile geliştirme yapmak istiyorsanız ilk yapmanız gereken şey geliştirme ortamınızı hazırlamak olacaktır.

MacOSX üzerinde halihazırda kurulu bir apache ve php sürümü bulunuyor zaten. Bunları basitçe aktif hale getirebilir ve geri kalan ayarları elle yapmak isteyebilirsiniz fakat macosx ile yüklü gelen php, apache sürümü ve eklentileri, standart ihtiyaçlara bile cevap veremeyebilir. Basit bir wordpress kurulumu bile gd, zip, iconv ve benzeri php eklentilerine ihtiyaç duyacaktır. Dolayısıyla bir noktada php kurulu php sürümünü güncellemeye ihtiyaç duyabilirsiniz. Apache için de durum aynı. Ayrıca sadece eklentiler değil, mysql gibi birkaç sunucu uygulaması da kurmak zorunda kalacaksınız. Bunları tek yerden başlatıp durdurabilmek için de başka araçlar bulmanız veya geliştirmeniz de gerekebilir.

Varolan apache ve php kurlumunu kullanmak dışında en hızlı kurlumu, MAMP (MacOSX Apache MySQL PHP) ile yapabilirsiniz. Bir çok genel eklentiyle beraber universal olarak derlenmiş ve paketlenmiş bir uygulama diyebiliriz MAMP için. MAMP ile birkaç dakika içinde standart bir web geliştirme ortamını ayağa kaldırabilirsiniz.

http://www.mamp.info/ adresinden indirebileceğiniz MAMP, basit bir şekilde kurulabiliyor. Applications klasörünüzde MAMP adında bir klasör içinde herşeyi toplu bir şekilde bulabileceğiniz MAMP, birçok ayar dosyasını da barındırıyor. Dolayısıyla Web root dizininizi kolayca değiştirebilir, php.ini veya my.cnf'i modifiye ederek istediğiniz eklentileri aktifleştirebilir pasifleştirebilirsiniz.

http://www.mamp.info/en/mamp/index.html adresinden MAMP ile beraber gelen tüm kütüphane / eklenti ve sunucu yazılımlarının listesini görebilirsiniz. MAMP'in standart sürümü ücretsiz ve basit bir yönetim arayüzü sunuyor.

MAMP
Eğer vhost, dns, email sunucusu ayarlarınızı görsel bir arayüzde yönetmek istiyorsanız tek seferlik satın alabileceğiniz bir lisans ile MAMP PRO yani sadece yönetimsel arayüz uygulaması satın alarak varolan MAMP kurulumunuzu kolayca yönetebilirsiniz.

MAMP PRO
Birkaç ipucu vermem gerekirse, MAMP PRO'da çok göz önünde olmasa da "File > Edit Template > ..." menüsünden php.ini, my.cnf, httpd.conf gibi ayar dosyalarınıza hangi dizinde olduklarını çözmeye gerek kalmadan ulaşabilirsiniz.

Web root klasörünüzü (kullanıyorsanız) Dropbox'unuzda bir dizini belirterek tüm web geliştirme dosyalarınızı ve projelerinizi dropbox'da tutarak anlık yedekleme sağlayabilirsiniz.
Yine URL şemaları üstüne bir yazı hazırladım. Bu sefer htaccess'den çok dinamik bir url şeması hazırlamayı da anlattım. Bu yazı ile:

- apple.com/ipod/nike
- sahibinden.com/kiralik

veya kullanıcı sayfaları:

- twitter.com/mfyz
- twitter.com/mfyz/followers

Şeklindeki url şemaları oluşturmak için gerekli mantığın anlamış olacaksınız.

http://mfyz.com/dokuman/131/htaccess-yardimiyla-tu......n-yonetmek
URL şemaları, SEO amacıyla önem taşımakta. Bunun yanı sıra, her geliştirici ürettiği uygulamanın URL şemasının anlaşılır ve güzel görünmesinı ister. Eğer bir framework kullanıyorsanız muhtemelen bunu yönetebileceğiniz bir yer, yardımcı vs vardır. Fakat kendi kodunuzu yazıyorsanız htaccess ile mod_rewrite yardımıyla her url şema tipine göre bir rewrite kuralı yazmanız gerekecektir.

Basit bir proje örneği vereceğim, diyelim ki basit bir ürün katalogu hazırlıyorsunuz, katalog anasayfasında son ürünler ve kategoriler listeleniyor. Her her ürün de bir kategoride listeleniyor. Yani kategori sayfaları ve ürün detay sayfalarınız var. Basit bir php projesi ile bu uygulamayı 3 parçaya ayırdınız, anasayfa, kategori ve ürün detay. Her parçanın kendine ait kodu var. Normalde bu parçaları birer php dosyası olarak hazırladığınızı düşünürsek her parçayı birbirine
  • anasayfa.php
  • kategori.php?kategori_id=21
  • urun_detay.php?urun_id=2320
gibi linklerle bağlıyorsunuz.

URL şemasını su şekilde kurgulamak istediğinizi düşünelim:
  • /
  • /kategori/21
  • /urun/2320

Bunun için klasik yöntemlere göre htaccess dosyanıza her link şeması için bir kural yazıp gerekli yönlendirmeyi yapmanız gerekir. Fakat her kural için düzenli ifade (regex) yazmak hem yorucu olabilir hem de her yeni url şeması için yeni regex hazırlamanız ve htaccess dosyanızı güncellemek durumunda kalırsınız. Eğer url şemalarınız belirli bir mantığa göre hazırlıyorsanız -ki MVC frameworkleri genelde buna benzer kurallara sahiptir- bu kuralı algoritmaya çevirmeniz çok kolay.

Mesela Codeigniter kullanarak hazırladığınız aynı yapı için, anasayfa, kategori ve ürün detayı için ayrı controller ve ayrı view'lar yazmak durumunda olacaksınız. Gerçekten de olması gereken bu zaten. Ama controller'ı yazarken size bazı kurallar koyar Codeigniter. Verdiğiniz sınıf adı ve method'a URL üstünden doğrudan ulaşabilirsiniz eğer methodunuz public bir method ise. Atıyorum ürün detay controller'ının adını Urun koydunuz ve method adını da detay koydunuz. Bu methodu tetiklemek (ulasmak) için kullanacağınız url: /Urun/Detay/ekstra/parametreler şeklinde olabilir. Methodunuz içinde ekstra parametreleri yakalayabilirsiniz.

Kendiniz yazarak hazırlayacağınız kod ıle url şeması böyle ikili bir kurala sahip olmak zorunda değil. Tekil bir tanımlayıcı yeterli olacaktır, ama daha karışık bir mekanizma kurarak siz de çoğul (ikili veya üçlü) bir adresleme mekanizması oluşturabilirsiniz. Tekil bir adresleme için kurallı bir mekanizma olarak şöyle bir algoritmanız olabilir:
/Urun/3452/yazci-uyumlu-versiyon şeklindeki bir url'i, ilk parça controller adı, geri kalanlar da hem opsiyonel hem de controller tarafından yakalanıp işlenecek olan veri olarak düşünürseniz, ilk parçada gelen adda controller'a sahip olup olmadığınızı kontrol edebilirsiniz. Bunun için bütün controller'larınızı "Controllers" gibi bir dizinde toplu tutmanızda fayda var. Çok ilkel bir mekanizmayla controller'larınızın sınıf değil, düz php dosyaları olduklarını varsayıyorum ve böyle bir url çağırıldığında tek bir dosyadan gerekli controller'i tespit edip include ederek calıştırdığınızı düşünelim.

Peki bu url'ler nasıl tek merkezden geçecek?

Şimdi size önce anlatmam gereken kısma geldik, bütün trafiği tek dosyaya yönlendirmek. İşte bunun için htaccess'a oldukça genel bir kod koyuyoruz:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?path=$1 [L,QSA]
Yukarıdaki kod sitenize gelen tüm istekleri index.php dosyasına yönlendirir. Örnek olarak:
http://example.com/
http://example.com/kategori/123
http://example.com/urun/8765
gibi istekleri index.php?path=/kategori/123 şeklinde tek parametre olarak index.php dosyasına iletilecektir. Ama yukaridaki kod teknik olarak eğer url'de geçerli bir dizin adresi veya dosya adresi yoksa istekleri index.php'ye yönlendirecektir. Yani "kategori" adında bir dizininiz varsa istek index.php'ye gitmez. Bunda da bir detay daha var. Eğer "kategori" adında bir dizininiz var ve url /kategori/sdjfhsdkfjshd ise bu URL'de aranan dosya orada olmadığı için istek yine index.php dosyasına aktarılır.

Burada ilk problemin çözümü için, controller adlarınız projenizin kök dizininde varolmayan bir klasör adı olmalıdır. İkinci problem ise, siz kullanmıyor olsanız bile herhangi bir dizin içinde bulunamayan istek index.php dosyasına yönlenecek ve siz bunu kontrol etmek zorunda kalırsınız. Olmayan dosyalara yapılan istekler web'in doğasında olan bir şeydir. En basit örneği, sitenizi tarayan botlar (google bot etc...) sitenize robots.txt, favicon.ico, sitemap.xml veya crossdomain.xml gibi sorgular yapacaktır. Olmadığı için 404 hatası almaları gerekir yaptıkları şeyi doğru yapmak için. Bunun yanı sıra siz de bu gereksiz istekleri işlemenize gerek kalmazsınız.

Bunun için, yani ikinci problemi çözmek için, projenizin asset dizinlerini (stiller, js, resimler, imges, files etc...) bu url ayrıştırma mekanizmasından ayırmak isteyebilirsiniz. Aşağıdaki satırları yukaridaki kodun üstüne yerleştirmeniz yeterli.
RewriteCond %{REQUEST_URI}  !^/resimler.* [NC]
RewriteCond %{REQUEST_URI}  !^/proje.* [NC]
Böylece bu dizinler ve altındaki isteklere dokunulmayacaktır. Ama yine de kök dizindeki her spesifik isteği ya htaccess'da ya da index.php dosyanızda işlemeniz gerekmektedir.

index.php istekleri nasıl ayrıştıracak?

Artık sitenize gelen tüm istekler index.php'nin elinin altında. "path" parametresini "/" karakterine göre parçalayarak ilk parçayı controller adı olarak rezerve edebilirsiniz. Dizinin geri kalan elemanlarını global bir dizide tutarak controller'larinizin içinde yakalayabilirsiniz. Unutmayın hala $_GET dizisiyle soru işareti ve sonrasında kullanacağınız GET parametrelerini yakalayabilirsiniz. Yani /urun/67845?ref=facebook_campaign gibi bir url hala doğru şekilde calışacaktır.

Çok ilkel bir yapıda controller adını "Controllers" dizininde öyle bir dosya olup olmadığını kontrol ederek ve eğer dosya varsa o an include ederek basit bir yapı kurabilirsiniz.

Size biraz daha farklı bir yapı sunacağım şimdi


mfyz.com'un kodu çok eski sürümlerde Türkçe idi, sonrasında ilkel bir modüler yapıya evrimleşti, sonrasında dil değiştirdi, sonrasında ilkel bir MVC modeline evrimleşti, ve şu an oldukça gelişmiş bir MVC modeline sahip. Kod 95% İngilizce, çünkü hala Türkçe yazılmış ve refactor edilmeyi bekleyen eski kodlar duruyor hala derinlerde :-) Neyse, bu örneği çoklu dile sahip bir projede çalışma ihtimali için veriyorum. Kod, controller'lar ve method adlarınız hep ingilizce (veya başka bir dilde) olmak zorunda olabilir veya ölyle olmasını isteyebilirsiniz. Böyle bir durumda Türkçe bir domain altında yoresel-organik-sabun.com/product/detail/1231231 gibi bir url şemasından çok yoresel-organik-sabun.com/urun/1231231 gibi bir URL tercih edersiniz değil mi? Şimdi bunun için kuralsal bir yaklaşımdan çok bir yol haritasının yolu gösterdiği bir mekanizmayı anlatacağım. Bu mekanizmanin bir diğer avantajı da aynı controller ve method'lara birden fazla farklı url şemaları oluşturabilmenizdir. Yani örneğin bir iletişim formuna sahipsiniz ve example.com/contact ve example.com/callus gibi iki url hatta aynı zamanda example.com/iletisim gibi farklı dildeki adresleri oluşturabilirsiniz. Sonra otomatik dil değişimi yapıp yapmamak sizin controller'da yaptığınız hünerli kodlara kalmış.

Bir yol haritası oluşturmak aslında bu url şemalarını htaccess'da her şema için ayrı ayrı kural yazmaya benziyor, ama çok daha dinamik olabilir ve düzenli ifade yerine basit dizilerde tutulabilir. İlkel bir yol haritası dizisi yazacağım yukaridaki örnek proje için.
$router = array(
  'kategori' => array('controller'=>'kategori', 'method'=>'index'),
  'ürün' => array('controller'=>'ürün', 'method'=>'detail'),
  'urundetay' => array('controller'=>'ürün', 'method'=>'detail'),
)
Gördüğünüz gibi ürün için iki farklı adresleme kullanabilirsiniz. Daha dinamik bir yol haritasını veritabanınızda saklayabilir hatta otomatik güncelleyebilirsiniz. Bunun en güzel örneği kullanıcı adı ile adresleme yapabilmektir. Yani example.com/mfyz ve example.com/mfyz/links gibi kullanıcınıza domain.com/kullanici_adi gibi bir sayfa adresleyebilmenizdir. Gelen isteğinizi, sitenizin ana yol haritası kontrollerinizi yaptıktan sonra, eğer istekte bulunulan adres yol haritanızda bir yeri işaret etmiyorsa kullanıcı dizininizde aratarak adresin bir kullanıcı profili veya kullanıcı sayfasını işaret ettiğini yakalatabilirsiniz.


Hazirlayan: Mehmet Fatih YILDIZ
Projenizi geliştirirken en büyük problemlerden biri olan cache sorununu apache sunucularda kolayca çözebilirsiniz. Tüm geliştirme süresince projenizin root'undaki htaccess dosyanıza css ve js dosyalarının cachelenmemesi için gerekli header'ları tarayıcıya gönderebilirsiniz.

Bu sayede tarayıcı bu dosyaları her aldığında expire olduklarını anlayacak ve her sayfa yenilendiğinde sunucudan tekrar isteyecektir.

Bunun için proje root klasörünüzdeki htaccess dosyanıza (yoksa oluşturun)



Header set Cache-Control "max-age=0, public"
Header set Expires "Thu, 15 Jan 2000 20:00:00 GMT"



satırlarını ekleyin.

Popüler Etiketler

ios iphone ipad apple app store store in-app purchase purchase subscription verification storekit itunes connect itunes html form input textarea select regex mail newsletter api php pear mdb2 prepare execute injection assets javascript css framework google social network app facebook developer code development icon ikon grafik download xhtml rss parse xml wanda digital session cookie mysql query less compile compiler macosx windows linux on-the-fly ipucu kontrol yapıları if switch ruffles doritos js htaccess mod_rewrite url lifestream firefox internet explorer mootools jquery örnek kod logo html5 mfyz screen konsol terminal job cache apache blog www subdomain redirect crossdomain cms language style mobile twitter widget startups calendar media tool istatistik insanlar meta share tebrik sql iOS mssql pgsql coding applications free kurulum opengraph fql optimization css3 date diff zaman tarih banner optimizasyon analyse procedure design table object auth http while ui ux login webkit radio button graph nasıl internet statistics web app music bootstrap chart sitemap seo ie browser portfolio support imza signature gimp ubuntu workspace search route router fstab ntfs howto nedir kitap db integration service player license lisans svn subversion proje plugin editor sosyal medya database osx ide phpstorm jetbrains deployment version control git open source server kampanya tytz box export pharma hack wordpress dokuman browsers connect oyun generator wireless xmlhttprequest ajax laptop notebook spam link icons