Laravel Telescope – 永夜 https://www.shuijingwanwq.com 没有不值得去解决的问题,也没有不值得去学习的技术! Fri, 29 May 2026 12:43:48 +0000 zh-Hans hourly 1 https://wordpress.org/?v=7.0 在 Laravel 9 中,执行:php artisan telescope:install 时报错:ERROR There are no commands defined in the “telescope” namespace. https://www.shuijingwanwq.com/2024/02/04/8431/ https://www.shuijingwanwq.com/2024/02/04/8431/#respond Sun, 04 Feb 2024 01:36:44 +0000 https://www.shuijingwanwq.com/?p=8431 浏览量: 97 1、在 Laravel 9 中,执行:php artisan telescope:install 时报错:ERROR There are no commands defined in the “telescope” namespace.。如图1
在 Laravel 9 中,执行:php artisan telescope:install 时报错:ERROR There are no commands defined in the "telescope" namespace.

图1



PS E:\wwwroot\erp-backend> php artisan telescope:install

   ERROR  There are no commands defined in the "telescope" namespace.



2、发现应用程序的 config/app.php 配置文件中 TelescopeServiceProvider 服务提供者注册 已经删除。先再次添加回去。如图2
发现应用程序的 config/app.php 配置文件中 TelescopeServiceProvider 服务提供者注册 已经删除。先再次添加回去

图2

3、再次运行:php artisan telescope:install。不再报错。如图3
再次运行:php artisan telescope:install。不再报错

图3



PS E:\wwwroot\erp-backend> php artisan telescope:install
Publishing Telescope Service Provider...
Publishing Telescope Assets...
Publishing Telescope Configuration...
Telescope scaffolding installed successfully.


4、还原第 2 步骤的操作,在 App\Providers\AppServiceProvider 类的 register 方法中,手动注册 telescope 的服务提供者


/**
 * 注册应用服务
 *
 * @return void
 */
public function register()
{
    if ($this->app->environment('local')) {
        $this->app->register(\Laravel\Telescope\TelescopeServiceProvider::class);
        $this->app->register(TelescopeServiceProvider::class);
    }
}


]]>
https://www.shuijingwanwq.com/2024/02/04/8431/feed/ 0
在 Laravel 6 ,队列任务失败后,异常信息未写入表 failed_jobs 中 https://www.shuijingwanwq.com/2023/12/21/8293/ https://www.shuijingwanwq.com/2023/12/21/8293/#respond Thu, 21 Dec 2023 03:30:51 +0000 location]]> https://www.shuijingwanwq.com/?p=8293 浏览量: 82 1、当一个队列任务失败后,执行到 任务失败后清理 failed 方法。抛出异常,发现与 telescope 有关


[2023-11-20 17:25:42] local.ERROR: file_get_contents(E:\wwwroot\object\storage\app\theme_downloads\2023\11\20\1700472319.9435.1423840798\migrations\migrate_settings_data.php): failed to open stream: No such file or directory {
    "exception": "[object] (ErrorException(code: 0): file_get_contents(E:\\wwwroot\\wshop\\platform\\storage\\app\\theme_downloads\\2023\\11\\20\\1700472319.9435.1423840798\\migrations\\migrate_settings_data.php): failed to open stream: No such file or directory at E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\telescope\\src\\ExceptionContext.php:45)
[stacktrace]
#0 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'file_get_conten...', 'E:\\\\wwwroot\\\\wsho...', 45, Array)
#1 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\telescope\\src\\ExceptionContext.php(45): file_get_contents('E:\\\\wwwroot\\\\wsho...')
#2 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\telescope\\src\\ExceptionContext.php(19): Laravel\\Telescope\\ExceptionContext::getFileContext(Object(ErrorException))
#3 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\telescope\\src\\Watchers\\JobWatcher.php(108): Laravel\\Telescope\\ExceptionContext::get(Object(ErrorException))
#4 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Events\\Dispatcher.php(369): Laravel\\Telescope\\Watchers\\JobWatcher->recordFailedJob(Object(Illuminate\\Queue\\Events\\JobFailed))
#5 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Events\\Dispatcher.php(218): Illuminate\\Events\\Dispatcher->Illuminate\\Events\\{closure}('Illuminate\\\\Queu...', Array)
#6 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Queue\\Jobs\\Job.php(185): Illuminate\\Events\\Dispatcher->dispatch('Illuminate\\\\Queu...')
#7 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Queue\\Worker.php(482): Illuminate\\Queue\\Jobs\\Job->fail(Object(ErrorException))
#8 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Queue\\Worker.php(469): Illuminate\\Queue\\Worker->failJob(Object(Illuminate\\Queue\\Jobs\\RedisJob), Object(ErrorException))
#9 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Queue\\Worker.php(399): Illuminate\\Queue\\Worker->markJobAsFailedIfWillExceedMaxAttempts('redis', Object(Illuminate\\Queue\\Jobs\\RedisJob), 1, Object(ErrorException))
#10 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Queue\\Worker.php(372): Illuminate\\Queue\\Worker->handleJobException('redis', Object(Illuminate\\Queue\\Jobs\\RedisJob), Object(Illuminate\\Queue\\WorkerOptions), Object(ErrorException))
#11 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Queue\\Worker.php(314): Illuminate\\Queue\\Worker->process('redis', Object(Illuminate\\Queue\\Jobs\\RedisJob), Object(Illuminate\\Queue\\WorkerOptions))
#12 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Queue\\Worker.php(134): Illuminate\\Queue\\Worker->runJob(Object(Illuminate\\Queue\\Jobs\\RedisJob), 'redis', Object(Illuminate\\Queue\\WorkerOptions))
#13 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Queue\\Console\\WorkCommand.php(112): Illuminate\\Queue\\Worker->daemon('redis', 'default', Object(Illuminate\\Queue\\WorkerOptions))
#14 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Queue\\Console\\WorkCommand.php(96): Illuminate\\Queue\\Console\\WorkCommand->runWorker('redis', 'default')
#15 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Container\\BoundMethod.php(36): Illuminate\\Queue\\Console\\WorkCommand->handle()
#16 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Container\\Util.php(37): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()
#17 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Container\\BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure(Object(Closure))
#18 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Container\\BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure))
#19 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Container\\Container.php(590): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL)
#20 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Console\\Command.php(134): Illuminate\\Container\\Container->call(Array)
#21 E:\\wwwroot\\wshop\\platform\\vendor\\symfony\\console\\Command\\Command.php(255): Illuminate\\Console\\Command->execute(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))
#22 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Console\\Command.php(121): Symfony\\Component\\Console\\Command\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))
#23 E:\\wwwroot\\wshop\\platform\\vendor\\symfony\\console\\Application.php(1021): Illuminate\\Console\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#24 E:\\wwwroot\\wshop\\platform\\vendor\\symfony\\console\\Application.php(275): Symfony\\Component\\Console\\Application->doRunCommand(Object(Illuminate\\Queue\\Console\\WorkCommand), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#25 E:\\wwwroot\\wshop\\platform\\vendor\\symfony\\console\\Application.php(149): Symfony\\Component\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#26 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Console\\Application.php(93): Symfony\\Component\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#27 E:\\wwwroot\\wshop\\platform\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Console\\Kernel.php(131): Illuminate\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#28 E:\\wwwroot\\wshop\\platform\\artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#29 {main}
"
} 


2、使用 queue:work Artisan 命令运行处理器,发现队列任务一直未结束,也未失败。如图1
使用 queue:work Artisan 命令运行处理器,发现队列任务一直未结束,也未失败

图1



PS E:\wwwroot\object> php artisan queue:work
[2023-11-20 17:25:19][4kBhJcMDrWBEuf8ZWskA9ikQlGbu9kBL] Processing: Modules\ThemeStoreDb\Jobs\InstallThemeToDb


3、查看表 failed_jobs 中,也未新增加记录。如图2
查看表 failed_jobs 中,也未新增加记录

图2

4、在 .env 文件,禁用 telescope ,再次执行队列任务,表 failed_jobs 中已经成功增加新记录。如图3
在 .env 文件,禁用 telescope ,再次执行队列任务,表 failed_jobs 中已经成功增加新记录

图3



TELESCOPE_ENABLED=false


5、还原第 4 步骤,根源应该在于执行了 View::addLocation($this->location); 方法所导致,也执行了方法 View::flushFinderCache(); 。然后又删除掉了目录 $this->location。决定不再删除目录 $this->location。使用 queue:work Artisan 命令运行处理器,发现队列任务已经失败。且 表 failed_jobs 中,也已经新增加记录。如图4
还原第 4 步骤,根源应该在于执行了 View::addLocation($this->location); 方法所导致,也执行了方法 View::flushFinderCache(); 。然后又删除掉了目录 $this->location。决定不再删除目录 $this->location。使用 queue:work Artisan 命令运行处理器,发现队列任务已经失败。且 表 failed_jobs 中,也已经新增加记录。

图4

]]>
https://www.shuijingwanwq.com/2023/12/21/8293/feed/ 0
在 Laravel Telescope 的 Job Queries 中,一些 SQL 语句未被记录的排查分析 https://www.shuijingwanwq.com/2023/05/16/7624/ https://www.shuijingwanwq.com/2023/05/16/7624/#respond Tue, 16 May 2023 01:16:07 +0000 https://www.shuijingwanwq.com/?p=7624 浏览量: 92

1、在 Laravel Telescope 的 Job Queries 中,一些 SQL 语句未被记录。Queries (22) ,实际上远不止 22 条。如图1

在 Laravel Telescope 的 Job Queries 中,一些 SQL 语句未被记录。Queries (22) ,实际上远不止 22 条

图1

2、在 composer.json 中查看 laravel/telescope,其版本为:v2.1.7 。如图2

在 composer.json 中查看 laravel/telescope,其版本为:v2.1.7

图2

3、清空 telescope_ 开头的表,重新执行 Job,在 Laravel Telescope 的 Queries 中,发现 Job Queries 下的 所有 SQL 皆是存在的,只不过一些 SQL 并未与 Job 关联起来。预估 job 中存在的 SQL 是超过 1000 条的,但是在 Laravel Telescope 的 Queries 中,仅存在 641 条 SQL,仍然没有显示完全。如图3

清空 telescope_ 开头的表,重新执行 Job,在 Laravel Telescope 的 Queries 中,发现 Job Queries 下的 所有 SQL 皆是存在的,只不过一些 SQL 并未与 Job 关联起来。预估 job 中存在的 SQL 是超过 1000 条的,但是在 Laravel Telescope 的 Queries 中,仅存在 641 条 SQL,仍然没有显示完全

图3

4、执行 SQL,SELECT count(*) FROM `table`.`telescope_entries` WHERE `type` = ‘query’,结果为 1375。说明 Job 下的 SQL 是完全记录了的,只不过未显示完全。如图4

执行 SQL,SELECT count(*) FROM `table`.`telescope_entries` WHERE `type` = 'query',结果为 1375。说明 Job 下的 SQL 是完全记录了的,只不过未显示完全

图4

5、进入一条未被关联的 SQL,点击 View Job,其跳转至 Jobs 中的最新一个 Job,并非其本应关联到的 Job。不过,可以基于 Location 的值确认此 SQL 是属于本应关联到的 Job 的。如图5

进入一条未被关联的 SQL,点击 View Job,其跳转至 Jobs 中的最新一个 Job,并非其本应关联到的 Job。不过,可以基于 Location 的值确认此 SQL 是属于本应关联到的 Job 的

图5

6、决定在 Job 中注释掉一些不重要的 SQL 执行,以将 SQL 数量减少一些,以便于观察更为重要的 SQL。

]]>
https://www.shuijingwanwq.com/2023/05/16/7624/feed/ 0
在 Laravel 6 中,队列已经执行完毕,但是在 Laravel Telescope 中,排队作业仍然显示未结束:pending https://www.shuijingwanwq.com/2023/01/17/7352/ https://www.shuijingwanwq.com/2023/01/17/7352/#respond Tue, 17 Jan 2023 01:17:37 +0000 https://www.shuijingwanwq.com/?p=7352 浏览量: 77 1、在 Laravel 6 中,在终端中,可以确认队列已经执行完毕。如图1
在 Laravel 6 中,在终端中,可以确认队列已经执行完毕

图1



PS E:\wwwroot\object> php artisan queue:work
[2023-01-13 14:12:32][GHVw90qX0L3e9k3iZaJ5N8CYcSo2RftQ] Processing: Modules\ThemeStoreDB\Jobs\ThemeDeletionJob
[2023-01-13 14:12:35][GHVw90qX0L3e9k3iZaJ5N8CYcSo2RftQ] Processed:  Modules\ThemeStoreDB\Jobs\ThemeDeletionJob
[2023-01-13 14:12:35][SdsCdHiZ3Mk2D7GDMmzNdV1U2wpfa0PF] Processing: Modules\ThemeStoreDB\Jobs\ThemeDeletionJob
[2023-01-13 14:12:37][SdsCdHiZ3Mk2D7GDMmzNdV1U2wpfa0PF] Processed:  Modules\ThemeStoreDB\Jobs\ThemeDeletionJob
[2023-01-13 14:12:37][wCuCurEwV8BZma2n8hty3lx4HxyRDNXy] Processing: Modules\ThemeStoreDB\Jobs\ThemeDeletionJob
[2023-01-13 14:12:41][wCuCurEwV8BZma2n8hty3lx4HxyRDNXy] Processed:  Modules\ThemeStoreDB\Jobs\ThemeDeletionJob
[2023-01-13 14:14:09][pCozFDgDIQpaLtjFSGG923orPRknPSM7] Processing: Modules\ThemeStoreDB\Jobs\ThemeInstallationJob
[2023-01-13 14:14:38][pCozFDgDIQpaLtjFSGG923orPRknPSM7] Processed:  Modules\ThemeStoreDB\Jobs\ThemeInstallationJob
[2023-01-13 14:14:38][3RcAOkB0IASBFY6WQHWliuZvBEG2Krfb] Processing: Modules\ThemeStoreDB\Jobs\ThemeInstallationJob
[2023-01-13 14:15:11][3RcAOkB0IASBFY6WQHWliuZvBEG2Krfb] Processed:  Modules\ThemeStoreDB\Jobs\ThemeInstallationJob
[2023-01-13 14:15:11][nmzxYtN0OV6QwgH3OUXDSALbxpUf0wBD] Processing: Modules\ThemeStoreDB\Jobs\ThemeInstallationJob
[2023-01-13 14:15:48][nmzxYtN0OV6QwgH3OUXDSALbxpUf0wBD] Processed:  Modules\ThemeStoreDB\Jobs\ThemeInstallationJob


2、但是,在 Laravel Telescope 中,排队作业的状态仍然显示未结束。如图2
但是,在 Laravel Telescope 中,排队作业的状态仍然显示未结束

图2

3、怀疑可能是更新 Telescope 后,没有重新配置加载 Telescope 实例的缘故,执行命令,重新加载。如图3
怀疑可能是更新 Telescope 后,没有重新配置加载 Telescope 实例的缘故,执行命令,重新加载

图3



PS E:\wwwroot\object> php artisan telescope:publish
Publishing complete.
Copied Directory [\vendor\laravel\telescope\public] To [\public\vendor\telescope]
Publishing complete.


4、再次执行队列任务,在 Laravel Telescope 中,新的排队作业的状态已经显示为已结束:processed。如图4
再次执行队列任务,在 Laravel Telescope 中,新的排队作业的状态已经显示为已结束:processed

图4

]]>
https://www.shuijingwanwq.com/2023/01/17/7352/feed/ 0
在 Laravel 6、Module、Lighthouse 中实现 安全 验证 的流程(使用 @rules 指令,使用 Exists 规则) https://www.shuijingwanwq.com/2022/04/20/6312/ https://www.shuijingwanwq.com/2022/04/20/6312/#respond Wed, 20 Apr 2022 01:10:33 +0000 https://www.shuijingwanwq.com/?p=6312 浏览量: 92 1、当请求响应成功时的结构。如图1
当请求响应成功时的结构

图1




mutation {
  onlineStoreThemePreviewCodeGenerate(themeId: "vogue") {
    themePreviewCode
  }
}





{
  "data": {
    "onlineStoreThemePreviewCodeGenerate": {
      "themePreviewCode": "eyJpdiI6IjZlZ3RpZzlyZmp6S3BzQWJcL0N1NVR3PT0iLCJ2YWx1ZSI6IkNGdVwvdGJMZFI2MWJPRXFMbTNhdmVOUVVCVDhzb1ZnSzFNQzd2Y1RoSElGMmw4VkxOWFppbnlNbmtjaFNnbG9FXC9Oa1hYSndRU1hlcmpFMktneFNkQmVoMjhENnoxb3dQY0lxNHZnemJrNXlLTlpNKzJmbEU4RTFXNnFza2dyVG4iLCJtYWMiOiI0NzcwZjllYjIxZDliOGFkMTU2OTdiZmVmYWViN2I2OTI5NWE0ZDFjOTBmOGU1MGMyZjI3MzBjNTQxMWE3ODQ2In0="
    }
  }
}


2、但是,现阶段并未针对请求参数进行安全验证。参考:https://lighthouse-php.com/master/security/validation.html#single-arguments 。Lighthouse 允许您在查询和变更中使用 Laravel 的验证。 3、此 GraphQL API 的变更仅有一个请求参数,即 themeId,仅需要验证此字段是否在表中存在即可。 4、利用内置验证规则的最简单方法是使用 @rules 指令。使用 Exists 规则


extend type Mutation {
    "生成主题预览代码"
    onlineStoreThemePreviewCodeGenerate(themeId: ID! @rules(apply: ["exists:theme_asset,theme_id"])): OnlineStoreThemePreviewCodeGeneratePayload @field(resolver: "Modules\\ThemeStore\\Resolver\\ThemePreview\\GenerateThemePreviewCodeResolver")
}


5、测试验证规则是否有效,确定有效。如图2
测试验证规则是否有效,确定有效

图2




mutation {
  onlineStoreThemePreviewCodeGenerate(themeId: "vogue1") {
    themePreviewCode
  }
}





{
  "errors": [
    {
      "message": "Validation failed for the field [onlineStoreThemePreviewCodeGenerate].",
      "extensions": {
        "validation": {
          "themeId": [
            "The selected theme id is invalid."
          ]
        },
        "category": "validation"
      },
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "onlineStoreThemePreviewCodeGenerate"
      ],
      "trace": ...
    }
  ],
  "data": {
    "onlineStoreThemePreviewCodeGenerate": null
  }
}


6、查看 Laravel Telescope 中请求中的 SQL 语句。


select
  count(*) as aggregate
from
  `theme_asset`
where
  `theme_id` = 'vogue1'


7、但是,现阶段还存在一个问题,因为表名称的前缀恰好是 ”,如果设置为 ‘object_’,可能会有问题。再次请求,发现报错,符合预期。说明验证规则中会自动读取表前缀的。无需要调整。如图3
但是,现阶段还存在一个问题,因为表名称的前缀恰好是 '',如果设置为 'object_',可能会有问题。再次请求,发现报错,符合预期。说明验证规则中会自动读取表前缀的。无需要调整

图3



        'mysql' => [
            ...
            'prefix' => 'object_',
        ],




{
  "errors": [
    {
      "debugMessage": "SQLSTATE[42S02]: Base table or view not found: 1146 Table 'object_store.object_theme_asset' doesn't exist (SQL: select count(*) as aggregate from `object_theme_asset` where `theme_id` = vogue1)",
      "message": "Internal server error",
      "extensions": {
        "category": "internal"
      },
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "onlineStoreThemePreviewCodeGenerate"
      ],
      "trace": [
        ...
      ]
    }
  ],
  "data": {
    "onlineStoreThemePreviewCodeGenerate": null
  }
}


]]>
https://www.shuijingwanwq.com/2022/04/20/6312/feed/ 0
在 Laravel 6 v6.20.43、Laravel Telescope v2.1.17 中, \vendor\laravel\telescope\src\Watchers\EventWatcher.php:91,报错:get_class() expects parameter 1 to be object, string given https://www.shuijingwanwq.com/2022/04/11/6261/ https://www.shuijingwanwq.com/2022/04/11/6261/#respond Mon, 11 Apr 2022 01:27:05 +0000 https://www.shuijingwanwq.com/?p=6261 浏览量: 68 1、在 \vendor\laravel\telescope\src\Watchers\EventWatcher.php:91,报错:get_class() expects parameter 1 to be object, string given。如图1
在 \vendor\laravel\telescope\src\Watchers\EventWatcher.php:91,报错:get_class() expects parameter 1 to be object, string given。

图1



{
    "message": "get_class() expects parameter 1 to be object, string given",
    "status_code": 500,
    "debug": {
        "line": 91,
        "file": "E:\\wwwroot\\object\\vendor\\laravel\\telescope\\src\\Watchers\\EventWatcher.php",
        "class": "ErrorException",
        "trace": [
            "#0 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'get_class() exp...', 'E:\\\\wwwroot\\\\wsho...', 91, Array)",
            "#1 E:\\wwwroot\\object\\vendor\\laravel\\telescope\\src\\Watchers\\EventWatcher.php(91): get_class('App\\\\Listeners\\\\U...')",
            "#2 [internal function]: Laravel\\Telescope\\Watchers\\EventWatcher->Laravel\\Telescope\\Watchers\\{closure}(Array, 1)",
            "#3 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Support\\Collection.php(638): array_map(Object(Closure), Array, Array)",
            "#4 E:\\wwwroot\\object\\vendor\\laravel\\telescope\\src\\Watchers\\EventWatcher.php(95): Illuminate\\Support\\Collection->map(Object(Closure))",
            "#5 E:\\wwwroot\\object\\vendor\\laravel\\telescope\\src\\Watchers\\EventWatcher.php(47): Laravel\\Telescope\\Watchers\\EventWatcher->formatListeners('App\\\\Events\\\\Them...')",
            "#6 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Events\\Dispatcher.php(366): Laravel\\Telescope\\Watchers\\EventWatcher->recordEvent('App\\\\Events\\\\Them...', Array)",
            "#7 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Events\\Dispatcher.php(218): Illuminate\\Events\\Dispatcher->Illuminate\\Events\\{closure}('App\\\\Events\\\\Them...', Array)",
            "#8 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\helpers.php(477): Illuminate\\Events\\Dispatcher->dispatch('App\\\\Events\\\\Them...')",
            "#9 E:\\wwwroot\\object\\app\\Services\\ThemeService.php(124): event(Object(App\\Events\\Theme\\ThemeUpdated))",
            "#10 E:\\wwwroot\\object\\app\\Services\\ThemeService.php(184): App\\Services\\ThemeService->update(2, Array, false)",
            "#11 E:\\wwwroot\\object\\app\\Http\\Controllers\\Admin\\API\\ThemeController.php(50): App\\Services\\ThemeService->setDefault(2)",
            "#12 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Controller.php(54): App\\Http\\Controllers\\Admin\\API\\ThemeController->setDefault('2', Object(App\\Services\\ThemeService))",
            "#13 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('setDefault', Array)",
            "#14 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php(219): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\Admin\\API\\ThemeController), 'setDefault')",
            "#15 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php(176): Illuminate\\Routing\\Route->runController()",
            "#16 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(681): Illuminate\\Routing\\Route->run()",
            "#17 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(130): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#18 E:\\wwwroot\\object\\vendor\\spatie\\laravel-permission\\src\\Middlewares\\RoleOrPermissionMiddleware.php(25): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#19 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Spatie\\Permission\\Middlewares\\RoleOrPermissionMiddleware->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure), 'manage_themes|a...')",
            "#20 E:\\wwwroot\\object\\app\\Http\\Middleware\\CheckStoreAdminStatus.php(45): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#21 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): App\\Http\\Middleware\\CheckStoreAdminStatus->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#22 E:\\wwwroot\\object\\app\\Http\\Middleware\\SwitchLanguage.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#23 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): App\\Http\\Middleware\\SwitchLanguage->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#24 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Http\\Middleware\\Auth.php(55): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#25 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Dingo\\Api\\Http\\Middleware\\Auth->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#26 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Auth\\Middleware\\Authenticate.php(43): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#27 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Auth\\Middleware\\Authenticate->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure), 'api')",
            "#28 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Http\\Middleware\\PrepareController.php(45): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#29 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Dingo\\Api\\Http\\Middleware\\PrepareController->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#30 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(105): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#31 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(683): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))",
            "#32 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(658): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Dingo\\Api\\Http\\Request))",
            "#33 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(624): Illuminate\\Routing\\Router->runRoute(Object(Dingo\\Api\\Http\\Request), Object(Illuminate\\Routing\\Route))",
            "#34 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(613): Illuminate\\Routing\\Router->dispatchToRoute(Object(Dingo\\Api\\Http\\Request))",
            "#35 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Routing\\Adapter\\Laravel.php(88): Illuminate\\Routing\\Router->dispatch(Object(Dingo\\Api\\Http\\Request))",
            "#36 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Routing\\Router.php(518): Dingo\\Api\\Routing\\Adapter\\Laravel->dispatch(Object(Dingo\\Api\\Http\\Request), 'v1')",
            "#37 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Http\\Middleware\\Request.php(126): Dingo\\Api\\Routing\\Router->dispatch(Object(Dingo\\Api\\Http\\Request))",
            "#38 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(130): Dingo\\Api\\Http\\Middleware\\Request->Dingo\\Api\\Http\\Middleware\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#39 E:\\wwwroot\\object\\app\\Http\\Middleware\\ChangeAppUrlMiddleware.php(23): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#40 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): App\\Http\\Middleware\\ChangeAppUrlMiddleware->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#41 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#42 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#43 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#44 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#45 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#46 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#47 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode.php(63): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#48 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#49 E:\\wwwroot\\object\\vendor\\fideloper\\proxy\\src\\TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#50 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Fideloper\\Proxy\\TrustProxies->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#51 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(105): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
            "#52 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Http\\Middleware\\Request.php(127): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))",
            "#53 E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Http\\Middleware\\Request.php(103): Dingo\\Api\\Http\\Middleware\\Request->sendRequestThroughRouter(Object(Dingo\\Api\\Http\\Request))",
            "#54 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Dingo\\Api\\Http\\Middleware\\Request->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
            "#55 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(105): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))",
            "#56 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(145): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))",
            "#57 E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(110): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))",
            "#58 E:\\wwwroot\\object\\public\\index.php(57): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))",
            "#59 {main}"
        ]
    }
}


2、查看 \vendor\laravel\telescope\src\Watchers\EventWatcher.php:91


                if (is_string($listener)) {
                    return Str::contains($listener, '@') ? $listener : $listener.'@handle';
                } elseif (is_array($listener)) {
                    return get_class($listener[0]).'@'.$listener[1];
                }



3、查看 EventServiceProvider


    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [

        ThemeUpdated::class                                  => [
            ThemeUpdatedWebhookListener::class
        ],

    ];


4、这看起来像一个 Bug,我看到有一个新的提交正好解决了这个问题。提交:https://github.com/laravel/telescope/commit/a69fc6f4f5fd5b0ac5a242981e162774cbb69e17 。support new listeners syntax。如图2
这看起来像一个 Bug,我看到有一个新的提交正好解决了这个问题。提交:https://github.com/laravel/telescope/commit/a69fc6f4f5fd5b0ac5a242981e162774cbb69e17 。support new listeners syntax。

图2

5、我暂未升级,而是参考提交的变更,编辑 \vendor\laravel\telescope\src\Watchers\EventWatcher.php


                if (is_string($listener)) {
                    return Str::contains($listener, '@') ? $listener : $listener.'@handle';
                } elseif (is_array($listener) && is_string($listener[0])) {
                    return $listener[0].'@'.$listener[1];
                } elseif (is_array($listener) && is_object($listener[0])) {
                    return get_class($listener[0]).'@'.$listener[1];
                }


6、再次运行程序,不再报错。后续决定升级 Laravel Telescope 至包含这个提交的版本。  ]]>
https://www.shuijingwanwq.com/2022/04/11/6261/feed/ 0
在 Laravel 6、Module、Lighthouse 中实现 安全 验证 的流程(使用验证器类来支持复杂的验证规则) https://www.shuijingwanwq.com/2022/03/25/6196/ https://www.shuijingwanwq.com/2022/03/25/6196/#respond Fri, 25 Mar 2022 01:16:13 +0000 https://www.shuijingwanwq.com/?p=6196 浏览量: 172

1、当请求响应成功时的结构。如图1

当请求响应成功时的结构。

图1



mutation {
  onlineStoreThemeAssetCreate(
    input: { themeId: "vogue", content: "string", key: "string" }
  ) {
    themeAsset {
      id
      themeId
      content
      key
      mimeType
      category
      schema
      createdAt
      updatedAt
      deletable
      renameable
      updatable
    }
  }
}




{
  "data": {
    "onlineStoreThemeAssetCreate": {
      "themeAsset": {
        "id": "653",
        "themeId": "vogue",
        "content": "string",
        "key": "string",
        "mimeType": "text/x-php",
        "category": "unknown",
        "schema": null,
        "createdAt": "2022-02-25 01:49:53",
        "updatedAt": "2022-02-25 01:49:53",
        "deletable": false,
        "renameable": false,
        "updatable": false
      }
    }
  }
}


2、但是,现阶段并未针对请求参数进行安全验证。参考:https://lighthouse-php.com/master/security/validation.html#single-arguments 。Lighthouse 允许您在查询和变更中使用 Laravel 的验证。如图2

但是,现阶段并未针对请求参数进行安全验证。参考:https://lighthouse-php.com/master/security/validation.html#single-arguments 。Lighthouse 允许您在查询和变更中使用 Laravel 的验证。

图2

3、此 GraphQL API 的变更虽然在输入对象中仅有 3 个参数,但是验证规则比较复杂。包含如下规则:
(1)验证表中是否存在 themeId: “vogue” 的记录,如果不存在,验证失败;


SELECT * FROM `object_store`.`theme_asset` WHERE `theme_id` = 'vogue' LIMIT 0,1


(2)验证 key: “string” 的格式,其必须为一个有效的相对路径,例:assets/iconfont/iconfont.css。其值等于 string ,验证失败;
(3)验证 key: “string” 的格式,其为一个有效的相对路径后,其文件后缀名必须属于一个预先定义的数组中,例:[‘json’, ‘css’, ‘js’];
(4)验证表中 themeId: “vogue”, key: “string” 记录的唯一性,如果已存在,验证失败;


SELECT * FROM `object_store`.`theme_asset` WHERE `theme_id` = 'vogue' AND `asset_key` = 'string' LIMIT 0,1


(5)验证 content: “string” 的格式,例:当 key 的值的文件后缀名为 .json 时,需要验证 content 的值格式为 json 格式;
(6)mime_type 的值需要基于 key 的值转换得出;
(7)category 的值需要基于 key 的值转换得出;

4、使用验证器类来支持复杂的验证规则。Lighthouse 对验证器类使用简单的命名约定,只需使用输入类型的名称并附加 Validator 。最终生成文件:/app/GraphQL/Validators/CreateOnlineStoreThemeAssetInputValidator.php


PS E:\wwwroot\lighthouse-tutorial> php artisan lighthouse:validator CreateOnlineStoreThemeAssetInputValidator
Validator created successfully.


5、由于现在需要在 Module ThemeStore 中使用此验证器类,将文件:/app/GraphQL/Validators/CreateOnlineStoreThemeAssetInputValidator.php 剪切至:/Modules/ThemeStore/Validators/CreateOnlineStoreThemeAssetInputValidator.php

<?php
 
namespace Modules\ThemeStore\Validators;
 
use Nuwave\Lighthouse\Validation\Validator;
 
class CreateOnlineStoreThemeAssetInputValidator extends Validator
{
    /**
     * Return the validation rules.
     *
     * @return array<string, array<mixed>>
     */
    public function rules(): array
    {
        return [
            'themeId' => [
                'exists:theme_asset,theme_id'
            ],
        ];
    }
}

6、编辑文件:/Modules/ThemeStore/Resources/graphql/theme_asset.graphql,修改输入对象,使用 @validator 指令,以指定验证器类


input OnlineStoreThemeAssetCreateInput @validator(class: "Modules\\ThemeStore\\Validators\\CreateOnlineStoreThemeAssetInputValidator") {
    "主题ID"
    themeId: String!,
    "内容"
    content: String!,
    "路径,相对于主题的路径,如 pages/index.blade.php"
    key: String!,
}


7、测试验证规则是否有效,确定有效。如图3

测试验证规则是否有效,确定有效。

图3



mutation {
  onlineStoreThemeAssetCreate(
    input: { themeId: "vogue1", content: "string", key: "string" }
  ) {
    themeAsset {
      id
      themeId
      content
      key
      mimeType
      category
      schema
      createdAt
      updatedAt
      deletable
      renameable
      updatable
    }
  }
}




{
  "errors": [
    {
      "message": "Validation failed for the field [onlineStoreThemeAssetCreate].",
      "extensions": {
        "validation": {
          "input.themeId": [
            "The selected input.theme id is invalid."
          ]
        },
        "category": "validation"
      },
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "onlineStoreThemeAssetCreate"
      ],
      "trace": [
        {
          "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Schema\\Directives\\ArgTraversalDirective.php",
          "line": 29,
          "call": "Nuwave\\Lighthouse\\Validation\\ValidateDirective::Nuwave\\Lighthouse\\Validation\\{closure}(null, array(1), instance of Nuwave\\Lighthouse\\Schema\\Context, instance of GraphQL\\Type\\Definition\\ResolveInfo)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Schema\\Directives\\TrimDirective.php",
          "line": 56,
          "call": "Nuwave\\Lighthouse\\Schema\\Directives\\ArgTraversalDirective::Nuwave\\Lighthouse\\Schema\\Directives\\{closure}(null, array(1), instance of Nuwave\\Lighthouse\\Schema\\Context, instance of GraphQL\\Type\\Definition\\ResolveInfo)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Schema\\Factories\\FieldFactory.php",
          "line": 99,
          "call": "Nuwave\\Lighthouse\\Schema\\Directives\\TrimDirective::Nuwave\\Lighthouse\\Schema\\Directives\\{closure}(null, array(1), instance of Nuwave\\Lighthouse\\Schema\\Context, instance of GraphQL\\Type\\Definition\\ResolveInfo)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Executor\\ReferenceExecutor.php",
          "line": 623,
          "call": "Nuwave\\Lighthouse\\Schema\\Factories\\FieldFactory::Nuwave\\Lighthouse\\Schema\\Factories\\{closure}(null, array(1), instance of Nuwave\\Lighthouse\\Schema\\Context, instance of GraphQL\\Type\\Definition\\ResolveInfo)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Executor\\ReferenceExecutor.php",
          "line": 550,
          "call": "GraphQL\\Executor\\ReferenceExecutor::resolveFieldValueOrError(instance of GraphQL\\Type\\Definition\\FieldDefinition, instance of GraphQL\\Language\\AST\\FieldNode, instance of Closure, null, instance of GraphQL\\Type\\Definition\\ResolveInfo)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Executor\\ReferenceExecutor.php",
          "line": 474,
          "call": "GraphQL\\Executor\\ReferenceExecutor::resolveField(GraphQLType: Mutation, null, instance of ArrayObject(1), array(1))"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Executor\\ReferenceExecutor.php",
          "line": 857,
          "call": "GraphQL\\Executor\\ReferenceExecutor::GraphQL\\Executor\\{closure}(array(0), 'onlineStoreThemeAssetCreate')"
        },
        {
          "call": "GraphQL\\Executor\\ReferenceExecutor::GraphQL\\Executor\\{closure}(array(0), 'onlineStoreThemeAssetCreate')"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Executor\\ReferenceExecutor.php",
          "line": 859,
          "function": "array_reduce(array(1), instance of Closure, array(0))"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Executor\\ReferenceExecutor.php",
          "line": 490,
          "call": "GraphQL\\Executor\\ReferenceExecutor::promiseReduce(array(1), instance of Closure, array(0))"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Executor\\ReferenceExecutor.php",
          "line": 263,
          "call": "GraphQL\\Executor\\ReferenceExecutor::executeFieldsSerially(GraphQLType: Mutation, null, array(0), instance of ArrayObject(1))"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Executor\\ReferenceExecutor.php",
          "line": 215,
          "call": "GraphQL\\Executor\\ReferenceExecutor::executeOperation(instance of GraphQL\\Language\\AST\\OperationDefinitionNode, null)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Executor\\Executor.php",
          "line": 156,
          "call": "GraphQL\\Executor\\ReferenceExecutor::doExecute()"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\GraphQL.php",
          "line": 162,
          "call": "GraphQL\\Executor\\Executor::promiseToExecute(instance of GraphQL\\Executor\\Promise\\Adapter\\SyncPromiseAdapter, instance of GraphQL\\Type\\Schema, instance of GraphQL\\Language\\AST\\DocumentNode, null, instance of Nuwave\\Lighthouse\\Schema\\Context, array(0), null, null)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\GraphQL.php",
          "line": 94,
          "call": "GraphQL\\GraphQL::promiseToExecute(instance of GraphQL\\Executor\\Promise\\Adapter\\SyncPromiseAdapter, instance of GraphQL\\Type\\Schema, instance of GraphQL\\Language\\AST\\DocumentNode, null, instance of Nuwave\\Lighthouse\\Schema\\Context, array(0), null, null, array(29))"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\GraphQL.php",
          "line": 268,
          "call": "GraphQL\\GraphQL::executeQuery(instance of GraphQL\\Type\\Schema, instance of GraphQL\\Language\\AST\\DocumentNode, null, instance of Nuwave\\Lighthouse\\Schema\\Context, array(0), null, null, array(29))"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\GraphQL.php",
          "line": 203,
          "call": "Nuwave\\Lighthouse\\GraphQL::executeParsedQuery(instance of GraphQL\\Language\\AST\\DocumentNode, instance of Nuwave\\Lighthouse\\Schema\\Context, array(0), null, null)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\GraphQL.php",
          "line": 162,
          "call": "Nuwave\\Lighthouse\\GraphQL::parseAndExecuteQuery('mutation {\n  onlineStoreThemeAssetCreate(\n    input: { themeId: \"vogue1\", content: \"string\", key: \"string\" }\n  ) {\n    themeAsset {\n      id\n      themeId\n      content\n      key\n      mimeType\n      category\n      schema\n      createdAt\n      updatedAt\n      deletable\n      renameable\n      updatable\n    }\n  }\n}', instance of Nuwave\\Lighthouse\\Schema\\Context, array(0), null, null)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\GraphQL.php",
          "line": 121,
          "call": "Nuwave\\Lighthouse\\GraphQL::executeOperation(instance of GraphQL\\Server\\OperationParams, instance of Nuwave\\Lighthouse\\Schema\\Context)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Support\\Utils.php",
          "line": 99,
          "call": "Nuwave\\Lighthouse\\GraphQL::Nuwave\\Lighthouse\\{closure}(instance of GraphQL\\Server\\OperationParams)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\GraphQL.php",
          "line": 120,
          "call": "Nuwave\\Lighthouse\\Support\\Utils::applyEach(instance of Closure, instance of GraphQL\\Server\\OperationParams)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Support\\Http\\Controllers\\GraphQLController.php",
          "line": 32,
          "call": "Nuwave\\Lighthouse\\GraphQL::executeOperationOrOperations(instance of GraphQL\\Server\\OperationParams, instance of Nuwave\\Lighthouse\\Schema\\Context)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\ControllerDispatcher.php",
          "line": 48,
          "call": "Nuwave\\Lighthouse\\Support\\Http\\Controllers\\GraphQLController::__invoke(instance of Illuminate\\Http\\Request, instance of Nuwave\\Lighthouse\\GraphQL, instance of Illuminate\\Events\\Dispatcher, instance of Laragraph\\Utils\\RequestParser, instance of Nuwave\\Lighthouse\\Execution\\SingleResponse, instance of Nuwave\\Lighthouse\\Execution\\ContextFactory)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php",
          "line": 219,
          "call": "Illuminate\\Routing\\ControllerDispatcher::dispatch(instance of Illuminate\\Routing\\Route, instance of Nuwave\\Lighthouse\\Support\\Http\\Controllers\\GraphQLController, '__invoke')"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php",
          "line": 176,
          "call": "Illuminate\\Routing\\Route::runController()"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
          "line": 681,
          "call": "Illuminate\\Routing\\Route::run()"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 130,
          "call": "Illuminate\\Routing\\Router::Illuminate\\Routing\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Support\\Http\\Middleware\\AttemptAuthentication.php",
          "line": 34,
          "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 171,
          "call": "Nuwave\\Lighthouse\\Support\\Http\\Middleware\\AttemptAuthentication::handle(instance of Illuminate\\Http\\Request, instance of Closure)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Support\\Http\\Middleware\\AcceptJson.php",
          "line": 27,
          "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 171,
          "call": "Nuwave\\Lighthouse\\Support\\Http\\Middleware\\AcceptJson::handle(instance of Illuminate\\Http\\Request, instance of Closure)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 105,
          "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
          "line": 683,
          "call": "Illuminate\\Pipeline\\Pipeline::then(instance of Closure)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
          "line": 658,
          "call": "Illuminate\\Routing\\Router::runRouteWithinStack(instance of Illuminate\\Routing\\Route, instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
          "line": 624,
          "call": "Illuminate\\Routing\\Router::runRoute(instance of Illuminate\\Http\\Request, instance of Illuminate\\Routing\\Route)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
          "line": 613,
          "call": "Illuminate\\Routing\\Router::dispatchToRoute(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php",
          "line": 170,
          "call": "Illuminate\\Routing\\Router::dispatch(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 130,
          "call": "Illuminate\\Foundation\\Http\\Kernel::Illuminate\\Foundation\\Http\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\barryvdh\\laravel-debugbar\\src\\Middleware\\InjectDebugbar.php",
          "line": 67,
          "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 171,
          "call": "Barryvdh\\Debugbar\\Middleware\\InjectDebugbar::handle(instance of Illuminate\\Http\\Request, instance of Closure)"
        },
        {
          "file": "E:\\wwwroot\\object\\app\\Http\\Middleware\\ChangeAppUrlMiddleware.php",
          "line": 23,
          "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 171,
          "call": "App\\Http\\Middleware\\ChangeAppUrlMiddleware::handle(instance of Illuminate\\Http\\Request, instance of Closure)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php",
          "line": 21,
          "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 171,
          "call": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest::handle(instance of Illuminate\\Http\\Request, instance of Closure)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php",
          "line": 21,
          "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 171,
          "call": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest::handle(instance of Illuminate\\Http\\Request, instance of Closure)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize.php",
          "line": 27,
          "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 171,
          "call": "Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize::handle(instance of Illuminate\\Http\\Request, instance of Closure)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode.php",
          "line": 63,
          "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 171,
          "call": "Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode::handle(instance of Illuminate\\Http\\Request, instance of Closure)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\fideloper\\proxy\\src\\TrustProxies.php",
          "line": 57,
          "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 171,
          "call": "Fideloper\\Proxy\\TrustProxies::handle(instance of Illuminate\\Http\\Request, instance of Closure)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Http\\Middleware\\Request.php",
          "line": 111,
          "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 171,
          "call": "Dingo\\Api\\Http\\Middleware\\Request::handle(instance of Illuminate\\Http\\Request, instance of Closure)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
          "line": 105,
          "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php",
          "line": 145,
          "call": "Illuminate\\Pipeline\\Pipeline::then(instance of Closure)"
        },
        {
          "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php",
          "line": 110,
          "call": "Illuminate\\Foundation\\Http\\Kernel::sendRequestThroughRouter(instance of Illuminate\\Http\\Request)"
        },
        {
          "file": "E:\\wwwroot\\object\\public\\index.php",
          "line": 57,
          "call": "Illuminate\\Foundation\\Http\\Kernel::handle(instance of Illuminate\\Http\\Request)"
        }
      ]
    }
  ],
  "data": {
    "onlineStoreThemeAssetCreate": null
  }
}


8、查看 Laravel Telescope 中请求中的 SQL 语句。如图4

查看 Laravel Telescope 中请求中的 SQL 语句。

图4


select count(*) as aggregate from `theme_asset` where `theme_id` = 'vogue1'


]]>
https://www.shuijingwanwq.com/2022/03/25/6196/feed/ 0
在 Laravel Telescope 中,页面一直处于 Scanning… https://www.shuijingwanwq.com/2022/03/18/6154/ https://www.shuijingwanwq.com/2022/03/18/6154/#respond Fri, 18 Mar 2022 01:13:38 +0000 https://www.shuijingwanwq.com/?p=6154 浏览量: 116 1、在 Laravel Telescope 中,页面一直处于 Scanning…。查看网络,Table ‘object_store.telescope_entries’ doesn’t exist。如图1
在 Laravel Telescope 中,页面一直处于 Scanning...。查看网络,Table 'object_store.telescope_entries' doesn't exist

图1

2、运行 migrate 命令:


PS E:\wwwroot\object> php artisan migrate
Migrating: 2018_08_08_100000_create_telescope_entries_table
Migrated:  2018_08_08_100000_create_telescope_entries_table (0.49 seconds)


3、刷新页面,响应 200。如图2
刷新页面,响应 200

图2

]]>
https://www.shuijingwanwq.com/2022/03/18/6154/feed/ 0
在 Laravel 6 中,执行命令:php artisan telescope:publish,报错:Unable to locate publishable resources. Publishing complete https://www.shuijingwanwq.com/2022/01/24/5788/ https://www.shuijingwanwq.com/2022/01/24/5788/#respond Mon, 24 Jan 2022 01:47:32 +0000 https://www.shuijingwanwq.com/?p=5788 浏览量: 55 1、在 Laravel 6 中,执行命令:php artisan telescope:publish,报错:Unable to locate publishable resources. Publishing complete。如图1
在 Laravel 6 中,执行命令:php artisan telescope:publish,报错:Unable to locate publishable resources. Publishing complete

图1



PS E:\wwwroot\object> php artisan telescope:publish
Unable to locate publishable resources.
Publishing complete.
Unable to locate publishable resources.
Publishing complete.
PS E:\wwwroot\object>


2、查看 composer.json,laravel/telescope 存在于 require-dev 中。


    "require-dev": {
        "allure-framework/allure-phpunit": "^1.3",
        "barryvdh/laravel-debugbar": "^3.6",
        "beyondcode/laravel-dump-server": "^1.0",
        "beyondcode/laravel-er-diagram-generator": "^1.4",
        "brianium/paratest": "^2.0",
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4",
        "laravel/telescope": "^2.1",
        "mockery/mockery": "^1.0",
        "mpociot/laravel-apidoc-generator": "^4.1",
        "nunomaduro/collision": "^3.0",
        "phpunit/phpunit": "^7.5",
        "squizlabs/php_codesniffer": "^3.5"
    },


3、查看目录 /config,已经存在文件 telescope.php,文件:/app/Providers/TelescopeServiceProvider.php 已存在。但是目录 /public/vendor/telescope 不存在。 4、访问:http://object.local/telescope ,响应 500。如图2
访问:http://object.local/telescope ,响应 500

图2

5、相继执行命令:php artisan clear-compiled、composer dumpautoload。注:不太确定此 2 个命令是否有作用。编辑 .env 文件,TELESCOPE_ENABLED=true。 6、访问:http://object.local/telescope ,响应 The Telescope assets are not published. Please run: php artisan telescope:publish。如图3
访问:http://object.local/telescope ,响应 The Telescope assets are not published. Please run: php artisan telescope:publish

图3

7、再次执行命令:php artisan telescope:publish ,不再报错。如图4
再次执行命令:php artisan telescope:publish ,不再报错

图4



PS E:\wwwroot\object> php artisan telescope:publish
Publishing complete.
Copied Directory [\vendor\laravel\telescope\public] To [\public\vendor\telescope]
Publishing complete.
PS E:\wwwroot\object>


8、目录:/public/vendor/telescope 已存在。如图5
目录:/public/vendor/telescope 已存在

图5

9、访问:http://object.local/telescope ,响应 200。如图6
访问:http://object.local/telescope ,响应 200

图6

]]>
https://www.shuijingwanwq.com/2022/01/24/5788/feed/ 0