laravel控制器动作结构

时间:2015-02-11 10:27:44

标签: laravel model-view-controller separation-of-concerns

在观看了许多laracasts之后,到处都有一个声明:尽可能保持控制器的亮度

好的,我正在尝试熟悉laravel概念和哲学,使用Repository和关注点模式分离,我有一些困扰我的问题,让我们假设如下:

Route::resource('/item', 'ItemController');

class Item extends \Eloquent {}

回购

class EloquentItemRepo implements ItemRepo {
        public function all()
        {
                return Item::all();
        }

        public function find($id)
        {
                return Item::where('id', '=', $id);
        }
}

和控制器:

class ItemController extends BaseController {

        protected $item;

        public function __construct(ItemRepo $item)
        {
                $this->item = $item;
        }

        public function index()
        {
                $items = $this->item->all();

                return Response::json(compact('items'))
        }
}

现在,一切都很简单干净(假设repo由提供者等加载)控制器非常简单,除了加载和返回数据之外什么都不做(我使用了json,但任何事情都可以)。

  

请假设我使用的是验证用户的身份验证过滤器   登录并存在,或者如果没有则返回错误,所以我没有   必须在控制器中进一步检查。

现在,如果我需要做更多检查,例如:

response_ *方法是格式化Json响应的帮助程序

public function destroy($id)
    {
        try {

            if ($this->item->destroy($id)) {
                return Response::json(['success' => true]);
            }

            return response_failure(
                Lang::get('errors.api.orders.delete'),
                Config::get('status.error.forbidden')
            );

        } catch (Exception $e) {
            return response_failure(
                Lang::get('errors.api.orders.not_found'),
                Config::get('status.error.notfound')
            );
        }
    }

在这种情况下,我必须测试很多东西:

  • 说明有效吗? (返回true)
  • 破坏失败了吗? (返回false)
  • 删除时出错? (例如:在firstOrFail中找不到该项目)

我有更多测试的方法,我的印象是控制器越来越大,所以我可以处理任何可能的错误。

这是管理这个的正确方法吗?控制器应该充满检查,或者测试应该移到其他地方?

在提供程序中,我经常使用item->firstOrFail()并让异常冒泡到控制器,是不是很好?

如果有人可以指出我正确的方向,因为所有laracasts或其他教程总是使用更简单的情况,而不需要很多控件。

编辑:实际案例

好的,这是我提问的一个实际案例:

控制器

   /**
     * Update an order.
     * @param int $id Order id.
     * @return \Illuminate\Http\JsonResponse
     */
    public function update($id)
    {
       try {

            $orderItem = $this->order->update($id, Input::all());

            if (false === $orderItem) {
                return response_failure(
                    Lang::get('errors.api.orders.update'),
                    Config::get('status.error.forbidden')
                );
            }

            return response_success();

       } catch (Exception $e) {
           return response_failure(
               Lang::get('errors.api.orders.not_found'),
               Config::get('status.error.notfound')
           );
       }
    }

回购

public function update($id, $input)
{
    $itemId = $input['itemId'];
    $quantity = $input['quantity'] ?: 1;

    // cannot update without item id
    if (!$itemId) {
        return false;
    }

    $catalogItem = CatalogItem::where('hash', '=', $itemId)->firstOrFail();
    $orderItem = OrderItem::fromCatalogItem($catalogItem);

    // update quantity
    $orderItem->quantity = $quantity;

    return Order::findOrFail($id)->items()->save($orderItem);
}

在这种情况下,有三个可能的问题:

  • 订单未找到
  • 找不到catalogItem
  • itemId未在帖子数据中设置

在我组织的方式中,问题是顶级错误消息将不会被清除,因为它将始终处于状态:“订单未找到”,即使它是无法找到的目录项。

我看到的唯一可能是在控制器中捕获多个异常代码并引发不同的错误消息,但这不会使控制器过载吗?

0 个答案:

没有答案