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: 执行成功后,会得到如下输出:

UserController

步骤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。

在 Controller 的构造函数中分配中间件

<?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中间件使用中的中间件方法用户控制器构造函数。

例子

步骤1: 将以下几行代码添加到app/Http/routes.php文件并保存:

<?php
Route::get('/usercontroller/path',[
    'middleware' => 'First',
    'uses' => 'UserController@showPath'
]);

步骤2: 通过执行以下代码行创建一个名为FirstMiddleware的中间件:

php artisan make:middleware FirstMiddleware

步骤3: 在app/Http/Middleware的FirstMiddleware中的handle方法中添加以下代码:

<?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:在app/Http/Middleware的FirstMiddleware中的handle方法中添加以下代码:

<?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 后,你将收到以下输出:

UserController1

步骤8: 复制以下代码到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: 访问以下网址:

http://localhost:8000/usercontroller/path

步骤11: 输出将如下图所示:

UserController2

Restful资源控制器


通常在制作应用程序时我们需要执行CRUD(创建、读取、更新、删除)操作,Laravel 让我们轻松完成这项工作,只需创建一个控制器,Laravel 就会自动为 CRUD 操作提供所有方法。你还可以为 routes.php 文件中的所有方法注册一个路由。

步骤1: 通过执行以下命令创建一个名为的MyController控制器:

php artisan make:controller MyController

步骤2: 在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文件中添加以下代码:

Route::resource('my','MyController');

步骤4: 我们现在通过注册一个控制器和资源来注册MyController的所有方法,下面是资源控制器处理的操作表:

请求方法路径动作路由名称
GET/myindexmy.index
GET/my/createcreatemy.create
POST/mystoremy.store
GET/my/{my}showmy.show
GET/my/{my}/editeditmy.edit
PUT/PATCH/my/{my}updatemy.update
DELETE/my/{my}destroymy.destroy

步骤5: 尝试执行下表所示的 URL:

URL描述输出图像
http://localhost:8000/my执行 MyController.php 的 index 方法index
http://localhost:8000/my/create执行 MyController.php 的 create 方法create
http://localhost:8000/my/1执行 MyController.php 的 show 方法show
http://localhost:8000/my/1/edit执行 MyController.php 的 edit 方法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 请求。

步骤1: 执行下面的命令来创建一个控制器,我们保留了类名ImplicitController,你可以为类指定任何名称:

php artisan make:controller ImplicitController --plain

步骤2: 成功执行步骤 1 后,你将得到以下输出:

Implicitcontroller

步骤3: 复制以下代码到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文件中添加以下代码,用于将请求路由到指定的控制器:

Route::controller('test','ImplicitController');

构造函数注入


Laravel 服务容器用于解析所有 Laravel 控制器。因此,你可以在其构造函数中对控制器可能需要的任何依赖项进行类型提示。依赖项将自动解析并注入控制器实例。

步骤1: 添加以下代码应用程序/Http/routes.phpfile.

应用程序/Http/routes.php

class MyClass{
    public $foo = 'bar';
}
Route::get('/myclass','ImplicitController@index');

步骤2: 添加以下代码

应用程序/Http/Controllers/ImplicitController.phpfile.

应用程序/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:访问以下网址测试构造函数注入。

http:// 本地主机:8000/myclass

步骤4: 输出将如下图所示。

Myclass

方法注入


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

步骤1: 添加以下代码应用程序/Http/routes.phpfile.

应用程序/Http/routes.php

class MyClass{
    public $foo = 'bar';
}
Route::get('/myclass','ImplicitController@index');

步骤2: 添加以下代码

应用程序/Http/Controllers/ImplicitController.phpfile.

应用程序/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: 访问以下网址测试构造函数注入。

http:// 本地主机:8000/myclass

它将产生以下输出:

Constructor Injection