【发布时间】:2019-10-27 01:46:12
【问题描述】:
我的代码并没有真正的问题,更像是我的代码结构的问题。
我的项目是用 Laravel 编写的,我使用 laravel 为我们生成的资源控制器。在我的 Update() 函数中,我做了很多数据处理。
一些例子:
更新()
public function update(Request $request)
{
$post = (object) $request->all();
unset($post->XDEBUG_SESSION_START);
$this->preparePassword($post);
$this->prepareMail($post);
$this->prepareAvailability($post);
$this->prepareZip($post);
$this->prepareSofttags($post);
$user = User::find(Auth::id());
$user->update((array) $post);
}
更新调用函数来处理数据。一些例子:
private function prepareAvailability(stdClass &$data) : void
{
// If no days or a date is selected, return
if (empty($data->available_days) && empty($data->available_from)) {
return;
}
// when days are given (available)
if ($data->available_days) {
$days = (int) $data->available_days;
$avail_level = 0.2 * $days;
$data->avail_level = $avail_level;
$data->avail_from = mysqldate(strtotime('today'), true);
unset($data->available_days);
}
// When a date is given (no available)
if ($data->available_from) {
$data->avail_level = 0;
$data->avail_from = mysqldate(strtotime($data->available_from), true);
unset($data->available_from);
}
}
和:
private function prepareZip(stdClass &$data) : void
{
if (empty($data->zip)) {
return;
}
$zip4d = (int) substr($data->zip, 0, 4);
$zipData = Zip::check($zip4d);
$data->city = $zipData->name;
}
我只是向您展示了 2 个功能,尽管我还有更多功能,而且还会有更多功能。现在我的控制器充满了私有函数,它们只是以多种方式处理数据。
有没有更好的方法,我在考虑特质,但特质应该与每个班级兼容。不特定于一个控制器。
有人对此有什么想法吗?
附:如果您不了解代码中使用的某些功能,例如“mysqldate”,我会使用一些辅助功能
【问题讨论】:
-
听起来像是 en.wikipedia.org/wiki/Chain-of-responsibility_pattern 的用途。我发现有人在 Laravel 项目中使用它的 Medium 帖子:medium.com/@nikolakusibojoski/…。在某些 PHP 框架中,所有请求都通过这种类型的链进行处理。
-
从我所看到的到我在整个职业生涯中必须处理的代码,整个代码布局都很可爱!我就是这样做的,所以我对这方面的任何改进都很感兴趣!
-
mysqldate(strtotime('today'), true);可以替换为Carbon::now()->toDateString();Carbon 是 Laravel 自带的,并且有很多日期函数,让事情变得更简单。 -
@Pockets 并感谢您的建议,但那些文章听起来像是他制造了一个问题,然后试图用一些奇怪的模式解决这个问题。 (这就是我的感受)。也许它的倒示例让我觉得“这不会发送任何发送”或我的倒英语。也许两者兼而有之:)
-
您可以创建一个
Request对象,该对象甚至可以在请求数据到达您的控制器之前对其进行修改。这是一个不错的解决方案,因为它将您的操作逻辑放在一个中心位置,并保证您以您期望的方式接收数据。请参阅此示例 - stackoverflow.com/q/28854585/296555。