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}', 'UserController@showProfile');
现在,如果一个请求匹配上面的路由 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\AdminController@method');
3.命名控制器路由(如果get第二个参数为字符串,则默认key为uses)
Route::get('foo', ['uses' => 'FooController@method', 'as' => 'name']);
使用action生成对应URL
$url = action('FooController@method');
还可以使用帮助函数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('PhotoController@index');
这三者取出的地址都是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', 'PhotoController@method');
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}', 'UserController@update');
你需要通过定义控制器方法如下所示来类型提示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
Laravel之控制器的更多相关文章
- laravel 资源控制器
Artisan 生成器来生成一个资源控制器(在之前命名后加上 --resource 选项) php artisan make:controller PostController --resource ...
- laravel中控制器的创建和使用(五)
laravel中我们可以使用 artisan 命令来帮助我们创建控制器文件. php artisan make:controller TestController TestController 控制器 ...
- laravel在控制器中赋值给视图
1.控制器 2.视图
- laravel创建控制器
一.创建 php artisan make:controller Admin/IndexController 二.目录 app/Http/Controllers/ 控制器存储目录 [ C控制器 ]
- laravel 多控制器路由
laravel 路由: ======================================= 公司的情况很不乐观...... 破产清算随时可能发生......
- laravel 资源控制器方法列表
以 PostController 控制器的每个方法都有对应的请求方式.路由命名.URL.方法名和业务逻辑约定. HTTP请求方式 URL 控制器方法 路由命名 业务逻辑描述 GET post inde ...
- laravel在控制器中动态创建数据表
Schema::connection('usertable')->create('test', function ($table) { $table->increments('id'); ...
- Laravel 5.2 二、HTTP路由、创建控制器 与 资源路由
一.HTTP路由 所有路由都定义在 App\Providers\RouteServiceProvider 类载入的 app/Http/routes.php文件中. 1. 基本路由 简单的 Larave ...
- Laravel 的HTTP控制器
简介# 除了在路有文件中以闭包的形式定义所有的请求处理逻辑外,还可以使用控制器类来组织此类行为,控制器能够将相关 的请求处理逻辑组成的一个单独的类,控制器被存放在app/Http/Controller ...
随机推荐
- HDU2824 The Euler function
Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Description The Eule ...
- 【原创】Linux环境下的图形系统和AMD R600显卡编程(3)——AMD显卡简介
早期的显卡仅用于显示,后来显卡中加入了2D加速部件,这些部件用于做拷屏,画点,画线等操作.随着游戏.三维模拟以及科学计算可视化等需要,对3D的需求逐渐增加,早期图形绘制工作由CPU来完成,要达到真实感 ...
- 在floodlight源码的基础上添加一个新的module并正确运行
1.在src/main/java目录下新建一个package,目录结构如下: 2.在新建的package下,新建一个class,名字就是自定义的module,接下来implements想实现的serv ...
- app:compileDebugNdk,NDK
Error:Execution failed for task ':app:compileDebugNdk'. > Error: Your project contains C++ files ...
- unicode和utf8之间的关系
,字符编码是计算机技术的基石,想要熟练使用计算机,懂得一点字符编码的知识,还是很有必要的. 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit ...
- kubernetes节点安装配置
#环境安装,要与控制节点一致Centos 7 Linux release 7.3.1611网络: 互通配置主机名设置各个服务器的主机名hosts#查找kubernetes支持的docker版本Kube ...
- hdu 5067(暴力搜索)
Harry And Dig Machine Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- 「Codeforces Round #441」 Classroom Watch
Discription Eighth-grader Vova is on duty today in the class. After classes, he went into the office ...
- [POI2014]Tourism
题目大意: 给定一个$n(n\le20000)$条个点,$m(m\le25000)$条边的无向图,保证图中最长路径上的点数不超过$10$.对一个点染色的代价是$w_i$.求使得每个结点都被染色或至少有 ...
- 事务没有提交导致 锁等待Lock wait timeout exceeded异常
异常:Lock wait timeout exceeded; try restarting transaction 解决办法: 执行select * from information_schema.i ...