精华内容
下载资源
问答
  • laravel 路由

    2018-09-03 21:07:00
    laravel路由

    laravle的路由主要是在routes下的web.php中进行路由的控制,比如:

    Route::get('/detail','TestController@detail');

    表示访问域名/detail 通过中间件去调用TestController中的detail方法

     

    路由都定义在位于 routes 目录下的路由文件中,这些文件通过框架自动加载,相应逻辑位于 app/Providers/RouteServiceProvider 类(后面我们在讲 Laravel 启动过程的时候会详细讨论这部分逻辑)。routes/web.php 文件定义了 Web 界面的路由,这些路由被分配到了 web 中间件组,从而可以使用 session 和 csrf 保护等功能。定义在 routes/web.php 中的路由可以通过在浏览器地址栏输入相应的 URL 进行访问,例如,你可以通过 http://blog.dev/user 访问下面的路由:

    Route::get('/user', 'UsersController@index');

     

    2、重定向:Route::redirect('路由1','路由2')

    Route::redirect('/index','/index2')

     

     

    路由来响应任何 HTTP 请求动作:

    Route::get($uri, $callback); Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback);

     

    需要注册一个路由响应多种 HTTP 请求动作 —— 这可以通过 match 方法来实现。或者,可以使用 any 方法注册一个路由来响应所有 HTTP 请求动作:

    Route::match(['get', 'post'], 'foo', function () { return 'This is a request from get or post'; }); Route::any('bar', function () { return 'This is a request from any HTTP verb'; });

     

    路由视图:如果你的路由需要返回一个视图,可以使用 Route::view 方法,和 redirect 方法类似,这个方法也很方便,以至于你不需要在额外定义一个路由或控制器。view 方法接收一个 URI 作为第一个参数,以及一个视图名称作为第二个参数,此外,你还可以提供一个数组数据传递到该视图方法作为可选的第三个参数,该数组数据可用于视图中的数据渲染:

    Route::view('/welcome', 'welcome'); Route::view('/welcome', 'welcome', ['name' => '学院君']);

     

    为了保证可以共用 welcome.blade.php 这个视图文件,我们也对默认提供的 / 路由做了调整,接下来,我们需要修改 resources/views/welcome.blade.php 代码以支持 website数据变量:

     

     

    3、路由分组:路由分组的目的是让我们在多个路由中共享相同的路由属性,比如中间件和命名空间等,这样的话我们定义了大量的路由时就不必为每一个路由单独定义属性。共享属性以数组的形式作为第一个参数被传递给 Route::group 方法。

     

    中间件:要给某个路由分组中定义的所有路由分配中间件,可以在定义分组之前使用 middleware 方法。中间件将会按照数组中定义的顺序依次执行:

    Route::middleware(['first', 'second'])->group(function () { Route::get('/', function () { // Uses first & second Middleware }); Route::get('user/profile', function () { // Uses first & second Middleware }); });

    关于中间件的使用我们在后面单独讲中间件时再进行示例演示,这里我们先了解这样使用就行。

     

    命名空间:路由分组另一个通用的例子是使用 namespace 方法分配同一个 PHP 命名空间给该分组下的多个控制器:

    Route::namespace('Admin')->group(function () { // Controllers Within The "App\Http\Controllers\Admin" Namespace });

    默认情况下,RouteServiceProvider 在一个命名空间分组下引入所有路由文件,并指定所有控制器类所在的默认命名空间是 App\Http\Controllers,因此,我们在定义控制器的时候只需要指定命名空间 App\Http\Controllers 之后的部分即可。

    关于命名空间后面我们单独讲控制器的时候还会再详细演示,这里先了解用法即可。

     

    子域名路由:路由分组还可以被用于处理子域名路由,子域名可以像 URI 一样被分配给路由参数,从而允许捕获子域名的部分用于路由或者控制器,子域名可以在定义分组之前调用 domain 方法来指定:

    Route::domain('{account}.blog.dev')->group(function () { Route::get('user/{id}', function ($account, $id) { return 'This is ' . $account . ' page of User ' . $id; }); });

    比如我们设置会员子域名为 account.blog.dev,那么就可以通过 http://account.blog.dev/user/1 访问用户ID为 1的会员信息了:

    This is account page of User 1

    路由前缀

    prefix 方法可以用来为分组中每个路由添加一个给定 URI 前缀,例如,你可以为分组中所有路由 URI 添加 admin 前缀 :

    Route::prefix('admin')->group(function () { Route::get('users', function () { // Matches The "/admin/users" URL }); });

     

    展开全文
  • Laravel 路由

    2017-04-24 10:31:21
    Laravel 路由

    1、基本路由

    最基本的 Laravel 路由只接收一个 URI 和一个闭包,并以此提供一个非常简单且优雅的定义路由方法:

    Route::get('home', function () {
        return 'Hello World';
    });

    默认路由文件

    所有 Laravel 路由都定义在位于 routes 目录下的路由文件中,这些文件通过框架自动加载。routes/web.php 文件定义了web界面的路由,这些路由被分配了web中间件组,从而可以提供session和csrf防护等功能。routes/api.php 中的路由是无状态的,被分配了 api 中间件组。
    对大多数应用而言,都是从 routes/web.php 文件开始定义路由。

    有效的路由方法

    我们可以注册路由来响应任何 HTTP 请求:

    Route::get($uri, $callback);
    Route::post($uri, $callback);
    Route::put($uri, $callback);
    Route::patch($uri, $callback);
    Route::delete($uri, $callback);
    Route::options($uri, $callback);

    有时候还需要注册路由响应多个 HTTP 请求——这可以通过 match 方法来实现。或者,可以使用 any 方法注册一个路由来响应所有 HTTP 请求:

    Route::match(['get', 'post'], '/', function () {
        //
    });
    
    Route::any('home', function () {
        //
    });

    CSRF防护

    在 web 路由文件中所有请求方式为PUT、POST或DELETE的HTML表单都会包含一个CSRF令牌字段,否则,请求会被拒绝。关于CSRF的更多细节,可以参考CSRF文档:

    <form method="POST" action="/profile">
        {{ csrf_field() }}
        ...
    </form>

    2、路由参数

    必选参数

    有时我们需要在路由中捕获 URI 片段。比如,要从 URL 中捕获用户ID,需要通过如下方式定义路由参数:

    Route::get('user/{id}', function ($id) {
        return 'User '.$id;
    });

    可以按需要在路由中定义多个路由参数:

    Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
        //
    });

    路由参数总是通过花括号进行包裹,这些参数在路由被执行时会被传递到路由的闭包。路由参数不能包含 - 字符,需要的话可以使用 _ 替代。

    可选参数

    有时候可能需要指定可选的路由参数,这可以通过在参数名后加一个 ? 标记来实现,这种情况下需要给相应的变量指定默认值:

    Route::get('user/{name?}', function ($name = null) {
        return $name;
    });
    
    Route::get('user/{name?}', function ($name = 'John') {
        return $name;
    });

    正则约束

    可以使用路由实例上的 where 方法来约束路由参数的格式。where 方法接收参数名和一个正则表达式来定义该参数如何被约束:

    Route::get('user/{name}', function ($name) {
        //
    })->where('name', '[A-Za-z]+');
    
    Route::get('user/{id}', function ($id) {
        //
    })->where('id', '[0-9]+');
    
    Route::get('user/{id}/{name}', function ($id, $name) {
        //
    })->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

    全局约束

    如果想要路由参数在全局范围内被给定正则表达式约束,可以使用 pattern 方法。在RouteServiceProvider 类的 boot 方法中定义约束模式:

    /**
     * 定义路由模型绑定,模式过滤器等
     *
     * @param  \Illuminate\Routing\Router  $router
     * @return void
     * @translator  http://laravelacademy.org
     */
    public function boot()
    {
        Route::pattern('id', '[0-9]+');
        parent::boot();
    }

    一旦模式被定义,将会自动应用到所有包含该参数名的路由中:

    Route::get('user/{id}', function ($id) {
        // 只有当 {id} 是数字时才会被调用
    });

    3、命名路由

    命名路由为生成 URL 或重定向提供了便利。实现也很简单,在路由定义之后使用 name 方法链的方式来实现:

    Route::get('user/profile', function () {
        //
    })->name('profile');

    还可以为控制器动作指定路由名称:

    Route::get('user/profile', 'UserController@showProfile')->name('profile');

    为命名路由生成URL

    为给定路由分配名称之后,就可以通过辅助函数 route 为该命名路由生成 URL:

    $url = route('profile');
    return redirect()->route('profile');

    如果命名路由定义了参数,可以将该参数作为第二个参数传递给 route 函数。给定的路由参数将会自动插入到 URL 中:

    Route::get('user/{id}/profile', function ($id) {
        //
    })->name('profile');
    
    $url = route('profile', ['id' => 1]);

    4、路由群组

    路由群组允许我们在多个路由中共享路由属性,比如中间件和命名空间等,这样的话我们就不必为每一个路由单独定义属性。共享属性以数组的形式作为第一个参数被传递给 Route::group 方法。

    中间件

    要给路由群组中定义的所有路由分配中间件,可以在群组属性数组中使用 middleware。中间件将会按照数组中定义的顺序依次执行:

    Route::group(['middleware' => 'auth'], function () {
        Route::get('/', function () {
            // 使用 Auth 中间件
        });
    
        Route::get('user/profile', function () {
            // 使用 Auth 中间件
        });
    });

    命名空间

    另一个通用的例子是路由群组分配同一个 PHP 命名空间给其下的多个控制器,可以在分组属性数组中使用 namespace 来指定群组中所有控制器的公共命名空间:

    Route::group(['namespace' => 'Admin'], function(){
        // 控制器在 "App\Http\Controllers\Admin" 命名空间下
    });

    默认情况下,RouteServiceProvider 引入你的路由文件并指定其下所有控制器类所在的默认命名空间App\Http\Controllers,因此,我们在定义的时候只需要指定命名空间 App\Http\Controllers 之后的部分即可。

    子域名路由

    路由群组还可以被用于子域名路由通配符,子域名可以像 URI 一样被分配给路由参数,从而允许捕获子域名的部分用于路由或者控制器,子域名可以通过群组属性数组中的 domain 来指定:

    Route::group(['domain' => '{account}.myapp.com'], function () {
        Route::get('user/{id}', function ($account, $id) {
            //
        });
    });

    路由前缀

    群组属性 prefix 可以用来为群组中每个路由添加一个给定 URI 前缀,例如,你可以为所有路由 URI 添加 admin 前缀 :

    Route::group(['prefix' => 'admin'], function () {
        Route::get('users', function () {
            // 匹配 "/admin/users" URL
        });
    });

    5、路由模型绑定

    注入模型ID到路由或控制器动作时,通常需要查询数据库才能获取相应的模型数据。Laravel 路由模型绑定让注入模型实例到路由变得简单,例如,你可以将匹配给定 ID 的整个 User 类实例注入到路由中,而不是直接注入用户ID。

    隐式绑定

    Laravel 会自动解析定义在路由或控制器动作(变量名匹配路由片段)中的 Eloquent 模型类型声明,例如:

    Route::get('api/users/{user}', function (App\User $user) {
        return $user->email;
    });

    在这个例子中,由于类型声明了 Eloquent 模型 App\User,对应的变量名 $user 会匹配路由片段中的{user},这样,Laravel 会自动注入与请求 URI 中传入的 ID 对应的用户模型实例。

    如果数据库中找不到对应的模型实例,会自动生成 HTTP 404 响应。

    自定义键名

    如果你想要在隐式模型绑定中使用数据表的其它字段,可以重写 Eloquent 模型类的 getRouteKeyName 方法:

    /**
     * Get the route key for the model.
     *
     * @return string
     */
    public function getRouteKeyName()
    {
        return 'slug';
    }

    显示绑定

    要注册显式绑定,需要使用路由的 model 方法来为给定参数指定绑定类。应该在 RouteServiceProvider 类的 boot 方法中定义模型绑定:

    public function boot()
    {
        parent::boot();
        Route::model('user', App\User::class);
    }

    接下来,定义一个包含 {user} 参数的路由:

    $router->get('profile/{user}', function(App\User $user) {
         //
    });

    由于我们已经绑定 {user} 参数到 App\User 模型,User 实例会被注入到该路由。因此,如果请求 URL 是 profile/1,就会注入一个用户 ID 为 1 的 User 实例。

    如果匹配的模型实例在数据库不存在,会自动生成并返回 HTTP 404 响应。

    自定义解析逻辑

    如果你想要使用自定义的解析逻辑,需要使用 Route::bind 方法,传递到 bind 方法的闭包会获取到 URI 请求参数中的值,并且返回你想要在该路由中注入的类实例:

    public function boot()
    {
        parent::boot();
    
        Route::bind('user', function($value) {
            return App\User::where('name', $value)->first();
        });
    }

    6、表单方法伪造

    HTML 表单不支持 PUT、PATCH 或者 DELETE 请求方法,因此,当定义 PUT、PATCH 或 DELETE 路由时,需要添加一个隐藏的 _method 字段到表单中,其值被用作该表单的 HTTP 请求方法:

    <form action="/foo/bar" method="POST">
        <input type="hidden" name="_method" value="PUT">
        <input type="hidden" name="_token" value="{{ csrf_token() }}">
    </form>

    还可以使用辅助函数 method_field 来实现这一目的:

    {{ method_field('PUT') }}

    7、访问当前路由

    你可以使用 Route 门面上的 current、currentRouteName 和 currentRouteAction 方法来访问处理当前输入请求的路由信息:

    $route = Route::current();
    $name = Route::currentRouteName();
    $action = Route::currentRouteAction();
    展开全文
  • laravel路由

    2019-10-02 22:54:56
    laravel路由的路由文件路径: 有的版本是app/http/routes.php 有的版本是routes/web.php //简单路由 Route::get('/', function () {return view('welcome');});//访问路径 http://localhost/laravel/public/ ...

    laravel路由的路由文件路径:

    有的版本是app/http/routes.php

    有的版本是routes/web.php

     

    //简单路由

    Route::get('/', function () {return view('welcome');});
    //访问路径 http://localhost/laravel/public/

    Route::get('hello',function(){return 'hello world';});
    //访问路径 http://localhost/laravel/public/hello

     

    //不同请求方式的路由

    Route::match(['get','post'],'basic2',function(){return 'basic2';});

    Route::any('basic3',function(){return 'basic3';});

     

    //传参路由

    Route::get('user/{id}',function($id){
    return 'user-id='.$id;
    });

    //访问路径 http://localhost/laravel/public/user/参数

     

    //路由群组
    Route::group(['prefix'=> 'user'], function(){
    Route::any('basic2',function(){
    return 'user-basic2';
    });

    Route::any('basic3',function(){
    return 'user-basic3';
    });

    });

    //访问路径 http://localhost/laravel/public/user-basic2/参数

    
    

    转载于:https://www.cnblogs.com/gyfluck/p/9036757.html

    展开全文
  • Laravel路由

    2016-01-06 11:11:26
    Laravel路由一、基本路由1. 可以通过function自定义返回Route::get('/', function () { return 'Hello World'; });Route::post('foo/bar', function () { return 'Hello World'; });Route::put('foo/bar', ...

    Laravel路由

    一、基本路由

    1. 可以通过function自定义返回

    Route::get('/', function () {
        return 'Hello World';
    });
    
    Route::post('foo/bar', function () {
        return 'Hello World';
    });
    
    Route::put('foo/bar', function () {
        //
    });
    
    Route::delete('foo/bar', function () {
        //
    });

    2. 也可直接调用Controller的方法

    Route::get('foo','FooController@index');
    Route::resource('foo','FooController');//resource方法会自动注册该控制器的所有方法(get/post/patch/delete等)

    3. 使用Route::match可以绑定多个请求

    Route::match(['post','get'],'foo','FooController@index');

    4. 或者使用Route::any绑定所有的请求

    Route::any('foo','FooController@index');

    5. 使用url()方法可以获取路由绑定的路径

    比如在前面的例子中,url('foo')返回的就是http://xxxx/foo

    二、路由参数

    1. 必须的参数

    Route::get('user/{id}', function ($id) {
        return 'User '.$id;
    });

    此时laravel无法找到/user,只能找到/user/1

    2. 可选参数

    Route::get('user/{name?}', function ($name = null) {
        return $name;
    });

    3. 对参数进行限制

    Route::get('user/{id}/{name}', function ($id, $name) {
        //
    })
    ->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

    4. 全局参数限制

    RouteServiceProvider.php的boot方法里定义

    public function boot(Router $router)
    {
        $router->pattern('id', '[0-9]+');
    
        parent::boot($router);
    }

    一旦一个参数在boot方法中被定义,就会被用于所有的路由中

    5.对于有参数的路由,使用route()方法获取路径

    $url = route('profile', ['id' => 1]);

    三、对路由进行重命名

    使用as关键字对路由进行重命名

    Route::get('user/profile', ['as' => 'profile', function () {
        //
    }]);
    
    Route::get('user/profile', [
        'as' => 'profile', 'uses' => 'UserController@showProfile'
    ]);

    或是使用name()方法

    Route::get('user/profile', 'UserController@showProfile')->name('profile');

    四、 路由组

    1. 中间件

    Route::group(['middleware' => 'auth'], function () {
        Route::get('/', function ()    {
            // Uses Auth Middleware
        });
    });

    2. 命名空间

    Route::group(['namespace' => 'Admin'], function()
    {
        // Controllers Within The "App\Http\Controllers\Admin" Namespace
        Route::group(['namespace' => 'User'], function()
        {
            // Controllers Within The "App\Http\Controllers\Admin\User" Namespace
        });
    });

    3. 前缀

    Route::group(['prefix' => 'admin'], function () {
        Route::get('users', function ()    {
            // Matches The "/admin/users" URL
        });
    });
    展开全文
  • laravel 路由 One of the coolest (arguably the coolest) features of Laravel is its amazing routing features. Coming from Codeigniter where all routing is done by controller and method names, this was a...
  • laravel路由参数 Today we'll be looking at more of Laravel's routing features. This time we'll be dealing with how Laravel handles route parameters. We've gone over Laravel routing before, but this ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,174
精华内容 2,069
关键字:

laravel路由