首页
统计
壁纸
追番记录
优秀博主
关于
推荐
导航
工具
音乐解锁
Search
1
NAS的简单介绍
729 阅读
2
网站环境一键部署工具推荐
505 阅读
3
tp5-模型数据处理
404 阅读
4
win10镜像
359 阅读
5
第20200225期-电脑壁纸-P10
350 阅读
PHP
闲谈杂料
硬件系统
美图
ThinkPHP
笔记
数据库
Lua
登录
Search
标签搜索
ThinkPHP
MySQL
Laravel
PHP
API
GIT
Windows10
markdown
Web
跨域
ajax
小程序
壁纸
Linux
jsonp
try
异常
Dcat
UEFI
win10
phpfunny
累计撰写
104
篇文章
累计收到
24
条评论
首页
栏目
PHP
闲谈杂料
硬件系统
美图
ThinkPHP
笔记
数据库
Lua
页面
统计
壁纸
追番记录
优秀博主
关于
推荐
导航
工具
音乐解锁
搜索到
7
篇与
的结果
2024-11-13
关于Larave中.env读取偶发性失效问题
相关问题.env设置了自定义参数,但env()函数读取失败只获取默认值编辑.env没有生效其他env问题问题描述在配置完.env后(增加了一些自定义KEY) 在程序中使用env()助手函数没有获取的键值。在Larave文档相关操作说明(config):需要删除env缓存文件并重新生成。执行发现依然没有生效。可是检查.env文件参数是没问题的,了解env()和config()区别后更是不解,明明用的env()的助手行数直接获取env文件中的参数,和缓存没有关系,但实际发现确实读取不到,获取的是env()参数二设置的默认值。最终也很疑惑希望知情之人能告知一二。解决过程检查.env配置文件中设置正确的参数SERVICE_IP="42.XXX.XXX.163" TENCENTCLOUD_SECRET_ID=AKIDgXXXXXXXXXXXXXXXXXXXXXXXXMtENL4 TENCENTCLOUD_SECRET_KEY=cwDPciXXXXXXXXXXXXXXXVYXLwKVWM TENCENTCLOUD_CAPTCHA_APPID=1900000000 TENCENTCLOUD_APPSECRET_KEY=hi8XXXXXXXXXXXXXXXX6tqbU WECHAT_APP_ID=wx000000000000ce WECHAT_APP_SECRET=80cXXXXXXXXXXXXXXfb18 WECHAT_TOKEN=76976000000000000000acb834a WECHAT_ENCODING_AES_KEY=u7u2B00000000000000001jZrv9设置config配置参数/config/services.phpreturn [ ... 'easywechat' => [ 'official_account' => [ 'app_id' => env('WECHAT_APP_ID', ''), 'secret' => env('WECHAT_APP_SECRET', ''), 'token' => env('WECHAT_TOKEN', ''), 'aes_key' => env('WECHAT_ENCODING_AES_KEY', '') ], ], 'tencentcloud' => [ 'secret_id' => env('TENCENTCLOUD_SECRET_ID', ''), 'secret_key' => env('TENCENTCLOUD_SECRET_KEY', ''), 'captcha_appid' => env('TENCENTCLOUD_CAPTCHA_APPID', ''), 'appsecret_key' => env('TENCENTCLOUD_APPSECRET_KEY', '') ], 'service_ip' => env('SERVICE_IP', '') ];删除config缓存并重新生成#清除config缓存文件 php artisan config:clear #生成config缓存文件 php artisan config:cache测试请在需要获取参数的地方使用config()助手函数dd(config('services.tencentcloud.captcha.appid')); dd(config('services.service_ip'));最优雅的方式env()方法不要在业务代码中使用,只在配置文件中使用。拓展一,最优雅获取配置方式上述"解决过程"为最佳方式二,助手函数中env()和config()区别助手函数用途用法示例env()函数用于直接从 .env 文件中读取环境变量。它主要用于在配置文件中读取环境变量,以便在不同的环境中使用不同的配置值。env('API_KEY', 'default_value');在.env文件中写法 API_KEY=your_api_keyconfig()用于从配置文件中读取配置值。配置文件位于 config 目录下,每个文件对应一个特定的配置领域。config('app.api_key');在/config/app.php写法 return ['api_key' => env('API_KEY', 'default_key')];两者区别读取来源不同:env() 从 .env 文件中读取环境变量。config() 从 config 目录下的配置文件中读取配置值。使用场景不同:env() 通常用于在配置文件中读取环境变量,以便在不同的环境中使用不同的配置值。config() 用于在代码中读取配置文件中的配置值。缓存机制不同:env() 不会被缓存,每次调用都会从 .env 文件中读取。config() 会被缓存,使用 php artisan config:cache 命令生成的缓存文件 bootstrap/cache/config.php 中读取配置值,提高性能。三,关于env()获取为空原因
2024年11月13日
8 阅读
0 评论
0 点赞
2022-09-04
[laravel] 监听方式记录SQL日志
创建监听器php artisan make:listener QueryListener --event=Illuminate\Database\Events\QueryExecuted打开app/Providers/EventServiceProvider.php添加引导protected $listen = [ 'Illuminate\Database\Events\QueryExecuted' => [ 'App\Listeners\QueryListener', ] ];打开app/Listeners/QueryListener#引入log use Illuminate\Support\Facades\Log; #handle方法添加代码: public function handle(QueryExecuted $event) { if (env('APP_DEBUG')) { $sql = str_replace("?", "'%s'", $event->sql); $log = vsprintf($sql, $event->bindings); $log = '[' . date('Y-m-d H:i:s') . '] ' . $log . PHP_EOL; $logDir = storage_path('logs/sql'); // if (!is_dir($logDir)) { // mkdir($logDir, 0777, true); // } file_put_contents($logDir, $log, FILE_APPEND); //Log::channel('sql')->info($log); #未添加sql日志通道 /* 'sql'=>[ 'driver' => 'daily', 'level' => 'debug', 'path' => storage_path('logs/sql/log.log'), ], */ } }补充-添加日志通道在写入日志使用Log::channel('sql')->info($log); 需要配置下日志记录通道在config/logging.php加入以下内容:'sql'=>[ 'driver' => 'daily', 'level' => 'debug', 'path' => storage_path('logs/log.log'), ],
2022年09月04日
101 阅读
0 评论
0 点赞
2022-07-07
[laravel]自定义辅助函数
[TOC]前言laravel自带的助手函数使用方便。 虽然laravel自带的助手有很多,有的时候也需要自定义那么就需要我们来手动创建比如说接口中常用的方法: 成功返回success(),失败返回failed()经常会使用所以必要的需要封装起来,放在一个起统一管理,前言就几句话还得写的语无伦次,笑了 ::(狗头)创建助手类vim /Helpers/function.php封装<?php /** * @param int $code 返回码 * @param string $message 返回说明 * @param array $data 成功时返回数据 * @param array $errors 失败时返回数据 * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response */ function responseApi(int $code, string $message, array $data = [], array $errors = []) { return response(compact('code', 'message', 'data', 'errors')); } /** * @param array $data 返回数据 * @param string $message 说明 * @param int $code 返回码 * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response */ function success(array $data = [], string $message = 'OK', int $code = 0) { $code = $code == 0 ? $code : -1; return responseApi($code, $message, $data, []); } /* function successWithToken(string $token, string $message = '', array $data = []) { if ($token && !\Illuminate\Support\Str::startsWith($token, 'Bearer ')) { $token = 'Bearer ' . $token; } return success($data, $message)->header(config('auth.token_key'), $token); }*/ /** * @param string $message 说明 * @param int $code 返回码 * @param array $errors 失败时返回数据 * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response */ function failed(string $message = 'Failed', int $code = -1, array $errors = []) { $code = $code == 0 ? -1 : $code; return responseApi($code, $message, [], $errors); } /** * @param string $failMessage 说明 * @param int $statusCode 回状态码 * @param array $errors 错误数据 * @param int $code 返回代码 * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response */ function failedWithStatusCode(string $failMessage = 'Failed', int $statusCode = -1, array $errors = [], int $code = -1) { $statusCode = $statusCode > 400 ? $statusCode : 400; return response(['code' => $code, 'message' => $failMessage, 'data' => [], 'errors' => $errors], $statusCode); } /** * 生成随机字符串(纯字母) * * @param int $length * @return string */ function random_str(int $length): string { return random_in_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", $length); } /** * 生成随机字符串(纯大写字母) * * @param integer $length * @return string */ function random_str_up(int $length): string { return random_in_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ", $length); } /** * 生成随机字符串(纯数字) * * @param int $length * @return string */ function random_number(int $length): string { return random_in_str("0123456789", $length); } /** * 在字符串中随机取字符组成长度为length的字符串 * * @param string $str * @param integer $length * @return string */ function random_in_str(string $str, int $length): string { while (strlen($str) < $length) { $str .= str_shuffle($str); } return substr(str_shuffle($str), mt_rand(0, strlen($str) - $length), $length); } 自动引用如果想让项目可以随时用助手那需要在配置下加载有两种方式。方法一:在composer.json中 添加 autoload中增加"files":["app/Helpers/function.php"]"autoload": { "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" }, "files": [ "app/Helpers/function.php" ] },最后在项目根目录中更新下composercomposer dumpautoload方法二:使用框架自己引导加载在 bootstrap/app.php 中增加require __DIR__ . '/../app/Helpers/function.php';测试最后在随便一个类中可以测试一下return success();
2022年07月07日
159 阅读
0 评论
0 点赞
2022-05-19
跨域解决方案
前后端分离项目100%会碰到跨域问题跨域提示Access to XMLHttpRequest at 'http://manage.sdk.phpfunny.cn/index/portal_site/v1/home' from origin 'http://localhost:8080' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be 'true' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.什么是跨域指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器对 javascript 施加的安全限制。同源策略:是指协议(protocol)、域名(host)、端口号(port),都必须相同,其中一个不同都会产生跨域。http://www.test.com:8080/ 协议(http)、主域名(test)、子域名(www)、端口号(8080)非同源策略:无法读取非同源网页的cookie、localStorage、IndexedDB无法接触非同源网页的DOM无法向非同源地址发送 AJAX 请求解决跨域方法JSONPCORS 跨域资源共享(Cross-Origin Resource Sharing)反向代理具体解释请看下方实践或者百度网上超多的教程。[前端]nodejs+vue解决跨域采用第三种方案 使用nodejs内置反代来绕过跨域问题详见vue解决跨域文章,还有其他方式等待后期补充。[后端]laravel接口解决跨域利用框架的中间件来允许指定域名请求创建中间件cd Http/Middleware vim EnableCrossRequestMiddleware.php完善中间件内容<?php namespace App\Http\Middleware; use Closure; class EnableCrossRequestMiddleware{ /** * @param $request * @param Closure $next * @return mixed */ public function handle($request, Closure $next) { $response = $next($request); $origin = $request->server('HTTP_ORIGIN') ? $request->server('HTTP_ORIGIN') : ''; $allow_origin = [ 'http://127.0.0.1:8080',//允许访问 'http://manage.sdk.xxxxx.cn',//允许访问 'http://manage.sdk.xxxxx.com/' ]; if (in_array($origin, $allow_origin)) { $response->header('Access-Control-Allow-Origin', $origin); $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN'); $response->header('Access-Control-Expose-Headers', 'Authorization, authenticated'); $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS'); $response->header('Access-Control-Allow-Credentials', 'true'); } return $response; } }注册中间件在protected $middleware 里写上中间件类名。如果没有Http/Kernel.php则需要创建<?php namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { /** * The application's global HTTP middleware stack. * * These middleware are run during every request to your application. * * @var array */ protected $middleware = [ \App\Http\Middleware\EnableCrossRequestMiddleware::class, ]; /** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ ]; /** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ ]; } 完成,重新请求即可。其他方式解决跨域PHP项目中共享域设置待补充
2022年05月19日
216 阅读
0 评论
0 点赞
2021-06-01
Laravel配合crontab指令创建定时任务
Laravel 配合crontab指令创建定时任务我工作中的项目使用的是Lumen框架,和laravel创建定时任务一样首先要定义调度,也是我们常说的脚本文件在App\Console\Commands下创建Test.php指令创建:php artisan make:command Test手动创建:<?php namespace App\Console\Commands; use Illuminate\Console\Command; class Test extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'test'; /** * The console command description. * * @var string */ protected $description = '测试创建脚本'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return int */ public function handle() { echo '开始执行test脚本'; echo "脚本执行结束"; } } 第二步、编辑 app/Console/Kernel.php 文件,将新生成的类进行注册:protected $commands = [ \App\Console\Commands\Test::class, ];然后就可以直接使用运行脚本指令啦 常用的指令有://查看所有的脚本以及框架自带的一些调度 php artisan list //手动执行指定脚本 php artisan test 参考一下 list指令Laravel Framework 8.41.0 Usage: command [options] [arguments] Options: -h, --help Display help for the given command. When no command is given display help for the list command -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question --env[=ENV] The environment the command should run under -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands: clear-compiled Remove the compiled class file db Start a new database CLI session down Put the application into maintenance / demo mode env Display the current framework environment help Display help for a command inspire Display an inspiring quote list List commands migrate Run the database migrations optimize Cache the framework bootstrap files serve Serve the application on the PHP development server test Run the application tests test_cmd 测试创建脚本 tinker Interact with your application up Bring the application out of maintenance mode auth auth:clear-resets Flush expired password reset tokens cache cache:clear Flush the application cache cache:forget Remove an item from the cache cache:table Create a migration for the cache database table config config:cache Create a cache file for faster configuration loading config:clear Remove the configuration cache file db db:seed Seed the database with records db:wipe Drop all tables, views, and types event event:cache Discover and cache the application's events and listeners event:clear Clear all cached events and listeners event:generate Generate the missing events and listeners based on registration event:list List the application's events and listeners key key:generate Set the application key make make:cast Create a new custom Eloquent cast class make:channel Create a new channel class make:command Create a new Artisan command make:component Create a new view component class make:controller Create a new controller class make:event Create a new event class make:exception Create a new custom exception class make:factory Create a new model factory make:job Create a new job class make:listener Create a new event listener class make:mail Create a new email class make:middleware Create a new middleware class make:migration Create a new migration file make:model Create a new Eloquent model class make:notification Create a new notification class make:observer Create a new observer class make:policy Create a new policy class make:provider Create a new service provider class make:request Create a new form request class make:resource Create a new resource make:rule Create a new validation rule make:seeder Create a new seeder class make:test Create a new test class migrate migrate:fresh Drop all tables and re-run all migrations migrate:install Create the migration repository migrate:refresh Reset and re-run all migrations migrate:reset Rollback all database migrations migrate:rollback Rollback the last database migration migrate:status Show the status of each migration notifications notifications:table Create a migration for the notifications table optimize optimize:clear Remove the cached bootstrap files package package:discover Rebuild the cached package manifest queue queue:batches-table Create a migration for the batches database table queue:clear Delete all of the jobs from the specified queue queue:failed List all of the failed queue jobs queue:failed-table Create a migration for the failed queue jobs database table queue:flush Flush all of the failed queue jobs queue:forget Delete a failed queue job queue:listen Listen to a given queue queue:prune-batches Prune stale entries from the batches database queue:restart Restart queue worker daemons after their current job queue:retry Retry a failed queue job queue:retry-batch Retry the failed jobs for a batch queue:table Create a migration for the queue jobs database table queue:work Start processing jobs on the queue as a daemon route route:cache Create a route cache file for faster route registration route:clear Remove the route cache file route:list List all registered routes sail sail:install Install Laravel Sail's default Docker Compose file sail:publish Publish the Laravel Sail Docker files schedule schedule:list List the scheduled commands schedule:run Run the scheduled commands schedule:test Run a scheduled command schedule:work Start the schedule worker schema schema:dump Dump the given database schema session session:table Create a migration for the session database table storage storage:link Create the symbolic links configured for the application stub stub:publish Publish all stubs that are available for customization vendor vendor:publish Publish any publishable assets from vendor packages view view:cache Compile all of the application's Blade templates view:clear Clear all compiled view files要是实现脚本自动定时执行需要配合crontab 指令第三步、创建一个该项目的定时任务* * * * * php /www/blog.phpfunny.cn/artisan schedule:run >> /dev/null 2>&1 //注意:* * * * *分别代表 分 时 日 月 周 (定时任务的时间) /为你的项目位置第四步、指定脚本执行时间(周期)protected function schedule(Schedule $schedule) { $schedule->command('test')//Test.php中的name ->everyFiveMinutes();//每五分钟执行一次 }常用的执行周期:->cron('* * * * *'); 在自定义Cron调度上运行任务 ->everyMinute(); 每分钟运行一次任务 ->everyFiveMinutes(); 每五分钟运行一次任务 ->everyTenMinutes(); 每十分钟运行一次任务 ->everyThirtyMinutes(); 每三十分钟运行一次任务 ->hourly(); 每小时运行一次任务 ->daily(); 每天凌晨零点运行任务 ->dailyAt('13:00'); 每天13:00运行任务 ->twiceDaily(1, 13); 每天1:00 & 13:00运行任务 ->weekly(); 每周运行一次任务 ->monthly(); 每月运行一次任务 ->monthlyOn(4, '15:00'); 每月4号15:00运行一次任务 ->quarterly(); 每个季度运行一次 ->yearly(); 每年运行一次 ->timezone('America/New_York'); 设置时区
2021年06月01日
272 阅读
0 评论
0 点赞
2020-08-01
laravel核心文件不存在或者打不开
在使用laravel框架部署的时候碰到的小坑下载完核心,修改完配置数据库,路径访问修改为public,正常过程走完之后访问地址提示数据流错误不存在打不开原因是:核心都没有下载完整或者没有复制完整的缘故!(使用composer下载laravel好几次碰到这个错误)写这篇文档记录一下解决方法。以下方法还不使请重新下载完整的lavarel框架吧。解决方法:cd到该引用的根目录,先删除 composer.lock 文件重新在根目录执行“composer install”,这样就能重新生成 composer.lock 文件了。如果出现php版本不匹配,可用“composer install --ignore-platform-reqs”(忽略版本匹配)。补充:在第二步骤执行composer install提示我的composer版本过低,所以要先更新一下版本composer self-update更新完之后再次输入composer install提示我使用了禁用的函数,去php环境将使用的php版本中禁用函数配置文件中putenv()删除即可执行 Composer install 命令,提示 killed(原因是服务器内存不足)解决方式1:升级服务器配置解决方式2:查看当前composer包状态信息composer diagnose出现的异常在手动解决即可例如我的这个情况proc_open去php禁用函数把他删除即可再次使用 composer install 即可正常操作
2020年08月01日
104 阅读
0 评论
0 点赞
2020-07-17
laravel路由笔记
线上正式生产环境测试环境(局域网内,模拟线上环境)开发环境(本地开发)facades(门面xx) 佛萨斯1.通过路由访问 (控制器,视图,闭包,重定向地址)接口降低耦合度容器-目的:不重复造轮子使用指令创建php artisan make:controller HelloController//创建控制器 php artisan make:model Order//创建模型 php artisan make:event OrderPaid//创建事件 中间件在路由和控制之间对接受的字段进行处理。测试路由post时候发现错误注意CSRF 保护不需要csrf保护,在控制器中VerifyCsrfToken.php中接入http完整访问路径,可绕过保护。//生成URLecho $url=route('profile');//生成重定向return redirect()->route('profile');普通路由简单的访问配置Route::get("路由名",“控制器名@方法”);//访问视图(闭包) Route::get('hello', function () { return view('hello'); }); //访问视图 Route::view('hello','hello'); //访问控制器 Route::any('index','IndexController@index'); Route::any('user','user\IndexController@index'); //使用闭包 Route::match(['get','post'],'blog/{id}/{name?}',function($id,$name=''){ return 'blog'.$id.'-'.$name; });路由参数:必填,选填,正则表达式约束,全局属性//正则约束 Route::any('user/{id?}','IndexController@index')->where(['id'=>'[0-5]{2}']);全局变量在http/Providers/RouteServiceProvider.phppublic function boot(){ Route::pattern('id','[0-9]+'); parent::boot(); }特殊路由:重定向路由Route::redirect('/here','/there',301);//参数3默认是302视图路由Route::view('hello','hello');//参数3是[路由参数]推荐使用any ,不推荐match(在接口请求用的多post,get,put)路由起名//往起名的路由中传参 Route::get('test', function () { echo route("yonghu",['id'=>11,'name'=>'bilibili']); echo "<br/>"; echo route("blog",['id'=>12,'name'=>'acfun']); }); //起名 Route::any('user/{id?}','IndexController@index') ->where(['id'=>'[0-5]{2}']) ->name('yonghu'); //起名 Route::match(['get','post'],'blog/{id}/{name?}',function($id,$name=''){ return 'blog'.$id.'-'.$name; })->name('blog');检查路由路由中间件定义中间件指令:php artisan make:middleware CheckAge手动建立<?php namespace App\Http\Middleware; use Closure; class CheckAge { public function handle($request, Closure $next) { if ($request->age <= 200) { return redirect('home'); } return $next($request); } }中间件定义又分为:前置/后置中间件中间件是在请求之前或之后执行,取决于中间件本身// 请求之前执行:执行一些任务 return $next($request);//请求之后执行:$response = $next($request); // 执行一些任务return $response;在ChekAge中填写定义任务,比如:public function handle($request, Closure $next) { if ($request->age <= 200) {//如果age<200使用hello路由 return redirect('hello'); } return $next($request);//否则只用本条路由 }在Http/Kernel.php中添加中间件定义在$routeMiddleware变量中'check' => \App\Http\Middleware\CheckAge::class,最后在路由中使用middlewareRoute::any('index','IndexController@index') ->middleware('\App\Http\Middleware\CheckAge::class'); //或者使用上面routeMiddleware中自定义check //->middleware('check'); //或者使用use(第二行代码简写) //use App\Http\Middleware\CheckAge; //->middleware(CheckAge::class);访问:http://localhost/index?age=201跳转index路由,如果age=200跳转hello路由路由中间件传参//中间件CheckAge方法 public function handle($request, Closure $next,$test) { echo $test.'<br/>'; if ($request->age <= $test) { return redirect('hello'); } return $next($request); } //web路由 Route::any('index','IndexController@index')->middleware('check:100');访问index?age=99,走判断里的hello路由。访问index?age=101,走本身index路由terminable最终中间件-详情见管方手册分组路由Route::middleware('check:100,xiao')//路由参数设置 ->domain('{goods}.laravel.cn')//子域名设置 ->name('admin.')//路由名前缀设置 ->prefix('zx')//路由前缀设置 ->namespace('User')//命名空间设置 ->group(function(){ Route::any('user/{id?}','IndexController@index') ->where(['id'=>'[0-5]{2}']) ->name('yonghu'); Route::match(['get','post'],'blog/{id}/{name?}',function($goods,$id,$name=''){ return 'blog'.$id.'-'.$name.'子域名:'.$goods; })->name('blog'); });回退路由Route::fallback(function(){ echo '404'; });
2020年07月17日
104 阅读
0 评论
0 点赞