Почему $uses считается плохой практикой в ​​cakePHP?

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

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

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

Любые решения?


person AlexBrand    schedule 31.07.2011    source источник


Ответы (3)


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

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

--

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

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

person Ross    schedule 31.07.2011
comment
Не лучшая практика.. вот это из первых уст: groups.google.com/forum/#!msg/cake-php/E3xXtOsBAxc/mMfAOBBFTHkJ - person George M Reinstate Monica; 26.05.2017

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

    $this->loadModel('NewModelName');

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

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

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

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

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

person Ehtesham    schedule 31.07.2011
comment
в чем разница между этим и методом $uses? - person AlexBrand; 31.07.2011
comment
Ну, внутренне использует вызов самой функции loadModel(). каждая модель, которую вы указываете, использует загрузку массива при создании экземпляра нового объекта контроллера. Таким образом, модели, указанные с использованием, будут доступны во всем контроллере. Целесообразно загружать их при необходимости, поэтому используйте loadModel в пользу использования - person Ehtesham; 31.07.2011
comment
Я не уверен, что разбрызгивание серии $this->loadModel() в ваших действиях контроллера является мудрой идеей, если вы точно не знаете, что вам когда-либо понадобится модель только для этой одной конкретной функции. Как только вы продублируете эту строку кода, вы действительно что-то получите? Если вы исключите ненужные модели из массива $uses и перечислите только те, которые вам действительно нужны, это будет гораздо лучшим решением. Другим людям также легче поддерживать, они могут видеть это прямо перед собой, вместо того, чтобы копаться во всех действиях вашего контроллера. - person Charles Sprayberry; 31.07.2011
comment
лучше всего использовать ассоциацию торта, например $this->Model1->RelatedModel->action(), если модели совершенно не связаны, используйте loadModel и всегда избегайте использования. - person Ehtesham; 31.07.2011

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

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

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

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

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

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

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

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

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

person Anh Pham    schedule 31.07.2011
comment
Итак, вы говорите, что нужно иметь одну таблицу пользователей, а затем таблицу учеников, учителей и администраторов, которая в основном будет иметь только столбец id и столбец user_id? Вы бы предпочли сохранить текущий дизайн, создать действия администратора в контроллерах учеников и учителей, а затем использовать ajax, чтобы получить все это на одной странице? - person AlexBrand; 31.07.2011
comment
Да по первому вопросу. Для второго: если вы сохраняете текущий дизайн, использование $uses в контроллере администратора является самым простым способом (не беспокойтесь о влиянии на производительность). Я не на вашем месте, чтобы знать, что лучше в долгосрочной перспективе, и все решения находятся в приемлемом диапазоне; поэтому просто выберите тот, который вам нравится использовать. - person Anh Pham; 31.07.2011