MENU

# 01: 基础:定义控制器、命名空间、单个行为控制器

January 14, 2020 • Laravel 入门

定义控制器

Laravel 提供了方便的 artisan 命令用于快速创建控制器,如:php artisan make:controller PostController,执行后将生成 app/Http/Controllers/PostController.php 控制器文件:

php artisan make:controller PostController
<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
    // 添加控制器方法
    public function show(App\Post $post) {
        // ...
    }
}

将路由的处理回调指定到控制器方法:

Route::get('/post/{post}', 'PostController@show');

路由 & 控制器命名空间

在路由中的指定控制器不需要填写完整的命名空间:

Route::get('/post/{post}', 'PostController@show');

这是因为在 web.phpapi.php 中定义的路由都会被分别注入到一个包含命名空间前缀的路由组中,具体可以看 RouteServiceProvider 中的 mapWebRoutesmapApiRoutes 方法:

protected function mapWebRoutes()
{
    Route::middleware('web')
         ->namespace($this->namespace)
         ->group(base_path('routes/web.php'));
}

protected function mapApiRoutes()
{
Route::prefix('api')
        ->middleware('api')
        ->namespace($this->namespace)
        ->group(base_path('routes/api.php'));
}

单个行为控制器

如果一个控制器内只有一个行为,可以在控制器中使用 __invoke 魔术方法,使用 artisan make:controller PostController --invokable 命令:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function __invoke(Request $request)
    {
        //
    }
}

在路由中只需要指定控制器,不需要写方法名:

Route::get('/post', 'PostController');