精华内容
下载资源
问答
  •  上篇介绍了 Laravel路由注册机制“Laravel 4 的路由如何完成注册的?”作为这个系列的最后一讲,本篇将要为大家介绍的,是执行了 $app->run() 之后所发生的事,以及这个过程中涉及到的应用程序事件。  ...
    
    

      上篇介绍了 Laravel 的路由注册机制“Laravel 4 的路由是如何完成注册的?”作为这个系列的最后一讲,本篇将要为大家介绍的,是执行了 $app->run() 之后所发生的事,以及这个过程中涉及到的应用程序事件。

      在完成了路由的注册后,紧接着执行的就是 public/index.php 中的 $app->run(); 让我们来看一下 run 方法的源码:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public function run()
    {
        // 调度路由返回响应实例
        $response = $this->dispatch($this['request']);
     
        // 执行 close 应用程序事件
        $this['router']->callCloseFilter($this['request'], $response);
     
        // 发送响应
        $response->send();
     
        // 执行 finish 应用程序事件
        $this['router']->callFinishFilter($this['request'], $response);
    }

      下面是整个流程的分析:

    1. 第4行,执行了路由调度操作 dispatch
      1. 执行应用程序事件 App::before(function($request){})
      2. 执行 Illuminate\Routing\Route.php 的 run 方法
        1. 执行 Route::filter($route, $request) 前置操作
        2. 最终业务回调,取得响应实例(这里执行了之前注册进路由的回调函数)
        3. 执行 Route::filter($route, $request, $response) 后置操作
      3. 执行应用程序事件 App::after(function($request, $response){})
    2. 第7行,执行应用程序事件 App::close(function($request, $response){})
    3. 第10行,发送 1-2-2 中获取的响应实例
    4. 第13行,执行应用程序事件 App::finish(function($request, $response){})
    5. 最后在 public/index.php 中的 $app->shutdown() 时,执行最后的应用程序事件 App::shutdown(function($application){})

    展开全文
  • 使用PHP 8属性在Laravel应用中注册路由 该软件包提供注释以自动注册路由。 这是一个简单的例子: use Spatie \ RouteAttributes \ Attributes \ Get ; class MyController { #[Get('my-route')] public function...
  • <p>I have a Laravel application with a StandardModel and StandardConnector trait that I'm applying to the vast majority of my Models and Connectors. <p>By including Route::resource in the routes ...
  • 目录[-] group() createRoute() 相关文件的源码请参考: ... 上篇分析了 Laravel 4 的启动流程 “Laravel 4 在启动的时候到底做了什么?... 而开发阶段我们将会面临另一个难点——路由。  通常,
    
    

      上篇分析了 Laravel 4 的启动流程 “Laravel 4 在启动的时候到底做了什么?”,读过的朋友应该对 Laravel 4 文件的加载顺序有了一个比较清晰的认识,这样就可以顺利的完成开发前的配置及准备工作。

      而开发阶段我们将会面临另一个难点——路由。

      通常,在看过官方文档后就可以比较顺利的使用路由,我们知道在 routes.php 文件中可以通过定义 Route::get() Route::post() Route::group() 等方法来注册我们的路由,然而你真的了解这些路由是怎么注册进我们的程序的吗?

      除了“RESTful控制器”和“资源控制器”之外,所有的路由注册最终都指向 Illuminate\Routing\Router.php 的 createRoute 方法。而另一个重要的辅助方法则是 group 分组路由。只有理解了这两个方法,才算是完全理解了路由的注册机制。

    group()

      让我们从 group 方法开始,这个方法可以直接使用,像这样 Route::group(array(), function(){}); 下面是它的源码:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function group(array $attributes, Closure $callback)
    {
        // 存储分组共享属性,对于嵌套使用的路由组,将对传入的共享属性做递归合并处理
        $this->updateGroupStack($attributes);
     
        // 回调函数中的路由注册最终都指向了 createRoute 方法
        call_user_func($callback);
     
        // 出栈,移除本次记录的共享属性
        array_pop($this->groupStack);
    }

      第4行的作用是将传入的 $attributes 数组存储到 $this->groupStack 这个分组属性的堆栈中,如果出现了嵌套使用分组路由的情况,则对传入的属性数据做递归处理。这些临时存储的属性将在第7行,也就是最终执行到 createRoute 方法时被存储到各个线路中去,与各自的行为参数合并。第10行的出栈操作则是避免嵌套使用的分组路由出现属性存储的错误。

      这里有两个重点:

    1. Route::group() 中的匿名函数将会立即被执行,而不像 Route::get() 中的匿名函数被存储为回调函数后期调用,所以如果你在分组路由的匿名函数中放上一个 dd() 那么恭喜,你的整个程序都会 dd 在那里了。
    2. 关于 $attributes 数组,建议在此定义的属性如下:
    ?
    1
    2
    3
    4
    5
    6
    7
    array(
        'http','https', // 协议类型,默认 http(任选其一即可)
        'domain' => '', // 域名模式字符串
        'prefix' => '', // 前缀
        'before' => '', // 前置过滤器
        'after'  => '', // 后置过滤器
    );

    createRoute()

      接下来,让我们来看看 createRoute 方法,像 Route::get('/', function(){}); 这样的调用最终都会指向它,下面是它的源码:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    protected function createRoute($method, $pattern, $action)
    {
        // We will force the action parameters to be an array just for convenience.
        // This will let us examine it for other attributes like middlewares or
        // a specific HTTP schemes the route only responds to, such as HTTPS.
        // 将“非数组行为参数”格式化为标准的“行为参数数组”
        // 匿名函数将被解析为 array(Closure)
        // 字符串将被解析为   array('uses' => 'usesController@usesMethod')
        if ( ! is_array($action))
        {
            $action = $this->parseAction($action);
        }
         
        $groupCount = count($this->groupStack);
     
        // If there are attributes being grouped across routes we will merge those
        // attributes into the action array so that they will get shared across
        // the routes. The route can override the attribute by specifying it.
        // 当存在“分组共享参数”时,将其合并到当前的“行为参数数组”
        if ($groupCount > 0)
        {
            $index = $groupCount - 1;
     
            $action = $this->mergeGroup($action, $index);
        }
     
        // Next we will parse the pattern and add any specified prefix to the it so
        // a common URI prefix may be specified for a group of routes easily and
        // without having to specify them all for every route that is defined.
        // 得到正确格式的“模式字符串”及“可选参数数组”
        list($pattern, $optional) = $this->getOptional($pattern);
     
        if (isset($action['prefix']))
        {
            $prefix = $action['prefix'];
     
            // 为模式字符串增加前缀
            $pattern = $this->addPrefix($pattern, $prefix);
        }
     
        // We will create the routes, setting the Closure callbacks on the instance
        // so we can easily access it later. If there are other parameters on a
        // routes we'll also set those requirements as well such as defaults.
        $route = with(new Route($pattern))->setOptions(array(
     
            // 从“行为参数数组”中获取回调函数:匿名函数 或 uses 参数
            '_call' => $this->getCallback($action),
     
        ))->setRouter($this)->addRequirements($this->patterns);
     
        // 设置请求类型
        $route->setRequirement('_method', $method);
     
        // Once we have created the route, we will add them to our route collection
        // which contains all the other routes and is used to match on incoming
        // URL and their appropriate route destination and on URL generation.
        // 为线路(非路由,注意区分)设置属性及可选参数
        $this->setAttributes($route, $action, $optional);
     
        // 构造线路名称
        $name = $this->getName($method, $pattern, $action);
     
        // 将线路加入路由集合实例,注意:同名路由将被覆盖
        $this->routes->add($name, $route);
     
        // 返回当前线路实例
        return $route;
    }

      这部分的注释已经写的相当详细了,需要特别说明的是:

    1. 从14到25行,正是这部分操作将分组路由的属性合并入其下各个线路的行为参数中去。所以理论上来说这里支持的行为参数,在分组路由的属性中都是可以被定义的,但是出于各种考虑,分组路由的属性还是仅建议定义上面提到的那几种。
    2. 第64行的操作将会照成同名路由被覆盖,而路由的名称则是根据“域名”“模式字符串”等数据进行构造的,并且如果存在 as 行为参数的话则直接使用 as 的字符串。所以像 as 这种行为参数如果你要把它放到分组路由的属性中去定义的话,那我只能哈哈了。
    3. 支持定义的行为参数如下:
      ?
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      array(
          'http','https', // 协议类型,默认 http(任选其一即可)
          'domain' => '', // 域名模式字符串(不借助分组路由依然可以针对域名操作)
          'as'     => '', // 别名(优先作为线路名称,注意线路覆盖)
          'prefix' => '', // 前缀(建议在路由分组中设置)
          'before' => '', // 前置过滤器
          'uses'   => '', // 控制器方法字符串(支持简写,与 Closure 任选其一)
           Closure,       // 匿名回调函数(支持简写,与 uses 任选其一)
          'after'  => '', // 后置过滤器
      );
    4. 支持的简写:
      ?
      1
      2
      直接使用 匿名函数 相当于 array(Closure)
      直接使用 字符串   相当于 array('uses' => 'usesController@usesMethod')

    相关文件的源码请参考:

    展开全文
  • 第一步: 在和web.php同级新建一个自己的路由比如叫myweb.php第二步: 在app\Providers\RouteServiceProvider.php中添加如下代码: /** * 自己注册路由文件 */ protected function mapMywebRoutes() { ...

    第一步:

        在和web.php同级新建一个自己的路由比如叫myweb.php

    第二步:

      在app\Providers\RouteServiceProvider.php中添加如下代码:

       

         /**

         *  自己注册的路由文件

         */

         protected function mapMywebRoutes()

          {

            Route::middleware('web')

                 ->namespace($this->namespace)

                 ->group(base_path('routes/myweb.php'));

         }

    第三步:

       修改public function map()在里面添加如下一句代码:

           $this->mapMywebRoutes();

         

    展开全文
  • Laravel注册密码默认加密方式是Hash::make(),如何得知 查看路由,看到注册的 Action 是 App\Http\Controllers\Auth\AuthController@register,找到AuthController这个控制器,发现找不到 register 这个方法,但是...

    https://www.jianshu.com/p/35b64d596cfa

    Laravel注册密码默认加密方式是Hash::make(),如何得知

    查看路由,看到注册的 ActionApp\Http\Controllers\Auth\AuthController@register,找到AuthController这个控制器,发现找不到 register 这个方法,但是我们可以看到

     

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;
    

    这里用到了 trait,找到 AuthenticatesAndRegistersUsers,代码如下

     

    <?php
    
    namespace Illuminate\Foundation\Auth;
    
    trait AuthenticatesAndRegistersUsers
    {
        use AuthenticatesUsers, RegistersUsers {
            AuthenticatesUsers::redirectPath insteadof RegistersUsers;
            AuthenticatesUsers::getGuard insteadof RegistersUsers;
        }
    }
    

    还是用到了trait,进入 RegistersUsers,终于找到了 register 方法

     

    public function register(Request $request)
    {
        $validator = $this->validator($request->all());
    
        if ($validator->fails()) {
            $this->throwValidationException(
                $request, $validator
            );
        }
    
        Auth::guard($this->getGuard())->login($this->create($request->all()));
    
        return redirect($this->redirectPath());
    }
    

    这里有个 create 方法,就是使用这个创建用户,但这个controller的方法,不是model的方法,接着找到一开始的 AuthController,找到 create 方法

     

    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }
    

    这里密码用了 bcrypt 方法加密了,bcrypt是 Hash::make() 方法的别名

    所以,不难发现,默认注册密码加密使用的是 Hash::make / bcrypt


     



    作者:一阵风fly
    链接:https://www.jianshu.com/p/35b64d596cfa
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • laravel开发过程中,多模块配置是很常见,一般我们会routes下自定义一个路由,通过RouteServiceProvider进行路由注册,实现自定义多模块路由,下面我们就来看看如何实现自定义路由模块。 首先我们通过Artisan创建...
  • 它提供了一个路由中间件,该路由中间件在应用于路由时将确保Varnish无论如何都将缓存响应。 该软件包还包含一个从应用程序内部刷新Varnish缓存的功能。 支持我们 我们投入了大量资源来创建。 您可以通过来支持我们...
  • 在 config/app.php 注册 ServiceProvider 和 Facade (Laravel 5.5 + 无需手动注册) 'providers' => [ // ... Overtrue\LaravelWeChat\ServiceProvider::class, ], 'aliases' => [ // ... 'EasyWeChat' =&...
  • 该项目的主要目的是演示如何Laravel Framework中使用通配符域/子域。 了解更多 在此处阅读有关此项目的更多信息: : 部署方式 假定该项目使用Laravel Forge托管,并使用Envoyer.io进行部署 安装作曲家依赖项后要...
  • 注册路由 这块代码是在 Application 的构造函数中加载的 public function __construct($basePath = null) { ... $this->registerBaseServiceProviders(); ... } 复制代码protected function reg...
  • 引言Laravel分层设计中,一般在路由阶段对请求进行初步的过滤筛选, 对不合格的或者非法的请求,直接可以中断请求,返回错误结果。一般我们也是这么做的,但是你想过没有,中间件如何传递数据到下游? 本文就来说一...
  • 从某种意义上说,服务提供者...Laravel的每个核心组件都对应一个服务提供者,可以这么说,服务提供者是Laravel的心脏,是Laravel的核心,核心组件类在这里完成注册、初始化以供后续调用。既然这么重要,那么如何在自...
  • 更是如何合理规划 URL 的指路明灯,相信你会从中学到很多。 下面我们正式开始一项一项地实现 Article 的新增、编辑、删除功能: 开始行动 配置资源路由 将当前路由配置中的 <code>Route::get('...
  • 更是如何合理规划 URL 的指路明灯,相信你会从中学到很多。 下面我们正式开始一项一项地实现 Article 的新增、编辑、删除功能: 开始行动 配置资源路由 将当前路由配置中的 <code>Route::get('...
  • 如何安装 首先使存储文件夹可写。 cp .env.example .env composer install php artisan key:generate php artisan migrate --seed php artisan storage:link 前端开发 npm install npm run watch 进行生产 npm run ...
  • 从某种意义上说,服务提供者有点类似HTTP控制器,HTTP控制器用于为相关路由注册提供统一管理,而服务提供者用于为相关服务容器提供统一绑定场所,此外服务提供者还可以做...既然这么重要,那么如何在自己的Laravel...
  • 仿联想商城laravel实战---5、无刷新...1、比如管理员有正常和禁用两种状态,我需要修改管理员状态,我如何修改(需要注册路由么)? 需要注册路由 总结:一些非路由组里面的方法都要注册,所以我们增加的一些乱七八...
  • 引言Laravel分层设计中,一般在路由阶段对请求进行初步的过滤筛选, 对不合格的或者非法的请求,直接可以中断请求,返回错误结果。 一般我们也是这么做的,但是你想过没有,中间件如何传递数据到下游? 本文就来说一...
  • 引言 电子邮件从其诞生以来就大大地提升了人们的效率,传统的绿色的邮箱那种送信方式, 已经被传输在光缆上的一束束通讯信息取代。 电子邮件同时带来了垃圾信息的...接着在 routes/web.php 路由文件内注册资源类路由
  • 正尝试用Lumen开发一个...所以我想将微信的路由注册为可响应GET和POST两种请求:查了下laravel 5的文档,为多种请求匹配路由:Route::match(['get', 'post'], '/', function(){return 'Hello World';});注册为响应...
  • 跟随本文我们一起来看看如何进行Laravel重置密码重构。1、首先确定重置密码的路由我们在安装好laravel的时候默认生成的重置密码是在用户未登录的情况下进行的。所以使用原来的控制器是不可行的,并且原有的重置...
  • 如何在 <code>cleaners</code> 中增加清理呢?目前使用下面的办法解决的,但是发现有很多 <code>ServiceProvider</code> 类,都需要一一添加吗? <pre><code> // 用于清理注册了单例的 ...
  • 注册路由方式类同 > 2. 模型的对象化使用极为相似,但是两者间的几个关键词要注意; 比如 ThinkPHP5.1使用 field、order、find、select、alias等; 而 Laravel5.5 使用 select、orderBy、get、first 等 &...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

laravel如何注册路由