作者:京东科技 韩国凯前言Go语言定义Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态、强类型、编译型语
顺晟科技
2021-07-07 13:32:27
67
让我们思考一个问题:当我们将全部的请求处理逻辑都通过闭包函数来处理,而不是通过控制器类来组织相关的请求处理逻辑,这将导致什么的影响?
这将导致以下几个问题:
首先,将全部的请求处理逻辑都交给路由的闭包函数处理,意味着所有的逻辑代码都写在路由文件中。这将造成路由文件体积很大。其次,所有的逻辑代码写在一个文件里,会造成代码结构混乱,无法合理高效地管理代码。再次,所有的逻辑代码糅杂在一起,各功能之间会导致强耦合关系。不符合“高内聚,低耦合”的开发原则。使用控制器的几个优点:
路由的定义更加简洁。控制行为的路由可以被缓存,而闭包的路由不会被缓存,路由缓存将会大幅降低应用路由的注册时间。控制器将相关的请求处理逻辑封装成一个控制器类内的不同方法,更加符合“高内聚,低耦合的”开发原则(解耦),程序的代码结构更加清晰,代码管理起来也更加容易。抽象定义:控制器是MVC中的C层,是"承上启下"的一个控制转发层。收集来自http的请求参数,并将这些参数传递给Model层。但在实际开发中,我们通常在Controller层和Model层中间抽象出Service层,专门用来进行业务逻辑处理。
代码定义如下:
<?php
namespace App\Http\Controllers;
use App\Services\UsersService as Service;
use Illuminate\Http\Request;
class UsersController extends Controller
{
protected $request;
protected $service;
public function __construct(Request $request, Service $service)
{
$this->request = $request;
$this->service = $service;
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
// return 'hello world';
return $this->service->index();
}
}
值得指出的是:控制器
不是必须继承基础类 Controller。但是如果控制器没有继承基础类,将无法使用一些便捷的功能,比如
middleware(),validate()和dispatch()等方法。
提示:当注册单个行为控制器的路由时不需要指名方法。
补充资源控制器:
如果您需要增加额外的路由到默认的资源路由之中,您需要在
Route::resource
前定义它们;否则,resource
方法定义的路由可能会无意间优先于您定义的路由
Route::get('photos/popular', [PhotoController::class, 'popular']);
Route::resource('photos', PhotoController::class);
默认情况下,Route::resource 将会用英文动词创建资源 URI。如果需要自定义 create 和 edit 行为的动作名,可以在 AppServiceProvider 的 boot 中使用 Route::resourceVerbs() 方法实现。
use Illuminate\Support\Facades\Route; /** * 引导任何应用服务。 * * @return void */ public function boot() { Route::resourceVerbs([ 'create' => 'crear', 'edit' => 'editar', ]); }
26
2023-02
20
2023-02
29
2022-11
19
2022-10
15
2022-10
30
2022-09