Я работаю над проектом. Мне потребовались некоторые базовые значения в разных маршрутах. например показать список пользователей, мест, продуктов на разных страницах / маршрутах. Поэтому я хотел создать общий метод для них, например, где я хочу показать список пользователей. Я вызову метод для пользователя и передам этот список для просмотра.
Я попробовал следующий метод:
$usersArr = User::where('loc_id',session('organization'))
->where('status', '!=', 'Deleted')
->orderBy('id', 'desc')
->lists('username', 'id');
Поэтому я хотел знать, какое место лучше всего подходит для определения таких методов. Должен ли я определить это в модели, контроллера или создать какой-то тип общих функций?
Создайте CommonModel и определите функцию там .. и назовите эту модель
Это общий вопрос. Я думаю, что самый популярный подход — создать для этого класс Repository (например, с именем UserRepository). Вы можете определить метод репо следующим образом:
class UserRepository{
public static function getOrganizationActiveUsers($organization){
return User::where('loc_id', $organization)
->where('status', '!=', 'Deleted')
->orderBy('id', 'desc')
->lists('username', 'id');
}
}
а затем использовать этот метод в других классах, таких как:
$variable = UserRepository::getOrganizationActiveUsers(session('organization'));
Таким образом, вашему классу не нужно будет знать, что существует какая-то сессия. Это полезно, если вы не можете получить доступ к сеансу, например, при доступе к конкретному API.
Также вы можете добавить свой репозиторий в свой контроллер (или любой другой класс) следующим образом:
<?phpuse Namespace/SubnameSpace/UserRepository; // this is very important, to specify the correct full classname with namespace;class SomeController
{__construct(UserRepository $userRepo)
{
$this->userRepo = $userRepo;
}
public function showUserOrganizationUsers()
{
$users = $this->userRepo->getOrganizationActiveUsers(session('organization'));
return $users;
}
}
Это также удобно, если вы, например, хотите внедрить совершенно другой класс, но с теми же методами. (если вы хотите глубже погрузиться в внедрение зависимостей, прочитайте об интерфейсах и контейнере Laravel DI, которые обеспечивают большое удобство при внедрении зависимостей. То, что я показал выше, является простым способом).
Кстати, вы можете проверить некоторые примеры кодовых баз с различными подходами здесь:
Удивительный Laravel на GitHub