Comments 15
Если вам нужны несколько сайтов, зависимых друг от друга (допустим, admin.example.com, crm.example.com, mail.example.com, etc), то делаете каждый подсайт в виде модуля и указываете роутинг с нужного домена в конфиге (см. http://nickbartlett.com/yii-multisite-point-domain-to-modules/ ). При этом, webroot с каждого домена идет на одну и ту же папку.
Если же сайты не должны быть зависимы друг от друга, то вообще в разные проекты нужно разделять всё.
Но, находясь на урезанном хостинге и с желанием экономии — будет слегка напряжно реализовать все красиво.
На счет модулей — я сразу оговорил, что предлагаю вариант без оных. Также есть отзыв пришедшего программиста в нашу команду, который сказал: «О, так понятнее и проще, чем на модулях»
А сайты… В нашем случае это можно сравнить с фрилансом. Когда есть сторона работодателя и соискателя. У которых пересекаются модели, методы, данные, компоненты и т.д.
Велосипед буду изобретать, т.к. только так делаются какие-то прорывы из консерватизма.
Чтоб учить, необходимо сказать: «делайте так». Я лишь предложил альтернативу, которую внедрили в моем проекте, и которая лично мне приглянулась.
Девяти добавлениям в избранное, видимо, также.
Спасибо за отзыв. Я не претендую на прорыв в технологиях. Буду рад, если кому данный подход также понравится больше, чем модульность или у кого нет желания вкладываться в хостинг.
А Вас не смущает, что сам фреймворк это, по сути, иерархия модулей и Ваша реализация всего лишь попытка объединить два базовых модуля? На мой взгляд это не велосипед, а введение в заблуждение новичков. Для сквозной доступности реализуйте модели в common/models/
для шаблонов используйте темы.
Чтобы добавить ещё один сайт без чуда на свитчах достаточно сделать копию одного из базовых модулей с переименованием директории, например frontend
-> api
и добавить в файл common/config/bootstrap.php
строчку:
Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api');
Так же сделать копию environments/frontend/
-> environments/api/
и во всех файлах environments/api/
заменить frontend
на api
. В файле environments/index.php
в массиве сделать копию узлов frontend
в Production
и Development
для api
. Далее в корне проекта запускаете файл php ./init.php
и не нужно никаких велосипедов. Причём это никак не усложняет всю логику и добавлять Вы можете сколько угодно базовых модулей (сайтов).
Хотите чтобы была единая директория для upload? Добавьте алиасы в common/config/bootstrap.php
:
Yii::setAlias('@uploads', dirname(dirname(__DIR__)) . '/uploads');
Yii::setAlias('@webUploads', '/uploads');
И используйте его при обращении к файлам
Просто нужно изучать инструменты с которыми работаешь, а не сочинять "кривого монстра" на пустом месте
Из плюсов моего варианта — более удобно, если, ни дай бог, два или более приложений должны иметь общие ресурсы: картинки, шрифты.
Я выше отметил, что у нас сильно было завязано на 2 приложения. У них было много общего. Т.е. как предлагали — можно было сделать через модули. Попробовали сделать так — лично нам понравилось. Штатный вариант теперь чет не нравится)
Или это общепринято? :)
Я чет всю жизнь под первым понимал сервер-сайд, под вторым — отдача html + статики. :)
С учетом общих файлов статики, данное решение более удобно применять для поддоменов. :)
Хотя можно статику разнести по папкам доменов, а php натравить на:
а) общий файл;
б) разные файлы, но иметь предложенную структуру папок.
А текущее решение — не обязательно применять))) Его еще можно перекроить 10 раз. Мне, до написания этой статьи, просто было немного не понятно как этот Yii «склеивается». Попутно разобрался и избавился от мандража, что перекроить Yii — это страшно)
Тут стоит понимать что yii2-app-advanced
и yii2-app-basic
— это не окончательные варианты структуры проектов. Это шаблоны от команды фреймворка, как можно организовать структуру на одну и на несколько точек входа. Кому подходит, тот пользуется готовым. Кому нет — делает свой шаблон.
Вы даже можете оформить свой вариант в виде пакета для composer, чтобы начинать новые проекты по этому шаблону с команды:
composer create-project --prefer-dist username/yii2-app-cool .
Лично я склоняюсь больше к использованию Yii-basic и модульности. Поскольку кажется, что yii advanced склоняет мешать логику в разных частях приложения, делая проект тем самым более запутанным. Лучше делать несколько проектов со своими направлениями, чем один с разными приложениями.
Интересное решение. Попробуйте на github опубликовать ;)
Спасибо. Да там выше предложена ссылка, где эта задача решается на уровне одного только веб-сервера с помощью реврайтов. Можно сказать, что моя «миссия» уже выполнена другим человеком))))
Yii2-advanced: альтернативное размещение папок для нескольких приложений