控制器(Controllers)
在MVC框架中,字母“C”代表Controller。 它充当视图和模型之间的引导流量。 在本章中,您将了解Laravel中的控制器。
创建一个控制器
根据您使用的操作系统打开命令提示符或终端,然后键入以下命令以使用Artisan CLI(命令行界面)创建控制器。
php artisan make:controller <controller-name> --plain
将替换为控制器的名称。 这将创建一个普通的构造函数,因为我们传递参数 - plain 。 如果您不想创建普通构造函数,则可以忽略该参数。 可以在app/Http/Controllers看到创建的构造函数。
您将看到已经为您完成了一些基本编码,您可以添加自定义编码。 可以通过以下语法从routes.php调用创建的控制器。
语法 (Syntax)
Route::get(‘base URI’,’controller@method’);
例子 (Example)
Step 1 - 执行以下命令以创建UserController 。
php artisan make:controller UserController --plain
Step 2 - 成功执行后,您将收到以下输出。
Step 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'
]);
这里我们将在配置文件路由中将auth中间件分配给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');
}
}
这里我们使用UserController构造函数中的中间件方法分配auth中间件。
例子 (Example)
Step 1 - 将以下代码行添加到app/Http/routes.php文件并保存。
routes.php
<?php
Route::get('/usercontroller/path',[
'middleware' => 'First',
'uses' => 'UserController@showPath'
]);
Step 2 - 通过执行以下代码行创建一个名为FirstMiddleware的中间件。
php artisan make:middleware FirstMiddleware
Step 3 - 将以下代码添加到app/Http/Middleware新创建的FirstMiddleware的handle方法中。
FirstMiddleware.php
<?php
namespace App\Http\Middleware;
use Closure;
class FirstMiddleware {
public function handle($request, Closure $next) {
echo '<br>First Middleware';
return $next($request);
}
}
Step 4 - 通过执行以下命令创建一个名为SecondMiddleware的中间件。
php artisan make:middleware SecondMiddleware
Step 5 - 在app/Http/Middleware新创建的SecondMiddleware的handle方法中添加以下代码。
SecondMiddleware.php
<?php
namespace App\Http\Middleware;
use Closure;
class SecondMiddleware {
public function handle($request, Closure $next){
echo '<br>Second Middleware';
return $next($request);
}
}
Step 6 - 通过执行以下行创建一个名为UserController的控制器。
php artisan make:controller UserController --plain
Step 7 - 成功执行URL后,您将收到以下输出 -
Step 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;
}
}
Step 9 - 现在,如果尚未执行,请执行以下命令启动php的内部Web服务器。
php artisan serve
Step 10 - 访问以下URL。
http://localhost:8000/usercontroller/path
Step 11 - 输出将如下图所示。
宁静的资源控制器
通常在创建应用程序时,我们需要执行CRUD (Create, Read, Update, Delete)操作。 Laravel让我们的工作变得轻松。 只需创建一个控制器,Laravel将自动提供CRUD操作的所有方法。 您还可以为routes.php文件中的所有方法注册单个路由。
例子 (Example)
Step 1 - 通过执行以下命令创建一个名为MyController的控制器。
php artisan make:controller MyController
Step 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';
}
}
Step 3 - 在app/Http/routes.php文件中添加以下代码行。
app/Http/routes.php
Route::resource('my','MyController');
Step 4 - 我们现在通过向资源注册控制器来注册MyController的所有方法。 下面是资源控制器处理的操作表。
动词 | 路径 | 行动 | 路线名称 |
---|---|---|---|
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 |
Step 5 - 尝试执行下表中显示的URL。
网址 | 描述 | 输出图像 |
---|---|---|
http://localhost:8000/my | 执行MyController.php的索引方法 | 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 |
隐式控制器
隐式控制器允许您定义单个路由来处理控制器中的每个操作。 您可以使用Route:controller方法在route.php文件中定义它,如下所示。
Route::controller(‘base URI’,’<class-name-of-the-controller>’);
将替换为您给控制器的类名。
控制器的方法名称应以HTTP动词开头,如get或post。 如果你用get启动它,它将只处理get请求,如果它以post开头,那么它将处理post请求。 在您可以使用HTTP谓词之后,您可以为该方法指定任何名称,但它应该遵循URI的标题案例版本。
例子 (Example)
Step 1 - 执行以下命令以创建控制器。 我们保留了类名ImplicitController 。 您可以在课程中提供您选择的任何名称。
php artisan make:controller ImplicitController --plain
Step 2 - 成功执行第1步后,您将收到以下输出 -
Step 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';
}
}
Step 4 - app/Http/routes.php下行添加到app/Http/routes.php文件以将请求路由到指定的控制器。
app/Http/routes.php
Route::controller('test','ImplicitController');
构造函数注入
Laravel服务容器用于解析所有Laravel控制器。 因此,您可以在其构造函数中键入提示控制器可能需要的任何依赖项。 依赖关系将自动解析并注入控制器实例。
例子 (Example)
Step 1 - 将以下代码添加到app/Http/routes.php文件中。
app/Http/routes.php
class MyClass{
public $foo = 'bar';
}
Route::get('/myclass','ImplicitController@index');
Step 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);
}
}
Step 3 - 访问以下URL以测试构造函数注入。
http://localhost:8000/myclass
Step 4 - 输出将如下图所示。
方法注入
除了构造函数注入之外,您还可以在控制器的操作方法上键入 - 提示依赖项。
例子 (Example)
Step 1 - 将以下代码添加到app/Http/routes.php文件中。
app/Http/routes.php
class MyClass{
public $foo = 'bar';
}
Route::get('/myclass','ImplicitController@index');
Step 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);
}
}
Step 3 - 访问以下URL以测试构造函数注入。
http://localhost:8000/myclass
它将产生以下输出 -