Veritabanı
Çoğu eklentinin webman-admin kuracağını göz önünde bulundurarak, webman-admin'in veritabanı yapılandırmasını tekrar kullanmanız önerilir.
Model temel sınıfı plugin\admin\app\model\Base kullanılarak webman-admin'in veritabanı yapılandırması otomatik olarak kullanılacaktır.
<?php
namespace plugin\foo\app\model;
use plugin\admin\app\model\Base;
class Orders extends Base
{
/**
* Model ile ilişkili olan tablo.
*
* @var string
*/
protected $table = 'foo_orders';
/**
* Tablonun ilişkili olduğu birincil anahtar.
*
* @var string
*/
protected $primaryKey = 'id';
}
Ayrıca plugin.admin.mysql ile webman-admin'in veritabanını da işleyebilirsiniz, örneğin
Db::connection('plugin.admin.mysql')->table('user')->first();
Kendi Veritabanınızı Kullanma
Eklentiler kendi veritabanlarını da tercih edebilir, örneğin plugin/foo/config/database.php içeriği aşağıdaki gibi olabilir
return [
'default' => 'mysql',
'connections' => [
'mysql' => [ // mysql bağlantı adı
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => 3306,
'database' => 'veritabanı',
'username' => 'kullanıcı_adı',
'password' => 'şifre',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_general_ci',
],
'admin' => [ // admin bağlantı adı
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => 3306,
'database' => 'veritabanı',
'username' => 'kullanıcı_adı',
'password' => 'şifre',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_general_ci',
],
],
];
Referans şeklinde Db::connection('plugin.{eklenti}.{bağlantı_adı}'); kullanabilirsiniz, örneğin
use support\Db;
Db::connection('plugin.foo.mysql')->table('user')->first();
Db::connection('plugin.foo.admin')->table('admin')->first();
Ana projenizin veritabanını kullanmak istiyorsanız, doğrudan kullanabilirsiniz, örneğin
use support\Db;
Db::table('user')->first();
// Ana projenin ayrıca admin bağlantısı yapılandırdığını varsayıyoruz
Db::connection('admin')->table('admin')->first();
Model için Veritabanı Yapılandırma
Model için bir Base sınıfı oluşturabiliriz, Base sınıfı $connection ile eklentinin kendi veritabanı bağlantısını belirtebilir, örneğin
<?php
namespace plugin\foo\app\model;
use DateTimeInterface;
use support\Model;
class Base extends Model
{
/**
* @var string
*/
protected $connection = 'plugin.foo.mysql';
}
Bu şekilde, eklentideki tüm Model'ler Base'den miras alarak otomatik olarak eklentinin kendi veritabanını kullanır.
Veritabanını Otomatik Olarak İçe Aktarma
php webman app-plugin:create foo komutunu çalıştırmak, plugin/foo/api/Install.php ve plugin/foo/install.sql içeren foo eklentisini otomatik olarak oluşturacaktır.
İpucu
Eğer install.sql dosyası oluşturulmadıysawebman/console'u güncellemeyi deneyin, komutcomposer require webman/console ^1.3.6
Eklenti Yüklenirken Veritabanını İçe Aktarma
Eklentiyi yüklerken, Install.php içindeki install metodu çalıştırılacaktır; bu metod, install.sql içindeki SQL ifadelerini otomatik olarak içe aktarır ve böylece veritabanı tablolarının otomatik olarak içe aktarılmasını sağlar.
install.sql dosya içeriği, veritabanı tablolarını oluşturma ve tablonun geçmişteki değişiklikleri için SQL ifadelerini içerir; her ifadenin ; ile bitmesi gerektiğine dikkat edin, örneğin
CREATE TABLE `foo_orders` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'Birincil anahtar',
`order_id` varchar(50) NOT NULL COMMENT 'Sipariş id',
`user_id` int NOT NULL COMMENT 'Kullanıcı id',
`total_amount` decimal(10,2) NOT NULL COMMENT 'Ödenecek tutar',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Sipariş';
CREATE TABLE `foo_goods` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'Birincil anahtar',
`name` varchar(50) NOT NULL COMMENT 'İsim',
`price` int NOT NULL COMMENT 'Fiyat',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Ürün';
Veritabanı Bağlantısını Değiştir
install.sql ile içe aktarılan hedef veritabanı varsayılan olarak webman-admin'in veritabanıdır; başka bir veritabanına içe aktarmak isterseniz, Install.php içindeki $connection özelliğini değiştirebilirsiniz, örneğin
<?php
class Install
{
// Eklentinin kendi veritabanını belirtir
protected static $connection = 'plugin.admin.mysql';
// ...
}
Test
php webman app-plugin:install foo komutunu çalıştırarak eklentiyi yükleyin, ardından veritabanını kontrol edin; foo_orders ve foo_goods tablolarının oluşturulduğunu göreceksiniz.
Eklenti Güncellenirken Tablo Yapısını Değiştirme
Bazen eklenti güncellemesi, yeni tablolar oluşturmayı veya tablo yapısını değiştirmeyi gerektirir; bu durumda, install.sql dosyasının sonuna uygun ifadeleri ekleyebilirsiniz, her ifadenin sonunda ; olmasına dikkat edin; örneğin bir foo_user tablosu ekleyerek foo_orders tablosuna bir status alanı ekleme
CREATE TABLE `foo_orders` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'Birincil anahtar',
`order_id` varchar(50) NOT NULL COMMENT 'Sipariş id',
`user_id` int NOT NULL COMMENT 'Kullanıcı id',
`total_amount` decimal(10,2) NOT NULL COMMENT 'Ödenecek tutar',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Sipariş';
CREATE TABLE `foo_goods` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'Birincil anahtar',
`name` varchar(50) NOT NULL COMMENT 'İsim',
`price` int NOT NULL COMMENT 'Fiyat',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Ürün';
CREATE TABLE `foo_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'Birincil anahtar',
`name` varchar(50) NOT NULL COMMENT 'İsim'
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Kullanıcı';
ALTER TABLE `foo_orders` ADD `status` tinyint NOT NULL DEFAULT 0 COMMENT 'Durum';
Güncelleme sırasında, Install.php'taki update metodu çalıştırılacaktır; bu metod da install.sql içindeki ifadeleri çalıştırır; yeni ifadeler çalıştırılır, eski ifadeler atlanır ve böylece veritabanındaki değişiklikleri gerçekleştirir.
Eklentiyi Kaldırırken Veritabanını Silme
Eklenti kaldırıldığında Install.php'daki uninstall metodu çağrılır; bu metod install.sql içindeki tablo oluşturma ifadelerini analiz eder ve bu tabloları otomatik olarak siler, böylece eklenti kaldırıldığında veritabanı tablolarının silinmesini sağlar.
Eğer kaldırma işleminde yalnızca kendi uninstall.sql dosyanızın çalışmasını, otomatik olarak tablo silme işlemine müdahale etmeyerek istiyorsanız, yalnızca plugin/{eklenti_ismi}/uninstall.sql dosyasını oluşturmanız yeterlidir; bu şekilde uninstall metodu yalnızca uninstall.sql dosyası içindeki ifadeleri çalıştıracaktır.