несколько приложений в одном проекте

Всем доброго дня!

Кто нибудь знает как правильно разделить приложение на две части : бэк-энд и фронт-энд???? Вот тут есть небольшое обсуждение по этому поводу http://www.yiiframew…12.html#msg4312 я бы хотел спросить это единственный способ?? И каким образом я смогу использовать модели одного приложения в другом???

Если честно, не понятен смысл этого извращения :) Тот чудик какой-то странный, нафиг два логина? Ну если так уж хочется, можно определять, где находимся и логинить соответственно. Скажем, для показа логина – два разных действия (хотя, думаю, можно и через одно замутить), а обработка логина - в одном и том же. А дальше, в зависимости от того, откуда пришел и перенаправлять.

Если делать как написано там, то использовать классы одного приложения в другом можно только если вручную их подгружать. Ну или можно перегрузить Yii autoload и подгружать автоматом со своим приложением.

Еще вариант - наследовать свой класс приложения и в нем реализовать свои отличия.

А можно узнать задачу, может есть более корректные решения?

Есть приложение, которое имеет админский интерфейс и полностью изолированный от него интерфейс пользователя (ну в принципе как всегда).

Т.е. пользователь должен ходить по урлу типа http://localhost/public

а админ должен ходить по урлу http://localhost/private

при этом и админ и пользователи должны обязательно пройти авторизацию.

Сейчас у меня есть просто 2 контроллера public и private.

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

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

http://localhost/public/profile/show - для простого пользователя

и

http://localhost/private/profile/show - для админа

кстати этого можно добиться разделяя контроллеры по подкаталогам…Только вот что-то у меня не получилось этого сделать??

Поддерживает ли Yii разделение контроллеров по подкаталогам?

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

Соответственно делаем так:

contollers/

  public/

      UserController.php

  private/

      UserController.php

  PublicController.php

  PrivateController

И пусть к контроллерам задавать как

index.php?r=public.user/register

index.php?r=private.user/create

Модели можно использовать везде, так как приложение одно.

Вариант №2

А зачем вам вообще админский контроллер? Для действий, которые делаются в админке просто ставьте интерфейс админиский и все. Доступ проверяйте через accessControl и все дела. Таким образом, в UserController.php будет и register и create, но с разными view. Юзер и не отличит. Особенно, если урлы перезаписывать с помощью CUrlManager, то вообшще ништяк

Вариант №3

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

Quote

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

http://localhost/public/profile/show - для простого пользователя

и

http://localhost/private/profile/show - для админа

И зачем нужны лишние проблемы? Пусть заходят по одному и тому же урлу, но админ будет видеть другое. Это разве проблема? :)

Quote

кстати этого можно добиться разделяя контроллеры по подкаталогам....Только вот что-то у меня не получилось этого сделать??

Поддерживает ли Yii разделение контроллеров по подкаталогам?

Поддерживает, смотри топики:

http://www.yiiframew…opic,806.0.html

http://www.yiiframew…opic,268.0.html

Quote

Поддерживает, смотри топики:

http://www.yiiframew…opic,806.0.html

http://www.yiiframew…opic,268.0.html

Да спасибо! Просто думал что как в CI разделителем служит - "/" а оказалась "."

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

Quote

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

Я думаю, это шибочное решение Ты модель из каталога сверху не подключишь, разве что определишь алиас для папки protected фронтенда в бекенда и наоборот и будешь с помощью него импортировать. Я думаю, если ты решил идти путем с двумя приложениями, лучше сделай просто две точки входа - frontend.php, backend.php. И напиши правила в .htaccess, чтобы выглядело как каталоги. Если сильно хочется HTTP-аутентификацию на админку так это можно и на один файл поставить.

Просто по моему вариант №3 у тебя минимальное количество телодвижений и копирования функционала.

Я сейчас у себя релизую вариант 1, возможно перейду на вариант 2, но у меня админка отделяется от проекта слабо.

Я, наверное, не совсем корректно выразился…Я имел ввиду что просто в рамках одного приложения для фронт и бэк частей  - сделаю разные подгаталоги для контроллеров (вариант 1).

Quote

Я, наверное, не совсем корректно выразился....Я имел ввиду что просто в рамках одного приложения для фронт и бэк частей  - сделаю разные подгаталоги для контроллеров (вариант 1).

Имхо, будет повтор кода.

Да повтор кода будет - но только для контроллеров. Библиотеки (а при желании и экшены) - можно общими сделать.

Было бы идеальным, если бы взяли концепцию, как у Symfony.

DARX, расскажи плз как сделано в symfony??? я где то читал что там тоже модели backend не доступны во  frontend…или не так??

Привет еще раз, Андрей

В симфони можно делить проект на сколько угодно приложений:

apps:

  • backend

    • actions
    • config
    • modules
    • templates
    • etc…
  • frontend

    • actions
    • config
    • modules
    • templates
    • etc…
  • another_one

    • actions
    • config
    • modules
    • templates
    • etc…

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

Сами же контроллеры лежат в actions.

Дармен

Дармен, спасибо за разъяснения!

На самом деле удобный принцип!

Quote

Дармен, спасибо за разъяснения!

На самом деле удобный принцип!

Всегда пожалуйста :)

Принцип очень удобен, вот только почему в Yii так не сделают? Думаю, фреймворку цены бы не было…

Konstantin Mirin, я так понимаю, наиболее оптимальным является третий вариант, где мы создаем второй входной скрипт, допустим admin.php, указываем другой конфиг /protected/config/admin.php, в контролерах рулим пермишинами?

а как правильно должен выглядеть новый конфиг, если я правильно понял то там нужно переопределить представления, или?

тема старовата, но вложу пару своих мыслей :)

DARX, ты забыл указать, что в симфонии админский интерфейс редко кто генерит - скаффолдинг рулит.

тем кто не в курсе - в симфонии изначально заложена идея жесткого разделения пользовательской части (frontend) и админской (backend). не много приложений в одной структуре папок, а именно фронт и бэк. хотя ничто не мешает наклепать хоть десять двадцать тысяч миллионов приложений. честно говоря с трудом представляю себе цели и задачи такого проекта :).

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

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

про повтор кода в симфонии - разные приложения и подразумевают под собой РАЗНЫЕ приложения, зачем использовать действия и модули одного приложения в другом - делай тогда плагин и пользуй.

честно говоря не понимаю в чем великая проблема и меньшее удобство в yii сделать разделенные приложения - хоть вон через модули, хоть разными контроллерами - выбирай, что удобнее в каждом конкретном случае. генратора админки, конечно, не хватает… поменял модель, почистил кеш, и ничего больше делать не надо… эх лепота :)

Да, темка устарела, но вопрос так сказать актуальный.

После долгих мучений пришел к выводу что оптимальный вариант (по крайней мере для меня) это с двумя точками входа… плюс еще можно прикрутить наследование собственных контроллеров, дабы “добавить админский функционал”… но вобщем-то вопрос не об этом :)

Quote

Ну если так уж хочется, можно определять, где находимся и логинить соответственно. Скажем, для показа логина -- два разных действия (хотя, думаю, можно и через одно замутить), а обработка логина - в одном и том же. А дальше, в зависимости от того, откуда пришел и перенаправлять.

долго долбился с мануалом, на ум приходит или returlUrl или urlReferrer, но что-то ни то не другое не помогает…

как надо настроить авторизацию чтобы был 1 контроллер?

В конфиге бэкенда прописал 'loginUrl'=>'login.html', потом в конфиге фронтенда тоже самое прописал и создал правило 'login'=>'site/login'

открываю localhost/login.html - urlReferrer пустой, returlUrl равен index.php

открываю localhost/backend.php - перебрасывает на localhost/login.html - значения переменных теже…

в чем мой косяк? ???

или все-таки не ломать голову и сделать показ логина через 2 действия, а обработку в одном? хотя тож чето не понятно как…