路由只用来接收请求

目前我们大致了解了laravel,在开始一个Http程序需要先定义路由。之前的例子中,我们的业务逻辑都是在路由里实现的,这对于简单的网站或web应用没什么问题,当我们需要扩大规模,程序变得复杂,分层的业务逻辑更为合适。这个时间,我们就应该使用控制器。

了解MVC的都对控制器的作用有所了解,控制器是实现主要业务逻辑的,在其他框架,控制器一般都是一个类,laravel也不例外,laravel的控制器其结构并没有什么特殊。

<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class HomeController extends Controller {

    /**
     * 显示首页。
     *
     * @return Response
     */
    public function index()
    {
        return view('home');
    }

}

上述例子中就是laravel的控制器结构,没什么特别的。可以看得到,laravel的控制器非常的干净,与其他类的耦合度相当的低,得益于laravel的loc容器,我们很容易实现相当丰富的功能,且不会产生紧密耦合。那么如何才能访问到这个控制器里的逻辑呢?

在上面的代理示例中,看到了一个十分简单的控制器,但是要知道,定义了控制器你是无法直接使用的,要知道一个来自客户点的请求会先经过路由,经过解析最终按照规则派发至具体的处理逻辑。

我们只是如何定义一个路由,但之前的路由里包含了逻辑,我们如何将这个路由的逻辑转到控制器呢?我们希望通过http://localhost/访问我们上面例子中的HomeController类的index方法,应该定义一条这样的路由。

Route::get('/', 'HomeController@index');

例子很简单,但是这种定义方法会带来一种问题。

关于laravel的路由定义,很多人看到后都有一个疑惑:
每条地址规则都要定义路由,岂不是很累?
这个问题确实是个问题,不过,laravel给我们一个折中的方案--控制器路由。

控制器路由我认为只要是解决路由定义繁杂的情况,因为大型的应用业务比较复杂,控制器相当的多,我们不可能每一个控制器的方法都要定义一个路由。laravel的控制器路由可以这样完美的解决问题:

Route::controller('/', 'HomeController');

我们的控制器方法的写法也要有所改变:

<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class HomeController extends Controller {

    /**
     * 显示首页。
     *
     * @return Response
     */
    public function getIndex()
    {
        return view('home');
    }

    /**
     * 显示关于界面
     *
     * @return Response
     */
    public function getAbout()
    {
        return view('about');
    }
}

依照上述例子,如果我们访问地址http://localhost/就会显示HomeController的getIndex方法产生的内容,访问http://localhost/about 就会显示getAbout方法产生的内容。除了使用get{method}这种格式,还可以有post{Method}、delete{Method}等,至于前缀get、post等代表的意义,应该猜得到吧?

现在我们已经看到,这样的英译我们可以不用再给控制器的每一个方法定义一个路由,值需要给控制器定义一个路由即可。

//路由的基本格式

Route::get('/', function() { 

  //指的是访问根目录 然后返回Hello World   return 'Hello World'; })
路由常用写法

//这个指访问主页的create页面  会调用Article控制器下的create方法
Route::get('/create','ArticleController@create'); 

//提交表单 action的位置为Article控制器下的store方法里

Route::post('/store','ArticleController@store'); 
路由传参

//指的是点击show链接  将一个参数传给Article控制器下的show方法
Route::get('/show{id}','ArticleController@show');

//一般show方法就会这么写
public function show($id) {        //这个$id就是链接后面跟的参数
    //利用这个id 做点事情好吧...
}
路由的方法大总

//我们上面的方法相当于这里的回调函数。
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
为路由命名

方法一:
Route::any('/create',[
    'use' => 'ArticleController@create',    //回调函数
    'as' => 'Article-create'    //命名
]);
方法二:
Route::any('/create','ArticleController@create')->name('Article-create');

//命名的作用是为了在重定向或者其他的时候  很容易找到路由的url地址
$url = route('Article-create');
return redirect()->$url;    //这样就很方便跳转了

//如果地址有参数的话,还可以在后面直接加参数key=>value
Route::get('/article/{id}/edit', ‘ArticleController@edit‘)->name('edit');
return redirect()->route('edit', ['id'=>$id]);
路由分组

作用1 - - - 中间件

//比如在做登录认证的时候 一般就会用到  auth  的中间件
Router::group(['middleware'=>'auth'], function() {
    Route::get('admin/index', 'Admin/IndexController@index')
});
//这样别人就必须登录了 才能进到后台界面  把所有的都可以调到这个路由组里
作用2- - - 路由前缀

群组属性 prefix 可以用来为群组中每个路由添加一个给定 URI 前缀
//比如做后台管理系统  我么就可以给路由添加一个路由前缀 admin
Route::group(['prefix'=>'admin'], function() {
    Route::get('index', 'IndexController@index' )    //注意看 并没有加前面的admin
//访问的时候  还是需要(假设根目录叫做shop.dev) 访问 shop.dev/admin/index
//这样才能访问到这个路由
});
作用3- - - 命名空间

比如 在控制器文件夹下肯定有多个控制器,为了避免名称的冲突我们可以给路由命名空间
 //    注意Admin是Controllers下的第一个文件夹
Route::group(['namespace'=>'Admin'], function() {
    ...
});

[2018-01-12] laravel--路由(路由与控制器)的更多相关文章

  1. laravel的路由分组,中间件,命名空间,子域名,路由前缀

    laravel的路由分组,就是把一些具有相同特征的路由进行分组,比如一些路由需要进行验证,一些路由有共同的前缀,一些路由有相同的控制器命名空间等. 这样把路由组合在一起,方便管理,维护性更好. Rou ...

  2. laravel的路由设置,路由参数和路由命名(三)

    laravel中必须先配置路由,才能使用.不像tp中不配置也能使用,因为tp可以通过pathinfo进行自动解析. 一.简单的路由设置 我们一般在routes/web.php文件中配置网页端路由. / ...

  3. Laravel中路由怎么写(二)

    1.路由命名——给路由起个名字 1.1 基本使用 我们使用as关键字来为路由命名: Route::get('/hello/Laravel',['as'=>'academy',function() ...

  4. [PHP] - Laravel - Route路由

    前言 这里使用的是Laravel 5 PHP Laravel的路由比较强悍,但也正因如此,不统一而容易凌乱.比如在路由中可以直接写方法操作(破坏封装啊) 以下是个人学习的例子,不供参考 路由中的直接方 ...

  5. laravel之路由

    laravel之路由设置 代码如下: 访问就是: 代码附上: <?php /*|--------------------------------------------------------- ...

  6. laravel 配置路由 api和web定义的路由的区别详解

    1.路由经过中间件方面不同 打开kerenl.php就可以看到区别 protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware ...

  7. laravel控制器之资源控制器

    资源控制器 Laravel 的资源控制器可以让我们很便捷地构建基于资源的 RESTful 控制器,例如,你可能想要在应用中创建一个控制器,用于处理关于文章存储的 HTTP 请求,使用 Artisan ...

  8. AngularJS路由系列(2)--刷新、查看路由,路由事件和URL格式,获取路由参数,路由的Resolve

    本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● 刷新路由● 查看当前路由以及所有路由● 路由触发事件● 获取路由参数 ● 路由的resolve属性● 路由URL格式 ...

  9. [2018-11-27]2018年12月1日宁波dotnet社区线下活动

    离上次活动,转眼又过了一个月,幸得各路大神支持,于本周六(12月1日),宁波dotnet社区的线下分享活动又来啦! 活动嘉宾及主题 董斌辉 2015-2019年微软全球最有价值专家(.NET方向) 2 ...

  10. 2018年12月8日广州.NET微软技术俱乐部活动总结

    吕毅写了一篇活动总结,写得很好!原文地址是:https://blog.walterlv.com/post/december-event-microsoft-technology-salon.html ...

随机推荐

  1. python常用算法学习(3)

    1,什么是算法的时间和空间复杂度 算法(Algorithm)是指用来操作数据,解决程序问题的一组方法,对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但是在过程中消耗的资源和时间却会有很大 ...

  2. python编程基础之十

    分支条件: 单一分支条件:if 条件 : 条件真运行... 双分支条件:if 条件 : 条件真运行else: 条件假运行... 多分支条件:if 条件1 : 条件1真运行elif 条件2 : 条件1假 ...

  3. java并发之CAS详解

    前言 在高并发的应用当中,最关键的问题就是对共享变量的安全访问,通常我们都是通过加锁的方式,比如说synchronized.Lock来保证原子性,或者在某些应用当中,用voliate来保证变量的可见性 ...

  4. 洛谷 1552 [APIO2012]派遣

    题目背景 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. 题目描述 在这个帮派里,有一名忍者被称之为Master.除了Master以外,每名忍者都有且仅有一个上级.为保密 ...

  5. 基于KVM的SRIOV直通配置及性能测试

    SRIOV介绍.VF直通配置,以及包转发率性能测试 小慢哥的原创文章,欢迎转载 目录 ▪ 1. SRIOV介绍 ▪ 2. 环境说明 ▪ 3. 开启SRIOV ▪ 4. 生成VF ▪ 5. VF直通 ▪ ...

  6. python selenium单/复选框操作

    一.单选:radio 1.首先是定位选择框的位置 2.定位id,点击图标就可以了,代码如下(获取url地址方法:把上面源码粘贴到文本保存为.html后缀后用浏览器打开,在浏览器url地址栏复制出地址就 ...

  7. Web前端助手-功能丰富的Chrome插件

    整合优秀的前端实用工具.免费,可配置的强大工具集 示例 安装 github仓库: https://github.com/zxlie/FeHelper 官网地址:https://www.baidufe. ...

  8. MySQL 插入记录时自动更新时间戳

    将字段设置成timestamp类型,同时默认值设置成 CURRENT_TIMESTAMP.

  9. [BZOJ4947] 字符串大师 - KMP

    4974: [Lydsy1708月赛]字符串大师 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 739  Solved: 358[Submit][Sta ...

  10. SpringBoot项目配置Tomcat和JVM参数

    设置Tomcat端口号和连接数等 使用application.properties配置文件有一些参数无法设置,所以推荐创建一个类文件来配置,如下: package com.qipai.springbe ...