Laravel之控制器

一.简介

将所有的请求处理逻辑都放在单个routes.php 中肯定是不合理的,你也许还希望使用控制器类组织管理这些行为。控制器可以将相关的 HTTP 请求封装到一个类中进行处理。通常控制器存放在app/Http/Controllers 目录中。

二.基本控制器

1.简单示例
下面是一个基本控制器类的例子。所有的 Laravel 控制器应该继承自 Laravel 自带的控制器基类Controller

<?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}‘, ‘[email protected]‘);

  

现在,如果一个请求匹配上面的路由 URI, UserController 的showProfile 方法就会被执行。当然,路由参数
也会被传递给这个方法。

2.控制器&命名空间
你应该注意到我们在定义控制器路由的时候没有指定完整的控制器命名空间,而只是定义了App\Http\Controllers 之后的部分。默认情况下, RouteServiceProvider 将会在一个路由分组中载入routes.php 文件,并且该路由分组指定定了分组中路由控制器所在的命名空间。

如果你在App\Http\Controllers 目录下选择使用 PHP 命名空间嵌套或组织控制器,只需要使用相对于App\Http\Controllers 命名空间的指定类名即可。因此,如果你的完整控制器类是App\Http\Controllers\Photos\AdminController ,你可以像这样注册路由:

Route::get(‘foo‘, ‘Photos\[email protected]‘);

  

3.命名控制器路由(如果get第二个参数为字符串,则默认key为uses)

Route::get(‘foo‘, [‘uses‘ => ‘[email protected]‘, ‘as‘ => ‘name‘]);

  

使用action生成对应URL

$url = action(‘[email protected]‘);

  

还可以使用帮助函数route 来为已命名的控制器路由生成对应的 URL

$url = route(‘name‘);

  

4.控制器中使用中间件

$this->middleware(‘auth‘);

  

三.RESTful 资源控制器

1.资源控制器
使用 Artisan 命令make:controller ,我们可以快速创建一个带有RESTful风格的控制器:

php artisan make:controller PhotoController

  

该 Artisan 命令将会生成一个控制器文件app/Http/Controllers/PhotoController.php ,这个控制器包含了每一个资源操作对应的方法。 接下来,可以为该控制器注册一个资源路由:

Route::resource(‘photo‘, ‘PhotoController‘);

  

这个路由声明包含了处理图片资源 RESTful 动作的多个路由,相应地,Artisan 生成的控制器也已经为这些动作设置了对应的处理方法。

2.定义部分资源路由

#仅仅index,show方法可用
Route::resource(‘photo‘, ‘PhotoController‘,
[‘only‘ => [‘index‘, ‘show‘]]);

#除except里面的方法不可用,其余可用
Route::resource(‘photo‘, ‘PhotoController‘,
[‘except‘ => [‘create‘, ‘store‘, ‘update‘, ‘destroy‘]]);

  

3.命名资源路由
默认情况下,所有资源控制器动作都有一个路由名称,然而,我们可以通过传入 names 数组来覆盖这些默认的名字:

Route::resource(‘photo‘, ‘PhotoController‘,[‘names‘ => [‘create‘ => ‘photo.build‘]]);

  

使用
route(‘photo.build‘);
即可取出对应url,如http://localhost:9000/photo/create

route/url/action的区别,
Route::resource(‘photo‘, ‘PhotoController‘);

route(‘photo.index‘); //如果路由有命名,可以取他的名字,如as定义的名字
url(‘photo‘);
action(‘[email protected]‘);

这三者取出的地址都是http://localhost:9000/photo,但每个函数的参数形式不同;

4.嵌套资源
有时候我们需要定义路由到“嵌套”资源。例如,一个图片资源可能拥有多条“评论”,要“嵌套”资源控制器,在路由声明中使用“.”号即可:

Route::resource(‘photos.comments‘, ‘PhotoCommentController‘);

  

控制器中:

class PhotoCommentController extends Controller
{
	/**
	* 显示指定照片评论
	*
	* @param int $photoId
	* @param int $commentId
	* @return Response
	* @translator http://laravelacademy.org
	*/
	public function show($photoId, $commentId)
	{
		//
	}
}

  

5.补充资源控制器
如果有必要在默认资源路由之外添加额外的路由到资源控制器,应该在调用Route::resource 之前定义这些路由;否则,通过resource 方法定义的路由可能无意中优先于补充的额外路由:

Route::get(‘photos/popular‘, ‘[email protected]‘);
Route::resource(‘photos‘, ‘PhotoController‘);

  

6.隐式控制器
(1).Laravel 允许你只定义一个路由即可访问控制器类中的所有动作,首先,使用Route::controller 方法定义一个路由,该controller 方法接收两个参数,第一个参数是控制器处理的 baseURI,第二个参数是控制器的类名:

Route::controller(‘users‘, ‘UserController‘);

  

接下来,添加方法到控制器,方法名应该以 HTTP 请求方法开头:

<?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()
	{
		//
	}
}

  

在上例中可以看到, getIndex 方法将会在访问控制器处理的默认 URI: /users 时被调用。

(2).分配路由名称
如果你想要命名该控制器中的一些路由,可以将一个名称数组作为第三个参数传递到该controller 方法:

Route::controller(‘users‘, ‘UserController‘, [
‘getShow‘ => ‘user.show‘,
]);

  

使用route取出对应url
route(‘guo.show‘);

四.依赖注入 & 控制器

1.构造函数注入
Laravel 使用服务容器解析所有的 Laravel 控制器,因此,可以在控制器的构造函数中类型声明任何依赖,这些依赖会被自动解析并注入到控制器实例中:

<?php
namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
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;
	}
}

  

当然,你还可以类型提示任何 Laravel 契约,如果容器可以解析,就可以进行类型提示。

2.方法注入

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
	/**
	* 存储新用户
	*
	* @param Request $request
	* @return Response
	*/
	public function store(Request $request)
	{
		$name = $request->input(‘name‘);
		//
	}
}

  

如果控制器方法期望输入路由参数,只需要将路由参数放到其他依赖之后,例如,如果你的路由定义如下:

Route::put(‘user/{id}‘, ‘[email protected]‘);

  

你需要通过定义控制器方法如下所示来类型提示Illuminate\Http\Request 并访问路由参数id :

public function update(Request $request, $id)
{
//
}

  

四.路由缓存
1.生成路由缓存

php artisan route:cache

  

缓存路由文件(在bootstrap/cache/下)现在取代app/Http/routes.php 文件被使用.

因此,只有在项目运行阶段你才会运行route:cache 命令

2.清除路由缓存

php artisan route:clear

  

时间: 2024-10-31 01:00:51

Laravel之控制器的相关文章

Laravel之简单的学生信息管理平台

laravel框架写的简易版的学生信息管理平台,贯穿了laravel的控制器.视图.模板.模型.中间件.路由规则的使用. 页面是使用BootStrap前端框架搭建 使用laravel实现了增删改查的功能. //这是路由文件的关键代码 Route::group(['middleware' => ['web']], function () { Route::get('student/index',['uses'=>'[email protected]']); Route::any('student

【干货】Laravel --Validate (表单验证) 使用实例

前言 : Laravel 提供了多种方法来验证应用输入数据.默认情况下,Laravel 的控制器基类使用ValidatesRequests trait,该trait提供了便利的方法通过各种功能强大的验证规则来验证输入的 HTTP 请求.要掌握 Laravel 强大的验证特性,让我们先看一个完整的验证表单并返回错误信息给用户的例子. 在这之前如果您是首次接触 Laravel 而且并不知道路由如何跳转到指定的控制器 可以查看博主的Restfulapi或者Laravel官网对路由的介绍,在这里就不做介

Laravel HTTP 路由

路由配置文件 定义:路由是指分析来自客户端请求的统一资源标识符(URI),根据设定的规则将请求分发至期待的处理逻辑(匹配请求地址),这一规则就是路由规则,而这一过程就是路由. Route::get('/', function() { return view('index'); }); 我们访问 http://yourdoamin/ 会显示渲染后的视图文件 index 的内容.这对于制作一个网站首页而言,十分简明,不需要再额外创建控制器.当然,如果首页是一类组织方法中的一部分,也可以用控制器实现.

Laravel框架学习笔记

教程里安装成功lavavel之后在地址栏输入 http://localhost/laravel5/public/home 如果访问失败进不去登陆页面,那可能是因为没有开启apache里的mod rewrite 模块 开启方法:把httpd.conf文件中 #LoadModule rewrite_module modules/mod_rewrite.so 前的#去掉,保存后重启apache就ok了 Laravel 中的路由,跟其他 PHP 框架一样,作用是把各种请求分流到各个控制器 Laravel

Laravel中路由怎么写(二)

1.路由命名——给路由起个名字 1.1 基本使用 我们使用as关键字来为路由命名: Route::get('/hello/Laravel',['as'=>'academy',function(){ return 'Hello Laravel!'; }]); 路由命名可以让我们在使用route函数生成指向该路由的URL或者生成跳转到该路由的重定向链接时更加方便: Route::get('/testNamedRoute',function(){ return route('academy'); })

Vue+elementUI+Laravel实现分页

Laravel框架控制器方法: /* * 学生信息列表 * 请求方式:get * 参数:null * */ public function studentLists(){ $data = Student::studentLists(); foreach ($data as $k=>$v){ $data[$k]['s_sex'] = $v['s_sex'] == 1 ? '男' : '女'; $data[$k]['s_img'] = 'http://www.1707laravel.com/'.$v

HTTP层 &mdash;&mdash; 验证

1.简介 Laravel 提供了多种方法来验证应用输入数据.默认情况下,Laravel 的控制器基类使用ValidatesRequests trait,该trait提供了便利的方法通过各种功能强大的验证规则来验证输入的 HTTP 请求. 2.快速入门 要掌握 Laravel 强大的验证特性,让我们先看一个完整的验证表单并返回错误信息给用户的例子. 定义路由 首先,我们假定在routes/web.php文件中包含如下路由: // 显示创建博客文章表单... Route::get('post/cre

.net转php laraval框架学习系列(三)项目实战---Route&amp;Controllers

本章来学习laravel的路由 一个简单的路由列子 Route::get('/', function() { return 'Hello World'; }); 路由的写法和Node的风格很相似.上面的路由直接返回ContentResult 这样容易理解一些. 再看一个复杂的Route的 Route::filter('old', function()//这是一个filter { if (Input::get('age') < 200) { return Redirect::to('home');

Laravel 5系列教程二:路由,视图,控制器工作流程

免费视频教程地址https://laravist.com/series/laravel-5-basic 上一篇教程我们走了那么长的路,终于把Laravel安装好了,这一篇教程我们就要进入Laravel的神奇世界了,主要是讲解Laravel的Router,Views,Controllers的工作流程,目的也就是让大家明白Laravel在处理一个get请求的时候是如何工作的. 在开始之前,我们首先得将我们的服务器启动起来,如果你使用Laravel的artisan,你可以直接: php artisan