Какая конвенция, как и на место запросов в 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"?


Если требуются дополнительные детали мне знать

Author: Patrick Maciel, 2014-05-09

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);
}

Примечание: В конструкторе вы можете потратить несколько интерфейсов

 2
Author: , 2014-05-09 19:36:52

Тебе я бы посоветовал использовать репозитории, оставляют свой код намного более читаемым и гибкий.

Лучшее(es) способ(ы) с помощью Инъекции зависимостей в Laravel

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

 1
Author: vinicius73, 2017-04-13 12:59:31