Какая конвенция, как и на место запросов в Laravel 4?
Мой вопрос, относительно следующим образом:
public function getIndex()
{
$users = \User::all();
return \View::make('admin.users.index')
->with('title', 'Usuários')
->with('users', $users);
}
в Этом случае я назвал метод all()
Eloquent верно?
, Но давайте скажем, что в будущем в системе, что поиск потребоваться некоторые параметры. Тогда будет выглядеть следующим образом:
$users = \User::where('group_id', 333)->get();
Направленные на то, что это может увеличить (или нет) является правильным оставить эту инструкцию на контроллер? Или лучше создать метод в модели? Например:
$users = \User::getUsers(333);
я Говорю это больше вопрос конвенция.
1 - Когда я должен создать метод в модели для консультации?
2 - Как я избегаю знаменитый "Fat Model"?
Если требуются дополнительные детали мне знать
2 answers
Я использую репозиторий для инъекции зависимостей.
Как бы:
Создайте в своем проекте папку в папке app
имя repository
. В папке repository
создайте php-файл, который будет интерфейс по умолчанию с именем RepositoryInterface
с этого содержимое.
<?php
interface RepositoryInterface {
public function all();
public function toDropDown();
public function toJson();
public function toArray();
public function toListPaginate();
public function remove($id = NULL);
public function get($id = NULL);
public function create();
}
Часто interface
создается по какой-то цели быть таким собственной модели. Будучи этой основе я создаю интерфейс, об этом, что во время инъекции у меня есть имена стандарт. Пример RepositoryCreditoInterface
, то есть, создайте еще один файл PHP с помощью этого содержимое следуя примеру
<?php
interface RepositoryCreditoInterface extends RepositoryInterface { }
Реализация RepositoryCreditoInterface
, создав новый PHP-файл с именем RepositoryCredito
, принимая содержимое реализован и кодирования.
<?php
class RepositoryCredito implements RepositoryCreditoInterface {
protected $nameTable = 'creditos';
public function __construct() { }
public function create(){
return new Credito();
}
public function get($id = NULL){
if ($id){
return Credito::find((int)$id);
}
return NULL;
}
public function remove($id = NULL)
{
if ($id) {
$model = $this->get($id);
if ($model) {
$model->delete();
return true;
}
}
return false;
}
public function toListPaginate()
{
return
DB::table($this->nameTable)
->where('descricao','LIKE', '%'.Input::get('filtro', '').'%')
->orderBy('descricao','asc')
->paginate(10);
}
public function all(){
return Credito::orderBy('descricao')->get();
}
public function toJson(){
return Credito::orderBy('descricao')->get()->toJson();
}
public function toArray(){
return Credito::orderBy('descricao')->get()->toArray();
}
public function toDropDown(){
return Credito::orderBy('descricao')->lists('descricao', 'creditoid');
}
}
Обратите внимание, что такой RepositoryCredito
является Model
Credito
(который ссылается на таблицу creditos
).
Все эти файлы RepositoryInterface
, RepositoryCreditoInterface
и RepositoryCredito
все, в той папке app\repository
.
Чтобы эти классы поднимитесь на Laravel будет в папка app\start\global.php
она будет таким образом:
ClassLoader::addDirectories(array(
app_path().'/commands',
app_path().'/controllers',
app_path().'/models'
app_path().'/database/seeds',
));
Добавить, чтобы выглядеть следующим образом:
ClassLoader::addDirectories(array(
app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/repository',
app_path().'/database/seeds'
));
То есть, добавил файлы в этой папке repository
(app_path().'/repository'
) в свой проект Laravel.
Теперь в папке app\
создайте файл с именем ioc.php
взяв на его содержимое:
<?php
/*
|--------------------------------------------------------------------------
| App::bind IOC
|--------------------------------------------------------------------------
|
*/
App::bind('RepositoryCreditoInterface', 'RepositoryCredito');
Примечание: все интерфейсы, вы можете зарегистрировать этот файл дает организации лучше для проекта.
Чтобы этот файл работал также будете снова в app\start\global.php
в последней строке добавить так:
require app_path().'/ioc.php';
После этих настроек, так что должно выполняться такие инъекции зависимостей в контроллер (Controller
), достаточно просто пройти как в конструкторе (__construct
) интерфейс, которые вы хотите разрешить.
Например:
<?php
class CreditoController extends BaseController {
/*
* construct
*/
public function __construct(RepositoryCreditoInterface $repository) {
parent::__construct();
View::share('titleView', 'Crédito');
$this->repository = $repository;
}
Использованием в index:
public function index() {
$model = $this->repository->toListPaginate();
View::share('routeUpdate', 'admin.credito.update');
return View::make('admin.credito.index')
->with('model', $model);
}
Примечание: В конструкторе вы можете потратить несколько интерфейсов
Тебе я бы посоветовал использовать репозитории, оставляют свой код намного более читаемым и гибкий.
Лучшее(es) способ(ы) с помощью Инъекции зависимостей в Laravel
Поначалу может показаться трудным, но после того, скорректирована структура становится очень легко.