乐趣区

关于lavarel:Laravel框架之控制器基础

what 局部

1. 控制器的概念

1.1 为什么要应用控制器?

让咱们思考一个问题:当咱们将全副的申请解决逻辑都通过闭包函数来解决,而不是通过控制器类来组织相干的申请解决逻辑,这将导致什么的影响?

这将导致以下几个问题:

  1. 首先,将全副的申请解决逻辑都交给路由的闭包函数解决,意味着所有的逻辑代码都写在路由文件中。这将造成路由文件体积很大。
  2. 其次,所有的逻辑代码写在一个文件里,会造成代码构造凌乱,无奈正当高效地治理代码。
  3. 再次,所有的逻辑代码糅杂在一起,各性能之间会导致强耦合关系。不合乎“高内聚,低耦合”的开发准则。

应用控制器的几个长处:

  1. 路由的定义更加简洁。
  2. 管制行为的路由能够被缓存,而闭包的路由不会被缓存,路由缓存将会大幅升高利用路由的注册工夫。
  3. 控制器将相干的申请解决逻辑封装成一个控制器类内的不同办法,更加合乎“高内聚,低耦合的”开发准则(解耦),程序的代码构造更加清晰,代码治理起来也更加容易。

1.2 控制器的定义

形象定义:控制器是 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()等办法。

2. 控制器的分类

提醒:当注册单个行为控制器的路由时不须要指名办法。

分类名称 路由中的用法 蕴含的办法 artisan 命令
根底控制器 Route::get(‘photos’, ‘PhotoController@index’); 自定义 php artisan make:controller PhotoController
单行为控制器 Route::get(‘photos’, PhotoController::class); 1 个。__invoke() php artisan make:controller PhotoController –invokable
资源控制器 Route::resource(‘photos’, PhotoController::class); 或 Route::resources([‘photos’ => PhotoController::class]); 7 个。index()、create()、store()、show()、edit()、update()、destroy() php artisan make:controller PhotoController –resource
Api 资源控制器 Route::apiResource(‘photos’, PhotoController::class); 或 Route::apiResources([‘photos’, PhotoController::class]); 5 个。index()、store()、show()、update()、destroy() php artisan make:controller PhotoController –api

补充资源控制器:

如果您须要减少额定的路由到默认的资源路由之中,您须要在 Route::resource 前定义它们;否则,resource 办法定义的路由可能会无意间优先于您定义的路由

Route::get('photos/popular', [PhotoController::class, 'popular']);

Route::resource('photos', PhotoController::class);

默认状况下,Route::resource 将会用英文动词创立资源 URI。如果须要自定义 create 和 edit 行为的动作名,能够在 AppServiceProviderboot 中应用 Route::resourceVerbs() 办法实现。

use Illuminate\Support\Facades\Route;

/**
* 疏导任何应用服务。*
* @return void
*/
public function boot()
{
   Route::resourceVerbs([
       'create' => 'crear',
       'edit' => 'editar',
   ]);
}
退出移动版