Удобный и логичный front-end and back-end

Обсуждение документации. Переводы Cookbook и авторские рецепты.
tiger
Сообщения: 15
Зарегистрирован: 2012.01.07, 21:21

Удобный и логичный front-end and back-end

Сообщение tiger »

Представляю доработанную версию разделения приложения на две части. Статья не претендует на оригинальность, и будет полезна новичкам, подробного и простого описания решения данной задачи не нашел, поэтому буду описывать максимально доступно и подробно .За основу была взята статья из вики: http://www.yiiframework.com/wiki/33/org ... d-back-end. В ней было показано как разделить приложение, но плохо описано все плюсы подобного подхода. Чем хорош данный подход и чем отличается от базового? :

Плюсы:
1) Физическое разделение приложения на уровне каталогов, файлов и настроек
2) Минимум повторяемости кода. в back-end помещается только те файлы, которые нужны, все остальное используется из основного приложения.(modules,models, view и т.д...)
3) Нет свистопляски с .htaccess и rules(urlManager в config), Минимальная настройка
4) Возможность использовать любые модули в обоих частях тоесть создать полностью подульное приложение, причем что бы разделить сторонний модуль на front-end and back-end части достаточно скопировать контроллеры и виды, используемые в админке модуля, в каталог и точно так же подключить в конфигурационном фале. (что касается лишних телодвижений, конечно придется дописать две лишних строчки в config, но дальнейшая работа с модулем доставляет одно удовольствие)
5) Использование общих правил доступа к back-end части сайта, на основе ролей (приписывается в protected/backend/components/controller.php)
Не смотря на все плюсы столкнулся с рядом сложностей(на момент написания статьи не исправлены)

Недостатки/Сложности:
1)При авторизации в front-end части, back-end видит пользователя как не авторизованным, приходится авторизоваться повторно(соответственно и наоборот). Причину пока не выявил, если кто может, помогите исправить. Конечно это не критично, но все же не очень удобно.
2)[s]Не смог настроить роутинг, что бы в браузерной строке убрать расширение входного скрипта, т.е. вместо красивого http://mysite.ru/backend/{ссылки}получается http://mysite.ru/backend.php/{ссылки} .(просто не красиво) Ситуация аналогична, буду рад любой помощи.[/s] (Решено)

А теперь собственно реализация. Начну с самого начала, что бы не было путаницы, при желании можно сравнить с http://www.yiiframework.com/wiki/33/org ... d-back-end.
1) В базовой директории должно лежать два файла: index.php и backend.php(соответственно создаем) и редактируем их сл. образом:

index.php:

Код: Выделить всё

 <?php 
$yii='Z:/home/192.168.0.100/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/frontend.php';

require_once($yii);
Yii::createWebApplication($config)->run(); 
?>
backend.php:

Код: Выделить всё

 <?php 
$yii='Z:/home/192.168.0.100/framework/yii.php';
$config=dirname(__FILE__).'/protected/backend/config/backend.php';
require_once($yii);
Yii::createWebApplication($config)->run(); 
?>
Эти файлы отличаются лишь путем до конфигурационных фалов.

2) Редактируем файлы конфигурации. Но для начала в '/protected' нашего приложения необходимо создать необходимые директории для back-end части:
wwwroot/
-index.php
-backend.php
-assets/
-images/
-js/
-protected/
--config/
----frontend.php
----main.php

--components/
--controllers/
--models/
--views/
--runtime/
--backend/
----config/
----backend.php
----components/
----controllers/
----modules/
----models/
----views/
----runtime/
Как видно у нас появились следующий конфигурационные фалы: frontend.php; main.php; backend.php. Поясню почему так- в main.php мы будем хранить настройки общие для обоих частей, такие как, к примеру, подключение к базе данных, а файлы frontend.php и backend.php будут наследовать основной файл настроек. :

main.php:

Код: Выделить всё

<?php
return array(    
    // preloading 'log' component
    'preload'=>array('log'),
    
    // application components
    'components'=>array(        
        'db'=>array(
            'connectionString' => 'mysql:host=localhost;dbname=yii_hom',
            'emulatePrepare' => true,
            'username' => 'admin',
            'password' => '***',
            'charset' => 'utf8',
            'tablePrefix'=>'tbl_',
        ),
        
        'errorHandler'=>array(
            // use 'site/error' action to display errors
            'errorAction'=>'site/error',
        ),  
        'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CFileLogRoute',
                    'levels'=>'error, warning',
                ),
                // uncomment the following to show log messages on web pages
                /*
                array(
                    'class'=>'CWebLogRoute',
                ),
                */
            ),
        ),
    ),

    // application-level parameters that can be accessed
    // using Yii::app()->params['paramName']
    'params'=>require(dirname(__FILE__).'/params.php'),
); 
backend.php:

Код: Выделить всё

 <?php
$backend=dirname(dirname(__FILE__));
$frontend=dirname($backend);
Yii::setPathOfAlias('backend', $backend);

return CMap::mergeArray(
    // наследуемся от main.php
    require($frontend.'/config/main.php'), 
array(
    'basePath'=>$frontend,
    'name'=>'Админка',
    // Настраиваем пути до основных компонентов нашего backend
    'controllerPath' => $backend.'/controllers',
    'viewPath' => $backend.'/views',
    'runtimePath' => $backend.'/runtime',
    'modulePath'=>$backend.'/modules',
    

    // autoloading model and component classes
    'import'=>array(   
        'application.models.*',
        'application.components.*',        
        'backend.models.*',
        'backend.components.*', 
        'application.modules.user.models.*',
        'application.modules.user.components.*',
                
    ),
    
    'sourceLanguage' => 'en',
      'language' => 'ru',
    
    'modules'=>array(
                'user',
        ),           
    'defaultController'=>'post',

    // application components
    'components'=>array(
        'user'=>array(
            // enable cookie-based authentication
            'allowAutoLogin'=>true,
            'loginUrl' => array('/user/login'),                       
        ), 
        'errorHandler'=>array(
            // use 'site/error' action to display errors
            'errorAction'=>'site/error',
        ),
        'urlManager'=>array(
            'urlFormat'=>'path',
            'showScriptName'=>false,  
            'rules'=>array(     
                // Убираем расширение .php из заголовка.(настройка файла .htaccess далее)
                'backend'=>'post/index',
                'backend/<_c>'=>'<_c>',
                'backend/<_c>/<_a>'=>'<_c>/<_a>',
            ),
        ),
    ),
)
); 
frontend.php:

Код: Выделить всё

 <?php

return CMap::mergeArray(
    // наследуемся от main.php
    require(dirname(__FILE__).'/main.php'), 
array(
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
    'name'=>'MySite - Мой замечательный сайт',
    // autoloading model and component classes
    'import'=>array(
        'application.models.*',
        'application.components.*',
        'application.modules.user.models.*',
        'application.modules.user.components.*',
    ),
    'defaultController'=>'post',    
    'modules'=>array(
                'user',
        ),
    // application components
    'components'=>array(
        'user'=>array(
            // enable cookie-based authentication
            'allowAutoLogin'=>true,             
        ),        
        'urlManager'=>array(
            'urlFormat'=>'path',
            'showScriptName'=>false,
            'rules'=>array(                
            ),
        ),    
    ),
)
); 
Хочу обратить внимание, что в конфигурации есть настройки для yii-user. Дальше объясню на примере этого модуля как разделить его на части.

3) Разделение модуля yii-user.
Скачиваем модуль -> http://www.yiiframework.com/extension/y ... 3-r107.zip
Сначала помещаем все содержимое архива в каталог 'modules' основного сайта. Настраиваем его в соответствии с документацией http://www.yiiframework.com/extension/yii-user/ в нашем случае настройки уже содержаться в ранее созданных файлах.
После чего смотрим какие контроллеры модуля необходимо ограничить от пользователей, в нашем случае это : AdminController.php; RecoveryController.php; ProfileFieldController.php; и в нашем случае(так как проблема с авторизацией в разных частях сайта пока не решена, прийдется скопировать контроллеры авторизации/выхода с сайта) LoginController.php; LogoutController.php. Копируем эти файлы в ' protected/backend/modules/user/controller', удалив из основной части AdminController.php; RecoveryController.php; ProfileFieldController.php (т.к. они там не нужны, мы их уже перенесли и они работают только в админке(backend)). И следует провести аналогичные операции с файлами видов(описывать не буду).
Теперь можно работать с приложением, переделывать вид сайта и модулей под себя, исправлять ссылки, и т.д. Но когда мы откроем ссылку http://mysite/user , к примеру, то модуль отобразиться на белом фоне, что бы этого избежать необходимо отредактировать лишь один файл(в обоих частях): ' protected/components /controller.php' и ' protected/backend/components/controller.php' в нем следует прописать

Код: Выделить всё

public $layout='//layouts/main'; 
Помимо этого в ' protected/backend/components/controller.php ' можно задать общие правила доступа к сайту на основе ролей, к примеру дописать следующее:

Код: Выделить всё

public function filters()
    {
        return array(
            'accessControl', 
        );
    }
    
     // Роли, права доступа к сайту
    public function accessRules()
    {
        return array(              
            array('allow',            
                  'roles'=>array('moderator'),
            ),
            array('deny',  // deny all users                  
                  'users'=>array('*'),
            ),
        );
    } 
Настройка .htaccess:

Код: Выделить всё

IndexIgnore */*
RewriteEngine on

RewriteRule ^backend backend.php

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php 

AddDefaultCharset utf-8
Прошу сильно палками не бить, буду рад любым замечаниям и дополнениям. На мой взгляд получился самый удобный способ разделения сайта. К тому же он не ограничивает использование модулей, причем наоборот, Идея состоит в том, что бы частично или полностью перевести сайт на модульную систему.
Последний раз редактировалось tiger 2012.02.18, 16:15, всего редактировалось 1 раз.
Аватара пользователя
andy_s
Сообщения: 127
Зарегистрирован: 2012.01.22, 13:15

Re: Удобный и логичный front-end and back-end

Сообщение andy_s »

Хех, напоминает мне мой путь освоения различных способов разделения frontend/backend :)

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

Вкратце опишу все наиболее популярные способы:

1. Модуль admin. Самый простой, но очень эффективный. Единый конфиг, единая точка входа, никаких проблем с url, юзерами и т.д. Минус один - это лишь модуль приложения, и придётся мириться с тем, что все assets, runtime, css, images и прочее нужно либо делить с "родителем", либо прилагать какие-то усилия, что отделить их от front'а.
2. Рассмотрю сразу два варианта (первый, второй). Считаю оба пограничным вариантом между предыдущим, когда backend всё ещё теснится внутри protected, и следующим. Если честно, не вижу смысла выбирать средний вариант (хотя внимательные читатели могли заметить, что один из них был описан мной, когда я только начинал изучать behavior'ы и прочие интересности), т.к. телодвижений нужно больше, по сравнению с первым, а "недостатки" те же, что и у следующего.
3. Мой фаворит на данный момент :D Ссылка: http://www.yiiframework.com/forum/index ... __p__54311 На самом деле я пришёл к этому варианту сам, следуя по цепочке, описанной выше, т.к. хотелось полного разделения backend и frontend. Как можно видеть, backend находится в webroot директории как полностью самостоятельная директория. Однако никто нам не запрещает подключить общий конфиг, модели и т.д. Главный плюс: собственная организация директорий (свои css, images, js, темы). Плюс, который некоторые переводят в минус: можно полностью отделить пользователей backend'а от frontend'а. В первом можно использовать классический UserIdentity, а во втором работать с БД, при этом можно легко сделать так, что процессы логина не будут конфликтовать: зашёл админом в backend =>во frontend я ещё гость, никаких покупок в интернет-магазине от имени администратора :lol: Притянутый за уши минус - нельзя сделать ссылку из backend во frontend. Но лично мне, кроме ссылки на главную страницу, большего никогда не требовалось.
4. И ещё один способ для особо крупных приложений: http://www.yiiframework.com/wiki/155/th ... oject-site Хотя принципиально от предыдущего он ничем не отличается (в плане описанных выше возможных проблем уж точно). И да, можно вынести backend вообще на отдельный сервер.

В заключение несколько ссылок по теме:
http://www.yiiframework.com/forum/index ... ontrollers
http://www.yiiframework.com/forum/index ... ent-in-yii
http://www.yiiframework.com/forum/index ... er-folder/

P.S. Вы так и не написали, в чём ваш способ выигрывает и какие не решённые в приведённом по ссылке примере проблемы решает.
chang
Сообщения: 125
Зарегистрирован: 2010.12.03, 20:01

Re: Удобный и логичный front-end and back-end

Сообщение chang »

[php]
'urlManager'=>array(
'showScriptName'=>false, // скроет backend.php и index.php
[/php]
tiger
Сообщения: 15
Зарегистрирован: 2012.01.07, 21:21

Re: Удобный и логичный front-end and back-end

Сообщение tiger »

P.S. Вы так и не написали, в чём ваш способ выигрывает и какие не решённые в приведённом по ссылке примере проблемы решает.
Пожалуй единственно чем этот способ хорош... простотой реализации. да и пост был написан по сути для рускоязычных новичков, лично я подробного описания данной реализации не нашел, поэтому решил описать все сам и более подробно, а реализация через behavior больно запутанна, и к стати третий вариант практически тот же что и у меня, принцыпы теже. Хочу заметить, что я лишь собрал всю инфу и показал как можно огранизовать данное разделение и как с ним в дальнейшем работать. Надеюсь кому то будет полезно.
tiger
Сообщения: 15
Зарегистрирован: 2012.01.07, 21:21

Re: Удобный и логичный front-end and back-end

Сообщение tiger »

chang писал(а):[php]
'urlManager'=>array(
'showScriptName'=>false, // скроет backend.php и index.php
[/php]
т.к. backend лежит внутри protected то данным способом мы не сможем скрыть расширение
Аватара пользователя
andy_s
Сообщения: 127
Зарегистрирован: 2012.01.22, 13:15

Re: Удобный и логичный front-end and back-end

Сообщение andy_s »

http://www.yiiframework.com/wiki/63/org ... havior#hh2
Так можно скрыть backend.php.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Удобный и логичный front-end and back-end

Сообщение Ekstazi »

Может яя чего-то не понимаю (хотя это вряд ли), но указывать полный путь к папке с фреймворком, когда есть константа __FILE__, dirname и относительные пути. При таком подходе теряется переносимость.
Аватара пользователя
andy_s
Сообщения: 127
Зарегистрирован: 2012.01.22, 13:15

Re: Удобный и логичный front-end and back-end

Сообщение andy_s »

Ekstazi писал(а):хотя это вряд ли
Очень скромно :D Как мне помогут относительные пути и __FILE__, если я использую одну установку Yii для N приложений? Например, путь к директории может быть такой: /home/yii-1.1.10/framework. Хотя в реальных условиях я пользуюсь таким выражением: require 'yii-1.1.x/framework/yii.php'; Путь ко всем необходимым версиям Yii есть в include_path.
tiger
Сообщения: 15
Зарегистрирован: 2012.01.07, 21:21

Re: Удобный и логичный front-end and back-end

Сообщение tiger »

andy_s писал(а):http://www.yiiframework.com/wiki/63/org ... havior#hh2
Так можно скрыть backend.php.
Да, спасибо большое, получилось. К посту добавлю решение
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Удобный и логичный front-end and back-end

Сообщение Ekstazi »

Мне такой подход не нравится, так как сайт может кочевать по хостингам и каждый раз прописывать абсолютный путь неправильно. В нете полно статей на эту тему. Я лишь выразил свое мнение. И я периодически сталкивался с подобными проектами, привязанными к "железу". Приходилось отвязывать.
vasilyev.dmitro
Сообщения: 59
Зарегистрирован: 2011.07.17, 15:28

Re: Удобный и логичный front-end and back-end

Сообщение vasilyev.dmitro »

не знаю как у Вас получалось "само по себе" разделять пользователей front и back, но у меня
- в protected папка backend
- копия своего AuthController в protected\backend\controllers\

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

А мне как ни странно надо раздельно)) ибо все-таки это плюс. Отчего же так?
Аватара пользователя
fad
Сообщения: 72
Зарегистрирован: 2012.02.21, 20:26

Re: Удобный и логичный front-end and back-end

Сообщение fad »

А в таком случае gii geneator'ы будут в обоих случаях работать?
Simple Yii CMS — простая CMS на Yii1 (без composer) с веб-инстяллтором и поддержкой разных БД.
Аватара пользователя
Troy
Сообщения: 235
Зарегистрирован: 2011.02.03, 21:04

Re: Удобный и логичный front-end and back-end

Сообщение Troy »

А у нас backend и frontend находятся на разных доменах + используются локалные конфиги, так же общие компоненты вынесены в common, получилась вот такая структура:

- frontend
- - www
- - - css
- - - js
- - - images
- - - index.php
- - models
- - controllers
- - configs
- - - main.php
- - - main-local.php
- - - console.php
- - - console-local.php
- - - test.php
- - - test-local.php
- - views

- common
- - models
- - components

- backend
- - www
- - - css
- - - js
- - - images
- - - index.php
- - models
- - controllers
- - configs
- - - main.php
- - - main-local.php
- - - console.php
- - - console-local.php
- - - test.php
- - - test-local.php
- - views
Аватара пользователя
MOTORIST
Сообщения: 245
Зарегистрирован: 2010.06.24, 10:04

Re: Удобный и логичный front-end and back-end

Сообщение MOTORIST »

Я просто основной контроллер раскидал на Backend и Frontend. Прописал layouts. Весь backend хранится в modules. Каждая сущность backend является модулем.
Данная структура позволяет наращивать функциональность в новых проектах, нет лишних файлов в директории. Если я зашел в модели модуля Users, так там только модели, которые относятся для данного модуля.

P.S. по-моему в cms Юпии такая же архитектура.
В сознании новичка много возможностей, в сознании эксперта — лишь несколько.
Аватара пользователя
nizsheanez
Сообщения: 814
Зарегистрирован: 2011.04.29, 13:09
Откуда: Москва

Re: Удобный и логичный front-end and back-end

Сообщение nizsheanez »

Для больших проектов хорош подход troy - можно до упора плодить фронтенды, раздельно деплоить, но посложнее в поддержке.
Для проектов средних - хорош подход с разбиением на модули и каждый модуль имеет свои админские контроллеры.
Для мелких проектов - можно и модуль admin сделать.
Аватара пользователя
vitovt
Сообщения: 210
Зарегистрирован: 2012.03.21, 10:37
Контактная информация:

Re: Удобный и логичный front-end and back-end

Сообщение vitovt »

Troy писал(а):А у нас backend и frontend находятся на разных доменах + используются локалные конфиги, так же общие компоненты вынесены в common, получилась вот такая структура:

- frontend
- - www
- - - css
- - - js
- - - images
- - - index.php
- - models
- - controllers
- - configs
- - - main.php
- - - main-local.php
- - - console.php
- - - console-local.php
- - - test.php
- - - test-local.php
- - views

- common
- - models
- - components

- backend
- - www
- - - css
- - - js
- - - images
- - - index.php
- - models
- - controllers
- - configs
- - - main.php
- - - main-local.php
- - - console.php
- - - console-local.php
- - - test.php
- - - test-local.php
- - views

Простите, а при таком подходе каков будет .htaccess и где лежат папки вроде framework и requirements ? Собираюсь делать крупный проект, хочется поступит таким образом при разделении frontend и backend дабы иметь возможность масштабироваться
Аватара пользователя
vitovt
Сообщения: 210
Зарегистрирован: 2012.03.21, 10:37
Контактная информация:

Re: Удобный и логичный front-end and back-end

Сообщение vitovt »

И кстати эта схема - это случайно не https://github.com/clevertech/YiiBoilerplate ?
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Удобный и логичный front-end and back-end

Сообщение lancecoder »

у меня схема делится тоже на паблик, приват и общую, о да это же бойлерплат, они запатентовали какое либо разделение ))
Аватара пользователя
nizsheanez
Сообщения: 814
Зарегистрирован: 2011.04.29, 13:09
Откуда: Москва

Re: Удобный и логичный front-end and back-end

Сообщение nizsheanez »

Кому интересен сервис-ориентированный подход смотрите как сделан advanced-application в yii2. Там все это есть.
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Удобный и логичный front-end and back-end

Сообщение lancecoder »

я видел - слизали с бойлерплата
Ответить