Часть 2. Bun Framework – настройка окружения и запуск скелета

2014-05-28 в 15:02 Bun Framework PHP Projects

Я не сразу перейду к разработке непосредственного самого фреймворка, а сначала посвящу небольшую статью настройки окружения и среды разработки на PHP, которую я буду использовать. Далее я поделюсь как и какие программы использую в работе, как настраиваю среду для работы проектов, какие сервисы использую для хранения кода и т.п.

Bun Framework environment


Для удобства ведения повествовании о разработки проекта PHP фреймворка я завел публичный репозиторий на Bitbucket.org – http://bitbucket.org/jakulov/bun. В качестве системы контроля версий я использую GIT. Актуальный коммит на момент написания этой статьи: e4c7fc8. Основные изменения кода, описанные в статье, зафиксированы к коммите 4ebec1d

Для запуска php-приложения и использую виртуальную машину через VirtualBox, с установленным Debian Weezy. Код проекта прокидываю с помощью монтирования общей папки. Для редактирования кода преймущественно использую IDE PHPStorm.


Готовим структуру

Итак, опишу, что было сделано для создания небольшого рабочего каркаса будущего фреймворка и использующего его приложения. В предыдущей статье уже была описана струкрура директорий проекта и за что она отвечает, поэтому я просто создаю эти директории, как показано на скриншоте выше. Далее можно заране позаботиться об управлении зависимостями в нашем приложении. Для этого обычно принято использовать composer. Я устанавливаю композер в корень проекта curl -sS https://getcomposer.org/installer | php. Далее задаем базовую конфигурацию в файле composer.json:


    {
        "config": {
            "vendor-dir": "lib"
        },
        "autoload": {
            "psr-4": {
                "Bun\\": "lib/bun/bun/src/",
                "Hello\\": "src/Hello/"
            }
        }
    }

Тут все просто, задачем в качестве директории с внешними билиотеками lib, и добавляем в автозагрузку код фреймворка и приложения, которое будет использовать фреймворк. Приложение, как вы поняли я назвал Hello. Далее можем запустить php composer.phar install. Он нам должен сказать, что устанавливать нечего и при это создать файлы автозагрузки. Я добавил в .gitignore файлы композера, которые он создает в директории lib. Часто практика применения композера предписывает включать в игнор всю директорию с вендорами, но я препочитаю исключать тот или иной вендро вручную – так мы имеем больше контроля над состоянием проекта.

Теперь можно определить пространства имен и создать первые исполняемые файлы проекта. Созданим класс Bun\Framework


    <?php
    namespace Bun;

    /**
     * Class Framework
     *
     * @package Bun
     */
    class Framework
    {
        const VERSION = '0.1';
    }

Класс пока ничего не далет, просто сообщает нам текущую верисю фреймворка. Далее создаем описанный ранее класс Bun\Core\Application:


<?php
namespace Bun\Core;

use Bun\Framework;

/**
 * Class Application
 *
 * @package Bun\Core
 */
abstract class Application
{
    // определяем базовые виды окружения
    const ENV_DEV = 'dev';
    const ENV_PROD = 'prod';
    const ENV_TEST = 'test';
    /** @var тут храним текущее окрущение string */
    protected $env;

    /**
     * инициализация приложения
     * @param string $env получаем параметр окружения в котором запускаем приложение
     */
    public function __construct($env = self::ENV_DEV)
    {
        $this->env = $env;
        $this->define(); // определяем базовые константы фреймворка
    }

    /**
     * возвращает текущее окружение
     * @return string
     */
    public function getEnv()
    {
        return $this->env;
    }

    /**
     * запуск приложения
     * Run the application
     */
    public function run()
    {
        echo 'Hello! Bun runs in '. $this->env .' environment. Version: '. Framework::VERSION;
    }

    /**
     * определение базовый констант
     * Define directory structure
     */
    protected function define()
    {
        $projectRoot = realpath(__DIR__ .'/.././../../..'); // определяем корень проекта
        if(!defined('LIB_DIR')) {
            define('LIB_DIR', $projectRoot . '/lib'); // директория lib
        }
        if(!defined('SRC_DIR')) {
            define('SRC_DIR', $projectRoot . '/src'); // директория src
        }
        if(!defined('VAR_DIR')) {
            define('VAR_DIR', $projectRoot . '/var'); // директория var для файлов приложения и фреймворка
        }
        if(!defined('PUBLIC_DIR')) {
            define('PUBLIC_DIR', $projectRoot . '/app/public'); // директория для статичных ресурсов приложения
        }
        if(!defined('PUBLIC_PATH')) {
            define('PUBLIC_PATH', '/public'); // веб-путь к директории статичный ресурсов
        }
        if(!defined('BUN_DIR')) {
            define('BUN_DIR', realpath(__DIR__ .'/..')); // директория самого фреймворка
        }
    }
}

Класс пока мало что умеет делать. Для начала мы просто определяем к какой среде запущено приложение, если не определены константы путей к базовым директориям, определяем их. Основной метод run() приложения пока просто выводит приветственное сообщение. Следующим файлов будет config.php, создаваемые в корне проекта:


    <?php
    /**
    * Require and configure application
    */

    // defining environment
    if(file_exists(__DIR__ .'/env.php')) {
        require __DIR__ .'/env.php';
    }
    if(!defined('ENV')) {
        define('ENV', 'dev'); // по-умочанию запускам в dev-окружении
    }

Конфигурационный файл в дальнешейм будет служить для возможности указать уникальные параметры конфигурации среды, с помощью файла env.php, который добавен в .gitignore


    .idea/
    env.php
    lib/autoload.php
    lib/composer/

Теперь созданим в директории нашего приложения src/Hello класс Hello\Application:


    <php
    namespace Hello;

    /**
    * Class Application
    *
    * @package Hello
    */
    class Application extends \Bun\Core\Application
    {

    }

Класс просто наслудется от базового класса приложения фреймворка, переопределять в нем пока ничего не нужно. Теперь последний штрих в коде проекта – стартовый файл app/index.php, на который мы натравим наш веб-сервер чуть позже:


    <php
    require __DIR__ .'/../config.php'; // подключаем конфиг
    require __DIR__ .'/../lib/autoload.php'; // и автозагрузчик composer'а
    // запускаем наше созданное приложение
    $app = new \Hello\Application(ENV);
    $app->run();

Настройка веб-сервера

Вот по сути и все для этой статьи, в завершении настроим веб-сервер на нашей виртульной машине. Я использую hostname framework.dev, который прописал у себя в hosts файле, направляя его на ip своей виртуалки.

Далее идем в саму виртуалку и настраиваем веб-сервер. Я предпочитаю nginx в связке с php-fmp. Для разработки использую версию php 5.4 но проект оставляю совместимым с 5.3.

Настройка уже установленного nginx выглядит просто:
# добавляем новый сервер и заносим туда указанные на скриншоте параметры:
1. sudo vim /etc/nginx/sites-avialable/framework
2. cd /etc/nginx/sites-enables
3. sudo ln -s ../sites-avialable/framework
4. sudo service nginx reload

debian nginx server

Теперь у себя в браузере можно увидеть:

framework.dev Bun Framework

В следующих статьях приступим непосредственно к разработке базовых компонентов модуля Core приложения: создадим класс Module и копонент конфигурации Config.


Автор   

Комментарии (2)    написать


evan

Нужно добавить конфигурацию для Apache. Я использовал htaccess для yii2

 Ответить   


Yakov Akulov

evan: да, спасибо за замечание. Вообще в dev-окружении разумней будет даже использовать встроенный php-сервер.

 Ответить      



Написать комментарий:

Чтобы комментрировать укажите свои данные или войдите через один из социальных сервисов

Загрузка...