Создание веб-сайта в MVC и без каких-либо фреймворков, но в Simple PHP, какой будет структура? - PullRequest
0 голосов
/ 18 сентября 2009

Я хочу создать веб-сайт в архитектуре MVC без использования каких-либо фреймворков. Какова будет структура Файлы / Папка ( Модуль / Представления / Модели ).

РЕДАКТИРОВАТЬ: Я знаю Zend, CakePHP. но мой вопрос заключается в том, как мы можем структурировать в Simple PHP . Я не хочу использовать какие-либо фреймворки, потому что мне нужна максимальная производительность / скорость. Я слышал, что фреймворки медленнее по сравнению с простыми веб-приложениями PHP, Именно поэтому я выбрал простой PHP .

РЕДАКТИРОВАТЬ 2: Я хочу, чтобы каждая веб-страница вызывалась через index.php,

Ответы [ 7 ]

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

У вас может быть такая структура:

  root folder/
     index.php
     views/
     models/
     controllers/
     util/

index.php - фронтальный загрузчик - все URL проходят через это, и он определяет, какой контроллер вызывать на основе URL. Вы можете удалить index.php из URL, используя mod_rewrite.

views / папка содержит ваши html, rss, xml и др. Файлы представления - вы будете заполнять значения в них с ваших контроллеров. Вы могли бы использовать Smarty здесь, но, честно говоря, я не вижу смысла.

Папка

models / будет содержать ваш код подключения ORM или DB. Модель легко написать с нуля.

controllers / folder будет содержать один файл контроллера на URL. Скажем, books.php для URL CRUD для работы с книгами. Каждый контроллер должен загрузить модель и использовать данные для заполнения представления.

Утилита / папка может содержать любые классы, которые не являются моделями или контроллерами. Вспомогательные вещи, такие как безопасность, управление сеансами и т. Д.

Видя, как вы пишете это самостоятельно, вы можете покончить с этим и сохранить его простым. Но вы можете обнаружить, что на самом деле это большая работа, чем вы думаете. Я знаю, что вы не хотите использовать один, но Code Igniter делает вещи очень простыми, легкими и не пытается сделать так много для вас, как другие фреймворки, как Cake и Symfony.

1 голос
/ 20 сентября 2009

Первоначальный создатель PHP опубликовал хорошую статью об этом типе вещей.

http://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html

0 голосов
/ 20 сентября 2009

Как предложил пользователь meder , попробуйте очень простой mvc framework web2bb . Есть также мой порт, улучшенный и оптимизированный для PHP 5.2. Вы можете получить доступ к его исходному коду через svn здесь:

Google Code web2bb-php52

Источник имеет встроенный пример приложения BLOG.

0 голосов
/ 20 сентября 2009
0 голосов
/ 20 сентября 2009

Я строю Caret , чтобы стать самой простой платформой VC.

У меня есть простой C-файл, который извлекает метаданные из комментариев, которые я затем использую JavaScript (на стороне сервера) для создания маршрутизатора URL вместе с функциями для соединения файлов. Это чрезвычайно просто и делает программирование быстрым без странной OO.

Обратите внимание, что у меня нет M. Я делаю аспект модели на своем родном языке, но в целом он сводится к функции, которая получает таблицы и набор функций, действующих как вызовы RPC. Я использую Кира ..

0 голосов
/ 18 сентября 2009

Прежде чем работать с Zend Framework, я делал что-то подобное.

Вот структура файлов / папок:

/
/views
/layouts
/controllers
/library
/etc
/data
Site.php
index.php

Просмотры: содержит все шаблоны, по одному на контроллер / действие

Макеты: макет, который получает переменную, содержащую имя файла для включения (из представлений)

контроллеры: контроллеры

библиотека: все дополнительные инструменты, необходимые для проекта

и т. Д .: документация и т. Д.

данные: для загрузки файла

Файл Site.php, используемый для инициации всего проекта, своего рода загрузчик, вызываемый index.php

index.php: вызвать загрузчик

<?php
class Site
{
    protected $_action = NULL;
    protected $_contentFile = NULL;
    protected $_args = array();
    protected $_headTitle = NULL;
    protected $_headerStack = array();

    public function __construct ($action)
    {
        $this->setAction($action);
        $this->setArgs();
    }


    public function setHeader($name = null, $value = null)
    {
        if (null != $name && null != $value)
        {
            $this->_headerStack[$name] = $value;
        }
    }

    public function sendHeaders()
    {
        if (null != $this->_headerStack)
        {
            foreach ($this->_headerStack as $key => $value)
            {
                header($key . ':' . ' ' . $value);
            }
        }
        return $this;
    }



    public function setAction($action)
    {
        $this->_action = (! empty($action) ) ? $action : 'error';
        return $this;
    }

    public function setArgs()
    {
        $this->_args['GET'] = $_GET;
        $this->_args['POST'] = $_POST;
    }

    public function getParam($name)
    {
        if ( ! empty($this->_args['GET'][$name]))
        {
            return $this->_args['GET'][$name];
        } else {
            return null;
        }
    }

    public function getParams()
    {
        return $this->_args['GET'];
    }

    public function getPost()
    {
        return $this->_args['POST'];
    }

    public function preRun()
    {
        if (is_file('views/' . $this->_action . '.phtml'))
        {
            $content = 'views/' . $this->_action . '.phtml';
            $this->setContentFile($content);
        }

        if (is_file('library/' . ucfirst($this->_action) . 'Action.php'))
        {
            require_once 'library/' . ucfirst($this->_action) . 'Action.php';
            if (function_exists  ('init')) 
            {
                init();
            }
        }
    }


    public function run()
    {
            $this->sendHeaders();
            $this->preRun();
            require_once 'layouts/main.phtml';
            $this->sendHeaders();
    }

    public function setContentFile($content)
    {
        $this->_contentFile = ( !empty($content) ) ? $content : '';
        return $this;
    }

    public function getContent()
    {
        require_once $this->_contentFile;
    }

    public function setHeadTitle($title)
    {
        $this->_headTitle = $title;
        return $this;
    }

    public function getHeadTitle()
    {
        return $this->_headTitle;
    }

}

Затем в своем индексе я сделал:

$action = $_GET['action'];

$site = new Site($action);

$site->run();

Я удалил некоторые дополнительные проверки безопасности для удобства ...

Затем вы можете расширить это, чтобы включить каталог моделей, вызываемый из контроллера и т. Д. *

0 голосов
/ 18 сентября 2009

Мне очень нравится древовидная структура symfony http://andreiabohner.files.wordpress.com/2007/03/cheatsheetsymfony001_enus.pdf

Что касается вашего редактирования, я предлагаю структуру каталогов Symfony (или ее подмножество, если вам нужно) не использовать Symfony.

Относительно производительности фреймворков, это зависит. Хорошие фреймворки знают свои проблемы и используют кеширование и другие методы оптимизации; использование облегченного http-сервера вместо apache может быть другой проблемой. Но все зависит от ваших конкретных потребностей.

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