Почему использование $ считается плохой практикой в ​​cakePHP? - PullRequest
0 голосов
/ 31 июля 2011

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

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

Единственный способ добиться этого - использовать переменную $uses в контроллере Administrators. Однако во многих местах я читал, что это плохая практика.

Какие-нибудь решения?

Ответы [ 3 ]

3 голосов
/ 31 июля 2011

Другая, возможно, лучшая практика - это использование ClassRegistry::init('MyModel')->myMethod() ( больше чтения @ Cake API )

Загружает объект только при использовании, в отличие от loadModel или uses, при ClassRegistry модели обрабатываются как одиночные.

-

что вы делаете что-то не так: вам нужен доступ к модели, которая не имеет никакого отношения к вашему текущему контроллеру.

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

2 голосов
/ 31 июля 2011

Вы всегда можете использовать другую модель, которая не связана с использованием

    $this->loadModel('NewModelName');

Затем вы можете получить доступ к новой загруженной модели:

    $this->NewModelName->add();    // whatever method model has defined

Почему предпочтение loadModel () перед использованием?

Чтобы получить производительность. Как? использует вызовы самой функции loadModel для загрузки всех моделей, которые вы указали в массиве метаний. Но проблема в том, что если только одному из ваших действий нужна конкретная модель, что будет хорошо, если вы включите ее в каждое действие. например только действие add () требует несвязанной модели, но если вы указали ее в метке использования, независимо от того, какое действие будет называться полностью несвязанной моделью, будет загружаться. Проще говоря, это будет неэффективно. Как будто вы объявили переменные в программе на C, но никогда не использовали их. В случае C компилятор предупредит вас, что вы не используете свои переменные, но, к сожалению, торт не может сказать вам.

Можно использовать, если все ваши действия должны загрузить эту модель, в противном случае используйте loadModel ().

1 голос
/ 31 июля 2011

Вы, вероятно, не читали мой ответ в своем другом вопросе:))

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

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

Единственный способ, который я нашел для достижения этой цели, это использовать $использует переменную в контроллере Администраторы.

Вы неправильно поняли насчет контроллера.Каждый контроллер управляет потоком данных конкретной модели (и связанных моделей).Это не значит, что вы должны оставаться в административном контроллере, чтобы выполнять административные действия. Какая модель, которой вы хотите манипулировать, определяет, в каком контроллере вы должны быть.

Однако во многих местах я читал, что это плохая практика.

Теперь о главном вопросе: использование $ использует красный знак того, что вы делаете что-то не так: вам нужен доступ к модели, которая не имеет ничего общего с вашим текущим контроллером.Теперь в программировании всегда есть исключения, иногда нам нужен доступ к этой модели.Вот где приходит loadModel. Потому что это должно быть редко.Если вам очень нужна модель, вам нужно будет часто вызывать loadModel, что громоздко, для чего и используется $, но тогда это означает, что что-то не так с вашим дизайном приложения:))

Таким образом, вы можете сказать, что использование использования $ является признаком неверного решения (в дизайне БД или в структуре приложения);и так часто использует loadModel.

Редактировать: Any solutions? Я дал одно решение в вашем другом вопросе.Но если вы хотите, чтобы все они были в одном месте, вы можете иметь 1 таблицу пользователей с информацией о пользователях.Каждый пользователь может иметь одно поле «Студент», «Учитель», «Администратор» и поле «группа», чтобы решить, к какой группе относится пользователь.Третье решение - использование $ использует.Его влияние на производительность не будет проблемой на самом деле.Но это будет довольно запутанным, когда вы будете развивать свое приложение дальше.Это то, что вам нужно беспокоиться.Например, я могу сказать, что если вы используете Auth, вам нужно будет немного его настроить, чтобы он работал с 3 моделями.Если вы используете таблицу пользователей, это будет намного проще.

...