写给thinkphp开发者的laravel系列教程(五)控制器

最近有事耽搁了一段时间;
以至于让这篇文章迟到了一段时间;

上上篇文章我就简单的聊了下目录;
下面就有请控制器上场了;
在使用thinkphp创建控制器的时候;
我们都是手动创建一个php文件;
然后再手动写控制器名继承;
这种重复劳动对我这懒人来说是相当折磨的;

so;为了偷懒;
我当年还专门研究怎么使用编辑器快速生成代码;
使用 sublime 的童鞋们可以瞅两眼这个项目;
为 sublime 编写的 thinkphp 代码块
我当年一度觉得;
我这个项目可以让男人用了沉默;
女人看了流泪;
真是大大的提高了编码的效率;
一直也没抽出时间写篇文章好好讲;
有兴趣的看看图根据 readme 研究吧;

然而当我遇到了laravel;
我发现我真的是弱爆了;
laravel 才是真正懂开发者的需求;
并且提供了靠谱的解决方案;

laravel创建控制器是使用命令行的;
比如说我要创建个 IndexControler 控制器;

php artisan  make:controller IndexController

在命令敲上这行命令;
就会创建 app/Http/Controllers/IndexController.php 文件;
命名空间啥的都不需要自己考虑;
连继承都自动 extends 了;
laravel的控制器是不需要.class.php后缀的直接 控制器名.php即可;

目录结构我上篇文章简单的讲了下;

app
├─Http 请求处理目录
│  ├─Controller  控制器目录
│  │  ├─admin  后台Admin模块
│  │  │  ├─IndexController.php 后台首页控制器
│  │  │  ├─CategoryController.php 分类管理控制器
│  │  ├─home   前台Home模块
│  │  │  ├─IndexController.php 前台首页控制器
│  │  │  ├─ArticleController.php 文章展示控制器
│  │  ├─user   用户User模块
│  │  │  ├─IndexController.php 用户首页控制器
│  │  │  ├─TagController.php 标签管理控制器

默认情况下;
artisan 生成的控制器全部是在 app/Http/Controllers 下的;
但是如果项目慢慢变的庞大后就会显得比较凌乱了;
而且;
而且给控制器命名都能成为一件纠结的事;
比如说我前台后台都有对文章的管理;
那这两个 ArticleController 分别怎么怎么命名?

在各种权衡利弊后;
我是推荐如我上面这种按照模块进行划分的;
使用命令行创建控制器的话直接加上目录即可;

php artisan  make:controller Home/IndexController

就会创建 app/Http/Controllers/Home/IndexController.php 文件;

在 thinkphp 中;
如果我们想对一些控制器制定比较宽泛的访问权限;
比如说让 user 模块下的控制器;
必须登录才可访问;
比较常见的做法是通过继承解决;
先创建 UserBaseController 基础控制器;
在 UserBaseController 的 __contruct 方法中判断必须登录才可访问;
然后让 user 模块下的控制器都继承 UserBaseController ;
但是通过继承 BaseController 的方案解决的非常之不细致;
如果只想让控制器中的某几个方法必须登录才可访问;
处理起来就比较麻烦了;

在 laravel 中;
则是使用了中间件的模式;
HTTP 中间件
中间件更加解耦;调用方便
职责也更加专一;
对比着tp来理解的话;
可以简单的把中间件比作是 **BaseController 中 __construct;
所有的请求都要先通过定义的中间件;

过了__construct ;
咱获取请求数据;
假设咱要向 home/index/index 中以GET方式传递id=1、name=白俊遥 的数据;
thinkphp 的 url可以是这样的;
1:https://baijunyao.com/home/index/index?id=1&name=白俊遥
当然有更美观点的 pathinfo 模式;
2:https://baijunyao.com/home/index/index/id/1/name/白俊遥;
或者搞的更花哨但不实用点的;
3:https://baijunyao.com/home/index/index/id/1?name=白俊遥;
但是不管怎么变控制器中获取参数的方式都如下:

<?php
namespace Home\Controller;
use Common\Controller\HomeBaseController;
class IndexController extends HomeBaseController {
    public function index(){
        // 原生php获取方式
        echo $_GET['id']; // 输出 1
        echo $_GET['name']; // 输出 白俊遥
        // 框架封装的更安全的I函数方式
        echo I('get.id'); // 输出1
        echo I('get.name'); // 输出 白俊遥
    }
}

但是上面三种在 laravel 中的意义是不同的;
相比于 thinkphp laravel 中除了请求参数还有个路由参数的概念;
第1种比较简单了和 thinkphp 一样这就是单纯的get传2个参数;
按照三级目录模式先定义路由;
routes/web.php

// Home模块下 三级模式
Route::group(['namespace' => 'Home', 'prefix' => 'home'], function () {
    Route::group(['prefix' => 'index'], function () {
        Route::get('index', 'IndexController@index');
    });
});

控制器中如下;
app/Http/Controllers/Home/IndexController.php

<?php
namespace App\Http\Controllers\Home;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class IndexController extends Controller
{
    public function index(Request $request)
    {
        echo $request->input('id'); // 输出 1
        echo $request->input('name'); // 输出 白俊遥
    }
}

第2种在 laravel 没有这样用的直接忽略好了;
重点说下第3种;但是需要稍加改造;
id可以不要了 https://baijunyao.com/home/index/index/1?name=白俊遥;
laravel 中有一个路由参数的概念;
针对上面这个链接就是指的高亮的的1 https://baijunyao.com/home/index/index/1?name=白俊遥
name 则是请求参数;
id可以不放在url的参数中了;而是定义在路由中

// Home模块下 三级模式
Route::group(['namespace' => 'Home', 'prefix' => 'home'], function () {
    Route::group(['prefix' => 'index'], function () {
        Route::get('index/{id}', 'IndexController@index');
    });
});

id和name获取方式也不一样了;

<?php
namespace App\Http\Controllers\Home;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class IndexController extends Controller
{
    public function index($id, Request $request)
    {
        echo $id; // 输出 1
        echo $request->input('name'); // 输出 白俊遥
    }
}

接着本来是要从数据库获取数据了;
这个放在下篇文章讲解模型的时候细说;
直接对比着分配数据和引入前端页面;

thinkphp中的分配数据是使用 assign;
以文章首页的方法为例;

public function index(){
    $assign = [
        'title' => '白俊遥文章的标题',
        'content' => '白俊遥文章的内容'
    ]
    $this->assign($assign);
    $this->display('Home/Index/index');
}

如果当前的方法要引入的html页面跟控制器目录结构一致;
那 display 是可以不传参数的;
Home 模块下的 IndexController 的 index 方法中;
display 不传参数跟传'Home/Index/index'是一样的;

$this->display()
$this->display('Home/Index/index');

到了 laravel 中就是这个样子的了;

public function index(){
    $assign = [
        'title' => '白俊遥文章的标题',
        'content' => '白俊遥文章的内容'
    ]
    return view('home.index.index', $assign);
}

laravel 用 view 函数可以实现分配和引入页面两个功能;
第一个参数是要引入的页面相对于resources/view的路径;
如果习惯 thinkphp 的用斜线分割的方式;
laravel 也是支持的;下面这两种写法是相等的;

return view('home.index.index', $assign);
return view('home/index/index', $assign);

这里推荐使用点 . 分割;
因为 phpstorm 默认是可以识别laravel项目的.分割的;
在控制器中按着 ctrl 点 'home.index.index' 是可以直接打开该文件的;
相当之方便;
还有需要特别注意的地方是return;
控制器中的方法返回页面或者redirect都必须要 return ;

白俊遥博客
请先登录后发表评论
  • latest comments
  • 总共33条评论
白俊遥博客

露露 :是再larave项目的根目录下,且根目录下有artisan文件,可是运行报这个错could not open input file:artisan

2019-03-08 17:30:59 回复

白俊遥博客

花舞千魂殇 :return view('模板地址','参数);5.6参数这 不能直接传值  需要以数组键值对的方式['assign' => $assign] 或者 compact('assign')

2018-07-25 14:59:02 回复

白俊遥博客 白俊遥博客

云淡风晴 :不能直接传值;我示例也是给的数组;

2018-08-05 16:32:28 回复

白俊遥博客

嗅及不到你散发的体香╰ :白哥,初看你的 感觉很棒,就是用你的博客看着laravel下载了 数据库文件砸来,还有你的中间件 我没高明白

2017-12-14 15:30:26 回复

白俊遥博客 白俊遥博客

云淡风晴 :看文档的数据库迁移部分;

2017-12-24 18:42:09 回复

白俊遥博客

无涯 :评论系统是什么插件?

2017-09-18 15:36:26 回复

白俊遥博客 白俊遥博客

云淡风晴 :手写的;不是插件;

2017-12-24 18:42:21 回复

白俊遥博客

如来佛祖 :按照博客的建立routes/web.php定义路由规则报错,找不到页面,按照报错信息把路由规则写在Http/routes.php就可以了,什么情况

2017-09-08 16:56:03 回复

白俊遥博客 白俊遥博客

云淡风晴 :你用的5.1的版本?

2017-09-09 00:12:58 回复

白俊遥博客

如来佛祖 :TP转到Laravel来的,就是看文章执行的composer create-project --prefer-dist laravel/laravel安装的,不知道是什么版本

2017-09-11 09:36:31 回复

白俊遥博客

:跑一下composer

2017-08-17 12:31:13 回复

白俊遥博客

蓝蓝的天空 白俊遥博客白哥,你用laravel做的博客系统,我克隆下来后,用不了,缺少vendor文件夹,自动加载的也报错,为啥啊?

2017-08-16 16:04:54 回复

白俊遥博客

天使的梦想 :用composer新建项目就可以了

2017-08-17 17:28:53 回复

白俊遥博客

蓝天白云 :白哥交换友链吗,木鱼博客 https://www.m5yu.com/

2017-08-16 11:32:59 回复

白俊遥博客

蓝天白云 :白兄,tp也可以路由传默认参数-。-

2017-08-16 11:31:28 回复

白俊遥博客

微笑好美 :白哥,我借用了你thinkphp里面的安装程序,然后我调整了部分代码,特来说明一下,感谢你的开源代码,以下是github仓库:https://github.com/rotao/PhpInstall,如果有什么侵犯到你权益的地方可联系我删除

2017-08-10 22:47:16 回复

白俊遥博客 白俊遥博客

云淡风晴 :不限版权;随意使用;

2017-08-21 00:22:21 回复

白俊遥博客

547142884 :博主,交换个友联. www.3maio.com

2017-08-10 14:02:11 回复

白俊遥博客

雾都一棵树 :我已经被laravel虐了千百遍了,一度想转回tp5

2017-08-10 10:27:47 回复

白俊遥博客 白俊遥博客

云淡风晴 :坚持住;

2017-08-21 00:22:38 回复

白俊遥博客

a'ゞ时间 :大神怎么过滤的alert('admin');

2017-08-09 22:24:39 回复

白俊遥博客

box :白兄 现在工作用什么IDE ?sublime ?zend?phpstorm?

2017-08-09 15:50:58 回复

白俊遥博客

YOU :大佬如果有兴趣能否出个phpword,phpexcle,phppdf等导出类库的案例或者手册啊,网上都都是陈旧的,用起来好累白俊遥博客

2017-08-09 11:40:17 回复

白俊遥博客

维斯布鲁克 :现在解决问题找不到很好的博客啦,十篇九篇都一样,直接粘贴复制,有错误也不改.支持原创!支持原创!支持原创

2017-08-08 11:09:26 回复

白俊遥博客

慢悠悠地慢慢游 :学习了 学习了

2017-08-07 11:15:23 回复

白俊遥博客

Tara_CK :支持一波

2017-08-06 19:59:35 回复

白俊遥博客

a'ゞ时间 :这个是无限级评论吗

2017-08-09 22:40:19 回复

白俊遥博客

a'ゞ时间 :666

2017-08-09 22:40:25 回复

白俊遥博客

a'ゞ时间 白俊遥博客

2017-08-09 22:41:24 回复

白俊遥博客

微笑好美 :666

2017-08-14 21:57:51 回复

白俊遥博客

微笑好美 :6666

2017-08-14 21:58:03 回复

白俊遥博客

PHP部门 :666

2017-08-25 14:07:21 回复

白俊遥博客

メ空白メ :总能学到很多

2017-08-06 17:55:44 回复