CakePHP çerçevesinde veritabanı tablo oluşturulmasını otomatikleştirmek

4 Cevap php

Ben CakePHP ile bir webapp yazmaya çalışıyorum, ve en webapps gibi değilse, yükleme işlemini yürütür, veritabanı başlatılmış olup olmadığını algılayan bir yükleyici oluşturmak istiyorum ve.

Bu süreç tamamen (kendisi zaten mevcut veritabanı varsayar, ve hiçbir şifre ile anonim hesabı üzerinden tam yönetici erişim izni olduğundan ... bu güvenlik konusunda hiçbir endişe, bir sanal ortamda için) otomatik olacak, bu yüzden ihtiyacı veritabanı tabloları oluşturulmuş ve başlatılmış olması halinde (! bakılmaksızın istek) algılamak, ve değilse, şeffaf o başlatma gerçekleştirmek ve daha sonra yine kullanıcının özgün isteği kadar hizmet edebilmek için.

Ben tüm istekler yönlendirilir, ve tek bir SQL sorgusu veritabanı tabloları mevcut olmadığını belirlemek için çalıştırılan hangi aracılığıyla Önyükleme denetleyicisi bir türlü yazı kabul edilir, ama bu hantal görünüyordu (ve kontrolör durum olması gerekmez karşılık gelen bir modeli gerektirir burada). Diğer olasılık AppModel geçersiz kılmak ve bunun içinde aynı testi yerleştirmek oldu, ama bu satırlar boyunca herhangi bir belge olmadığı gibi, bunu nasıl emin oldu.

Şimdiden teşekkürler!

tl;dr version: J2EE servlet'in "init ()" yöntemi CakePHP eşdeğer (veya nasıl eşdeğer CakePHP'de için yazılmış olabilir) nedir?

4 Cevap

AppError sınıf check out - sizin geçersiz ve çalışabilir bir eksik veritabanı tablo hata var çekebilir oradan veritabanı tablo SQL oluşturmak?

Böyle bir şey aradığınız ne olabilir, ancak model başına ekstra sorgusu gerektirir.

<?php
class AppModel extends Model {
    var $create_query = false;

    function __construct($id = false, $table = null, $ds = null) {
        parent::__construct($id, $table, $ds);

        if (!empty($this->create_query)) {
            $this->query($this->create_query);
        }
    }
}
?>

Sonra sadece var $create_query = 'CREATE TABLE IF NOT EXISTS ... eklemeniz gerekir; `daki modelleri. MySQL CREATE TABLE documentation IF NOT EXISTS hakkında daha fazla bilgi var.

However, ben bu çok erken) sorgu (aramaya çalışıyor olmadığından emin değilim. Tablo zaten varsa çek, görmek için önce veya have olmak üzere hangi. Aksi takdirde, CakePHP yerine tablo oluşturarak dışarı hata olur. Konuyla ilgili çok dokümantasyon ve en iyi bahis cake / libs / model / doğrudan model.php bakmak için olacak daha fazla bilgi için yoktur.

Update: The code above would not work as written.

Model sınıfından bakarak sonra biraz daha derin, Model :: Model çağırır __construct :: setSource (). Tablo var ve yoksa, bir hata atar, Model :: setSource () denetler. Eğer sorguyu geçersiz kılmak ve eklemek olurdu nerede bu yöntemi kullanmak için, bu. Aşağıdaki kodu kullanarak konum CakePHP hangi sürümüne bağlı olarak farklılık gerekebilir.

<?php
function setSource($tableName) {
    // From Model::setSource().  I believe this is needed to make query() work.
    $this->setDataSource($this->useDbConfig);

    // Create our table if we have a create query
    if (!empty($this->create_query)) {
        $this->query($this->create_query);
    }

    // Now call the parent
    parent::setSource($tableName);
}
?>

Eğer gerçekten veritabanı varolduğunu every isteği kontrol yapmak istiyor musunuz? Bu korkunç savurgan görünüyor.

O veritabanını kurmak ve daha sonra veritabanı bu zamana kadar dersin olsa bile tekrar kontrol edecek milyon sonraki isteklerinin her biri için olacak denetler ilk kez kuruldu!

Bu kişiye uygulama bazı kurulum yapmak yükler gerektiren için daha iyi bir fikir. Sen not her istek sırasında koşmak, ancak yükleme sırasında bir kişi tarafından elle çalıştırılan ayrı bir komut dosyası sunmalıdır.


CakePHP ile bunu yapmak için en iyi yolu hakkında Yorumlarınız Re, veritabanı şema göçler için Cake desteği baktım?

http://book.cakephp.org/view/734/Schema-management-and-migrations

Ben zaman içinde bir noktada bunu yaparken düşündüm, ve bunu yapmak için iyi bir yol ile geldi.

Önce bir not, kapalı: Ben senin app ihtiyaçlarını app / config / database.php yazma erişimi inanıyorum, bu yüzden doğru bilgi yazabilirsiniz. Ben bir çözüm var, ama bana yükleyici çalışır hangi yöntemi anlatalım.

PHP Script kendilerini yeniden (ya da kendilerini silme) anında yapabilirsiniz. Komut belleğe yüklenir ve SONRA bayt kodu yürütüldüğünde bu yana, bu çalışma yapılır kez dosya üzerinde bağımlı değildir. Yani teorik AppError sınıfı, tüm normal, CakePHP malzeme yüklü olan belirli bir denetleyici (sizin SetupWizardController demek) çalıştırmak için geçersiz bir şey olabilir. Eğer tüm sihirbazın geçmesi, ile (app bazı durumlarda yüklü değil eğer ben size farklı çalışma AppController gerek görebilirsiniz) AppError ve AppController dosyaların üzerine başka gerekli database.php dosya / setup şey yazmak saklanır olanlar yerde app / satıcıları / BenimProg seviyorum. Betiğin bittikten ve şimdi kontrol sonraki koşulara gerçekleşmez.

Bu Bill Karwin getirilen sorunun kurtulmak istiyorsunuz, AppError kullanmak, ve bir kurulum yapmak.

Bunu yapmak için başka bir yol uygulamanızda Ortamları fikrini eklemektir. App / config / environment.php daki ortamlarda saklayın söylüyorlar. Bu dosya yazma erişimi verilecek (ve bu erişim kurulum sonunda kaldırılacak olurdu), ya da üzerine olabilir. Birisi uygulamayı dağıtmak için çalışır, ve database.php otomatik environment.php dosyadan veritabanlarını ithal ne zaman olursa olsun, var olacaktır. Database.php sınıfının yapıcı sonra environment.php belirtilen biriyle $ varsayılan veritabanı bulunuyor üzerine yazacaktır. Database.php in $ varsayılan size AppController kontrol edilebilir bir NoDB Datasource'u, (Ben bir kukla modeli örneğini ve veri kaynağı bulunuyor kontrol etmek mümkün olacağını düşünüyorum) başvurmak, ve sonra gerekli Installer yukarı itmek istiyorsunuz. Açıkçası siz de bundan sonra AppController üzerine yazmak istiyorum.