2015-03-13 2 views
0

ПРЕАМБУЛА: Я использую F3 Framework (www.fatfreeframework.com).php "pure" OOP: как классы дизайна?

Скажем, у меня есть абстрактный класс «контроллер»

<?php 
abstract class Controller 
{ 

    /* F3 */ 
    protected $f3; 
    /* DATABASE SECTION */ 
    protected $db_name; 
    protected $db_host; 
    protected $db_username; 
    protected $db_password; 

    function __construct() 
    { 
     $f3 = Base::instance(); 
     $this->f3 = $f3; 
    } 

    protected function get_db_name() 
    { 
     return $this->db_name; 
    } 

    protected function get_db_host() 
    { 
     return $this->db_host; 
    } 

    protected function get_db_username() 
    { 
     return $this->db_username; 
    } 

    protected function get_db_password() 
    { 
     return $this->db_password; 
    } 

    protected function set_db_name($db_name) 
    { 
     $this->db_name = $db_name; 
    } 

    protected function set_db_host($db_host) 
    { 
     $this->db_host = $db_host; 
    } 

    protected function set_db_username($db_username) 
    { 
     $this->db_username = $db_username; 
    } 

    protected function set_db_password($db_password) 
    { 
     $this->db_password = $db_password; 
    } 

} // /class Controller 

И FrontendController Класс:

<?php 
class FrontendController extends Controller 
{ 
    public function get_view() 
    { 
     $this->set_db_host('localhost'); 
    }  
} 

Его работа этого управления веб-интерфейс (HTML, печать результаты из базы данных, и т.д. и т.п. и т.д.).

После некоторого дня мне нужен класс BackendController для управления новостями сайта (например).

1) Мне нужно переписать соединения db (например)? Или я переведу их в конструкцию Controller?

2) Действительно, с точки 1, я не думаю, чтобы добавить их в __construct подкласса, но конечно это переопределить __construct завтрашнего дня абстрактного класса

3) Я хочу создать ToolboxController класса. Предположим, что область действия будет выполнять некоторую задачу (например, «извлечь первые буквы X из текста», «форматировать данные в соответствии с пользовательскими настройками»), все фрагменты кода, которые я буду/могу использовать повторно в другой части приложения.

В этом случае мне нужно будет реорганизовать весь сайт меняющийся от:

Controller <= FrontendController 

Controller <= BackendController 

в

Controller <= ToolboxController <= FrontendController 

Controller <= ToolboxController <= BackendController 

< где = средняя "продолжается"?

Похоже, что это очень глупый вопрос и простой, но я бы понял логический процесс добавления новых функций на родившийся небольшой веб-сайт на большой портал.

+0

На самом деле это не место для «наилучшего проектирования этой прикладной/кодовой базы». Вы можете сделать лучше на программистов, но сначала ознакомьтесь с правилами и положениями. Я не говорю, что все в порядке, просто может быть, и здесь это не очень удобно. Немного непонятно, о чем вы спрашиваете, поскольку вы задаете справедливый бит. – James

+0

Ваш контроллер не знает о каких-либо настройках базы данных. Это для вашей соответствующей абстракции базы данных, которая находится на уровне * модели *. Так что избавитесь от каких-либо материалов базы данных от вашего контроллера, он там не принадлежит. – Jimbo

+0

@jimbo ok ... Спасибо. А для второго вопроса? Когда проект «поднимается», и мне нужно добавить другой контроллер? – sineverba

ответ

2

Вы делаете это неправильно. Корень вашей проблемы в том, что у вас нет модели.

Модель не является простым классом, это в целом слой абстракции.

  • объекта домена
  • Значение объекта
  • База данных Mapper
  • служба

Read this хороший ответ, чтобы узнать об этом.

В конце концов, вы цель должна быть чем-то вроде этого это

$model = new Model(); 
$controller = new Controller($model); 
$view = new View($model); 

View и Controller разделяет те же Model, и они его получают. Они не знают, как их получить.

+0

Спасибо, ты меня правильно поняла. Но для будущего добавления? См. Пункт 3 ... Спасибо! – sineverba

+0

Для сопоставления базы данных многие используют «Doctrine». Еще в те дни эта статья мне очень помогла, потому что это просто практично и не так много теоретических: http://blog.tekerson.com/2008/12/17/data-mapper-pattern-in-php/ –

+0

@sineverba Извините, мой плохой, вы имеете в виду вашу точку 3 :) Если вы хотите работать с данными (например, сменить), вы делаете это через уровень обслуживания. Служба называется везде в вашем приложении, вам это нужно. Таким образом, вы инкапсулируете эту логику в простой 'Service :: doYouJob ($ withThisData)'. Пример, который вы дали о создании, - это определенная вещь, которая должна быть в «View Layer». Для получения настроек, например, у вас есть Сервис в Model 'Service :: getCurrentUserSettings()', который делает это главным образом: '$ mapper = new UserSettingsMapper(); $ usersettings = $ mapper-> findById ($ user-> getId()); '. –

Смежные вопросы