одна переменная и несколько контроллеров - PullRequest
0 голосов
/ 18 мая 2010

Я работаю над веб-приложением, используя инфраструктуру CAKEPHP. Для этого мне нужно запросить одну переменную на нескольких страницах (все страницы имеют разные контроллеры). очевидно, что я получаю сообщение об ошибке на нескольких страницах, поскольку переменная не объявлена ​​во всех различных контроллерах.

Есть ли обходной путь для этого? я уже пробовал app :: import, чтобы импортировать контроллер в другой контроллер, но это, похоже, не работает (все еще появляется неопределенная ошибка переменной).

Спасибо за сотрудничество!

С уважением, Simon

Ответы [ 5 ]

2 голосов
/ 18 мая 2010

Повторяющийся вопрос , но я думаю, что он сформулирован немного лучше, поэтому я вставлю свой ответ здесь:

Стоя на плечах комментариев Десез и ответа Дэвида Йелла, я думаю, что им удалось вычеркнуть приличное представление о том, к чему вы пытаетесь добраться. Может быть. Так что с этим свободным пониманием того, что ты видишь и что у тебя есть ...

По умолчанию метод PagesController::display() создает представление домашней страницы (home.ctp). Я подозреваю, что это то, о чем ты говоришь. Тем не менее, переменная, которую вы устанавливаете в методе вашего SectionsController, не будет доступна вашей домашней странице, которая создается другим методом в другом контроллере. Если вы хотите, чтобы переменная была доступна для всех представлений, вы можете сделать несколько вещей:

  1. Вы можете установить переменную в файле config/core.php (обычно не рекомендуется)
  2. Вы можете установить его в config/bootstrap.php, если это константа. Под этим я подразумеваю, что это значение, которое вы собираетесь использовать в жестком коде, а не что-то динамически генерируемое. Неважно, создаете ли вы переменную как константу.
  3. Вы можете установить в своем AppController методом beforeFilter() или beforeRender(). Все ваши пользовательские контроллеры (при условии, что вы следовали протоколу) наследуются от AppController. Если вы выберете этот путь, сделайте копию cake/libs/controller/app_controller.php и поместите ее в каталог app/.

Это способы, которые, я думаю, будут наилучшим образом отвечать вашим потребностям, насколько я их понимаю.

1 голос
/ 18 мая 2010

Вы можете использовать Configure.write ... подробнее здесь

Подробнее о настройке класса

0 голосов
/ 19 мая 2010

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

В подобных ситуациях я создал таблицу предпочтений (с такими полями, как, id, name и value). Затем добавьте значение $ used в app_controller, чтобы сделать его доступным для всех контроллеров. Наконец, просто возьмите его с поиском вызова. (т. е. $ foo = $ this-> Preferences-> find ('first', array ('условие' => array ('name' = 'foo')));

0 голосов
/ 18 мая 2010

Вы можете использовать методы обратного вызова beforeRender() или beforeFilter() из AppController . :)

Они будут вызываться при каждом запросе страницы. :)

0 голосов
/ 18 мая 2010

Один из способов убедиться, что переменная доступна на всех страницах, - определить ее на фронт-контроллере (обычно index.php) или в любом другом всегда включаемом файле (например, глобальные конфигурации), другой вариант - использовать $_SESSION супер глобальный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...