Как я могу создать массив определенного объекта? - PullRequest
2 голосов
/ 03 декабря 2008

Ну, я новичок в ООП в PHP и пытаюсь написать сайт с ним. Сайт представляет собой базовый сайт флеш игр и имеет категории для отслеживания игр. Моим первым шагом было создание базовой настройки MVC и перечисление всех категорий. Проблема в том, что я не знаю, как создать массив со всеми категориями в нем. Могу ли я добавить это в контроллер? Должен ли я добавить новый метод в модель? Дайте мне знать, код ниже.

index.php (контроллер)

<?php
    require_once 'database.php';
    require_once 'models/category.php';

    if (isset($_GET['page']))
    {
    }
    else
    { //display home page
        require_once 'views/home.php';
    }
?>

models / category.php (модель)

<?php
    class Category
    {
        private $id,$name;

        function __construct($id)
        {
            $category_query = $database_connection->prepare('SELECT id,name FROM categories WHERE id=?');
            $category_query->execute(array($id));
            $category = $category_query->fetch();

            $this->id = $category['id'];
            $this->name = $category['name'];
        }

        function get_id()
        {
            return $this->id;
        }

        function get_name()
        {
            return $this->name;
        }
    }
?>

views / home.php (view)

List of all categories:
<ul>
<?php foreach ($all_categories as $category) { ?>
    <li><?php echo $category->get_name(); ?> (ID: <?php echo $category->get_id(); ?>)</li>
<?php } ?>
</ul>

Ответы [ 2 ]

2 голосов
/ 03 декабря 2008

Очень просто, вам просто не хватает клея, чтобы соединить все вместе. Это часто называют «бизнес-логикой». То, что у вас есть в качестве вашей «модели», на самом деле является вашим слоем хранения данных. Ваша модель должна использовать это, чтобы вернуть контроллеру то, что нужно дать представлению.

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

1 голос
/ 03 декабря 2008

Как сказал Staticsan, есть много мест, где вы можете поместить это, и книги написаны об этом. Я бы изменил конструктор так, что если вы не дадите ему аргументов, он не будет запрашивать. Затем я бы использовал статический метод, который выполняет собственный запрос всех категорий (или некоторого подмножества), а затем собирает массив объектов Category для возврата ...

Вероятно, лучше написать класс CategoryFactory, который отвечает за создание и возврат этих объектов. Отсюда (или из фабрики статических методов) вы можете быть уверены, что выполняете только один запрос.

MVC - это еще не конец для архитектуры веб-приложений, Фаулер и Алур с соавторами углубляются в детали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...