zoukankan      html  css  js  c++  java
  • Laravel 5.2 二、HTTP路由、创建控制器 与 资源路由

    一、HTTP路由

    所有路由都定义在 AppProvidersRouteServiceProvider 类载入的 app/Http/routes.php文件中。

    1. 基本路由

    简单的 Laravel 路由只接受一个 URI 和一个闭包

    Route::get('foo', function () {
        return 'Hello, Laravel!';
    });
    

    对于常见的 HTTP 请求,Laravel 有以下几种路由

    Route::get($uri, $callback); //响应 get 请求
    Route::post($uri, $callback);
    Route::put($uri, $callback);
    Route::patch($uri, $callback);
    Route::delete($uri, $callback);
    Route::options($uri, $callback);
    
    Route::match(['get', 'post'], $uri, $callback); //响应 get, post 请求
    Route::any('foo', $callback); //响应所有请求

    其中,$callback 可以是一个闭包,也可以是一个控制器方法。实际上,在开发中有不少情况是用作控制器方法的。

      

    2. 路由参数

    //单个路由参数
    Route::get('user/{id}', function ($id) {
        return 'User '.$id;
    });
    //多个路由参数
    Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
        //
    });
    //单个路由参数(可选)
    Route::get('user/{id?}', function ($id = 1) {
        return 'User '.$id;
    });
    //多个路由参数(可选)
    Route::get('posts/{post}/comments/{comment?}', function ($postId, $commentId = 1) {
        //
    });
    //注意:多个参数时,只可以对最后一个参数设置可选,其他位置设置可选会解析错误
    
    // 正则约束单个参数
    Route::get('user/{name?}', function ($name = 'Jone') {
        return $name;
    })->where('name', 'w+');  //约束参数为单词字符(数字、字母、下划线)
    
    // 正则约束多个参数
    Route::get('user/{id}/{name}', function ($id, $name) {
        //
    })->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
    

      

    二、创建控制器

    使用 Artisan 命令创建 php artisan make:controller UserController 

    现在,在 app/Http/Controllers 这个控制器目录下就生成了 UserController.php 的控制器文件。

    三、高级路由

    1. 命名路由

    //命名闭包路由
    Route:get('user', array('as' => 'alial', function(){}); 
    //或 name 方法链
    Route:get('user', function(){})->name('alias');
    
    //命名控制器方法路由
    Route:get('user', array('uses' => 'AdminIndexController@index', 'as' => 'alias')); 
    //或 name 方法链
    Route:get('user', 'AdminIndexController@index')->name('alias'));
    

    2. 路由分组

    2.1 路由前缀和命名空间

    例如,有两条指向控制器方法的路由

    Route::get('admin/login', 'AdminIndexController@login');
    Route::get('admin/index', 'AdminIndexController@index');

    拿第一条来说,

    参数一:admin/login  表示这个 URI 在请求网站根目录下的 admin/login 资源,完整地址就是  http://域名/admin/login (这里开启了 Apache 的路由重写,隐藏了 “index.php“ ),这个请求被映射到第二个参数中指定的控制器方法。注意,网站根目录是入口文件所在目录,在 Laravel 中就是 public 目录,配置服务器时最好也指向这里。

    参数二:AdminIndexController@login 表示这个控制器方法是在 AppHttpControllers 命名空间下的,连起来就是 AppHttpControllersAdminIndexController 控制器里的 login 方法。

    显然,两条路由的 URI 和 控制器方法 都有相同的部分,那么,启用路由分组可以提取出公共部分:

    // 第一个数组参数中,prefix 键定义 URI 的公共部分,namespace 键定义方法名(命名空间语法)的公共部分
    Route::group(array('prefix' => 'admin', 'namespace' => 'Admin'), function(){
        Route::get('login', 'IndexController@login');
        Route::get('index', 'IndexController@index');
    });

    2.2 资源路由

    资源路由就是映射到资源控制器的路由,Laravel 资源控制器内置了对资源增删改查的 7 个方法以及 7 条路由。

    首先,创建资源控制器 ArticleController

    php artisan make:controller Admin/ArticleController  --resource

    这样就生成了资源控制器在 app/Http/Controllers/Admin/ArticleController.php 文件(Admin 文件夹不存在时会自动创建),内置的 7 个方法如下 :

    <?php
    
    namespace AppHttpControllersAdmin;
    
    use IlluminateHttpRequest;
    use AppHttpRequests;
    use AppHttpControllersController;
    
    class LinksController extends Controller
    {
        /**
         * 显示一个资源的列表
         *
         * @return IlluminateHttpResponse
         */
        public function index()
        {
            //
        }
    
        /**
         * 显示一个表单来创建一个新的资源
         *
         * @return IlluminateHttpResponse
         */
        public function create()
        {
            //
        }
    
        /**
         * 保存最新创建的资源
         *
         * @param  IlluminateHttpRequest  $request
         * @return IlluminateHttpResponse
         */
        public function store(Request $request)
        {
            //
        }
    
        /**
         * 显示指定的资源
         *
         * @param  int  $id
         * @return IlluminateHttpResponse
         */
        public function show($id)
        {
            //
        }
    
        /**
         * 显示一个表单来编辑指定的资源
         *
         * @param  int  $id
         * @return IlluminateHttpResponse
         */
        public function edit($id)
        {
            //
        }
    
        /**
         * 更新指定的资源
         *
         * @param  IlluminateHttpRequest  $request
         * @param  int  $id
         * @return IlluminateHttpResponse
         */
        public function update(Request $request, $id)
        {
            //
        }
    
        /**
         * 删除指定的资源
         *
         * @param  int  $id
         * @return IlluminateHttpResponse
         */
        public function destroy($id)
        {
            //
        }
    }

    然后,定义资源路由 这里我还是选择在路由分组下定义,定义一条就好

    Route::group(array('prefix' => 'admin', 'namespace' => 'Admin'), function(){ 
        Route::get('login', 'IndexController@login');
        Route::get('index', 'IndexController@index');
        // 资源路由
        Route::resource('article', 'ArticleController');
    });

      

    最后,查看路由。有了资源控制器 和 资源路由,就可以看一下对以上 7 个方法的 HTTP 请求方式了。

    使用 Artisan 命令 php artisan route:list  列出当前的所有路由,请求方式、URI、控制器方法、中间件都罗列出来了。

    推荐阅读:有关 Laravel 的 HTTP 路由知识点还有 路由模型绑定、表单方法伪造 和 CSRF 保护等知识,详细请参考 Laravel 手册-HTTP路由功能

    相关阅读:URI 和 URL 的区别

  • 相关阅读:
    为什么 ObjectiveC 很难
    PHP开发Windows桌面应用程序实例
    windows下借助InstantRails环境搭建redmine
    php,python,ruby,perl的优缺点?
    Ruby在windows上的eclipse开发环境搭建
    Python的web框架很多,比如Django,webpy等,但是哪一种综合实力最强呢?
    使用JRockit作为Eclipse的Java VM
    Fat Jar Eclipse PlugIn Tutorial
    ECLIPSE插件集合
    Java反编译利器Jad, Jode, Java Decompiler等及其IDE插件
  • 原文地址:https://www.cnblogs.com/mingc/p/6761096.html
Copyright © 2011-2022 走看看