При написании статей на Хабре я заметил, что многим не по душе умерший Kohana framework, и слышал много критики в адрес проекта по этой причине и задумался над вопросом: « Как быть и что делать с Kohana?», ведь фреймворк совершенно не способствует развитию CMS на протяжении года.

Первые мысли были о продолжении развития Kohana собственными силами. Первым делом в систему был интегрирован Composer, модули и плагины мигрировали в пакеты в репозиторий https://packagist.org/packages/kodicms/ и в инсталлятор composer добавлены типы пакетов https://github.com/composer/installers. После этого потратив немного времени на поиск наткнулся на проект Kohana54 (https://github.com/kohana54/core), разработчик которого решил привести все классы в соответствие стандарта PSR-4 но видимо оставил до лучших времен. По началу меня это не сильно тревожило, можно было попробовать закончить и за него, но через несколько дней я понял, что помимо самого ядра придется также переписывать и остальные стандартные модули фреймворка, а также и все модули CMS, что равносильно использованию другого, более современного фреймворка и решил окончательно завязать с Kohana.

Встал вопрос: «Какой фреймворк выбрать?»


  • Laravel
  • FuelPHP
  • Symfony
  • Yii2
  • Zend Framework 2
  • CakePHP

Сравнение фреймворков может потянуть на целую статью, поэтому ограничусь только своим выбором, Laravel framework, который меня заинтриговал:

  • своей простотой и более менее логичной структурой приложения,
  • отличной архитектурой, которую можно было бы доработать под свои нужды,
  • наличием кучи возможностей из коробки, которые могли бы помочь в реализации части переносимого функционала,
  • удобная консоль,
  • удобные инструменты работы с БД (миграция, сидирование),
  • активное, живое сообщество,
  • ну и самое главное фреймворк активно развивается, что, как я заметил по своему проекту, очень важно.

Для многих людей 1 апреля — ассоциируется с днем смеха, а для меня — день рождения нового проекта — KodiCMS на фреймворке laravel. Именно в этот день был создан новый репозиторий https://github.com/KodiCMS/kodicms-laravel и добавлен первый коммит в него.

Немного расскажу про структуру новой CMS. Многим известно что Laravel из коробки не имеет модульной структуры, а пакеты это не тоже самое, что и модули, поэтому первым делом был написан ModuleLoader, который помог с организацией модульной структуры и динамическим подключением модулей, просто указывая его имя в конфиге.

В итоге структура модуля имеет следующий вид


  • config — конфиги приложения, могут быть перезаписаны из папки /config/
    • permissions.php — Служит для указания списка прав
    • sitemap.php — Служит для указания страниц для меню админ панели
    • behaviors.php
  • Console
    • Commands — расположение файлов консольных компанды
  • database
    • migrations — файлы миграции, будут запущены по команде cms:modules:migrate
    • seeds
      • DatabaseSeeder.php — если существует, то будет запущен по команде cms:modules:seed
  • Helpers — вспомогательные классы модуля
  • Http
    • Controllers — контроллеры модуля
    • Middleware
    • routes.php — роуты текущего модуля, оборачиваются в namespace KodiCMS\{module}
  • Observers — Наблюдатели для моделей Eloquent
  • Providers
    • ModuleServiceProvider.php — Сервис провайдер (наследуемый от KodiCMS\CMS\Providers\ServiceProvider), если есть, будет запущен в момент инициализации приложения
  • resources
    • js — JavaScript файлы, в этой папке происходит поиск js файлов по виртуальным путям /backend/cms/js/{script.js}
    • lang — Файлы переводов для модуля, доступны по ключу названия модуля приведенного в нижний регистр trans('{module}::file.key')
    • views — Шаблоны модуля, доступны по ключу названия модуля приведенного в нижний регистр view('{module}::template')
    • packages.php — В данном файле можно подключать свои Assets (Media) пакеты
  • Services — Сервисные контейнеры
  • ModuleContainer.php — Если данный файл существует, то он будет подключен как системный файл модуля, в котором указаны относительные пути и действия в момент инициализации. Необходимо наследовать от KodiCMS\CMS\Loader\ModuleContainer

Подробнее про модульность можно прочитать здесь

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

Как говорится глаза боятся, а руки делают. После реализации модульной структуры началась процедура переноса стандартных модулей системы и реализация основных возможностей. И на данный момент по моим оценкам перенесено чуть более 60% функционала:

  • Добавление в Laravel модульной структуры
  • Перенос ядра системы
  • Перенос модуля «API»
  • Перенос модуля «elFinder»
  • Перенос модуля «Pages»
  • Перенос модуля «Layouts»
  • Перенос модуля «Snippets»
  • Перенос модуля «Email»
  • Перенос модуля «Cron jobs»
  • Перенос модуля «Widgets»
  • Перенос модуля «Dashboard»
  • Перенос модуля «Users, Roles»
  • Перенос модуля ACL
  • Перенос модуля «Datasource»
  • Перенос плагина «Hyrid» и интеграция его в систему с расширенным функционалом
  • Реализация инсталлятора системы
  • Реализация подключения плагинов, со структурой аналогичной модулям

Изначально планировалось перенести весь функционал не менее чем за 6 месяцев, но что-то пошло не так и процесс пошел быстрее… Системой заинтересовались разработчики из группы в ВК http://vk.com/laravel_rus и на канале LaravelRUS, после чего энтузиасты стали предлагать помощь в разработке проекта одной из самых крутых OpenSource CMS на одном из самых крутых фреймворков.

Зачем нужна еще одна CMS?!


При использовании различных CMS я часто сталкивался с тем, что многие из них предлагают один и тот же функционал но с небольшими отличиями. Т.е. по сути многие CMS загоняют пользователя в определенные рамки, будь то структура URL или размещение контента на страницах сайта. Многие из них имеют самописное ядро, которое либо сложно расширять, либо приходится долго изучать документацию, чтобы начать разрабатывать.

При написании своей CMS мне хотелось собрать из них все самое лучшее и соединить в одну. Для начала я решил использовать один из популярных фреймворков и по минимуму вносить изменения в ядро, чтобы любой разработчик мог за кратчайшее время войти в процесс разработки. К тому же я не хочу CMS как у всех, только со своим именем, моя цель сделать некий конструктор, в котором можно конструировать собственные разделы (блог, новости и т.д.) посредством добавления в них полей нужных типов через админ панель, которые не жестко вшиты в код системы, а добавлялись бы с помощью плагинов сторонними разработчиками. Тоже самое и с выводом контента на страницы сайта. Чтобы каждый пользователь без особых знаний в программировании и ковыряния шаблонов сайта мог вывести необходимые данные, будь то список документов или меню сайта или обычный HTML.Дать возможность контент менеджеру использовать свой любимый текстовый редактор, который можно встроить в систему посредством API и полноценно использовать в админ панели.

Идей по системе море и все они реализуемые и большинство из них уже реализованы. Некоторые из них возможно нуждаются в доработке. Но все как обычно упирается в разработчиков. Поэтому приглашаем всех желающих присоединиться к разработке, тем более это поможет повысить свой опыт в работе с фреймворком Laravel, а также использовать свой опыт в дальнейшем.

Как обычно вы всегда можете посмотреть результат работы:


Сайт: http://laravel.kodicms.ru/backend

  • username: admin@site.com
  • password: password
или
  • username: test@test.com
  • password: password
или скачать и установить локально https://github.com/KodiCMS/kodicms-laravel

Благодарности


Благодаря KodiCMS я открыл для себя мир добрых сервисов и людей, готовых предоставить свою помощь:

P.s. В ближайшее время состоится первая online встреча по обсуждению проекта, на которой будет рассказано более подробно про систему, ее историю и о текущем состоянии https://vk.com/kodicms?w=wall-48395169_287%2Fall

Upd. На данный момент система еще имеет статус Alpha версии и могут возникать ошибки в работе или недочеты, которые будут в последствии устранены. Баг репорты приветствуются.

Комментарии (31)


  1. Ashot
    27.05.2015 11:13

    laravel.kodicms.ru/backend у вас тут эксепшн вылетает, к сожалению.


    1. ButscH Автор
      27.05.2015 11:27
      +2

      Спасибо, исправил. К сожалению такое имеет место быть, т.к. еще alpha версия, но система периодически переустанавливается по крону.


      1. resurection
        27.05.2015 11:29
        +1

        Извините меня. Это я сломал вашу админку переключив в настройках параметр сессия=apc.
        Я, однако, не понимаю, зачем это делать в админке, ведь это относиться к серверным настройкам. Я бы своим клиентам не стал бы давать админку с такими настройками, ведь большинство из них дураки. Они даже не знают где поменять тайтл для главной страницы. А уж переключение драйверов хранения сессии точно должно быть в системном конфиге который редактируется только программистом.


        1. ButscH Автор
          27.05.2015 11:31
          +1

          Данные настройки планируется защищать через ACL модуль и давать права на их изменение только администраторам или еще каким либо ролям, ну а так да, я согласен, возможно стоит убрать. Именно этим и хороша обратная связь. Спасибо.


          1. resurection
            27.05.2015 11:42
            +1

            Администратор=программист? Мне кажется к этим настройкам никто не должен иметь доступа, кроме программиста.
            И ещё, они не должны быть в админке только потому что можно всё сломать, а восстановить обратно уже не получится. Как сейчас и произошло.


  1. Invision70
    27.05.2015 11:41
    +1

    Доступ к файловому менеджеру открыт для всех, исправьте.
    laravel.kodicms.ru/api.filemanager?cmd=open&target=l1_Lw&init=1&tree=1&_=1432715839023


    1. ButscH Автор
      27.05.2015 11:46

      Спасибо. Модуль API также в будущем будет использовать API ключи которые будут генерироваться в админ панели и будут требоваться в том случае если пользователь не авторизован или для доступа сторонним ресурсам.


  1. Nord001
    27.05.2015 11:56

    Добрый день!

    Если что, я там поиграл утром, добавил счётчик:

    metrika.yandex.ru/stat/dashboard/?counter_id=30572062

    Я без злого умысла — просто поиграться…

    Кстати, очень внешне понравилась админка, успехов вам!


    1. ButscH Автор
      27.05.2015 12:00

      Спасибо за счетчик, я совсем про него забыл. Добавил код также на внутренние страницы админ панели


  1. denver
    27.05.2015 12:13
    +3

    отличной архитектурой, которую можно было бы доработать под свои нужды,

    Ларавел хорош, удобно пользоваться, всё ок пока не придет нужда залезть в их исходники чтобы понять как расширить/переопределить что-то под свои нужды. Да и повсеместные __call() и, как следствие, невозможность «серфить» по коду в IDE не добавляют ощущения отличной архитектуры. Порой хочется грустно посмотреть в глаза таким архитекторам. Правда не так часто нужно лазить под капот.


  1. justmara
    27.05.2015 12:13

    ...Hello Kodi XSS?
    спасибо тому, кто порадовал с утра 8)


    1. Invision70
      27.05.2015 12:13
      +3

      Не благодари :)

      Виджеты > Меню > Редактирование виджета > Header menu
      В «Название» пишем Header menu]-->тут_script
      Проверил, другие поля XSS не пропускают.


  1. Invision70
    27.05.2015 12:53
    +2

    «Теория разбитых окон» в действии, коммент теряет свой opacity )
    Если сливаете, то разъясните по какой причине. Разработчики дали публичный доступ, решил протестировать.
    Инициатива наказуема (


    1. ButscH Автор
      27.05.2015 13:01
      -3

      Ну собственно я не против твоего баловства, но это можно показать на внутренней странице и показать в чем проблема. На данный момент ты не единственный, кто может тестировать или хочет посмотреть систему, а если ее кто-то ломает, то для других появляется проблема доступа и всякие неудобства. Сломать всегда проще, чем сделать, но при этом всегда необходимо помнить о других. Мне вообще интересна проблема, которую ты показал, т.к. это явная недоработка, но хотелось бы видеть обратную связь немного по другому.


      1. justmara
        27.05.2015 13:56
        +1

        довольно глупо выкладывать в паблик со словами "вот, посмотрите, какой я молодец" и надеяться, что все будут только смотреть, не трогать и хвалить "какой ты молодец". Особенно с таким абмициозно-детским посылом:

        При написании своей CMS мне хотелось собрать из них все самое лучшее и соединить в одну.


        1. ButscH Автор
          27.05.2015 14:05

          Моя ошибка, я не уточнил, что на данный момент alpha версия, и в данный момент активно ведется перенос модулей со старой версии. По ссылке можно посмотреть результат переноса на данный момент времени, но это не окончательный вариант. Об этом также говорит лейбл alpha в логотипе админ панели.

          P.s. я с большим уважением отношусь к баг репортам и по возможности стараюсь проблемы исправлять в кратчайшие сроки.


    1. resurection
      27.05.2015 23:54

      Имея доступ в админку любой может сломать сайт. Например, удалив все разделы. Даже взламывать ничего не надо. Какой в этом смысл?


      1. Invision70
        28.05.2015 13:08

        Речь идет не о поломке сайта, а о безопасности ваших пользователей. Приведу небольшой пример.
        У тебя есть доступ в административную часть с ограниченными правами, например корректировать и публиковать статьи на сайте. Злоумышленник получает доступ к твоей учетной записи, внедряет xss, ловит сессию администратора сайта и получает полный доступ в админпанель. Остается залить шелл и выгрузить дамп БД.


        1. resurection
          28.05.2015 14:02

          А зачем вы даёте доступ к админке злоумышленникам?

          Не возможно защититься от всех. Приведу другой пример: работник ДатаЦентра вынимает hdd из вашего сервера, вставляет в свой комп и выгружает БД. Просто не давайте доступ к админке злоумышленникам.


          1. justmara
            28.05.2015 14:36

            А можно, я попробую пояснить, что имел ввиду тов. Invision70?
            Так вот, он пытается донести мысль, что обычно CMS пользуются не только админы. Зачастую доступ даётся всяким контент-менеджерам, которые по уровню компьютерной грамотности и элементарных навыков сетевой безопасности находятся где-то в пределах погрешности от абсолютного ноля. Они используют простые пароли, они оставляют залогиненные сессии в паблик местах, они не лочат комп на рабочем месте и тд. и тп.
            Так вот речь о том, что получив доступ к аккаунту такого нерадивого товарища можно через xss получить доступ и к админскому аккаунту.


  1. Evgeny42
    27.05.2015 14:37

    А почему phalcon не рассматривали? :)


    1. PaulMaly
      27.05.2015 15:33
      +1

      Возможно потому что CMS должна вставать на 99,9% хостингов, включая shared, простым переписыванием файлов. Phalcon прекрасен, но не для таких «коробок».


      1. Evgeny42
        27.05.2015 15:36

        Не знаю как Laravel 5, но 4 версия, по моему, вставала на shared хостинги с большим трудом и не желанием. Как сейчас с этим обстоит?


        1. PaulMaly
          27.05.2015 17:52

          Без понятия. Но как минимум Laravel использует не столь специфические расширения PHP, как Phalcon, который им собственно и является. Поэтому уверен что Phalcon стоит на кол-ве хостингов стремящемся к 0, а то что нужно для того же Laravel можно найти много где.


      1. asmaster
        27.05.2015 15:45

        Я в PHP не очень разбираюсь, просто интересно: зачем вообще сейчас нужны shared хостинги, когда есть, например, Digital Ocean за $5 в месяц.


        1. Claud
          27.05.2015 16:31

          Так не всякий сможет справится с администрированием, хотя конечно есть vds с панелями, но там тоже проблемы могут нарисоваться.


        1. PaulMaly
          27.05.2015 18:22

          Собственно мы так и делаем и спокойно используем Phalcon и получаем все преимущества от этого. Но как правильно заметил предыдущий отвечающий, администрировать не все умеют.

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


  1. Claud
    27.05.2015 16:29

    Лучше сделайте разовые демки для страждущих. Для каждого генерируйте на подомене отдельная установка (копируйте копию системы, да накатываете базу с префиксом например) и там пусть молодые таланты изливают свои мысли уровня «Здесь был Вася Пупкин все идите на три буквы!!!!!!!....».


  1. 13i
    30.05.2015 15:32
    -2

    Пройдет 1-3 года. Появятся другие фреймворки… Ларавел забудут. И что? Опять переходить на новый? Вот чем чистый ПХП лучше.


    1. denver
      04.06.2015 10:47

      Тролите? Ну-ну :)


  1. Aios
    08.06.2015 20:47

    С нетерпением жду!