Эффекты добавления уровня обслуживания в приложение Laravel

Я занимаюсь Zend Framework несколько лет и сейчас изучаю Laravel.

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

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

Если бы мои контроллеры Laravel вызвали бы мой уровень обслуживания, потеряю ли я какие-либо преимущества Laravel? (Насколько я понимаю, я все еще могу использовать привязку маршрута / модели).

В качестве второстепенного вопроса - как лучше всего реализовать мой уровень обслуживания? Может быть, как собрание поставщиков услуг?


person DatsunBing    schedule 29.01.2017    source источник


Ответы (2)


Я также перешел на Laravel из Zend и пропустил свои сервисы. Чтобы успокоить себя, я реализовал пространство имен Service, которое находится в пространстве имен App \ Services. Там я выполняю всю свою модель или обработку данных, которые не хочу видеть в своем контроллере и т. Д.

Пример моего макета контроллера:

<?php
namespace App\Http\Controllers;

use App\Services\Contact as ContactService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Lang;

class IndexController extends Controller
{

    /**
     * Create a new controller instance.
     *
     * @param Request $request
     * @return void
     */
    public function __construct(Request $request)
    {
        $this->_request  = $request;
    }

    /**
     * Standard contact page
     * 
     * @return contact page
     */
    public function contact(ContactService $contactService)
    {
        $errors  = null;
        $success = false;
        if ($this->_request->isMethod('post')) {
            $validator            = $contactService->validator($this->_request->all());
            if ($validator->fails()) {
                $errors = $validator->errors();
            } else {
                $contactService->create($validator->getData());
                $success = true;
            }
        }
        return view('pages/contact', ['errors' => $errors, 'success' => $success]);
    }
}

Службы возвращают валидаторы, обрабатывают примитивы, в основном делают все, что я не хочу видеть в своем контроллере, точно так же, как это было в моих проектах Zend.

Пример обслуживания:

<?php
namespace App\Services;

use Validator;
use Mail;
use App\Models\Contact as ContactModel;

class Contact
{

    /**
     * Get a validator for a contact.
     *
     * @param  array $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    public function validator(array $data)
    {
        return Validator::make($data, [
                'email'     => 'required|email|max:255',
                'phone'     => 'max:255',
                'firstName' => 'required|max:255',
                'lastName'  => 'required|max:255',
                'message'   => 'required'
        ]);
    }

    /**
     * Create a new contact instance after a valid form.
     *
     * @param  array $data
     * @return ContactModel
     */
    public function create(array $data)
    {
        //Handle or map any data differently if needed, just for illustration
        $data = [
            'email'     => $data['email'],
            'firstName' => $data['firstName'],
            'lastName'  => $data['lastName'],
            'language'  => $data['language'],
            'phone'     => $data['phone'],
            'message'   => $data['message']
        ];
        
        // Send an email
        Mail::send('emails.contact', ['data' => $data], function ($m) use ($data) {
            $m->from(config('mail.from.address'), config('mail.from.name'));
            $m->to(env('MAIL_TO', '[email protected]'), env('MAIL_TO'))->subject('Contact form entry from: ' . $data['firstName']);
        });
        
        return ContactModel::create($data);
    }
}
person Kevin Peters    schedule 30.01.2017
comment
Эй, подожди !! Я рекомендую вам прочитать документацию по laravel, я думаю, что это неправильный способ реализации шаблона уровня обслуживания. Я вижу, что вы используете пространство имен службы, выполняя работу с запросом формы, и в уже существующем laravel. поэтому, если Ким Принс или другие люди делают это таким образом, они теряют преимущества laravel. medium.com/@kamerk22/ - person Brian; 01.04.2020

См. Этот пост: «Шаблон проектирования: уровень обслуживания с Laravel 5» @Francoiss https://m.dotdev.co/design-pattern-service-layer-with-laravel-5-740ff0a7b65f .. в дополнение к приведенному выше ответу вы также можете инкапсулировать код проверки внутри отдельный класс валидатора

person abbood    schedule 02.06.2018