Внедрение зависимостей в PHP - PullRequest
       25

Внедрение зависимостей в PHP

2 голосов
/ 13 сентября 2009

Я изучал инъекцию зависимостей.

  • Я к чему-то или полностью выключен?
  • Является ли код хорошим или плохим - внедрение зависимостей или нет?

Приведенный ниже код является основой для системы CMS

Прямо сейчас есть таблица "page_details", в которой хранятся все веб-страницы.

Структура каталогов / файлов

.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 ]

2 голосов
/ 13 сентября 2009

Я не уверен, как вы ожидаете получить __autoload, который будет вызываться (я не вижу, чтобы вы вызывали new someclass где-либо в вашем коде), но на первый взгляд использование __autoload для автоматического включения классов это должно быть загружено хорошая идея , и вы используете это правильно.

Некоторые общие комментарии к вашему коду:

  1. Я бы использовал PDO вместо mysqli напрямую - это несколько более безопасно (с точки зрения внедрения SQL), более перспективно на будущее, и я думаю, что это также проще.
  2. Я бы проверил, что файл require d существует, прежде чем пытаться его запросить, и выдал бы приятное исключение, которое может быть перехвачено приложением и о котором было бы хорошо сообщено.
  3. вы, вероятно, хотите print ваш контент, а не print_r его, но я полагаю, вы делаете это для отладки.
0 голосов
/ 14 сентября 2009

Внедрение зависимостей - это БД -> Страницы? Да, выглядит хорошо. Это кажется разумным подходом.

Вот идея инкапсуляции (не DI): вы можете подумать, что вы получаете из класса Pages. Прямо сейчас он просто дает вам имя таблицы БД. Что если это был Page? Вместо того, чтобы возвращать $ строку данных, он может владеть ею. Затем вы можете добавить методы к Page, чтобы получить доступ к различным столбцам данных страницы. Эта архитектура даст вам место для размещения любого кода о странице. Это вместо того, чтобы идти прямо к строке $ в коде дисплея (теперь строка print_r).

...