laravel笔记-控制器

27 篇文章 0 订阅
17 篇文章 0 订阅
本文是关于Laravel框架的控制器使用笔记,包括控制器的定义、创建、调用、与中间件的交互,以及单动作、资源和隐式控制器的讲解。同时,介绍了参数处理和路由缓存的概念,帮助读者掌握Laravel中控制器的核心操作。
摘要由CSDN通过智能技术生成

laravel笔记-控制器

写在前面

时间可贵,善用目录↑

学习Laravel的笔记,仅仅是作为laravel文档笔记,目的是强化对文档的理解,质量不高。


什么是控制器(Controller)

将相关的 HTTP 请求封装到一个类中进行处理。通常控制器存放在 app/Http/Controllers 目录中。

继承App\Http\Controllers\Controller

控制器嘛,起一个控制调度的作用。

一个简单的控制器:

namespace App\Http\Controllers;

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

class UserController extends Controller
{
    /**
     * 为指定用户显示详情
     *
     * @param int $id
     * @return Response
     */
    public function show($id)
    {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

怎么用?

创建

Artisan命令:

php artisan make:controller <controller-name>

当然也可以自己写~

调用

在路由文件中调用控制器~

最简单的一种方法:

//当用户访问user时,调用UserController的show方法
Route::get('user/{id}', 'UserController@show');
//命名空间可以省略App\Http\Controllers 

和中间件的互动

给控制器分配中间件有两种方法

一是在路由中分配中间件(laravel笔记-中间件、路由中有介绍):

Route::get('profile', 'UserController@show')->middleware('auth');

二是在控制器中绑定中间件:

class UserController extends Controller
{
    /**
     * 实例化一个新的 UserController 实例
     *
     * @return void
     */
    public function __construct()
    {
        //全局
        $this->middleware('auth');
        //指定方法
        $this->middleware('log')->only('index');
        //排除方法
        $this->middleware('subscribed')->except('store');
    }
}

注:你可以将中间件分配给多个控制器动作,不过,这意味着你的控制器会变得越来越臃肿,这种情况下,需要考虑将控制器分割成更多、更小的控制器。


特例?

单动作控制器

就是只有一个方法的控制器,laravel给出了方便的处理方式。
在控制器中定义__invoke方法

namespace App\Http\Controllers;

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

class ShowProfile extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return Response
     */
    public function __invoke($id)
    {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

这样我们就可以在route文件里这么搞:

Route::get('user/{id}', 'ShowProfile');

相对简单一点。

资源控制器

我理解是专门做资源处理的控制器。

例如一个专门做图片储存的控制器:

php artisan make:controller PhotoController --resource

生成|的控制器会自动创建如下方法:

方法路径动作路由名称
GET/photosindexphotos.index
GET/photos/createcreatephotos.create
POST/photosstorephotos.store
GET/photos/{photo}showphotos.show
GET/photos/{photo}/editeditphotos.edit
PUT/PATCH/photos/{photo}updatephotos.update
DELETE/photos/{photo}destroyphotos.destroy

然后他有专门的资源路由:

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

//也可以指定一部分方法
Route::resource('photo', 'PhotoController', ['only' => 
    ['index', 'show']
]);

//当然也可以排除
Route::resource('photo', 'PhotoController', ['except' => 
    ['create', 'store', 'update', 'destroy']
]);

//或者说我们可以改一改名字
Route::resource('photo', 'PhotoController', ['names' => 
    ['create' => 'photo.build']
]);

//当然也可以加点参数
Route::resource('user', 'PhotoController', ['parameters' => [
    'user' => 'admin_user'
]]);

补充资源控制器

大多数时候对于一个请求只一个资源控制器是满足不了需求的,这样就可以添加额外的控制器:

//补充控制器路由务必在资源路由之前定义,防止被覆盖。
Route::get('photos/popular', 'PhotoController@method');
Route::resource('photos', 'PhotoController');

隐式控制器

隐式控制器允许你定义一个路由处理控制器中的每一个动作。

控制器的方法名应该是类似 GET或POST HTTP动词开头。如果以 get 开始,它只会处理 get 请求,如果它使用 post 开駋那么将处理post请求。在HTTP动词后,可以方法使用任何名称,但它应遵循 URI 的格式。

这样的:

route文件:

//绑定控制器
Route::controller('my', 'MyController');

MyController.php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class MyController 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';
   }
}

关于参数

构造函数注入(依赖注入)

就是说在创建实例的时候就注入依赖,比如说:
创建时注入了App\Repositories\UserRepository

方法注入

在方法中注入实例Illuminate\Http\Request

路由参数

Route::put('user/{id}', 'UserController@store');
namespace App\Http\Controllers;

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

class UserController extends Controller
{
    //依赖注入
    /**
     * The user repository instance.
     */
    protected $users;

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

    //方法注入
    /**
     * 存储新用户
     *
     * @param Request $request
     * @return Response
     */
    public function store(Request $request ,$id)
    {
        $name = $request->input('name');
        ......
    }

}

路由缓存

使用路由缓存将会极大减少注册所有应用路由所花费的时间开销。

# 每次修改路由都要重新生成
# 生成缓存
php artisan route:cache

#清除缓存
php artisan route:clear

注意:路由缓存不会作用于基于闭包的路由。要使用路由缓存,必须将闭包路由转化为控制器路由。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值