Совместное использование контроллеров, моделей и представлений в мультисайтовой установке CakePHP 2.3

Я создаю расширенную установку CakePHP 2.3 (несколько приложений-веб-сайтов, которые используют одну и ту же папку lib, где расположены все основные файлы торта). Это работает без проблем, я просто редактирую файл core.php в папке Config для каждого приложения, чтобы оно знало, где найти файлы торта. Файловая система выглядит примерно так:

[root]
    [cake-core-files]
    [websites]
        [website-1]
            [app]
            [plugins]
            [vendors]
        [website-2]
        ...
        [website-N]

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

Я видел концепцию поставщиков и плагинов в CakePHP (на самом деле я использую плагины на этих веб-сайтах, но из папки /app/plugins), но я не уверен, сработает ли это в моем случае, или как бы я это настроил. Я предполагаю, что идея заключалась бы в том, чтобы иметь другую папку (например, [shared_objects]) на том же уровне, что и [cake-core-files] и [веб-сайты], но я не знаю, как мне настроить торт для этого. или как вызывать эти объекты из каждого приложения.

Есть идеи?

ИЗМЕНИТЬ

Основываясь на комментариях/ответах ниже, я пытаюсь сделать это с помощью функции App:build() в файле bootstrap.php, но не могу заставить ее работать. Вот что я сделал:

  1. Добавлена ​​новая папка, в которую я хочу поместить материалы для совместного использования всеми приложениями:

    [root] [cake-core-files] [shared-stuff] --> NEW FOLDER [Model] [Config] [websites] [website-1] и т. д...

  2. Поместил модель User.php в новую папку [shared-stuff/Model].

  3. Добавил эту строку в бутстрап:

    App::build(array('Model' => array('/path/to/shared-stuff/Model')));
    
  4. Удалена модель User.php из исходного местоположения [website-1/app/Model].

После этих шагов, кажется, работает, модель User.php правильно загружается из папки [shared-stuff] (я проверял, что печать App::objects('Model' ); указана модель User). Однако на самом деле это не работает, когда я вызываю эту модель из UsersController в функции login(), вход в систему не работает (хотя я не получаю никакой ошибки, даже с отладкой, установленной на 2).

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

Одно можно сказать наверняка: если я оставлю точно такую ​​же модель User.php в ее исходном местоположении ( [website-1/app/Model]), все будет работать нормально, включая логин, так что это проблема с тем, как я пытаюсь настроить все это совместное использование, а не с самой моделью.

Любые идеи, что я делаю неправильно?


person Albert    schedule 02.01.2013    source источник
comment
Downvote - Нет, вы не используете модели/контроллеры в разных приложениях. Вы можете делиться плагинами, и это правильный путь.   -  person Reactgular    schedule 02.01.2013
comment
@MathewFoscarini знаете ли вы, как настроить плагин, который используется несколькими приложениями?   -  person Albert    schedule 02.01.2013
comment
book.cakephp.org/2.0/en /основные утилиты-библиотеки/   -  person Reactgular    schedule 03.01.2013
comment
App::build(array('plugins'=›array('c:/plugin/')));   -  person Reactgular    schedule 03.01.2013
comment
добавьте это в свой бутстрап   -  person Reactgular    schedule 03.01.2013
comment
выглядит многообещающе, спасибо! Кстати, я должен поместить ваш ответ в ответ, чтобы я мог принять его?   -  person Albert    schedule 03.01.2013
comment
Было бы неплохо, если бы вы могли голосовать против комментариев людей, которые не знают, о чем говорят. Наличие глобального плагина вполне допустимо, например: зачем вам поддерживать n копий комплекта отладки для пример, когда вы можете просто включить его один раз. Смотрите мой ответ ниже.   -  person dogmatic69    schedule 04.01.2013


Ответы (2)


Я думаю, что было бы полезно поделиться некоторым контроллером/моделью между несколькими веб-сайтами и сделать это без плагина: использование общего контроллера/модели позволяет вам перезаписать его, если это необходимо. Это должно произойти просто путем копирования контроллера/модели в нужную папку сайта, и система должна использовать его вместо общего!

РЕДАКТИРОВАТЬ: Замечательно, это работает, но я думаю, что в официальной документации торта есть небольшая ошибка: все пути должны заканчиваться разделителем каталогов! В книге cakephp нет завершающей косой черты. Добавьте его в путь к App::build и все будет работать отлично!

person alefalezza    schedule 03.02.2013
comment
Это было!!! Круто, теперь работает! Это сэкономит мне много времени в будущих проектах, спасибо, что указали на это! Немного неубедительно, что в официальной книге cakephp есть такая ошибка... - person Albert; 12.02.2013

У вас могут быть плагины в ядре Plugins/ dir

[root]
    [lib]
        [Cake]
    [Plugins]
        [Available]
        [To]
        [All]
    [website-1] // the 'app' dir -> https://github.com/cakephp/cakephp/tree/master/app
        [plugins]
        [vendors]
    [website-2] // you can have many of them named anything, 'app' is just one.
        ...
    [website-N]

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

EG:

Посмотрите на это. Скопируйте app в website-1, повторите до website-n.

person dogmatic69    schedule 04.01.2013
comment
Я отредактировал свой вопрос, чтобы объяснить, что я пытаюсь сделать, основываясь на том, что вы и другой человек сказали. Не могли бы вы посмотреть на него и увидеть, что я делаю неправильно? Большое спасибо! - person Albert; 04.01.2013