gpt4 book ai didi

laravel - 在 Laravel 应用程序中添加服务层的效果

转载 作者:行者123 更新时间:2023-12-02 00:38:40 25 4
gpt4 key购买 nike

我已经使用 Zend Framework 开发多年,现在正在学习 Laravel。

在我以前的应用程序中,我通常有一个由 Controller 调用的服务层。服务层位于映射器和域模型的顶部,负责一些应用程序逻辑、引发事件、一些输入过滤等。

为什么我不应该在 Laravel 中实现服务层?在我目前看到的示例中, Controller 直接与域对象(或更准确地说,事件记录)一起工作。

如果我的 Laravel Controller 调用我的服务层,我会失去 Laravel 的任何优势吗? (据我所见,我仍然可以使用 Route/Model 绑定(bind))。

作为次要问题 - 实现我的服务层的最佳方式是什么?作为服务提供商的集合,也许?

最佳答案

我也从 Zend 切换到 Laravel 并错过了我的服务。为了安慰自己,我实现了一个位于命名空间 App\Services 中的服务命名空间。在那里,我完成了我不想在 Controller 等中看到的所有模型或数据处理。
我的 Controller 布局示例:

<?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]);
}
}
服务返回验证器,处理杂物,基本上做我不想在我的 Controller 中看到的所有事情,就像我在 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', 'hello@world.com'), env('MAIL_TO'))->subject('Contact form entry from: ' . $data['firstName']);
});

return ContactModel::create($data);
}
}

关于laravel - 在 Laravel 应用程序中添加服务层的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41926737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com