我应该在管理员和管理员之间重新使用laravel中的控制器吗? api?或让我的管理员使用我的API?

时间:2013-12-21 23:49:06

标签: php api rest laravel

laravel的新手,并试图找出构建我的应用程序的最佳方法。

它有一个管理界面和一个API(JSON,angularjs前端)。

我的路线目前看起来像:

Route::group(array('prefix' => 'admin', 'before' => 'auth.admin'), function()
{
    Route::any('/', array('as' => 'admin.index', function() {
        return View::make('admin.index');
    }));

    Route::resource('countries.products', 'ProductsController');

    Route::resource('countries', 'CountriesController');

    Route::resource('orders', 'OrdersController');

});

// Route group for API versioning
Route::group(array('prefix' => 'api/v1'), function()
{
    Route::resource('products', 'APIProductsController', array('only' => array('index', 'show')));

    Route::resource('orders', 'APIOrdersController', array('only' => array('store', 'update')));

});

有许多重复的逻辑,例如OrdersController& APIOrdersController。我应该以某种方式重新使用单个控制器,也许是通过内容协商?或者更好的是修改OrdersController以查询API路由而不是使用eloquent?

还是有另一种更好的方法吗?

1 个答案:

答案 0 :(得分:4)

在我看来,我会将所有对象创建逻辑提取到一个合适的类(听起来像repository的好例子)。这个类应该只知道它必须接收的参数,并做出相应的响应。例如:

class EloquentOrder implements OrderRepositoryInterface {

    // Instance of OrderValidator, 
    // assuming we have one
    protected $validator; 

    public function create($params)
    {
        // Pseudo-code
        $this->validator = new Ordervalidator($params);
        if ($this->validator->passes())
            create and return new Order
        else
            return validator errors
    }

}

然后,您的每个模块都可以在其控制器中使用此功能。

在您的API中,您可以拥有:

class APIOrderController extends APIController {

    protected $repository;

    public function __construct(OrderRepositoryInterface $repository)
    {
        $this->repository = $repository;
    }

    public function create()
    {
        // Let's imagine you have an APIAuth class which 
        // authenticates via auth tokens:
        if (APIAuth::check()) {
            $params = Input::all();
            return $this->repository->new($params);
        }

        return Response::json(['error' => 'You are not authorized to create orders'], 401);
    }

}

在您的管理模块中,您可以:

class AdminOrderController extends AdminController {

    protected $repository;

    public function __construct(OrderRepositoryInterface $repository)
    {
        $this->repository = $repository;
    }

    public function create()
    {
        // Now, let's imagine Auth uses a different authentication
        // method, and can check for specific permissions
        if (Auth::check() && Auth::hasPermission('create.orders')) {
            $params = Input::all();
            return $this->repository->new($params);
        }

        return Redirect::home()->with('message', 'You are not authorized to create orders');
    }

}

如您所见,这允许您在不同的上下文中重用对象创建逻辑。在示例中,我使用了不同的身份验证方法和响应来表示灵活性,但这实际上取决于您的项目要求。