Рекомендации по CakePHP: Админ с маршрутизацией или без нее

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

Что в этом отношении считается передовым опытом для надежного приложения CakePHP (или другого фреймворка MVC)?


person seth    schedule 15.07.2010    source источник
comment
У меня есть два предложения отказаться от маршрутизации, что я склонен сделать, но как только я начал пробовать это, я чувствую, что врезался в кирпичную стену. В приложении без фреймворка я бы просто создал нового администратора каталога и поместил туда все мои контроллеры, специфичные для администратора, многие из которых будут иметь то же имя, что и внешние контроллеры, и, следовательно, будут доступны: / admin / users / add . Я не нахожу способа сделать что-то подобное с Cake. Мой единственный вариант / admin_users / add?   -  person seth    schedule 18.07.2010


Ответы (5)


Я бы предложил просто разделить интерфейсное приложение и админку на два отдельных приложения (/app и /admin). Просто представьте, что администратор - это простое интерфейсное приложение, выполняющее всю «грязную» работу с базой данных.

Таким образом вы сможете получить доступ к своему администратору с помощью префикса / admin в URL-адресе или установить для DocumentRoot значение / admin / webroot и получить доступ к администратору с помощью поддомена (например, admin.myapp.com).

Чтобы избежать дублирования кода модели, вы можете поместить свои модели в какую-нибудь общую папку (например, /vendors/core/models) и добавить этот путь к путям моделей в bootstrap.php файлах (App::build('models' => array(VENDORS . 'core/models/')) для CakePHP 1.3, $modelPaths = array(VENDORS . 'core/models/') для CakePHP 1.2).

Чтобы добавить в свои модели дополнительные элементы, специфичные для администратора или приложения, вы можете расширить свои базовые модели в / models, загрузив базовую модель и расширив ее:

App::import('Model', 'CoreModelName');

class CustomCoreModelA extends CoreModelA
{
    function specificMethod() {}
}

Это может быть сделано для общих компонентов, поведения и т. Д.

person ljank    schedule 03.09.2010
comment
насчет использования двух приложений, я бы согласен, и это то, о чем я думаю. но ставить модели продавцам - это уродливая уловка. вместо этого используйте APP :: build в одном приложении, чтобы указать файлы модели в другом приложении. с этим есть проблемы, особенно когда дело касается плагинов. очень медленно смотрится во многих каталогах. - person dogmatic69; 14.10.2010
comment
Вы правы, размещение общих моделей в каталоге / vendors некрасиво и взломано, использование каталога других моделей приложений для поиска моделей звучит лучше. Единственная проблема - это отсутствие пространств имен, поэтому вам придется добавлять префиксы ко всем вашим моделям администратора. А как насчет производительности? Что ж, вам нужно выбрать, иметь ли чистую и удобную в обслуживании архитектуру или молниеносное приложение, но с множеством архитектурных недостатков. - person ljank; 15.10.2010

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

function add(){
$this->_add();
}

function admin_add(){
$this->_add();
}

function _add(){
... your code ...
}

Я готов поспорить, что это не весь ваш код, и без использования маршрутизации администратора вы получите много кода, выполняющего if(... is admin ...) { echo 'blaa'} else { echo 'foo'; }

person dogmatic69    schedule 14.10.2010

Не беспокойтесь о маршрутизации администратора, если она не соответствует вашему сценарию. Я тоже им не пользуюсь, админки не подходят моему приложению. Дублирование кода - пустая трата усилий.

Вы можете использовать правила ACL для детализированных ролей или просто проверить роль (флаг администратора) в beforeFilter () контроллера или в первой строке действия.

У меня есть функция Component checkRole (array ()), которая вызывается в первой строке моих действий. Если текущий пользователь не имеет предоставленных ролей, он регистрирует и завершает запрос.

person sibidiba    schedule 16.07.2010

Во-вторых, я бы использовал ACL / роли для реальных вещей администратора и, вероятно, не использовал маршрутизацию администратора в производстве. Иногда я поддерживаю административную маршрутизацию (то есть минимальный дополнительный код) для низкоуровневой административной информации, доступной только мне, но это, вероятно, нецелесообразно в надежном производственном приложении.

Редактировать после комментария: это не оптимально, но вы можете собрать что-то, что будет выглядеть так, как вы хотите, в URL-адресах, а также упорядочить по папкам. Я еще не смог его протестировать, но вот идея:

Создайте папку «admin» в папке ваших контроллеров, а для пользователя admin создайте файл контроллера users_admin_controller.php. Они сворачивают структуру папок, поэтому вы по-прежнему не можете иметь те же имена, что и ваш корневой каталог, но вы все равно можете разделить их в папку.

По умолчанию это будет ситуация типа /admin_users/add, но это можно изменить с помощью второй части, некоторой маршрутизации:

Router::connect('/admin/users/:action', array('controller'=>'admin_users'))

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

person cincodenada    schedule 16.07.2010
comment
Итак, как же выглядят ваши URL-адреса раздела администратора? Я чувствую, что это было бы несложно, за исключением того, что нет хорошего способа разместить контроллеры в подкаталогах, доступ к которым осуществляется через / subdir / control / action (например, / admin / users / add). Вы просто называете все свои контроллеры администратора с добавлением имени администратора (например, / admin_users / add)? - person seth; 17.07.2010
comment
При использовании ACL / ролей есть только страницы / действия, которые либо доступны только администраторам, либо имеют дополнительные функции с администраторами. Но я думаю, что вы спрашиваете, когда используете строительные леса или разделы администратора. Там вы можете использовать маршрутизацию администратора, чтобы админ / пользователи / добавлялись как хотите. См. Руководство по CakePHP: book.cakephp.org/view/46 / При этом у вас есть только admin_add функция в вашем контроллере пользователей, доступ к которой осуществляется через /admin/users/add, а затем обычная функция add, доступ к которой осуществляется через /users/add. - person cincodenada; 19.07.2010
comment
Я полностью понимаю (и реализовал) ACL / роли и не использую строительные леса. У меня просто много одинаковых контроллеров фронтенда / админки. Я хотел бы поместить контроллеры администратора в подкаталог / admin, а URL-адреса выглядели бы как / admin без использования префиксов. - person seth; 19.07.2010
comment
Ах, я вижу, что вы ищете. Похоже, что вы можете размещать контроллеры в папках, но это в основном сглаживает структуру каталогов при переходе к URL-адресам (trac.cakephp.org/ticket/3567). Это усложняет любую попытку сделать что-то изящно. И я не думаю, что маршрутизация достаточно гибкая, чтобы делать какие-либо хитрые трюки вроде / admin / users / blah - ›/ admin_users / blah, что было бы еще одним обходным решением, если бы оно сработало. - person cincodenada; 19.07.2010
comment
Я отредактировал решение с другой идеей. Он не выполняет admin / users- ›admin_users автоматически, но должен работать, особенно если разделов администратора не так много. - person cincodenada; 21.07.2010

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

person Nigel    schedule 05.08.2010
comment
В итоге я использовал префикс ACL + (который на самом деле не отличается от моей первоначальной реализации). Меня все еще довольно раздражает, как cake обрабатывает структуры каталогов, имена файлов и ссылки. Было бы идеально, если бы контроллер находился в каталоге администратора, который стал бы частью пути URL. - person seth; 06.08.2010