PHP Bağımlılık Enjeksiyon

2 Cevap php

Ben Dependency Injection içine bakarak edilmiştir.

  • Ben bir şey mıyım ya da tamamen kapalı?
  • Bağımlılık enjeksiyon ya da değil - kodu iyi mi kötü mü?

Aşağıdaki kodu bir CMS sistemi için temeldir

Şu vea içinde saklanan tüm web sayfaları ile "page_details" adında bir tablo var.

Directory/file structure

.htaccess
index.php
classes/Db.class.php
classes/Page.class.php
config/config.php
config/init.php

.htaccess

# Mod rewrite enabled.
Options +FollowSymLinks
RewriteEngine on

# ---- Rules ----

RewriteRule ^([A-Za-z0-9-_]+)\.html$ index.php?page=$1 [NC,L]

index.php

<?php require_once ('config/init.php'); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-type" content="text/html; charset=iso-8859-1" />
    <meta http-equiv="imagetoolbar" content="no" />
    <title></title>
    <meta name="Description" content="" />
    <meta name="Keywords" content="" />
    <link href="/css/styles.css" media="screen" rel="Stylesheet" type="text/css" />
</head>
<body>
<?php
$page = new Pages($db);
print_r($page->get_page($_GET['page']));
?>
</body>
</html>

Db.class.php

<?php
class Db
{
    private $dbhost;
    private $dbuser;
    private $dbpassword;
    private $dbname;
    private $connection;
    public $query;
    function __construct($dbhost, $dbuser, $dbpassword, $dbname)
    {
        $this->dbhost = $dbhost;
        $this->dbuser = $dbuser;
        $this->dbpassword = $dbpassword;
        $this->dbname = $dbname;
    }
    public function open_connection()
    {
        try
        {
            $this->connection = mysqli_connect($this->dbhost, $this->dbuser, $this->
                dbpassword, $this->dbname);
        }
        catch (exception $e)
        {
            throw $e;
        }
    }
    public function close($query)
    {
        try
        {
            mysqli_close($this->connection);
        }
        catch (exception $e)
        {
            throw $e;
        }
    }
    public function query($query)
    {
        try
        {
            $this->open_connection();
            $result = mysqli_query($this->connection, $query);
            return $result;
        }
        catch (exception $e)
        {
            throw $e;
        }
        $this->close_connection();
    }
    public function fetchArray($query)
    {
        $row = mysqli_fetch_assoc($query);
        return $row;
    }
    public function count_rows($query)
    {
        $row = mysqli_num_rows($query);
        return $row;
    }
    public function rows_affected()
    {
        $row = mysqli_affected_rows($this->connection);
        return $row;
    }
    public function created_id()
    {
        $row = mysqli_insert_id($this->connection);
        return $row;
    }
}
?>

Page.class.php

<?php
class Pages
{
    private $db;
    function __construct($db)
    {
        $this->db = $db;
    }
    function get_page($seo_url)
    {
        $sql = $this->db->query("SELECT * FROM page_details WHERE seo_url='$seo_url'");
        $row = $this->db->fetchArray($sql);
        return $row;
    }
}
?>

config.php

<?php
$config = array();
$config['dbtype'] = 'mysqli';
$config['dbhost'] = 'localhost';
$config['dbname'] = 'name';
$config['dbuser'] = 'user';
$config['dbpassword'] = 'password';
$config['absolute_path'] = '/var/www/vhosts/example.com/httpdocs';
$config['website_root'] = 'http://www.example.com/';
$config['dummy'] = '';
?>

init.php

<?php
require_once ('config/config.php');
function __autoload($class_name)
{
    require_once (''.$config['absolute_path'].'classes/' . $class_name . '.class.php');
}
$db = new Db($config['dbhost'], $config['dbuser'], $config['dbpassword'], $config['dbname']);
?>

2 Cevap

Sana __autoload çağrılacak (Ben her yerde kodunuzu new someclass arayarak görmüyorum) almak için beklemek nasıl emin değilim, ama onun yüzünde [{kullanarak (0)]} otomatik olarak [(3)]} {yüklenmesi gerekir ve bunu doğru kullanıyorsanız sınıfları dahil etmek.

Olsa koduna bazı genel yorumlar:

  1. Gelecekte daha fazla kanıt, biraz daha güvenli (SQL enjeksiyonu bilge), ve ben onun da kolay düşünüyorum - Ben doğrudan PDO'yu yerine mysqli kullanılmış olurdu.
  2. Ben require d dosya gerektirecek denemeden önce mevcut kontrol ve uygulama tarafından yakalanmış ve güzel bir şekilde rapor edilebilir güzel bir istisna olacaktır.
  3. muhtemelen print içerik değil print_r bunu istiyorum, ama hata ayıklama için bunu sanırım.

Bağımlılık enjeksiyon DB -> Sayfalar? Evet, iyi görünüyor. Bu makul bir yaklaşım gibi görünüyor.

İşte bir kapsülleme (değil DI) fikir: Sen Sayfalar sınıfın çıkıyorum ne düşünebilirsiniz. Şu anda sadece size db tablo adını veriyor. Bu neydi, bir Page? Yerine veri $ satır döndürmek, onu sahibi olabilir. Daha sonra erişime yardım etmek Page yöntemleri ekleyebilirsiniz sayfası verileri çeşitli sütunları bu. Bu mimari, size sayfa hakkında herhangi bir kod koymak için bir yer verecek. Bu yerine (print_r çizgisi şimdi) ekran kod $ satırda doğrudan gidiş olacaktır.