Her türde organizasyon kodun verimli çalışmasını sağlamak için anahtardır ve bu özellikle web uygulamaları için geçerlidir. Birçok web geliştiricisi, CodeIgniter gibi önceden oluşturulmuş kodlama frameworklerini kullanarak belirli bir yapıya sadık kalırlar ve diğer alanlarda organizasyon sağlayarak uygulamanın daha hızlı kodlamasına yardımcı olurlar. Bir fremawork ile olsun veya olmasın, web uygulamalarının organize oluşturulmuş yapılara ihtiyacı vardır.
Her geliştirici bir web uygulamasının organizasyonunu nasıl düzenleyeceği konusunda kendi standartlarına sahip olabilir, ancak bu makalede en iyi uygulamaları, yaygın uygulamaları ve bazı web uygulamalarının belirli yönlerinin belirli bir şekilde düzenlenmesinin nedenini daha ayrıntılı olarak ele alacağız. Son olarak, bir uygulama oluştururken organizasyon yapısının neden bu kadar faydalı olabileceğini de inceleyeceğiz.
Dizin Yapısı
Projenizi hazırlarken ve çalıştırma aşamasında bir numaralı kriterin birden fazla proje için yeniden kullanabileceğiniz sağlam bir dizin yapısına sahip olmanız olduğunu söyleyebilirim. Bir framework kullanıyorsanız, genellikle sahip olduğunuz hazır bir yapı mevcut olacak, ancak bu senaryoda basit bir site veya uygulama üzerinde çalışıyoruz.
Analiz
Muhtemelen public_html yapısını çok iyi biliyorsunuzdur. Bu, tüm genel dosyalarınızın erişildiği belge kök dizinidir. (/public_html/page.php = fatihsoysal.com/page.php anlamına gelir.)
img – Tüm görüntü dosyalarınız, içerik resimleriniz bu dizinde.
css – Tüm css dosyalarınız.
js – Bütün javascript dosyalarınız.
resources dizini, tüm üçüncü parti kütüphaneleri, özel kütüphaneleri, yapılandırmaları ve projenizde bir kaynak görevi gören diğer tüm kodları tutmalıdır.
config.php – Ana yapılandırma dosyası. Site çapında ayarları burada saklamalıyız.
library – Tüm özel ve üçüncü parti kütüphaneleri için merkezi konum burası olmalı.
templates – Düzeni oluşturan, tekrar kullanılabilir bileşenler.
Yapılandırma Dosyası (Config)
Tasarımcılar ve geliştiriciler olarak asıl amacımız olabildiğince kısıtlı zamanda olabildiğinde çok iş yapmaktır. Bu hedefe ulaşmanın bir yolu da yapılandırma dosyalarındadır. Yapılandırma dosyasının nasıl olması gerektiğine dair daha iyi bir fikir edinmek için lütfen aşağıdaki örneği gözden geçirin.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | <?php /* Farkına varılması gereken en önemli durum, yapılandırma dosyasının her sayfanıza veya en azından bu ayarlara erişmek istediğiniz herhangi bir sayfaya kullanmak isteme durumunuz. Bu, bu ayarları bir proje boyunca güvenle kullanmanızı sağlar, çünkü veritabanı kimlik bilgileriniz veya belirli bir kaynağa giden bir yol gibi bir şey değişirse, Yalnızca burada güncelleştirmeniz gerekecektir. */ $config = array( "db" => array( "db1" => array( "dbname" => "database1", "username" => "dbUser", "password" => "pa$$", "host" => "localhost" ), "db2" => array( "dbname" => "database2", "username" => "dbUser", "password" => "pa$$", "host" => "localhost" ) ), "urls" => array( "baseUrl" => "http://fatihsoysal.com" ), "paths" => array( "resources" => "/path/to/resources", "images" => array( "content" => $_SERVER["DOCUMENT_ROOT"] . "/images/content", "layout" => $_SERVER["DOCUMENT_ROOT"] . "/images/layout" ) ) ); /* Genellikle aşağıdakileri bir önyükleme dosyası veya bazı ortam türlerine eklemeniz gerekebilir. Yapılandırma dosyanızda olduğu gibi (php için bazı alternatifler xml veya ini dosyaları). */ /* Yoğun kullanılan yollar için sabitler oluşturmak, işleri daha kolay hale getirir. Örn. require_once(LIBRARY_PATH . "Paginator.php") */ defined("LIBRARY_PATH") or define("LIBRARY_PATH", realpath(dirname(__FILE__) . '/library')); defined("TEMPLATES_PATH") or define("TEMPLATES_PATH", realpath(dirname(__FILE__) . '/templates')); /* Hata raporlaması. */ ini_set("error_reporting", "true"); error_reporting(E_ALL|E_STRCT); ?> |
Bu, temel açılır bir yapılandırma dosyasıdır. Çok boyutlu bir dizi, veritabanı kimlik bilgileri gibi çeşitli yapılandırma öğelerine erişmek için esnek bir yapı sağlar.
db – Veritabanınıza ait olan veritabanı kimlik bilgilerini saklayın.
paths – Siteniz için çeşitli kaynaklara yaygın olarak kullanılan yollar. (log dosyaları, upload dizinleri, kaynaklar)
urls – Sitenizde uzak kaynaklara başvururken URL’leri saklamak gerçekten kullanışlı olabilir.
emails – Hataları işlerken veya iletişim formlarında kullanmak için hata ayıklama veya yönetici e-postalarını saklayın.
Birden Fazla Ortam İçin Farklı Yapılandırma Dosyalarını Kullanma
Birden fazla ortam için farklı yapılandırma dosyaları kullanarak mevcut çevreye bağlı olarak ilgili ayarları alabilirsiniz. Bunun anlamı, eğer her bir ortam için farklı veritabanı kimlik bilgileri veya farklı yollar kullanırsanız, ilgili yapılandırma dosyalarını ayarlayarak, kodunuzun canlı yayındaki sitenizi güncellerken güçlük çekmeden çalışmasını sağlayabilirsiniz. Bu ayrıca mevcut çevreye dayalı farklı hata raporlama ayarlarına sahip olmanızı sağlar. Asla canlı yayındaki sitenizde hataları göstermeyin! Hataları canlı sitede görüntülemek, hassas verileri kullanıcılara gösterebilir (örneğin, şifreler gibi). Bu konuda ayrıntılı bilgi almak isterseniz daha önce yazmış olduğum Güvenli PHP Uygulamaları Oluşturmak İçin Yararlı İpuçları makaleme göz atabilirsiniz.
Tasarım
Yeniden kullanılabilir şablonlar büyük bir tasarruf sağlayıcısıdır. Şablon oluşturmak için harika kütüphaneler (Smarty gibi) vardır ve genellikle tekerleği yeniden icat etmek yerine böyle bir kütüphaneyi kullanmak daha akıllıca olandır. Bu kütüphaneler geliştiricilere oldukça çok işlevsellik sunar (para birimini biçimlendirmek veya e-posta adreslerini gizlemek için yardımcı yöntemler gibi). Ancak örneğimiz basit bir site olduğundan, kütüphaneyi kurmak için zaman ayırmak istemiyoruz bundan dolayı en temel temel şablonları kullanıyor olacağız.
Sitemizin sayfalarına ortak bölümler veya modüller ekleyerek organize yapıyı tasarım anlamında kurmayı başarabiliriz.
Peki bu bize nasıl bir esnek yapı sunar?
Örneğin, header modülünde bir şey değiştirmek istiyorsanız, genel gezinme bağlantısını ekleme gibi, bu güncelleme tek dosyadan site geneline yayılır.
Bunu örnek bir uygulamada açıklayalım.
header.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Örnek Site</title> </head> <body> <div id="header"> <h1>Örnek Site</h1> <ul class="nav global"> <li><a href="#">Anasayfa</a></li> <li><a href="#">Hakkımızda</a></li> <li><a href="#">Portfolio</a></li> </ul> </div> |
rightPanel.php
1 2 3 4 5 6 7 8 9 10 11 | <div id="siteControls"> <ul class="categories"> <li>PHP</li> <li>HTML</li> <li>CSS</li> </ul> <div class="ads"> <!-- ads code --> </div> </div> |
footer.php
1 2 3 4 5 | <div id="footer"> Footer içeriği... </div> </body> </html> |
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php // config dosyamız require_once("/path/to/resources/config.php"); require_once(TEMPLATES_PATH . "/header.php"); ?> <div id="container"> <div id="content"> <!-- content --> </div> <?php require_once(TEMPLATES_PATH . "/rightPanel.php"); ?> </div> <?php require_once(TEMPLATES_PATH . "/footer.php"); ?> |
Daha İleriye Götürmek
Bu temel şablon sistemi size harika bir başlangıç yaparken sizi daha da ileri götürülebilir. Örneğin, tüm şablon dosyalarını içeren bir sınıf veya fonksiyonlar oluşturabilir, bir içerik dosyasını mizanpaj içinde oluşturulacak argüman olarak kabul edebilirsiniz. Bu şekilde, şablon dosyalarını sitenizin her sayfasına eklemenize gerek yoktur. Size hızlı bir örnek göstereceğim.
/resources/library/templateFunctions.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <?php require_once(realpath(dirname(__FILE__) . "/../config.php")); function renderLayoutWithContentFile($contentFile, $variables = array()) { $contentFileFullPath = TEMPLATES_PATH . "/" . $contentFile; // Değişkenlerin arasında geçiş yapıldığından emin olun if (count($variables) > 0) { foreach ($variables as $key => $value) { if (strlen($key) > 0) { ${$key} = $value; } } } require_once(TEMPLATES_PATH . "/header.php"); echo "<div id=\"container\">\n" . "\t<div id=\"content\">\n"; if (file_exists($contentFileFullPath)) { require_once($contentFileFullPath); } else { /* Dosya bulunamazsa, hata birçok yönden ele alınabilir. Bu durumlar için bir hata şablonu ekleyeceğiz. */ require_once(TEMPLATES_PATH . "/error.php"); } // close content div echo "\t</div>\n"; require_once(TEMPLATES_PATH . "/rightPanel.php"); // close container div echo "</div>\n"; require_once(TEMPLATES_PATH . "/footer.php"); } ?> |
index.php
Şablon dizininizde bir içerik şablonu görevi gören home.php adlı bir dosyanız olduğunu varsayıyorum.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php require_once(realpath(dirname(__FILE__) . "/../resources/config.php")); require_once(LIBRARY_PATH . "/templateFunctions.php"); /* Artık tüm php mantığınızı şablonun dışında kullanabilirsiniz */ $setInIndexDotPhp = "Hey! I was set in the index.php file."; // Şablonda kullanılacak değişkenleri (bir dizi olarak) geçirmeliyiz $variables = array( 'setInIndexDotPhp' => $setInIndexDotPhp ); renderLayoutWithContentFile("home.php", $variables); ?> |
home.php
1 2 3 4 5 6 7 8 9 10 11 12 13 | <!-- Homepage content --> <h2>Home Page</h2> <?php /* RenderLayoutWithContentPage() fonksiyonundaki variables parametresinden geçirilen tüm değişkenler burada mevcuttur. */ echo $setInIndexDotPhp; ?> |
Bu Metodun Avantajları:
Mantık ve görünüşün daha fazla ayrılması (php ve html). Şablon mantığını bir işleve dahil etmek, şablonun sitenizin her sayfasında güncellenmeden nasıl gösterildiğini değiştirmenize olanak tanır.
Semboller
Unix tabanlı sistemler (os x, linux) üzerinde sembolik bağlar olarak adlandırılan ufak bir özellik taşır. (Sembolik Bağlantıları). Simge bağlantıları, dosya sistemindeki gerçek dizinlere veya dosyalara yapılan atıflardır. Birden fazla proje arasında kullanılan bir kitaplık gibi paylaşılan bir kaynağınız olduğunda bu gerçekten harika olur. Sembolik bağlarla yapabileceğiniz birkaç somut şey:
Kaynak dizininizin iki sürümü var. Canlı sunucunuzu güncellerken en son dosyalarınızı keyfi bir dizine yükleyebilirsiniz. Sembolik bağlantınızı, kod tabanımızı anında güncelleyen bu yeni dizine yönlendirin. Bir şeyler ters giderse, anında önceki (çalışan) dizine geri dönebilirsiniz.
Paylaşılan kaynaklar, sembolik bağlarla kolayca yönetilir. Üzerinde üzerinde çalışmakta olduğunuz özel bir kütüphaneniz olduğunu ve bir projede yaptığınız kitaplıktaki güncellemelerin başka bir kütüphanede derhal bulunabileceğini düşünün.
Sembolik Bağları Kullanma
Symlink’ler vs Hardlink’ler
Symlink’ler veya softlinkler, dosya sistemindeki tam yollara referanslar gibi davranırlar. Birden fazla lokasyonda sembolik bağları kullanabilirsiniz ve dosya sistemi, başvuru yaptıkları gerçek dosya veya dizinmiş gibi davranır. Diğer yandan Hardlinkler disk üzerindeki bir dosyaya işaretçilerdir (pencerelerdeki kısayolları düşünün); Sizi dosyanın gerçek konumuna götürürler.
Sembolik bağları kullanırken göz önüne almanız gereken birkaç şey var. Sunucu yapılandırmanızın sembolik bağları izleyecek şekilde ayarlanmış olması gerekir. Apache için bu işlem httpd.conf dosyasında yapılır. Dizin bloğunu bulun ve Options FollowSymLinks‘in orada olduğundan emin olun. Ekleme işlemini yapın ve Apache’yi yeniden başlatın.
1 2 3 4 | <Directory /> Options FollowSymLinks AllowOverride None </Directory> |
Sonuç
Bu ipuçları, yeni başlayanla, basit siteler veya uygulamalar oluşturanlar içindir. İdeal olarak büyük uygulamalar veya siteler için MVC mimarisi ve Nesne Yönlendirmeli programlama gibi daha gelişmiş bir şey düşünmek zorundasınız. Tek başına oldukça geniş bir konu olduğu için kaynak denetimini kapsamamaya karar verdim, ancak bu ipuçları dosyalarınızı daha kolay kaynak denetimi için organize etmenize yardımcı olacak.Tüm projeleriniz için git gibi kaynak denetimi kullanmaya kesinlikle dikkat edin.
Bir sonraki PHP Projenizi başlatırken bu ipuçlarını göz önünde bulunduracağınızı umut eder, buraya kadar okuduğunuz için teşekkürlerimi sunarım.