php - 如何检查许多 Controller 方法正在处理的对象是否存在 DRY 和 Laravel 风格?

标签 php dry laravel

在 Laravel Controller 中,我有几个方法都是从获取数据库记录开始,然后在检查是否找到数据后继续渲染 View ,或者在没有数据的情况下转到 404 页面.

这是一个例子:

<?php

function get_show_user($id)
{
    $user = static::get_user($user_id);
    if (!$user) {
        return Response::error('404', static::$some_common_error404_message);
    }
    return View::make('users.show_readonly_user_data')->with('user', $user);
}

function get_edit_user($id)
{
    $user = static::get_user($user_id);
    if (!$user) {
        return Response::error('404', static::$some_common_error404_message);
    }

    return View::make('users.display_edit_user_form')->with('user', $user);
}

我在这些方法中重复整个 if (!$user) 语句,即使它们都做同样的事情。

我宁愿做这样的事情:

function get_show_user($id)
{
    $user = Users::find($id);
    static::go404_if_null($user);
    return View::make('users.show_readonly_user_data')->with('user', $user);
}

function get_edit_user($id)
{
    $user = Users::find($id);
    static::go404_if_null($user);
    return View::make('users.display_edit_user_form')->with('user', $user);
}

实现这种 DRY 功能的最佳方式是什么?

显然,一个简单的return Response::error('404') 在常见的存在性检查器方法中不起作用,因为它只会从该方法返回。

Event::fire('404') 似乎也不理想,因为它不会终止触发它的方法。

也许这里需要使用异常,但我不确定这个,或者它应该如何在 Laravel 中完成。我应该在哪里捕获 Controller 的 404 异常?

最佳答案

我认为解决这个问题的最佳方法是在 Controller 上添加前置过滤器。

public static $require_user = array(
    'edit_user',
    'show_user',
);

public function before()
{
    $route = Request::route();
    if ( in_array( $route->controller_action, static::$require_user ) )
    {
        $this->user = User::find( $route->parameters[0] );
        if ( is_null($this->user) ) return Response::error('404');
    }
}

在构建 Controller 之后但在调用方法之前调用过滤器之前。如果前过滤器返回 null 以外的任何内容,则不会调用该方法,因此会停止执行。

这里我们获得了当前正在执行的路由,因此我们可以检查将针对我们的数组 $require_user 调用哪个方法。这让我们可以使用不需要用户 ID 的方法,例如登录。

然后我们检索用户实例,从传递给方法的内容中获取 id。您可能应该在此处添加更多错误处理。

最后,我们检查返回的用户是否为空,即未找到。如果是这种情况,我们将返回 404 响应,停止执行该方法。

希望对您有所帮助!

关于php - 如何检查许多 Controller 方法正在处理的对象是否存在 DRY 和 Laravel 风格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13000134/

相关文章:

php - Laravel 查询生成器

php - 样式表和 Symfony

php - 如何使用下拉选项过滤数据

c# - 我应该如何为接口(interface)的多个实现编写单元测试,同时遵守 DRY?

jQuery 结合多个函数以实现更简洁的编码

python - Django/Python 干 : how to avoid repeat code when working with Q objects and model attributes

适用于不同环境的 Laravel Seeder

php - 如何使用 CDbMigration 从表中删除键

php - 警告 : preg_match() [function. 预匹配]:未知修饰符 'v'

Laravel - 一条路线的多个网址