Laravel - 控制器

  • 简述

    在MVC框架中,字母“C”代表控制器。它充当视图和模型之间的引导流量。在本章中,您将了解 Laravel 中的控制器。
  • 创建控制器

    根据您使用的操作系统打开命令提示符或终端,然后键入以下命令以使用 Artisan CLI(命令行界面)创建控制器。
    
    php artisan make:controller <controller-name> --plain
    
    将 <controller-name> 替换为您的控制器的名称。当我们传递参数时,这将创建一个简单的构造函数 -plain。如果您不想创建普通构造函数,则可以简单地忽略该参数。创建的构造函数可以在app/Http/Controllers.
    您将看到一些基本编码已经为您完成,您可以添加自定义编码。可以通过以下语法从routes.php 调用创建的控制器。

    句法

    
    Route::get(‘base URI’,’controller@method’);
    

    例子

    步骤 1− 执行以下命令创建UserController.
    
    php artisan make:controller UserController --plain
    
    步骤 2− 成功执行后,您将收到以下输出。
    用户控制器
    步骤 3− 您可以在以下位置看到创建的控制器app/Http/Controller/UserController.php已经为您编写了一些基本编码,您可以根据需要添加自己的编码。
    
    <?php
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    class UserController extends Controller {
       //
    }
    
  • 控制器中间件

    我们以前见过中间件,它也可以与控制器一起使用。中间件还可以分配给控制器的路由或控制器的构造函数内。您可以使用中间件方法将中间件分配给控制器。注册的中间件也可以被限制到控制器的某些方法。

    将中间件分配给路由

    
    Route::get('profile', [
       'middleware' => 'auth',
       'uses' => 'UserController@showProfile'
    ]);
    
    在这里,我们将身份验证中间件分配给配置文件路由中的 UserController。

    在控制器的构造函数中分配中间件

    
    <?php
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    class UserController extends Controller {
       public function __construct() {
          $this->middleware('auth');
       }
    }
    
    这里我们分配auth中间件使用中间件方法UserController构造函数。

    例子

    步骤 1- 将以下代码行添加到app/Http/routes.php文件并保存。
    routes.php
    
    <?php
    Route::get('/usercontroller/path',[
       'middleware' => 'First',
       'uses' => 'UserController@showPath'
    ]);
    
    步骤 2− 创建一个名为的中间件FirstMiddleware通过执行以下代码行。
    
    php artisan make:middleware FirstMiddleware
    
    步骤 3- 将以下代码添加到handle新创建的 FirstMiddleware 的方法app/Http/Middleware.
    FirstMiddleware.php
    
    <?php
    namespace App\Http\Middleware;
    use Closure;
    class FirstMiddleware {
       public function handle($request, Closure $next) {
          echo '<br>First Middleware';
          return $next($request);
       }
    }
    
    步骤 4− 创建一个名为的中间件SecondMiddleware通过执行以下命令。
    
    php artisan make:middleware SecondMiddleware
    
    步骤 5− 在新创建的SecondMiddleware的handle方法中添加以下代码app/Http/Middleware.
    SecondMiddleware.php
    
    <?php
    namespace App\Http\Middleware;
    use Closure;
    class SecondMiddleware {
       public function handle($request, Closure $next) {
          echo '<br>Second Middleware';
          return $next($request);
       }
    }
    
    步骤 6− 创建一个名为UserController通过执行以下行。
    
    php artisan make:controller UserController --plain
    
    步骤 7− 成功执行 URL 后,您将收到以下输出 −
    用户控制器1
    步骤 8- 将以下代码复制到app/Http/UserController.php文件。
    app/Http/UserController.php
    
    <?php
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    class UserController extends Controller {
       public function __construct() {
          $this->middleware('Second');
       }
       public function showPath(Request $request) {
          $uri = $request->path();
          echo '<br>URI: '.$uri;
          
          $url = $request->url();
          echo '<br>';
          
          echo 'URL: '.$url;
          $method = $request->method();
          echo '<br>';
          
          echo 'Method: '.$method;
       }
    }
    
    步骤 9- 现在通过执行以下命令来启动 php 的内部 Web 服务器(如果尚未执行)。
    
    php artisan serve
    
    步骤 10− 访问以下 URL。
    
    http://localhost:8000/usercontroller/path
    
    步骤 11− 输出将如下图所示。
    用户控制器2
  • 安静的资源控制器

    通常在制作应用程序时我们需要执行CRUD (Create, Read, Update, Delete)操作。Laravel 让我们的工作变得轻松。只需创建一个控制器,Laravel 就会自动提供 CRUD 操作的所有方法。您还可以为routes.php 文件中的所有方法注册一个路由。

    例子

    步骤 1− 创建一个名为MyController通过执行以下命令。
    
    php artisan make:controller MyController
    
    步骤 2- 添加以下代码
    app/Http/Controllers/MyController.php文件。
    app/Http/Controllers/MyController.php
    
    <?php
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    class MyController extends Controller {
       public function index() {
          echo 'index';
       }
       public function create() {
          echo 'create';
       }
       public function store(Request $request) {
          echo 'store';
       }
       public function show($id) {
          echo 'show';
       }
       public function edit($id) {
          echo 'edit';
       }
       public function update(Request $request, $id) {
          echo 'update';
       }
       public function destroy($id) {
          echo 'destroy';
       }
    }
    
    步骤 3- 添加以下代码行app/Http/routes.php文件。
    app/Http/routes.php
    
    Route::resource('my','MyController');
    
    步骤 4− 我们现在通过向资源注册控制器来注册 MyController 的所有方法。下面是资源控制器处理的操作表。
    Verb Path Action Route Name
    GET /my index my.index
    GET /my/create create my.create
    POST /my store my.store
    GET /my/{my} show my.show
    GET /my/{my}/edit edit my.edit
    PUT/PATCH /my/{my} update my.update
    DELETE /my/{my} destroy my.destroy
    步骤 5− 尝试执行下表中显示的 URL。
    URL Description Output Image
    http://localhost:8000/my Executes index method of MyController.php index
    http://localhost:8000/my/create Executes create method of MyController.php create
    http://localhost:8000/my/1 Executes show method of MyController.php show
    http://localhost:8000/my/1/edit Executes edit method of MyController.php edit
  • 隐式控制器

    隐式控制器允许您定义单个路由来处理控制器中的每个操作。您可以在route.php文件中定义它Route:controller方法如下图。
    
    Route::controller(‘base URI’,’<class-name-of-the-controller>’);
    
    将 <class-name-of-the-controller> 替换为您为控制器指定的类名。
    控制器的方法名称应以 HTTP 动词开头,例如 get 或 post。如果以 get 开头,它将只处理 get 请求,如果以 post 开头,它将处理 post 请求。在 HTTP 动词 you can 之后,您可以为该方法指定任何名称,但它应该遵循 URI 的标题大小写版本。

    例子

    步骤 1− 执行以下命令创建控制器。我们保留了班级名称ImplicitController。您可以为班级指定任何您选择的名称。
    
    php artisan make:controller ImplicitController --plain
    
    步骤 2− 成功执行步骤 1 后,您将收到以下输出 −
    隐式控制器
    步骤 3- 将以下代码复制到
    app/Http/Controllers/ImplicitController.php文件。
    app/Http/Controllers/ImplicitController.php
    
    <?php
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    class ImplicitController extends Controller {
       /**
          * Responds to requests to GET /test
       */
       public function getIndex() {
          echo 'index method';
       }
       
       /**
          * Responds to requests to GET /test/show/1
       */
       public function getShow($id) {
          echo 'show method';
       }
       
       /**
          * Responds to requests to GET /test/admin-profile
       */
       public function getAdminProfile() {
          echo 'admin profile method';
       }
       
       /**
          * Responds to requests to POST /test/profile
       */
       public function postProfile() {
          echo 'profile method';
       }
    }
    
    步骤 4- 将以下行添加到app/Http/routes.php文件将请求路由到指定的控制器。
    app/Http/routes.php
    
    Route::controller('test','ImplicitController');
    
  • 构造函数注入

    Laravel 服务容器用于解析所有 Laravel 控制器。因此,您可以在其构造函数中键入控制器可能需要的任何依赖项。依赖项将自动解析并注入到控制器实例中。

    例子

    步骤 1- 添加以下代码app/Http/routes.php文件。
    app/Http/routes.php
    
    class MyClass{
       public $foo = 'bar';
    }
    Route::get('/myclass','ImplicitController@index');
    
    步骤 2- 添加以下代码
    app/Http/Controllers/ImplicitController.php文件。
    app/Http/Controllers/ImplicitController.php
    
    <?php
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    class ImplicitController extends Controller {
       private $myclass;
       
       public function __construct(\MyClass $myclass) {
          $this->myclass = $myclass;
       }
       public function index() {
          dd($this->myclass);
       }
    }
    
    步骤 3− 访问以下 URL 来测试构造函数注入。
    
    http://localhost:8000/myclass
    
    步骤 4− 输出将如下图所示。
    我的课
  • 方法注入

    除了构造函数注入之外,您还可以键入 - 暗示对控制器操作方法的依赖关系。

    例子

    步骤 1- 添加以下代码app/Http/routes.php文件。
    app/Http/routes.php
    
    class MyClass{
       public $foo = 'bar';
    }
    Route::get('/myclass','ImplicitController@index');
    
    步骤 2- 添加以下代码
    app/Http/Controllers/ImplicitController.php文件。
    app/Http/Controllers/ImplicitController.php
    
    <?php
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    class ImplicitController extends Controller {
       public function index(\MyClass $myclass) {
          dd($myclass);
       }
    } 
    
    步骤 3− 访问以下 URL 来测试构造函数注入。
    
    http://localhost:8000/myclass
    
    它将产生以下输出 -
    构造函数注入