Laravel文档梳理4、控制器

前言:Laravel文档梳理,仅作为记录后看,无关其他。


1、最基本的控制器的样子
<?php

namespace App\Http\Controllers;

use App\User;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * 显示指定用户的个人数据。
     *
     * @param  int  $id
     * @return Response
     */
    public function showProfile($id)
    {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

注意:所有的控制器都应该继承基础的控制器,因为基础的控制器关联着框架核心的东西,换句话说,你控制器不继承基础的控制器,你的业务逻辑就玩不转。

定义一个路由,指向到这个控制器对应的方法:
Route::get('user/{id}', 'UserController@showProfile');

2、定义控制器的路由时,是否需要指定完整的控制器命名空间?
不需要
如 App\Http\Controllers\Photos\AdminController
只需要定义 Photos\AdminController 这部分即可
实例:
Route::get('foo', 'Photos\AdminController@method');

Ps: 原因,默认情况下,RouteServiceProvider 会使用路由群组,把routes.php文件里的所有路由都配置到根控制器的命名空间

3、如何给控制器的路由起名字?
Route::get('foo', ['uses' => 'FooController@method', 'as' => 'name']);
比较一下基础的:
Route::get('foo', 'Photos\AdminController@method');

4、有了这个路由名字,有什么用呢?
比如,你要通过这个名字,知道控制器路由的url,那么这个时候,就用到控制器路由的名字了:
$url = route('name');

5、那只有这一种获取控制器路由的url吗?
不是
如下也可:
$url = action('FooController@method');

6、如何获取正在进行的控制器的行为名称?
$action = Route::currentRouteAction();

7、如何给路由指定中间件
Route::get('profile', [
    'middleware' => 'auth',
    'uses' => 'UserController@showProfile'
]);

8、如何精准地指定中间件?
在构造器中指定。
实例:
class UserController extends Controller
{
    /**
     * 添加一个 UserController 实例。
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');

        $this->middleware('log', ['only' => ['fooAction', 'barAction']]);

        $this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
    }
}
这样,你就可以做到,当前类中,哪些方法,使用哪些中间件,更加的灵活简单,而你如果在路由中定义,那你每个路由都得写。

9、资源控制器是什么?
php artisan make:controller PhotosController
以上这条命令,可以快速生成PhotosController控制器文件:
app/Http/Controllers/PhotosController.php
并且,这个文件中,还包含增删改查等常规方法

接下来,你可以在控制器中注册资源化路由:
Route::resource('photos', 'PhotosController');
这条路由声明,会创建多个路由。

由资源控制器处理的行为:

 

10、声明资源路由时,你也可以指定路由处理的动作
Route::resource('photos', 'PhotosController',
                ['only' => ['index', 'show']]);

Route::resource('photos', 'PhotosController',
                ['except' => ['create', 'store', 'update', 'destroy']]);


11、如何给资源路由重名
Route::resource('photos', 'PhotosController',
                ['names' => ['create' => 'photo.build']]);
Ps: 默认情况资源控制器行为都有名称,不过,你也可以在选项中传递一个names数组,重写名
Route::resource('photos', 'PhotosController',
                ['names' => ['create' => 'photo.build']]);

12、什么叫嵌套资源?
比如相片资源中可能会嵌套多个评论,代码中,如何实现?
路由声明中使用[点]
Route::resource('photos.comments', 'PhotoCommentController');

此路由会注册一个嵌套资源,访问url
photos/{photos}/comments/{comments}

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class PhotoCommentController extends Controller
{
    /**
     * 显示指定相片的评论。
     *
     * @param  int  $photoId
     * @param  int  $commentId
     * @return Response
     */
    public function show($photoId, $commentId)
    {
        //
    }
}
看到参数,一路了然。

13、如何附加资源控制器?
这个问题,说的白话点,资源控制器,默认情况,就那么几个方法,你如何给这个类中,再加几个方法呢?

Route::resource之前,定义所需路由
Route::get('photos/popular', 'PhotosController@method');

Route::resource('photos', 'PhotosController');

14、什么是隐式控制器?
Route::controller('users', 'UserController');
类:
<?php

namespace App\Http\Controllers;

class UserController extends Controller
{
    /**
     * 响应对 GET /users 的请求
     */
    public function getIndex()
    {
        //
    }

    /**
     * 响应对 GET /users/show/1 的请求
     */
    public function getShow($id)
    {
        //
    }

    /**
     * 响应对 GET /users/admin-profile 的请求
     */
    public function getAdminProfile()
    {
        //
    }

    /**
     * 响应对 POST /users/profile 的请求
     */
    public function postProfile()
    {
        //
    }
}
上述例子,index方法,响应控制器所处理的根URI,在这个例子中是users

15、如何命名控制器中的某些路由?
在Route::controller()方法中,传入一个数组,作为第三个参数
Route::controller('users', 'UserController', [
    'getShow' => 'user.show',
]);

16、构造器依赖注入
实例:
<?php

namespace App\Http\Controllers;

use Illuminate\Routing\Controller;
use App\Repositories\UserRepository;

class UserController extends Controller
{
    /**
     * 用户 Repository 实例。
     */
    protected $users;

    /**
     * 创建新的控制器实例。
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }
}

17、方法注入
Route::put('user/{id}', 'UserController@update');

想要从控制器方法中,获取路由参数,那么只需要在依赖之后,列出路由参数即可。
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class UserController extends Controller
{
    /**
     * 更新指定的用户。
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值