关于laravel:Laravel-入门01开篇

Laravel 是款比拟热门的基于 PHP 语言的 Web 开发框架,有成熟的开发者社区,有欠缺的文档可供参阅, Github 上有足够多的包(Packages)可供使用。 然而,文档是基于性能组织的,对于初学者而言,在我的项目中串联起来还是须要肯定的工夫和实际,况且框架中当初默认的前端是基于 Tailwind CSS 和 Vue ,对于初学者了解和应用 Laravel 并不敌对。 本系列入门教程,依据我本人的了解,把文档中的根底知识点串联起来,提供一个循序渐进学习的脉络,以期能给新入坑的同学一些启发 官网:https://laravel.com 国内的社区: Learnku:https://learnku.com/laravel Laravel 学院:https://laravelacademy.org Laravel 版本更新比拟快(参考 发行阐明)),绝对的,官网的文档更新也最及时,国内的翻译还是基于大版本更新时的文档为主,前面小版本更新后的文档就不那么及时了,如果对 Laravel 比拟相熟, 能够尝试查阅官网的文档(当然是英文)。 Demo:https://github.com/hefengbao/laravel-demo https://www.8ug.icu/articles/laravel-tutorial-01-start-lMn0Lj1zZN

September 18, 2023 · 1 min · jiezi

关于laravel:Laravel导出CSV

Laravel导出CSV <?phpnamespace App\Services;use Symfony\Component\HttpFoundation\BinaryFileResponse;class ReportsBase{ /** * 写入CSV文件 * @param string $file_name * @param array $arrHeader * @param array $arrDataList * @return array */ public static function writeFile(string $file_name = '', array $arrHeader = [], array $arrDataList = []): array { ini_set('memory_limit', '2048M'); $dir_name = 'export/'; $file_name = $dir_name . sprintf("%s", $file_name . ".csv"); $fileData = implode(',', $arrHeader) . "\r\n"; foreach ($arrDataList as $line) { $fileData .= implode(',', str_replace(',', ' ', $line)) . "\r\n"; } \Storage::disk('local')->put($file_name, mb_convert_encoding($fileData, 'gbk', 'utf-8')); return [ 'file_path' => $dir_name, 'file_name' => storage_path('app/' . $file_name), ]; } /** * 下载文件 * @param $file * @return BinaryFileResponse */ public static function downloadCsv($file): BinaryFileResponse { return response()->download($file)->deleteFileAfterSend(); }}

June 25, 2023 · 1 min · jiezi

关于laravel:解决-composer-安装-laravel-报错

执行composer create-project laravel/laravel laravel9报错Creating a "laravel/laravel" project at "./laravel9"Installing laravel/laravel (v10.2.1) - Downloading laravel/laravel (v10.2.1) - Installing laravel/laravel (v10.2.1): Extracting archiveCreated project in /Users/xuweidong/www/laravel9> @php -r "file_exists('.env') || copy('.env.example', '.env');"Loading composer repositories with package informationUpdating dependenciesYour requirements could not be resolved to an installable set of packages. Problem 1 - laravel/framework[v10.10.0, ..., v10.10.1] require doctrine/inflector ^2.0.5 -> found doctrine/inflector[2.0.x-dev, 2.1.x-dev] but it does not match your minimum-stability. - Root composer.json requires laravel/framework ^10.10 -> satisfiable by laravel/framework[v10.10.0, v10.10.1].解决办法:解除镜像查看镜像源 ...

May 22, 2023 · 1 min · jiezi

关于laravel:第五篇Laravel10权限中间件Laravel10-Vue30前后端分离框架通用后台源码

①复制Laravel9 + Vue3.0前后端拆散框架通用后盾源码,Middleware/Permissions.php ②复制Laravel9 + Vue3.0前后端拆散框架通用后盾源码,backend/app/Http/Kernel.php 搜寻 $routeMiddleware 'permissions' => \App\Http\Middleware\Permissions::class

April 23, 2023 · 1 min · jiezi

关于laravel:第四篇Laravel10自定义函数Laravel10-Vue30前后端分离框架通用后台源码

① 新建文件 Helpers/functions.php ② 编辑composer.json在 autoload 名称中,新增 files 例如: "autoload": { "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" }, "files": [ "app/Helpers/functions.php" ] },③composer的主动加载类命令——composer dump-autoloadvendor/composer/autoload_classmap.phpvendor/composer/autoload_static.php composer dump-autoload

April 23, 2023 · 1 min · jiezi

关于laravel:第三篇Laravel10安装依赖Laravel10-Vue30前后端分离框架通用后台源码

①用于跨域composer require fruitcake/laravel-cors ②用于权限composer require laravel/passport

April 23, 2023 · 1 min · jiezi

关于laravel:第二篇Laravel10测试性能及ngnix配置Laravel10-Vue30前后端分离框架通用后台源码

章节目录【第一篇Laravel10装置】Laravel10 + Vue3.0前后端拆散框架通用后盾源码 ①vscode 关上 laravel10-vue3-admin ②routes/web.php ③新增如下代码 Route::get('/hello', function () { echo "hello";});④运行成果,36s ⑤剖析性能,简略hello都要36s。连贯数据库,加上代码逻辑。预计要100s+呢。因为之前采纳的是,php artisan serve,这边换ngnix环境尝试一下,看一下访问速度是否有变动 ⑥配置ngnix关上file:///usr/local/etc/nginx/servers/laravel10-vue3.notestore.cn文件没有则新建哦 内容如下: server { listen 80; server_name laravel10-vue3.notestore.cn; index index.html index.php; root /Users/beichen/Documents/laravel10-vue3-admin/backend/public; # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location / { try_files $uri $uri/ /index.php$is_args$query_string; }}⑦重启ngnix服务brew services restart nginx ⑧进入/etc ⑨hosts文件,新增如下127.0.0.1 laravel10-vue3.notestore.cn ...

April 22, 2023 · 1 min · jiezi

关于laravel:第一篇Laravel10安装Laravel10-Vue30前后端分离框架通用后台源码

写文章背地的心酸与故事: 近期公司业务不好,没有工作安顿,公司惟一的技术兼程序员被裁员,情绪十分高涨,不晓得干什么,于是写文章来打磨心情。于是这边换了一家房东。整体环境还不错,为了能给大家带来轻松的浏览体验。这边在写文章的时候,尽可能放松与舒服。为了能让本人难受,这边也付出不少。带着绵绵的半露手指手套,不晓得是不是代码给我带来不好的音讯。写代码的时候,总感觉手冷冷的。带上手套,才有能源。这边在写文章的时候,也时不时闭上眼镜感触环境与手指的敲打,以及切换一个手指打字,以及尽可能少应用键盘,以及就义点小费开空调,上面就开始轻松而又欢快的感触吧 ①新建目录,取名laravel10-vue3-admin ②关上mac终端,window是命令行,并进入刚刚新建目录下 ③composer create-project laravel/laravel backend④复制 laravel9-vue3-admin/* to laravel10-vue3-admin/* ⑤cd backend php artisan serve⑥

April 22, 2023 · 1 min · jiezi

关于laravel:laravel-文档摘要2

数据库对于数据的保留数据库第一二三范式到底在说什么https://zhuanlan.zhihu.com/p/... 数据库的操作独立于 query builder 和 ORM 的存在 ORM 的操作是在操作内存对象 是独立的ORM 的一个对象自带了操作 relationship 的办法 query builder 的操作是在模仿 SQL 句子,它自带了很多 SQL 句子模板 Query Builderuse Illuminate\Support\Facades\DB;$users = DB::table('users')->get();$user = DB::table('users')->where('name', 'John')->first();The get method returns an Illuminate\Support\Collection instance containing the results of the query where each result is an instance of the PHP stdClass object. The first method will return a single stdClass object. 1 Query Builder 能够做什么通过执行 SQL 失去各种各样的 stdClass 对象或 stdClass 对象的汇合 ...

February 26, 2023 · 1 min · jiezi

关于laravel:laravel-文档摘要

(laravel 文档浏览记录) modelmodel casting给一个模型的属性 指定类型,不便后续模型操作 1 relationship模型和 relationship 的关系是什么?一个 one-to-many relationship 里,比方 post hasMany comments ,那么1$post 就会自带很多办法或 property 比方 use App\Models\Post; $comments = Post::find(1)->comments; foreach ($comments as $comment) { // ...}2Eloquent will automatically determine the proper foreign key column for the Comment model. By convention, Eloquent will take the "snake case" name of the parent model and suffix it with _id. So, in this example, Eloquent will assume the foreign key column on the Comment model is post_id. ...

February 25, 2023 · 2 min · jiezi

关于laravel:laravel实现队列

一:队列配置队列的配置文件搁置在config/queue.php文件中,laravel框架中反对的队列驱动有:sync, database, beanstalkd, sqs, redis,null对应着:同步(本地应用)驱动,数据库驱动,beanstalkd ,Amazon SQS ,redis,null 队列驱动用于那些放弃队列的工作 1:队列相干配置(1):队列驱动配置'default' => env('QUEUE_DRIVER', 'sync'),//队列驱动设置(2):不同驱动相干配置'connections' => [ ////syns驱动配置 'sync' => [ 'driver' => 'sync', ], ////数据库驱动配置 'database' => [ 'driver' => 'database', 'table' => 'jobs',//数据库驱动配置应用的数据库 'queue' => 'default', 'retry_after' => 90,//指定了工作最多解决多少秒后就被当做失败重试,比如说,如果这个选项设置为 90,那么当这个工作继续执行了 90 秒而没有被删除,那么它将被开释回队列 ], //beanstalkd驱动配置 'beanstalkd' => [ 'driver' => 'beanstalkd', 'host' => 'localhost',//应用beanstalkd驱动地址 'queue' => 'default', 'retry_after' => 90,//指定了工作最多解决多少秒后就被当做失败重试,比如说,如果这个选项设置为 90,那么当这个工作继续执行了 90 秒而没有被删除,那么它将被开释回队列 'block_for' => 0, ], //sqs驱动配置 'sqs' => [ 'driver' => 'sqs', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 'queue' => env('SQS_QUEUE', 'your-queue-name'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], //redis驱动配置 'redis' => [ 'driver' => 'redis', 'connection' => 'default',//应用哪个连贯的redis,redis配置是在config/database.php文件中 'queue' => env('REDIS_QUEUE', 'default'), 'retry_after' => 90, 'block_for' => null, ],],2:不同队列依赖(1):数据库驱动应用数据库驱动须要生成一个队列驱动表 ...

February 9, 2023 · 2 min · jiezi

关于laravel:laravel操作redis和缓存操作

一:操作redis1:redis拓展装置composer require predis/predis或者你也能够通过 PECL 装置 PhpRedis PHP 扩大,装置办法比较复杂,集体不举荐 2:配置redis在config/database.php文件中配置redis (1):单个redis配置'redis' => [ 'client' => env('REDIS_CLIENT', 'predis'),//别名,如果你装置的是PhpRedis,将client值改为phpredis 'default' => [ 'host' => env('REDIS_HOST', '127.0.0.1'),//redis服务器主机 'password' => env('REDIS_PASSWORD', null),//redis服务器明码 'port' => env('REDIS_PORT', 6379),//redis服务器端口 'database' => env('REDIS_DB', 0), ], 'cache' => [ 'host' => env('REDIS_HOST', '127.0.0.1'),//redis服务器主机 'password' => env('REDIS_PASSWORD', null),//redis服务器明码 'port' => env('REDIS_PORT', 6379),//redis服务器端口 'database' => env('REDIS_CACHE_DB', 1), ],],(2):redis集群配置'redis' => [ 'client' => env('REDIS_CLIENT', 'predis'), 'clusters' => [ 'default' => [ [ 'host' => env('REDIS_HOST', 'localhost'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, ], ], ],],3:操作redis(1):设置redisRedis::set('val1','asdasd');(2):获取redisRedis::get('key')(3):删除redisRedis::del('key');二:缓存操作1:缓存配置laravel框架的缓存配置在config/cache.php文件中,配置参数有: ...

February 9, 2023 · 2 min · jiezi

关于laravel:laravel操作session和cookie

一:操作session1:session配置Session 的配置文件存储在config/session.php中,配置参数有: (1):配置session驱动'driver' => env('SESSION_DRIVER', 'file'),//#这里示意先读取.env文件的SESSION_DRIVER参数值,如果没有应用file驱动laravel自带的驱动 • file - 将 Session 保留在 指定文件地址 中。• cookie - Session 保留在平安加密的 Cookie 中。• database - Session 保留在关系型数据库中。• memcached / redis - Sessions 保留在其中一个疾速且基于缓存的存储系统中。• array - Sessions 保留在 PHP 数组中,不会被长久化。 (2):配置生效工夫'lifetime' => env('SESSION_LIFETIME', 120),(3):应用file驱动时session文件保留地址'files' => storage_path('framework/sessions'),(4):应用redis驱动时指定 Session 应用哪个 Redis 连贯'connection' => null,//不批改应用默认的redis(5):应用database驱动时将session数据存入的数据库名'table' => 'sessions',应用database驱动时,在目录命令行执行 php artisan session:table这时候会在database/migrations目录下生成一个创立session数据表的文件 /** * Run the migrations. * * @return void */ public function up() { Schema::create('sessions', function (Blueprint $table) { $table->string('id')->unique(); $table->unsignedBigInteger('user_id')->nullable(); $table->string('ip_address', 45)->nullable(); $table->text('user_agent')->nullable(); $table->text('payload'); $table->integer('last_activity'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('sessions'); }而后执行 ...

February 9, 2023 · 1 min · jiezi

关于laravel:laravel乐观锁和悲观锁

一:乐观锁在laravel中乐观锁大多是基于数据版本 ( Version )记录机制实现。何谓数据版本?即为数据减少一个版本标识,在基于数据库表的版本解决方案中,个别是通过为数据库表减少一个 “version” 字段来实现。 读取出数据时,将此版本号一起读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的以后版本信息进行比对,如果提交的数据版本号大于数据库表以后版本号,则予以更新,否则认为是过期数据。 二:乐观锁在laravel中查问结构器蕴含一些能够帮忙你在 select 语法上实现「乐观锁定」的函数。若想在查问中实现一个「共享锁」, 你能够应用 sharedLock 办法。 共享锁可避免选中的数据列被篡改,直到事务被提交为止 : DB::table('users')->where('votes', '>', 100)->sharedLock()->get();下面这个查问等价于上面这条 SQL 语句: select * from `users` where `votes` > '100' lock in share mode;此外你还能够应用 lockForUpdate 办法。“for update”锁防止抉择行被其它共享锁批改或删除: DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();下面这个查问等价于上面这条 SQL 语句: select * from `users` where `votes` > '100' for update;

February 8, 2023 · 1 min · jiezi

关于laravel:laravel-从现有的数据库生成模型并通过模型操作数据库

一:拓展装置laravel中从现有的数据库生成模型并通过模型操作数据库须要应用到reliese/laravel拓展 reliese/laravel插件地址: https://packagist.org/package... composer require reliese/laravelcomposer require --ignore-platform-reqs reliese/laravel //疏忽Php版本要求二:配置reliese/laravel在config/app.php文件中增加 'providers' => [ /* * Package Service Providers... */ Reliese\Coders\CodersServiceProvider::class,],如果你仅仅想要在开发环境应用reliese/laravel插件的话,能够间接批改app\Providers\AppServiceProvider.php文件 public function register(){ // if($this->app->environment() == 'local') { $this->app->register('\Reliese\Coders\CodersServiceProvider'); }}二:应用reliese/laravel1:生成models.phpphp artisan vendor:publish --tag=reliese-modelsphp artisan config:clear在我的项目目录下运行下面两行命令后你会发现在config目录下生成了一个models.php文件 2:配置models.php因为larvel是通过 Eloquent ORM 来实现与数据库交互的,所以批改config/models.php的parent参数 'parent' => Illuminate\Database\Eloquent\Model::class,当你要生成的数据库model不是默认的数据库配置数,将config/models.php文件的connection参数批改成你的mysql连贯名 'connection' => 'mysql001',如果你须要批改生成的model文件指定目录 ,批改config/models.php文件的path和namespace 'path' => app_path('Models'),'namespace' => 'App\Models',3:生成modelphp artisan code:models //从默认连贯中构建模型运行下面的命令会在你在配置的config/models.php文件中配置的path目录下生成默认连贯的数据库的表的模型文件 留神:执行下面的命令可能会报如下谬误 解决方案: composer require doctrine/dbal:^2.6 --with-all-dependencies给特定的表生成模型php artisan code:models --table=test给指定的连贯生成模型php artisan code:models --connection=mysql001给指定的连贯的指定表生成模型php artisan code:models --connection=mysql001 --table=test4:操作数据库(1):数据查问【1】:根底查问$user = User::where('status', 1)->get();//查问status为1的所有数据//查问所有数据(等同于User::get())$user = User::all();//cursor 容许你应用游标来遍历数据库数据,该游标只执行一个查问。解决大量数据时,能够应用 cursor 办法能够大幅度缩小内存的使用量foreach (User::where('user_name', 'abc')->cursor() as $model){ var_dump($model->user_name);}//通过主键返回一条数据$user = User::find(27);//主键数组为参数调用 find 办法,它将返回匹配记录的汇合$user = User::find([27,28]);//查问不到数据会抛出Illuminate\Database\Eloquent\ModelNotFoundException$user = User::findOrFail(1);$user = User::where('sge', '>', 10)->firstOrFail();【2】:连表查问在model中减少关联函数 ...

February 8, 2023 · 1 min · jiezi

关于laravel:laravel数据库迁移

一:创立迁徙在laravel中应用make:migration命令来创立迁徙 php artisan make:migration create_user_table执行下面的命令后这时候会在database/migrations 目录下生成对应的迁徙文件,每个迁徙的文件名都蕴含一个工夫戳来让 Laravel 确认迁徙的程序 二:迁徙构造一个迁徙类蕴含两个办法: up 和 down。up 办法是用于新增数据库的数据表、字段或者索引的,而 down 办法应该与 up 办法的执行操作相同。 1:up办法public function up(){ Schema::create('user', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); });}2:down办法public function down(){ Schema::dropIfExists('user');}三:运行迁徙php artisan migrate大多数迁徙操作都是破坏性的,这意味着兴许会失落数据。为了避免有人在生产环境数据中运行这些命令,在执行这些命令之前将提醒你进行确认。如果要强制迁徙命令在没有提醒的状况下运行,请应用 --force 参数 php artisan migrate --force四:迁徙回滚php artisan migrate:rollback通过向 rollback 命令加上 step 参数,能够回滚指定数量的迁徙 php artisan migrate:rollback --step=5migrate:reset 命令将会滚回你应用程序所有的迁徙: php artisan migrate:reset五:回滚后迁徙migrate:refresh 命令将会在回滚你所有的迁徙后执行 migrate 命令。这个命令能够高效的从新创立你的整个数据库: php artisan migrate:refresh// 刷新数据库并执行数据库填充php artisan migrate:refresh --seed六:可用字段类型在laravel的数据库迁徙中,反对的字段类型有: 命令形容$table->bigIncrements('id');递增 ID(主键),相当于「UNSIGNED BIG INTEGER」$table->bigInteger('votes');相当于 BIGINT$table->binary('data');相当于 BLOB$table->boolean('confirmed');相当于 BOOLEAN$table->char('name', 100);相当于带有长度的 CHAR$table->date('created_at');相当于 DATE$table->dateTime('created_at');相当于 DATETIME$table->dateTimeTz('created_at');相当于带时区 DATETIME$table->decimal('amount', 8, 2);相当于带有精度与基数 DECIMAL$table->double('amount', 8, 2);相当于带有精度与基数 DOUBLE$table->enum('level', ['easy', 'hard']);相当于 ENUM$table->float('amount', 8, 2);相当于带有精度与基数 FLOAT$table->geometry('positions');相当于 GEOMETRY$table->geometryCollection('positions');相当于 GEOMETRYCOLLECTION$table->increments('id');递增的 ID (主键),相当于「UNSIGNED INTEGER」$table->integer('votes');相当于 INTEGER$table->ipAddress('visitor');相当于 IP 地址$table->json('options');相当于 JSON$table->jsonb('options');相当于 JSONB$table->lineString('positions');相当于 LINESTRING$table->longText('description');相当于 LONGTEXT$table->macAddress('device');相当于 MAC 地址$table->mediumIncrements('id');递增 ID (主键) ,相当于「UNSIGNED MEDIUM INTEGER」$table->mediumInteger('votes');相当于 MEDIUMINT$table->mediumText('description');相当于 MEDIUMTEXT$table->morphs('taggable');相当于退出递增的 taggable_id 与字符串 taggable_type$table->uuidMorphs('taggable');相当于退出 taggable_id 与字符串 taggable_typeUUID 列。$table->multiLineString('positions');相当于 MULTILINESTRING$table->multiPoint('positions');相当于 MULTIPOINT$table->multiPolygon('positions');相当于 MULTIPOLYGON$table->nullableMorphs('taggable');相当于可空版本的 morphs () 字段$table->nullableUuidMorphs('taggable');相当于可空版本的 uuidMorphs() 字段$table->nullableTimestamps();相当于可空版本的 timestamps() 字段$table->point('position');相当于 POINT$table->polygon('positions');相当于 POLYGON$table->rememberToken();相当于可空版本的 VARCHAR (100) 的 remember_token 字段$table->set('flavors', ['strawberry', 'vanilla']);相当于 SET$table->smallIncrements('id');递增 ID(主键),相当于「UNSIGNED SMALLINT」$table->smallInteger('votes');相当于 SMALLINT$table->softDeletes();相当于为软删除增加一个可空的 deleted_at 字段$table->softDeletesTz();相当于为软删除增加一个可空的 带时区的 deleted_at 字段$table->string('name', 100);相当于带长度的 VARCHAR$table->text('description');相当于 TEXT$table->time('sunrise');相当于 TIME$table->timeTz('sunrise');相当于带时区的 TIME$table->timestamp('added_on');相当于 TIMESTAMP$table->timestampTz('added_on');相当于带时区的 TIMESTAMP$table->timestamps();相当于可空的 created_at 和 updated_at TIMESTAMP$table->timestampsTz();相当于可空且带时区的 created_at 和 updated_at TIMESTAMP$table->tinyIncrements('id');相当于主动递增 UNSIGNED TINYINT$table->tinyInteger('votes');相当于 TINYINT$table->unsignedBigInteger('votes');相当于 Unsigned BIGINT$table->unsignedDecimal('amount', 8, 2);相当于带有精度和基数的 UNSIGNED DECIMAL$table->unsignedInteger('votes');相当于 Unsigned INT$table->unsignedMediumInteger('votes');相当于 Unsigned MEDIUMINT$table->unsignedSmallInteger('votes');相当于 Unsigned SMALLINT$table->unsignedTinyInteger('votes');相当于 Unsigned TINYINT$table->uuid('id');相当于 UUID$table->year('birth_year');相当于 YEAR七:字段润饰在laravel的数据库迁徙中,反对的字段修饰符有: ...

February 8, 2023 · 2 min · jiezi

关于laravel:Laravel框架实现无限极分类

表构造CREATE TABLE `goods_category` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id', `name` varchar(500) DEFAULT '' COMMENT '分类名称', `pid` int(5) unsigned DEFAULT '0' COMMENT '父级id', `level` tinyint(3) unsigned DEFAULT '1' COMMENT '分类等级', `status` tinyint(3) unsigned DEFAULT '0' COMMENT '分类状态:0-禁用,1-失常', `created_at` timestamp NULL DEFAULT NULL COMMENT '创立工夫', `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新工夫', PRIMARY KEY (`id`) USING BTREE, KEY `status` (`status`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='商品分类表';测试数据INSERT INTO `recruit_dev`.`goods_category` (`id`, `name`, `pid`, `level`, `status`, `created_at`, `updated_at`) VALUES ('1', '版本套餐', '0', '1', '1', NULL, NULL);INSERT INTO `recruit_dev`.`goods_category` (`id`, `name`, `pid`, `level`, `status`, `created_at`, `updated_at`) VALUES ('2', '图书', '0', '1', '1', NULL, NULL);INSERT INTO `recruit_dev`.`goods_category` (`id`, `name`, `pid`, `level`, `status`, `created_at`, `updated_at`) VALUES ('3', '组合会员', '1', '1', '1', NULL, NULL);INSERT INTO `recruit_dev`.`goods_category` (`id`, `name`, `pid`, `level`, `status`, `created_at`, `updated_at`) VALUES ('4', '考据会员', '3', '2', '1', NULL, NULL);INSERT INTO `recruit_dev`.`goods_category` (`id`, `name`, `pid`, `level`, `status`, `created_at`, `updated_at`) VALUES ('5', '高级会员', '3', '1', '1', NULL, NULL);INSERT INTO `recruit_dev`.`goods_category` (`id`, `name`, `pid`, `level`, `status`, `created_at`, `updated_at`) VALUES ('6', '经管类', '2', '2', '1', NULL, NULL);INSERT INTO `recruit_dev`.`goods_category` (`id`, `name`, `pid`, `level`, `status`, `created_at`, `updated_at`) VALUES ('7', '经济类', '2', '1', '0', NULL, NULL);模型关联/** * 查找本人的子级 * @return \Illuminate\Database\Eloquent\Relations\HasMany */public function children() { return $this->hasMany(get_class($this), 'pid' ,'id');}/** * 有限分级 * @return \Illuminate\Database\Eloquent\Relations\HasMany */public function allChildren() { return $this->children()->with( 'allChildren' )->where('status',1)->orderBy('level','asc');}控制器调用$items = GoodsCategory::with('allChildren')->where('pid',0)->where('status',1)->orderBy('level','asc')->get();

January 13, 2023 · 1 min · jiezi

关于laravel:PHPLargon-快速部署-Laravel-项目

引言phpLargon部署Laravel非常简单,只有对于PHP的一些组件进行相干理解即可。 Largon的bin组件介绍Apache:老牌Web服务器Cmder:命令行工具(Windows下的终端模拟器)Composer:PHP 包管理器Git:分布式版本控制软件HeidiSQL:收费的数据库管理工具(反对MySQL、MSSQL、Postgres)Laragon:治理开发环境提供的工具/服务的平台Memcached:老牌缓存零碎MySQL:最风行的开源数据库系统Nginx:高性能Web服务器Ngrok:平安的内网穿透利器(外网拜访内网站点)Node.js:可能在服务器端运行JavaScript的凋谢源代码、跨平台JavaScript 运行环境Notepad++:反对各种编程语言的文本编辑器PHP:蕴含最新稳固版本的PHPPuTTY:一个收费玲珑的SSH客户端Redis:能够长久化的键值对存储系统(可用于实现缓存、NoSQL、队列等)Sendmail:邮件发送代理软件TelnetWinSCP:收费的SFTP&FTP客户端Yarn:NPM 包管理器largon部署Laravel的一些长处丑化 URL:应用 app.test 代替 localhost/app可移植:能够任意挪动 Laragon 目录(不同磁盘、不同电脑、或者云服务)与零碎隔离:Laragon 提供了一个与操作系统隔离的环境,从而放弃了零碎的洁净繁难易用:Laragon 会主动为你实现简单的底层配置,你能够轻松地在不同版本的 PHP、Python、Java、MySQL、Nginx、MongoDB 等软件间切换古代&功能强大:基于现代化的软件架构设计,从而实用于构建现代化的 Web 利用,很多日常琐碎都能够一键帮你搞定。理解LargonLargon在过来的一篇英文博客介绍过,这里不再独自介绍Largon。 [[How to develop locally a Laravel app using Laragon]](https://segmentfault.com/a/11...) 装置LargonLargon的最大毛病是只能反对Windows用户应用,咱们只须要到官网下载exe安装包,一路下一步就能够了。 官网地址:https://laragon.org/download/ 拜访数据库默认数据库是 Laragon,用户名是 root,明码是 空字符串,点击「关上」按钮,就能够拜访这个默认的数据库: 进入到数据库连贯界面: 配置实现即可。 Largon装置之后就能够立刻初始化Laravel我的项目。 疾速构建Laravel我的项目Windows零碎在界面的右下角右击图标,而后依据上面的提醒主动构建我的项目即可。 构建我的项目之后能够应用:http://laravel.test。 当然如果不喜爱Largon本人擅自动了配置,应用默认的形式能够比方 http://localhost/laravel/public/ 拜访能够间接看到相干的资源链接。 简略理解Laravel框架入口流程集体对于PHP根本是无所不通,这里翻阅到一篇社区的文档,这篇文章介绍了拜访Public下的index.php加载过程,也就是框架是如何进行初始化和疏导的。 Lararel 框架执行流程详解(1) 入口文件 大抵的导入过程如下: 外表入口为public/index.php,外部代码引入了 bootstrap 目录下的 app.php。通过外围的kernel进行疏导初始化。$app->make(Kernel::class)是外围的启动办法。内核Kernel的次要工作:疏导、解决申请、生命周期流动、获取实例。Laravel实现初始化工作。首先是进入到app.php文件中: $app = require_once __DIR__.'/../bootstrap/app.php';$kernel = $app->make(Kernel::class);require_once 意思是如果对应的文件不存在会报错,require_once 语句和 **require** 语句完全相同,惟一区别是 PHP 会查看该文件是否曾经被蕴含过,如果是则不会再次蕴含。接着咱们能够看到Laravel的Kernel内核类,咱们查看它的类定义: interface Kernel{    /**     * Bootstrap the application for HTTP requests.     * 为HTTP申请提供应用程序。     * @return void     */    public function bootstrap();     /**     * Handle an incoming HTTP request.     * 解决一个http申请     * @param  \Symfony\Component\HttpFoundation\Request  $request     * @return \Symfony\Component\HttpFoundation\Response     */    public function handle($request);     /**     * Perform any final actions for the request lifecycle.     * 执行申请生命周期的任何最终口头。     * @param  \Symfony\Component\HttpFoundation\Request  $request     * @param  \Symfony\Component\HttpFoundation\Response  $response     * @return void     */    public function terminate($request, $response);     /**     * Get the Laravel application instance.     * 获取实例     * @return \Illuminate\Contracts\Foundation\Application     */    public function getApplication();}"内核“类干了四个事件:疏导、解决申请、生命周期流动、获取实例这几个要害行为。Kernel 类是在 Illuminate\Contracts\Http\Kernel的包中,咱们能够通过var_dump或者上面的形式打印出实例化之后的外部对象属性,当然也能够阅读文章开端一些不应用IDE或者插件优雅DEBUG办法(请看开端"扩大:PHP的Debug技巧局部")。 ...

December 21, 2022 · 2 min · jiezi

关于laravel:用-Golang-跑队列任务也可以像-Laravel-一样简单

话说用 Golang 跑「队列工作」须要几步?应用 Goravel ,四步不能再多了! 第一步:生成工作类go run . artisan make:job HelloWorld工作类构造 package jobstype HelloWorld struct {}//Signature The name and signature of the job.func (receiver *HelloWorld) Signature() string { return "process_podcast"}//Handle Execute the job.func (receiver *HelloWorld) Handle(args ...interface{}) error { return nil}第二步:注册工作注册到 app/provides/queue_service_provider.go func (receiver *QueueServiceProvider) Jobs() []queue.Job { return []queue.Job{ &jobs.HelloWorld{}, }}第三步:启动队列服务器在根目录下 main.go 中启动队列服务器 package mainimport ( "github.com/goravel/framework/support/facades" "goravel/bootstrap")func main() { // This bootstraps the framework and gets it ready for use. bootstrap.Boot() // Start queue server by facades.Queue. go facades.Queue.Worker(queue.Args{}).Run() select {}}第四步:调度工作err := facades.Queue.Job(&jobs.HelloWorld{}, []queue.Arg{}).Dispatch()OK, Over. 更多功能详见文档,根本用法与 Laravel 保持一致,小伙伴们开始欢快的搞事件吧! ...

May 25, 2022 · 1 min · jiezi

关于laravel:Laravel-connmix-开发分布式-WebSocket-聊天室

Laravel + connmix 开发分布式 WebSocket 聊天室Star https://github.com/connmix/ex... 获取最新版本的示例connmix 是一个基于 go + lua 开发面向音讯编程的分布式长连贯引擎,可用于互联网、即时通讯、APP开发、网络游戏、硬件通信、智能家居、物联网等畛域的开发,反对java,php,go,nodejs 等各种语言的客户端。 Laravel 是 PHP 业界公认最优雅的传统框架,当然你也能够抉择 thinkphp 等其余框架。 两者联合可疾速开发出性能强劲的分布式 websocket 长连贯服务,非常适合开发 IM、聊天室、客服零碎、直播弹幕、页游等需要。 装置装置 CONNMIX 引擎:https://connmix.com/docs/1.0/...装置最新版本的 Laravel 框架composer create-project laravel/laravel laravel-chat而后装置 connmix-php 客户端cd laravel-chatcomposer require connmix/connmix解决方案在命令行中应用 connmix 客户端生产内存队列 (前端发送的 WebSocket 音讯)。咱们抉择 Laravel 的命令行模式,也就是 console 来编写业务逻辑,这样就能够应用 Laravel 的 DB、Redis 等各种生态库。API 设计作为一个聊天室,在入手之前咱们须要先设计 WebSocket API 接口,咱们采纳最宽泛的 json 格局来传递数据,交互采纳经典的 pubsub 模式。 性能格局用户登录{"op":"auth","args":["name","pwd"]}订阅房间频道{"op":"subscribe","args":["room_101"]}订阅用户频道{"op":"subscribe","args":["user_10001"]}订阅播送频道{"op":"subscribe","args":["broadcast"]}勾销订阅频道{"op":"unsubscribe","args":["room_101"]}接管房间音讯{"event":"subscribe","channel":"room_101","data":"hello,world!"}接管用户音讯{"event":"subscribe","channel":"user_10001","data":"hello,world!"}接管播送音讯{"event":"subscribe","channel":"broadcast","data":"hello,world!"}发送音讯到房间{"op":"sendtoroom","args":["room_101","hello,world!"]}发送音讯到用户{"op":"sendtouser","args":["user_10001","hello,world!"]}发送播送{"op":"sendbroadcast","args":["hello,world!"]}胜利{"op":"*","success":true}谬误{"op":"***","error":"*"}数据库设计咱们须要做登录,因而须要一个 users 表来解决鉴权,这里只是为了演示因而表设计特意简化。 文件门路:users.sqlCREATE TABLE `users`( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `idx_n` (`name`));房间 table 这里临时不做设计,大家自行扩大。 ...

May 6, 2022 · 4 min · jiezi

关于laravel:在-Golang-中进行任务调度像用-Laravel-一样丝滑

Laravel 中的「任务调度」class Kernel extends ConsoleKernel{ protected function schedule(Schedule $schedule) { $schedule->call(function () { DB::table('recent_users')->delete(); )}->daily(); $schedule->command('emails:send name')->daily(); }}Goravel 中的「任务调度」type Kernel struct {}func (kernel Kernel) Schedule() []*support.Event { return []*support.Event{ facades.Schedule.Call(func() { facades.DB.Where("1 = 1").Delete(&models.User{}) }).Daily(), facades.Schedule.Command("emails:send name").Daily(), }}func (kernel Kernel) Commands() []console.Command { return []console.Command{ &commands.SendEmails{}, }}实现了 Laravel 中大部分的实用办法,继续更新中, 欢送 star 与 issues。 对于 GoravelGoravel 是一个性能齐备、具备良好扩大能力的 Web 应用程序框架。 作为一个起始脚手架帮忙 Golang 开发者疾速构建本人的利用。 我的项目地址:https://github.com/goravel/goravel 文档地址:https://www.goravel.dev

April 25, 2022 · 1 min · jiezi

关于laravel:在-Golang-中像-Laravel-的-Artisan-一样使用命令行Goravel-带你找回熟悉的味道

Laravel 中的 Artisan 命令行是这样// 创立命令php artisan make:command SendEmails// 运行命令php artisan mail:send// 应用参数php artisan mail:send hello// 应用选项php artisan mail:send --mail=abc@qq.comGoravel 中的 Artisan 命令行也一样// 创立命令go run . artisan make:command SendEmails// 运行命令go run . artisan mail:send// 应用参数go run . artisan mail:send hello// 应用选项go run . artisan mail:send --mail abc@qq.com就连 struct 的定义都是满满的回顾: package commandsimport ( "github.com/goravel/framework/contracts/console" "github.com/urfave/cli/v2")type SendEmails struct {}//Signature The name and signature of the console command.func (receiver *SendEmails) Signature() string { return "emails"}//Description The console command description.func (receiver *SendEmails) Description() string { return "Command description"}//Extend The console command extend.func (receiver *SendEmails) Extend() console.CommandExtend { return console.CommandExtend{}}//Handle Execute the console command.func (receiver *SendEmails) Handle(c *cli.Context) error { return nil}相熟的配方,原来的滋味。PHPer 极速切换,Goer 的福音。 欢送 star 与 issues。 ...

April 25, 2022 · 1 min · jiezi

关于laravel:laraveladmin使用filter过滤聚合字段

最近遇到一个需要,laravel admin的列表外面须要做统计查问 $grid = new Grid(new Attendancer());$grid->model()->selectRaw('cur_room,count(*) as aggregate')->whereRaw('cur_room is not null && cur_room !=""')->groupBy("cur_room");$grid->column('cur_room','房间号');$grid->column('aggregate','人数');return $grid;以上代码执行之后成果如图 而后接下来须要对这两列做数据过滤 $grid->filter(function (Grid\Filter $filter){ $filter->setFilterID("count"); $filter->disableIdFilter(); $filter->where(function ($query){ $query->having("aggregate",">=",$this->input); },'人数'); $filter->equal('cur_room','房间号'); });执行之后会发现,having那一行没用。文档外面filter也没有提到应用having的内容。那就只能本人来。 filter底层有一个办法是getColumn,能够返回该输出项的name。而后通过$_GET来获取传进来的参数。此处有个事项须要留神,就是对于count(*)的名字问题,必须要用 aggregate 否则会提醒查问sql时列名不存在,因为laravel-admin在执行这个办法的时候会带上开发者本人定义的where条件和聚合条件做一次统计查问 select count(*) as aggregate from `attendancer` where 你的查问条件 group by `聚合字段` having 你的字段名 >= 2不改成count字段的名字不改成aggregate的话会在查问的时候提醒 Column not found: 1054 Unknown column '你的字段名' in 'having clause' 残缺代码如下 $grid = new Grid(new Attendancer()); $c=''; $grid->filter(function (Grid\Filter $filter)use(&$c){ $filter->setFilterID("count"); $filter->disableIdFilter(); $c=$filter->setName("c")->where(function ($query){// $query->having("c",">=",$this->input); return $this->input; },'人数')->getColumn(); $filter->equal('cur_room','房间号'); }); $grid->model()->selectRaw('cur_room,count(*) as aggregate')->whereRaw('cur_room is not null && cur_room !=""')->groupBy("cur_room"); if(isset($_GET[$c])){ $grid->model()->havingRaw('aggregate >= ?',[$_GET[$c]]); } $grid->column('cur_room','房间号'); $grid->column('aggregate','人数'); $grid->disableActions(); $grid->disableCreateButton();总体来说,这个解决形式还是有坑的,治标不治本。 ...

March 30, 2022 · 1 min · jiezi

关于laravel:最棒的-7-个-Laravel-admin-后台管理系统推荐-卡拉云

本文首发:《最棒的 7 个 Laravel admin 后盾管理系统举荐 - 卡拉云》 Laravel 曾经凭借本人的易用性及低门槛成为 github 上 stars 第一的 PHP 框架,本文将介绍我精心为大家筛选进去的 Laravel admin 后盾管理系统,从形象水平最低(灵便但代码量大)到形象水平最高(代码量小但不灵便)来帮忙大家抉择适合本人的 Laravel admin 后盾管理系统。 Laravel admin 后盾管理系按类型抉择抉择 Laravel admin 后盾管理系统之前,我用了市面上大多数 Laravel admin ,它们看起来差异不大,其实用处和应用场景差异很大。上面总结了几个类型,大家可依据本人的需要对号入座。 脚手架型脚手架型的次要是以代码形式创立的,它能够帮你主动生成 Model、组件、路由,还有最根底的 CRUD 操作,然而一旦部署,前期就比拟难调整了。本文举荐的 infyOm Laravel Generator 就是这种类型。 CRUD 接口型因为 Laravel 框架遵循 MVC(模型-视图-控制器)模式,admin 管理系统的另一种类型是间接提供CRUD 接口。就是主动将 CRUD 逻辑和 UI 增加到现有模型的视图和控制器集。 这种的益处是前端组件帮你写好,模块化的疾速加到现有我的项目或者疾速 set 起一个我的项目,代码量绝对于脚手架型更少,弱点是如果碰到模型之间有简单的逻辑关系,它并不能很灵便的解决。本文举荐的 Nova(官网出品)、Laravel-admin、Backpack、Orchid 都属于这种类型。 可视化编程可视化编程绝对于下面两种类型,形象水平更高,曾经帮你把前端都写好了,只须要你指定要什么,放在什么中央就行了。这种灵便水平绝对于前两者更低,但部署起来更不便。对编程能力要求更低。 本文举荐的 Voyager 、QuickAdminPanel 和 Backpack 提供的开发工具 Backpack DevTools 都是这个类型的。 新一代低代码开发工具脚手架型的劣势是它最灵便,劣势是须要写大量代码,CURD 劣势是在复杂度和便捷度上找了个均衡,劣势是后端程序员还须要分精力进去解决前端问题。可视化编程好像解决了前两者的问题,但如果理论需要略微简单一些,用可视化编程比本人写代码还麻烦。 当初,曾经有了会集三种类型有点于一身的解决方案 - 卡拉云。卡拉云是一套低代码解决方案,齐全不必解决任何前端问题,只须要拖拽即可疾速生成前端组件,开发者只需会调 API,会写 SQL 即可疾速把前端组件与后端连接起来。卡拉云即有可视化编程的便捷性,又有脚手架型的灵活性。数周的工作量,1 小时即可实现。详情请见本文文末。 ...

March 16, 2022 · 2 min · jiezi

关于laravel:摘抄-laravel-分层

(摘抄) laravel 分层 https://laravelacademy.org/po... 核心思想就是分层你可能曾经留神到,优化利用目录构造的要害就是对不同组件的责任进行划分,或者说为不同的职责创立不同的层。控制器只负责接管和响应 HTTP 申请,而后调用适合的业务逻辑层的类。你的业务逻辑/畛域逻辑层才是利用最外围的局部,其中蕴含了读取数据,验证数据,执行领取,发送电子邮件,还有程序里所有其余性能的代码。事实上,你的畛域逻辑层不须要晓得任何对于「Web」的事件!Web 层仅仅是一种拜访应用程序的传输机制,对于 Web 和 HTTP 申请的所有不应该超出路由和控制器层的范畴。做出好的架构设计确实很有挑战性,但好的架构设计也会带来可保护的、更加清晰的代码。 举个例子,与其在业务逻辑类外面间接获取 Web 申请,不如把 Web 申请通过控制器传递给业务逻辑类。这个简略的改变会将你的业务逻辑类和「Web」层解耦,并且不用放心怎么去模仿 Web 申请,就能够轻松测试业务逻辑类 关键词:可保护 清晰 不便测试

March 16, 2022 · 1 min · jiezi

关于laravel:Laravel-日志按天保存

问题形容laravel 的日志默认记录在一个文件storage/logs/laravel.log,与日俱增文件越来越大,查找很不不便,于是想到按日期生成日志。laravel日志反对4种模式,默认应用single即繁多日志,只存储在一个文件中。 解决办法env配置文件设置LOG_CHANNEL的值为daily,不倡议在config/app.php里批改。 LOG_CHANNEL=daily

February 23, 2022 · 1 min · jiezi

关于laravel:使用中间件记录Laravel慢请求

一个零碎须要继续优化,日志尤为要害。通过巧用中间件记录零碎的慢申请,能够不必依赖任何监控型服务,定期剖析日志,从而优化零碎。 通过定义一个监控中间件,记录慢查问。 <?phpnamespace ModStart\Core\Monitor;use Illuminate\Http\Request;use Illuminate\Support\Facades\Log;class ModStartMonitorMiddleware{ public function handle(Request $request, \Closure $next) { $response = $next($request); if (defined('LARAVEL_START')) { $time = round((microtime(true) - LARAVEL_START) * 1000, 2); $param = json_encode(\Illuminate\Support\Facades\Request::input()); $url = $request->url(); $method = $request->method(); if ($time > 1000) { Log::warning("LONG_REQUEST $method [$url] ${time}ms $param"); } } return $response; }}如果常量 LARAVEL_START 未定义可在入口文件中定义。 define('LARAVEL_START', microtime(true));在零碎 Kernel 类中减少中间件到所有申请。 <?phpnamespace App\Http;class Kernel extends \Illuminate\Foundation\Http\Kernel{ protected $middleware = [ \ModStart\Core\Monitor\ModStartMonitorMiddleware::class, // ... ];}这样就能够在日志中看到慢申请 ...

February 16, 2022 · 1 min · jiezi

关于laravel:Laravel中的cachetags批量删除缓存前缀是怎么实现的

序言咱们晓得 Laravel 中能够通过 cache::tag("xxx")->flush() 实现批量删除。然而删除的底层命令是啥(这里以redis为缓存驱动)? 是会造成梗塞的keys命令, 还是scan命令又或者就是一般的del命令?不钻研源码的能够间接到最上面看总结底层代码剖析一、设置tag缓存底层代码剖析1) 设置带有tag的缓存代码如下: Cache::tags('foo')->put('bar', 'value');2) 通过编辑器的全局搜寻咱们找到tags办法代码,如下: /** * Begin executing a new tags operation. * * @param array|mixed $names * @return \Illuminate\Cache\RedisTaggedCache */ public function tags($names) { return new RedisTaggedCache( $this, new TagSet($this, is_array($names) ? $names : func_get_args()) ); }咱们先看TagSet类, TagSet类构造函数如下, 咱们能够看到在TagSet这个类中设置2了个成员变量 /** * Create a new TagSet instance. * * @param \Illuminate\Contracts\Cache\Store $store * @param array $names * @return void */ public function __construct(Store $store, array $names = []) { $this->store = $store; $this->names = $names; }咱们再回过头来看RedisTaggedCache类的构造函数, RedisTaggedCache类并没有本人的构造函数,然而他继承了TaggedCache类, TaggedCache类构造函数如下, 这里先执行TaggedCache父类构造方法,再来设置了tags变量. 咱们再来看看TaggedCache的父类的构造方法, 如下 ...

February 9, 2022 · 4 min · jiezi

关于laravel:vscodePHPstudylavarel调试采坑越过

1、PHPstudy中装置好对应版本的PHP;2、vscode中装置: 3、配置php.ini,这里我踩了不少坑,在配置文件中增加 xdebug.remote_enable = 1 xdebug.remote_autostart= 1 并能够把我圈进去的前两项正文掉 在php文件中减少xdebug配置: php配置文件地位 新减少两行 4、进入vscode中配置对应我的项目的launch.json文件,只须要减少一个xdebug的config即可 5、在应用时间接用F5即可,起初打完点后没反馈,此处就是我这种老手纳闷的中央,须要用其余调用形式来触发,比方接口调用操作; 6、装置环境肯定要急躁,加重复尝试。7、装置code Runner能够失常打印一般程序运行记录; 8、lavarel的代码目录在PHPstudy下,所以我的项目启动的依赖就是PHPstudy的启动,外部接口的调试,都依赖phpstudy的启动,所以不必能够去进行所谓的我的项目启动工作。

February 7, 2022 · 1 min · jiezi

关于laravel:laravel8model

MVC模型 model操作数据库,几种形式:1、间接在类中定义: const TABLE_NAME = 'users';protected $table = self::TABLE_NAME;public $timestamps = false;在controller中应用时,就能够间接应用$data = Dvwa::get() -> toArray(); 2、第二种获取模式,在model中写入办法,调用数据库,应用get办法时,与其余版本不一样, function readUser(){ $user_name = DB::table('users')->where('user_id',1)->get(['user','password']); return $user_name;}在用get获取多个字段时,传入的是一个数组。 在controller中,通过定义对象来进行调用 $dvwa = new Dvwa(); $user = $dvwa -> readUser(); return $user;获取一列数据应用pluck办法获取: $user_name = DB::table('users')->pluck('first_name'); 此处有个前提是要在env的配置文件中把数据库指定分明:

February 7, 2022 · 1 min · jiezi

关于laravel:laravel8的API路由坑

1、laravel8路由如何依照之前版本来写,则会呈现所援用的文件找不到问题,以下确认三种写法无效: 在controller上面整了个controller文件 2、在routes\api.php外面进行配置:官网举荐办法1:援用 use App\Http\Controllers\UserController; 理论应用,在调用时用域名加api/test援用,index为controller中的办法名 Route::get('/test' , [UserController::class , 'index']); 本人尝试办法2:间接援用 Route::get('test','App\Http\Controllers\UserController@index'); 办法3:Route::get('/test',['App\Http\Controllers\UserController','index'],'UserController@index'); laravel8中路由如果要应用matchRoute::match(['get','post'],'/getParame' , [DvwaController::class , 'getPramater']);

February 7, 2022 · 1 min · jiezi

关于laravel:laravel的安装踩过坑

1、我这边是间接在网上下载好的laravel,须要在本地配置,我弄了个laravel8的框架 2、依赖:laravel依赖composer 首先是装置composer 3、装置实现后,此处进入关键点: 须要批改composer的源,在这里间接给出正确答案,在这里踩过坑,也就是替换阿里云 composer config -g repo.packagist composer https://mirrors.aliyun.com/co... 4、进入到搁置laravel的目录,通常是放在phpstudy的www的目录下,命令行输出 composer update composer install 5、因为是手动下载的laravel,所以要把其目录下的.env.example文件批改为.env文件 之后执行这个命令 php artisan key:generate 6、之后在phpstudy中配置: 7、拜访http://local.laravel8.cn/则就OK 备注: vscode中PHP的配置: 批改php本地的应用环境:

February 7, 2022 · 1 min · jiezi

关于laravel:laravel-8-修改默认的paginate分页模板

最近应用日志工具ARCANEDEV/LogViewer时,装置胜利之后,发现分页有问题,应该是作者还没有适配Laravel8造成的。 对照文档粗略的看了下与之前版本的区别,发现自带的分页 ui 由 bootstrap UI 改为 tailwind css 了。 一路查看源码,首先找到 Illuminate\Pagination\AbstractPaginator 115 和 122 行: /** * The default pagination view. * * @var string */ public static $defaultView = 'pagination::tailwind'; /** * The default "simple" pagination view. * * @var string */ public static $defaultSimpleView = 'pagination::simple-tailwind';以及下方 552 行之后 /** * Set the default pagination view. * * @param string $view * @return void */ public static function defaultView($view) { static::$defaultView = $view; } /** * Set the default "simple" pagination view. * * @param string $view * @return void */ public static function defaultSimpleView($view) { static::$defaultSimpleView = $view; }咱们的分页办法是 $list->links(); 必定与 links 这个办法无关,找到,vendor/laravel/framework/src/Illuminate/Pagination/Paginator.php这个是分页组件的入口文件(能够这么了解了),找一下 links() 办法, 94 行, ...

January 23, 2022 · 1 min · jiezi

关于laravel:LaravelPlugin-基于-Laravel-的插件机制解决方案

介绍Laravel Plugin 是为须要构建本人生态的开发者提供的插件机制解决方案,应用它您能够构建相似 wordpress 的生态。它能为您提供的帮忙如下: 基于服务注册的形式去加载插件。通过命令行的形式,插件开发者能够方便快捷的构建插件,上传插件到插件市场。提供插件 composer 包反对。在创立的插件中独自援用 composer。以事件监听的形式,执行插件装置,卸载,启用,禁用的逻辑。不便开发者进行拓展。插槽式的插件市场反对,通过批改配置文件,开发者能够无缝对接到本人的插件市场。自带一个根本的插件市场,开发者能够上传插件,并对插件进行审核。反对插件多版本。文档地址欢送在 GitHub Star Laravel-Plugin 场景想做一个开源版本的 erp,开源版本只有简略的进销存性能,我心愿用户能够以插件的模式购买我的生成加工,财务核算,数据报表等性能。这样以开源的模式还能够盈利。同样如果你做一款开源商城,cms 同样能够用 Laravel-Plugin 构建你的插件生态。 疾速制作并上传你的第一个插件装置好 Laravel-Plugin 当前,在命令输出 php artisan plugin 查看所有可用指令。 创立插件通过 php artisan plugin:make test 创立你的插件 test。 注册插件创立好当前,咱们须要注册一个账号才能够上传。咱们有两种注册形式 通过执行 php artisan plugin:register 注册。插件市场 注册上传注册实现当前执行 php artisan plugin:upload test 就将 test 插件上传到插件市场了。 查看上传的插件在 插件市场 登录当前,点击插件治理就能够看到刚刚上传的插件。 审核公布插件市场工作人员在后盾审核当前,你的插件就能够公布到 插件市场 给别人下载应用了 命令行下载在命令行登录当前,你能够通过执行 php artisan plugin:download 下载插件 以上介绍了怎么通过 Laravel-Plugin 疾速公布你的第一个插件。如果你想对 Laravel-Plugin 有更多的理解,倡议仔细阅读 Laravel-Plugin 文档。 插件市场应用 Laravel-Plugin ,默认链接的是我这边用 laravel + vue3 + tailwincss 写的一个根底插件市场,在 Laravel-Plugin 文档 介绍了怎么自定义你本人的插件市场,当然,你也能够找我购买插件市场,后续中我会不断完善插件市场性能。 ...

January 18, 2022 · 1 min · jiezi

关于laravel:基于PrometheusGrafana监控LaravelSwoole应用

实现思路1.Swoole 开启自定义过程定时采集监控指标,如 $server->stats() memory_get_usage() sys_getloadavg() gc_status(),将这些指标存储到 APCu;2.配置 Laravel 全局terminate 中间件统计 HTTP 申请次数与耗时指标,将指标存储 APCu;3.Laravel 提供一个指标接口,从 APCu 中查问指标数据;4.Prometheus 定时拉取指标接口,存储指标数据到它的 TSDB;5.Grafana 接入 Prometheus 数据源,图形化展现监控指标数据。 用到哪些中间件APCu:存储指标数据,多过程共享数据,读写速度快;Prometheus:收集监控指标数据,存储到 TSDB,设置告警规定;Grafana:图形化展现监控数据,反对配置告警。难点Swoole是多过程模型,如何在自定义过程中取统计其余 Worker 过程的内存占用呢?过程间通信,应用sendMessage()与onPipeMessage()来实现自定义过程与 Worker 过程通信,统计Worker过程的内存与GC状况。统计申请的中间件势必会减少接口耗时,如果将影响降到最低?所有与中间件相干的实例(包含中间件)都采纳单例模式,尽可能减少对象的初始化,只操作 APCu,无其余简单操作,将中间件整体耗时降到最低。看看成果吧 待优化项中间件反对路由参数合并统计:/users/123与/users/456合并为/users/{id},还须要兼容多版本的Laravel/Lumen;LaravelS下如何配置?查看具体文档

November 23, 2021 · 1 min · jiezi

关于laravel:laravel自定义验证规则

laravel自定义验证规定,老是遗记,这里做下记录 $this->validate($request, [ 'coupons_group_serialno' => 'required|max:15', 'out_trade_no' => 'required|max:64', 'ext_param' => [ 'max:100', function ($attribute, $value, $fail) { $arrTemp = is_json($value, true); if (!$arrTemp) { $fail($attribute . ' Not a Json.'); } } ], 'app_key' => 'required',]);

November 18, 2021 · 1 min · jiezi

关于laravel:Laravel-sail-添加-MongoDB

sail 自身没有附带 MongoDB 和 php MongoDB的 拓展,然而 sail 是应用 docker 创立的,咱们能够很不便的去批改任何货色 装置PHP扩大首先在目录下执行命令,公布配置文件到以后的 docker 目录下 sail artisan sail:publish进入到 docker 目录,找到对应的php版本目录,关上 Dockerfile 编辑第31行,在最初加上 php8.0-mongodb ,加完当前如图 而后在命令行从新构建 sail build --no-cache构建实现后,咱们启动容器 sail up -d到这一步,PHP的MongoDB拓展就装置好了 装置 jenssegers/mongodb间接执行命令即可 sail composer require jenssegers/mongodb装置MongoDB数据库关上 docker-compose.yml 文件,增加以下内容,加在其余服务前面即可 mongo: image: 'mongo:4.4' restart: always environment: MONGO_INITDB_ROOT_USERNAME: '${DB_USERNAME}' MONGO_INITDB_ROOT_PASSWORD: '${DB_PASSWORD}' MONGO_INITDB_DATABASE: '${DB_DATABASE}' volumes: - 'sailmongo:/data/db' networks: - sail而后申明 volume volumes: sailmysql: driver: local sailredis: driver: local sailmeilisearch: driver: local sailmongo: # 这个是新加的 driver: local配置 laravel 连贯最初,咱们关上 config/database.php ...

November 11, 2021 · 1 min · jiezi

关于laravel:Laravel底层学习笔记04-加载并启动ServiceProvider事件观察者模式

参考资料:Laravel Service Provider 中 boot 办法和 register 办法的区别php artisan 命令 new self 和new staticnew self() 返回的是self所在类new static() 返回调用者所在类class Father{ public function getSelf(){ return new self(); } public function getStatic(){ return new static(); }}$f = new Father();echo get_class($f->getSelf());//Fatherecho get_class($f->getStatic());//Fatherclass Son extends Father{}$s = new Son();echo get_class($s->getSelf());//Fatherecho get_class($s->getStatic());//Son加载并启动ServiceProviderboot和register办法的区别register办法是必须的,boot办法不是register 办法用于绑定服务到容器,框架会先调用所有 provider 的 register 办法,等所有服务都注册结束再去调用每一个服务的 boot 办法。所以不能在 register 办法外面调用其余 provider 提供的服务,因为咱们无奈保障其余服务曾经注册结束。而在 boot 办法外面你能够干任何事件!dispatch和提早加载提早加载开启提早加载vim FamilyServiceProvider.php$defer = true;public function providers(){ return ['Family'];}除编译生成的文件(optimize的反向操作)php artisan clear-compiled调用app('Family')->test();//没有providers()时的调用办法app('App\Service\Family\FamilyService')->test();//providers()办法等价于app('app')->bind('Family','App\Service\Family\FamilyService');源码vim Illuminate/Foundation/Application.phppublic function make($abstract, array $parameters = []){ $abstract = $this->getAlias($abstract); if (isset($this->deferredServices[$abstract]) && ! isset($this->instances[$abstract])) { $this->loadDeferredProvider($abstract); }}事件和监听者观察者模式观察者模式可能便当的创立查看指标对象状态的对象,并且提供与外围对象非耦合的指定性功能。 ...

November 7, 2021 · 2 min · jiezi

关于laravel:基于laravel-架构

架构图 1、Request log 申请报文日志,这里加申请报文的起因是,很多状况下的BUG是低频难复现的。原申请报文能很好的排查问题。这一层也能够放在中间件(Middleware)来解决 参考示例: <?phpnamespace App\Http\Middleware;use App\Http\Controllers\Controller;use Closure;class ApiCheck extends Controller{ /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $params = $request->input(); $Uri = $request->getRequestUri(); $UriArray = explode('?',$Uri); $UriArray = explode('/',$UriArray[0]); $this->dataRecodes('申请报文', $params, $UriArray[3]); return $next($request); }}class Helper{ /** * @Notes: 记录接口日志信息 * @Author: Dong Xiannan * @Date: 2021/8/5 3:50 下午 * @Description: 形容 * @param $title * @param $data * @param string $file */ public static function dataRecodes($title, $data, $file = 'log') { $date = date("Ymd"); if (!is_dir(storage_path('logs/' . $date))) { mkdir(storage_path('logs/' . $date), 0777, TRUE); } $content = "================" . $title . ' ' . date('Y-m-d H:i:s') . "===================\n"; file_put_contents(storage_path('logs/' . $date . '/' . $file . '.log'), $content . var_export($data, 1) . PHP_EOL, 8); return; }2、Middleware 中间件 不做过多阐明 全局中间件、两头组、路由中间件 依据理论场景正当利用 ...

November 2, 2021 · 2 min · jiezi

关于laravel:Laravel底层学习笔记03-make和build

参考资料:php:laravel底层外围代码剖析之make办法的实现Laravel加载过程---make办法 实例化Illuminate\Contracts\Http\Kernelmake办法/public/index.php$app = require_once __DIR__.'/../bootstrap/app.php';$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);$app->make() => 父类Application中的make() => resolve()办法resolve办法vendor/laravel/framework/src/Illuminate/Container/Container.php/** * 第一次调用 * $abstract Illuminate\Contracts\Http\Kernel::class * $concrete 匿名函数 * * 第二次调用 * $abstract 'App\Http\Kernel' * $concrete 'App\Http\Kernel' (getConcrete办法返回) * 执行build()办法获取App\Http\Kernel的实例化对象,返回给getClosure() */protected function resolve($abstract, $parameters = [], $raiseEvents = true){ ... //依据$abstract从bindings数组中获取$concrete匿名函数 $concrete = $this->getConcrete($abstract); //判断$concrete和$abstract是否雷同,或者$concrete是一个匿名函数 if ($this->isBuildable($concrete, $abstract)) { //实例化$concrete的类 $object = $this->build($concrete); } else { //递归执行make $object = $this->make($concrete); } ... } getClosure()办法递归调用/** * 第一次调用 * $abstract 'Illuminate\Contracts\Http\Kernel' * $concrete 'App\Http\Kernel' * * 第二次调用 * 获取App\Http\Kernel的实例,向上返回给build()办法 */protected function getClosure($abstract, $concrete){ return function ($container, $parameters = []) use ($abstract, $concrete) { if ($abstract == $concrete) { return $container->build($concrete); } return $container->resolve($concrete, $parameters, $raiseEvents = false); };}build办法vendor/laravel/framework/src/Illuminate/Container/Container.php/** * 第一次调用 * $concrete 匿名函数 * * 第二次调用 * $concrete 'App\Http\Kernel' * 执行反射,获取App\Http\Kernel类的实例化对象 * 返回给resolve()办法 */public function build($concrete){ if ($concrete instanceof Closure) { //bind()办法中$concrete = $this->getClosure($abstract, $concrete); return $concrete($this, $this->getLastParameterOverride()); } $reflector = new ReflectionClass($concrete); if (! $reflector->isInstantiable()) { return $this->notInstantiable($concrete); } $this->buildStack[] = $concrete; $constructor = $reflector->getConstructor(); if (is_null($constructor)) { array_pop($this->buildStack); return new $concrete; } $dependencies = $constructor->getParameters(); $instances = $this->resolveDependencies( $dependencies ); array_pop($this->buildStack); return $reflector->newInstanceArgs($instances);}

October 31, 2021 · 1 min · jiezi

关于laravel:Laravel底层学习笔记02-服务容器服务提供者

学习材料:laravel底层外围代码剖析外围概念Laravel (5.5.33) 加载过程---instance办法 服务容器和服务提供者服务容器 ServiceContainnerServiceContainner通过依赖注入将ServiceProvider提供的能力注册进服务容器外部。 Laravel间接通过容器的实例化对象,找到对应的服务,就能够间接应用其提供的能力了。 ServiceContainner就是一个类的实例化对象,启动时加载所有可用服务,用的时候再解析调用其中的办法。 服务提供者 ServiceProvider有能力提供服务的服务提供者//Laravel 的服务提供者 config/app.php'providers' => [ /* * Laravel Framework Service Providers... */ //框架自带 Service Provider /* * Package Service Providers... */ //须要引入的 Service Provider]Laravel源码解析服务容器 $app/bootstrap/app.php$app = new Illuminate\Foundation\Application( realpath(__DIR__.'/../'));$app服务容器,就是Application类的实例化对象。src/Illuminate/Foundation/Application.phppublic function __construct($basePath = null){ if ($basePath) { $this->setBasePath($basePath);//设置根底门路 } $this->registerBaseBindings();//注册根底绑定 $this->registerBaseServiceProviders();//注册根底服务提供者 $this->registerCoreContainerAliases();//注册外围服务容器别名}注册根底绑定src/Illuminate/Foundation/Application.phpprotected function registerBaseBindings(){ static::setInstance($this);//实例化本人 $this->instance('app', $this);//将app注册到instances数组中 $this->instance(Container::class, $this);//将Container注册到instances数组中 $this->singleton(Mix::class); $this->singleton(PackageManifest::class, function () { return new PackageManifest( new Filesystem, $this->basePath(), $this->getCachedPackagesPath() ); });}instance函数vendor/laravel/framework/src/Illuminate/Container/Container.php/** * $abstract 'app' $instance Application * $abstract Container::class $instance Application */public function instance($abstract, $instance){ $this->removeAbstractAlias($abstract); //删除形象别名 $isBound = $this->bound($abstract);//判断是否实例化 unset($this->aliases[$abstract]); //删除别名 //将实例退出instances数组 $this->instances[$abstract] = $instance; //如果之前存在实例化 则运行 if ($isBound) { $this->rebound($abstract); } return $instance;}register函数src/Illuminate/Foundation/Application.phpprotected function registerBaseServiceProviders(){ $this->register(new EventServiceProvider($this)); $this->register(new LogServiceProvider($this)); $this->register(new RoutingServiceProvider($this));}public function register($provider, $options = [], $force = false){ if (($registered = $this->getProvider($provider)) && ! $force) { return $registered; } if (is_string($provider)) { $provider = $this->resolveProvider($provider); } if (method_exists($provider, 'register')) { $provider->register();//调用ServiceProvider实例的register办法 } //标记为已注册 $this->markAsRegistered($provider); //判断App是否已启动,已创立则调用$provider的启动(boot)办法 if ($this->booted) { $this->bootProvider($provider); } return $provider;}EventServiceProvider中的register函数 ...

October 31, 2021 · 2 min · jiezi

关于laravel:Laravel58底层学习笔记01-控制反转和依赖注入

参考资料:laravel底层外围代码剖析之外围概念解说PHP管制反转(IOC)和依赖注入(DI) 1 - Laravel框架外围长处集成了composer实现了依赖注入,更好的治理类的依赖关系,不便扩大(绝对于MVC模式)高级个性:控制台console,事件event,队列queue,中间件middleware,门面模式facades外围概念:服务容器 serviceProvider毛病及优化毛病加载文件太多,拜访速度慢优化缓存配置文件去掉不必要的加载文件(次要是serviceProvider)开启Opcache框架启动流程(生命周期)援用主动加载文件生成服务容器 1) 注册根底的bingings 2) 通过bind注册服务容器,事件,路由,日志服务 3) 通过bind绑定接口获取Request对象逻辑解决 1) 解析启动项(根底服务)如路由,异样解决,门面,服务容器 2) 通过管道模式,用中间件过滤用户申请,解决业务逻辑返回Response对象知识点单例模式,观察者模式,管道模式依赖注入,匿名函数,反射预约义接口ArrayAccess2 - 管制反转和依赖注入管制反转 IOC(inversion of control)将组件间的依赖关系从程序外部提到内部来治理解释:不在A类中间接新建B类实例,而是通过IOC容器将B类的实例传给A 依赖注入 DI(dependency injection)将组件的依赖通过内部以参数或其余模式注入示例: class DbMysql{ public function query(){}}class IOC{ public $db; public function __construct($dbMysql) { $this->db = $dbMysql; } public function action() { $this->db->query(); }}$db = new DbMysql();$c = new IOC($db);$c->action();IOC类中不须要实例化DbMysql,而是将DbMysql的实例作为参数传入,仅调用DbMysql的办法。这种模式就是依赖注入。 将B类的实例化动作提出到IOC类的里面,就叫做管制反转。 PHP的反射机制在PHP运行时,扩大分析程序,导出或提出对于类,办法,属性,参数的详细信息,这种动静获取和调用信息的性能称为反射API。class A { public function __construct(B $b) { }}class B {}//获取类的反射信息(所有信息)$reflector = new ReflectionClass('A');//获取构造函数$constructor = $reflector->getConstructor();//获取结构函数参数$dependencies = $constructor->getParameters();//获取依赖的类名foreach ($dependencies as $dependency){ if(!is_null($dependency->getClass())){ $classname = $dependency->getClass()->name; $p[] = new $classname(); }}//从给出的参数创立一个新的类实例$a = $reflector->newInstanceArgs($p);如果B类也有依赖的类,则须要通过递归创立 ...

October 30, 2021 · 1 min · jiezi

关于laravel:Laravel8学习笔记01-目录结构

根目录目录二级目录简介作用/app 利用目录利用的外围代码/bootstrap 启动目录 app.php 框架的启动和主动载入配置 ./cache路由和服务缓存框架为晋升性能所生成的文件/config 配置目录 /database 数据库目录数据库迁徙文件及填充文件/public 对外公开目录利用入口文件和前端资源文件 index.php利用入口文件 /resources 资源目录利用视图文件和未编译的原生前端资源文件/routes 路由目录 web.phpweb 中间件组反对 Session、CSRF 爱护以及 Cookie 加密性能 api.phpapi 中间件组反对频率限度性能 console.php控制台命令用于定义所有基于闭包的控制台命令 channels.php 用于注册利用反对的所有事件播送频道/storage 文件存储目录Blade 、 Session、文件缓存,框架生成的文件 ./app 利用生成的文件 ./public用于存储用户生成的文件 ./framework 框架生成的文件和缓存 ./logs 利用的日志文件/tests 测试目录能够通过 phpunit命令运行测试/vendor 依赖目录蕴含了利用所有通过 Composer 加载的依赖备注1.控制台路由 /routes/console.php Artisan::command('inspire', function () { $this->comment(Inspiring::quote());})->purpose('Display an inspiring quote');php artisan inspire利用目录 /app目录简介作用/Broadcasting播送频道类事件播送。make:channel/Console工作脚本注册Artisan命令,定义调度工作。make:command/Events事件寄存事件类。event:generate 和 make:event/Exceptions异样解决蕴含利用的异样处理器/HttpWeb利用蕴含了控制器、中间件以及表单申请等/Jobs队列工作寄存队列工作。make:job/Listeners事件监听事件监听器。event:generate 和 make:listener/Mail邮件邮件相干类。make:mail/ModelsEloquent模型Eloquent模型类。make:model/Notifications告诉发送告诉。make:notification/Policies受权受权策略。make:policy/Providers服务提供者在利用启动过程中绑定服务到容器、注册事件以及执行其余工作。/Rules验证规定在单个对象中封装简单的验证逻辑。make:rule备注PSR-4主动载入规范 https://learnku.com/docs/psr/...1. 此处的“类”泛指所有的class类、接口、traits可复用代码块以及其它相似构造。2. 一个残缺的类名需具备以下构造: \<命名空间>(\<子命名空间>)*\<类名>残缺的类名必须要有一个顶级命名空间,被称为 "vendor namespace";残缺的类名能够有一个或多个子命名空间;残缺的类名必须有一个最终的类名;残缺的类名中任意一部分中的下滑线都是没有非凡含意的;残缺的类名能够由任意大小写字母组成;所有类名都必须是大小写敏感的。当依据残缺的类名载入相应的文件……残缺的类名中,去掉最后面的命名空间分隔符,后面间断的一个或多个命名空间和子命名空间,作为“命名空间前缀”,其必须与至多一个“根目录”绝对应;紧接命名空间前缀后的子命名空间必须与相应的”文件基目录“相匹配,其中的命名空间分隔符将作为目录分隔符开端的类名必须与对应的以 .php 为后缀的文件同名。主动加载器(autoloader)的实现肯定不能抛出异样、肯定不能触发任一级别的错误信息以及不应该有返回值。3. 范例| 残缺类名 | 命名空间前缀 | 文件基目录 | 文件门路 | | :--------------------------- | :-------------- | :--------------------- | :---------------------------------------- | | \Acme\Log\Writer\File_Writer | Acme\Log\Writer | ./acme-log-writer/lib/ | ./acme-log-writer/lib/File_Writer.php | | \Aura\Web\Response\Status | Aura\Web | /path/to/aura-web/src/ | /path/to/aura-web/src/Response/Status.php | | \Symfony\Core\Request | Symfony\Core | ./vendor/Symfony/Core/ | ./vendor/Symfony/Core/Request.php | | \Zend\Acl | Zend | /usr/includes/Zend/ | /usr/includes/Zend/Acl.php | ...

October 28, 2021 · 1 min · jiezi

关于laravel:Laravel8自定义json日志记录HTTP请求

1.自定义日志通道vim config/logging.php'request' => [ 'driver' => 'daily',//按日期分隔日志 'path' => storage_path('logs/request.log'), 'tap' => [App\Logging\CustomizeFormatter::class], 'days' => 14,],2.自定义json解析新建CustomizeFormatter<?phpnamespace App\Logging;class CustomizeFormatter{ /** * 自定义给定的日志实例。 * * @param \Illuminate\Log\Logger $logger * @return void */ public function __invoke($logger) { foreach ($logger->getHandlers() as $handler) { $handler->setFormatter(new CustomizeJsonFormatter()); } }}新建CustomizeJsonFormatter<?phpnamespace App\Logging;use Monolog\Formatter\JsonFormatter;class CustomizeJsonFormatter extends JsonFormatter{ /** * 格式化 * * @param array $record * @return string */ public function format(array $record): string { $newRecord = [ 'datetime' => $record['datetime']->format('Y-m-d H:i:s'), 'message' => $record['message'], ]; if (!empty($record['context'])) { $newRecord = array_merge($newRecord, $record['context']); } $json = $this->toJson($this->normalize($newRecord), true) . ($this->appendNewline ? "\n" : ''); return $json; }}3.记录HTTP申请创立中间件php artisan make:middleware RequestLogMiddleware配置全局拜访 vim app/Http/Kernel.phpprotected $middleware = [ ... \App\Http\Middleware\RequestLogMiddleware::class,];记录HTTP申请$requestLog = [ 'ip' => $request->ips(), 'method' => $request->method(), 'status_code' => $response->getStatusCode(), 'headers' => $request->header(), 'url' => $request->url(), 'query' => $request->query(), 'params' => $request->all(), 'response' => $response->getData(),];4.输入日志\Log::channel('request')->info('REQUEST LOG', $requestLog);

October 22, 2021 · 1 min · jiezi

关于laravel:Laravel-Octane-安装-RoadRunner

在上一篇咱们实现了 Swoole 在 Laravel 中的装置和应用,这一篇将解说 RoadRunner 的装置和应用。 装置 RoadRunner 和装置 Swoole 相似,惟一了区别是 RoadRunner 无需装置 php 的扩大。 环境要求PHP 8.0+Larave 8.35+Swoole 和 RoadRunner 必须在 unix 零碎下装置(macOS, linux, window(WSL2))RoadRunner:请先确保 curl,zip sockets 等 php 扩大曾经装置虚拟机IP: 192.168.2.11Step1. 装置 octane 包composer require laravel/octaneStep2. 配置 nginx 代理map $http_upgrade $connection_upgrade { default upgrade; '' close;}server { listen 8009; # 浏览器端拜访的端口 #listen [::]:80; server_name 127.0.0.1; server_tokens off; root /var/www/html/octane/public; index index.php; charset utf-8; location /index.php { try_files /not_exists @octane; } location / { try_files $uri $uri/ @octane; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } access_log /var/log/nginx/octane-access.log main; error_log /var/log/nginx/octane-error.log error; error_page 404 /index.php; location @octane { set $suffix ""; if ($uri = /index.php) { set $suffix ?$query_string; } proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header Scheme $scheme; proxy_set_header SERVER_PORT $server_port; proxy_set_header REMOTE_ADDR $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_pass http://127.0.0.1:8010$suffix; # 代理申请 }}proxy_pass 示意 http://127.0.0.1:8010 代理转发来自 http://192.168.2.110:8009 的申请 ...

September 13, 2021 · 3 min · jiezi

关于laravel:Laravel-Octane-安装-Swoole

larave octane 是什么octane 是 laravel 官网提供的第三方包,它能够通过集成 Swoole 和 RoadRunner 这两种高性能的应用服务器来进步应用程序的性能。 RoadRunner 自身是一个用 Go 语言编写的开源 PHP 应用程序服务器。 Swoole 是一个应用 C++ 语言编写的基于异步事件驱动和协程的并行网络通信引擎,为 PHP 提供协程、高性能网络编程反对。 与 Apache 或 Nginx 和 PHP-FPM 十分类似,HTTP 申请能够发送到 RoadRunner 或 Swoole 以执行 PHP 代码,而后将响应发送回。 RoadRunner 或 Swoole 的不同之处在于它能够将 PHP 运行中的应用程序保留在内存中,以便在应用程序启动后取得更快的速度。 对于 Laravel 来说,这是相当有帮忙的。 环境要求PHP 8.0+Larave 8.35+Swoole 和 RoadRunner 必须在 unix 零碎下装置(macOS, linux, window(WSL2))RoadRunner:请先确保 curl,zip sockets 等 php 扩大曾经装置本地虚拟机,IP: 192.168.2.11装置历程依照 Laravel 的官网文档来装置 Swoole 和 RoadRunner 第三方包是一件十分苦楚的事,因为装置的过程中常常会遇到乌七八糟的问题。为了缩小大家走的弯路,所以我有必要在这里着重强调几个问题。 肯定要在 unix 零碎下装置,unix 零碎包含 macOS linux 和 windows的linux子系统为了可能在本地可能拜访虚拟机,请先敞开 linux 防火墙Step1. 装置 octane 包composer require laravel/octane假如你曾经有了新的 laravel 我的项目。进入我的项目根目录下执行以上命令。 ...

September 13, 2021 · 5 min · jiezi

关于laravel:使用-Laradock-安装-ElasticSearch

应用 Laradock 装置 ElasticSearchElasticSearch 可视化工具 ElasticHQ / 官网地址装置和应用应用 docker-compose up 命令运行 ElasticSearch 容器docker-compose up -d elasticsearch关上浏览器并通过端口 9200 拜访本地主机 http://localhost:9200默认用户是 user ,默认明码是 changeme如果是在 laradock 中应用时curl http://elasticsearch:9200装置 ElasticSearch 插件# 装置一个 ElasticSearch 插件docker-compose exec elasticsearch /usr/share/elasticsearch/bin/elasticsearch-plugin install {plugin-name}# 重启容器docker-compose restart elasticsearch装置 elasticsearch-analysis-ik 中文分词插件比方,此时须要装置 elasticsearch-analysis-ik 中文分词插件,须要下载 ik 的 releases 源码 zip 包 # 形式1,你能够间接在 elasticsearch 容器外,执行以下命令docker-compose exec elasticsearch /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.1/elasticsearch-analysis-ik-7.9.1.zip# 形式2,你能够间接进入到 elasticsearch 容器内,而后执行以下命令./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.1/elasticsearch-analysis-ik-7.9.1.zip须要留神的是:如果你的 elasticsearch 的版本是 7.9.1 那么,你装置的 ik 插件也必须是 7.9.1 的版本,elasticsearch 的版本号能够通过拜访 http://localhost:9200/ 查看 version.number 字段查看,而后 docker-compose restart elasticsearch 重启 elasticsearch 容器即可 ...

August 26, 2021 · 4 min · jiezi

关于laravel:Laravel-7x-自定义验证-自定义验证信息

需要:实现按字符串字数进行长度限度。相似max的性能,然而因为自带max 规定是依照字符计算长度,对中文计算存在偏差。咱们须要应用mb_strlen来计算中文字数。 在request 中批改 rules办法即可(应用 Validator::extend() 办法)。 参数1:规定名参数2:回调办法参数3:验证信息Validator::extend('mb_max', function ($attribute, $value, $parameters, $validator), $message);public function rules() { $mbMaxSize = 40;//字数限度 \Validator::extend('mb_max', function ($attribute, $value, $parameters, $validator) { \Log::info('$parameters', [$value, $parameters[0], mb_strlen($value)]); return (mb_strlen($value) <= intval($parameters[0])); }, ':attribute 不能超过' . $mbMaxSize . '个字'); return [ 'name' => 'required|min:1|mb_max:' . $mbMaxSize, 'department' => 'required', 'detail' => 'required|max:3000', ]; }

August 6, 2021 · 1 min · jiezi

关于laravel:OctaneSwoole提升程度测试

测试Octane+Swoole晋升水平 硬件:虚拟机VirtualBox, 1核2G, CPU为i5-8400;零碎: Centos7 + 宝塔;php环境: 启用opcache, session启用memcached缓存,文件缓存启用redis; 部署我的项目及引入octane composer create-project laravel/laravel octance.swcd ./octance.sw## 引入octanecomposer require laravel/octane## 装置octanephp artisan octane:install装置这一步应用RoadRunner出了很多问题,最初跑起来也没能失常拜访,遂放弃应用RR; 应用swoole倒是非常简单,宝塔面板中装好swoole扩大,octane:install时选swoole间接实现。 对laravel进行一般的生产环境优化; composer install --no-dev## 设置配置文件,关掉debugvi .envAPP_ENV=productionAPP_DEBUG=false## :wq保留## 执行优化composer dump-autoload -ophp artisan optimize到中件间文件app/Http/Kernel.php中正文掉api下的throttle中间件,免得ab压测时报429的谬误 测试以下内容:在控制器中返回一个0-100的随机数,控制器代码如下 function random(){ $i = mt_rand(0, 100); return response()->json([ 'code' => 0, 'msg' => 'random: ' . str_pad($i, 3, '0', STR_PAD_LEFT) ]);}1, 压测php-fpm配置Nginx转发到php-fpm;而后进行ab压测,一次压测后果如下: .\ab -n2000 -c8 http://octane.sw/api/randomThis is ApacheBench, Version 2.3 <$Revision: 1879490 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking octane.sw (be patient)Completed 200 requestsCompleted 400 requestsCompleted 600 requestsCompleted 800 requestsCompleted 1000 requestsCompleted 1200 requestsCompleted 1400 requestsCompleted 1600 requestsCompleted 1800 requestsCompleted 2000 requestsFinished 2000 requestsServer Software: nginxServer Hostname: octane.swServer Port: 80Document Path: /api/randomDocument Length: 30 bytesConcurrency Level: 8Time taken for tests: 17.194 secondsComplete requests: 2000Failed requests: 0Total transferred: 512000 bytesHTML transferred: 60000 bytesRequests per second: 116.32 [#/sec] (mean)Time per request: 68.777 [ms] (mean)Time per request: 8.597 [ms] (mean, across all concurrent requests)Transfer rate: 29.08 [Kbytes/sec] receivedConnection Times (ms) min mean[+/-sd] median maxConnect: 0 0 0.4 0 5Processing: 7 68 68.2 53 641Waiting: 7 68 68.2 53 641Total: 7 69 68.2 53 641Percentage of the requests served within a certain time (ms) 50% 53 66% 59 75% 61 80% 64 90% 95 95% 243 98% 303 99% 346 100% 641 (longest request)测试后果可见,一般优化下,php8的php-fpm能提供110+的QPS; ...

August 3, 2021 · 2 min · jiezi

关于laravel:laravel速查手册

罕用语句助手函数门路\vendor\laravel\framework\src\Illuminate\Support\helpers.phpconfig('app.cdn_domain') 读取配置env('CDN_DOMAIN') 只在配置文件应用的读取$path = app_path(); 返回app门路C:\www\laravel\app,$path = base_path(); 我的项目根目录,C:\www\laravel$path = config_path();配置门路C:\www\laravel\config$path = public_path(); 返回public门路C:\www\laravel\public,门路函数都反对生成文件门路$path = resource_path('assets/sass/app.scss'); 资源门路;C:\www\laravel\resources\assets/sass/app.scss$path = storage_path('app/file.txt');文件存储门路C:\www\laravel\storage\app/file.txt__("lang.test") //本地化,lang是文件,配置'locale' => 'zh-CN' trans("lang.test")只翻译键e('<html>foo</html>') 输入源代码 str_contains('This is my name', 'my'); 是否蕴含某个值str_limit('我是中国人', 3, '...') 截取字符串 中文3个一个汉字str_random(40) 随机字符串asset('img/photo.jpg') 生成残缺蕴含http/https门路 secure_asset()只生成httpsurl('user/profile', ['id'=>1])http://laravel.api.shanliwawa.top/user/profile/1 secure_url只生成httpsurl()->full() 以后残缺域名$cookie = cookie('name', 'value', $minutes);{{ csrf_field() }} 生成令牌 $token = csrf_token(); 获取令牌encrypt() decrypt() 加密解密dump()打印变量 dd() 打印后进行info('Some helpful information!'); 写入日志logger('Debug message'); 谬误写入日志redirect('/home'); 跳转$value = session('key'); session(['chairs' => 7, 'instruments' => 3]); 获取设置sessionuse Illuminate\Support\Facades\Hash;Hash::make($request->newPassword) 加密明码助手加密解密函数,反对字符串数组对象encrypt() decrypt()use Illuminate\Support\Facades\Crypt;无序列化加密$encrypted = Crypt::encryptString('Hello world.');$decrypted = Crypt::decryptString($encrypted);Crypt::encrypt() 反对字符串数组对象Crypt::decrypt()use Illuminate\Http\Request 是申请对象数据处理$request->input('title'); 获取输出$site = $request->input('site', 'Laravel学院'); 申请为空取后边值$request->input('books.0.author') 数组获取单值$request->json(); 返回JSON数据格式$request->all(); 全副$request->except('id');排除$request->only(['name', 'site', 'domain']); 只获取这些字段 $request->has('id') 判断id字段是否存在数据库操作use Illuminate\Support\Facades\DB;DB::select("select * from users where name=?",['admin']); //也反对name=:name,[':name'=>'admin']绑定,返回objDB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);$affected = DB::update('update users set votes = 100 where name = ?', ['John']); 返回影响行数$deleted = DB::delete('delete from users');返回影响行数DB::statement('drop table users'); 其余无返回语句DB::transaction(function () { 事务 DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete();});$list = DB::table("users")->get()->toArray();//获取全副转换成数组DB::table("users")->first() 获取一行DB::table("users")->value('email'); 获取一个字段DB::table("users")->pluck('email')->toArray(); 获取一列,如果设置两个pluck('name','id') id是键name是值的键值数组count() 后果集数量 max('price')最大值 min('price')最小值 avg('price')平均数 sum('price')求和DB::table('users')->select('name', 'email as user_email')->get(); 返回特定字段whereRaw('price > IF(state = "TX", ?, 100)', [200]) 原生whereorderBy('name', 'desc') inRandomOrder()随机排序join('contacts', 'users.id', '=', 'contacts.user_id') 内连贯leftJoin('posts', 'users.id', '=', 'posts.user_id') 左连贯groupBy('account_id') 分组 groupBy('first_name', 'status')having('account_id', '>', 100) 刷选take(5) 返回5条->offset(10) ->limit(5) 限度insert( ['email' => 'john@example.com', 'votes' => 0]); 插入 反对多条数据$id=DB::table("users")-> insertGetId( ['email' => 'john@example.com', 'votes' => 0]); 插入后返回idupdate(['votes' => 1]); 更新increment('votes', 5);decrement('votes', 5);自增自减increment('votes', 1, ['name' => 'John']); 反对其余字段更新DB::table('users')->truncate(); 清空表DB::table('users')->where('votes', '>', 100)->delete(); 删除 $users = DB::table('users')->paginate(15); 分页$users = DB::table('users')->simplePaginate(15); 简略分页只有上一页下一页$results->total() 总页数<div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach</div>{{ $users->links() }}

July 24, 2021 · 2 min · jiezi

关于laravel:laravel-自定义命令生成-servicerepository层

简介在应用 laravel 的时候,被 laravel 弱小所震撼,在开发 laravel 我的项目的是常常会用到 artisan 命令,真的怎么用怎么丝滑,特地是创立 Controller 或者 Model 的时候,切实太不便了,然而在公司中,常常会遇到的问题就是,我的项目会形象出 Service、 Repository 层等等,有没有方法能够像 artisan 命令一样丝滑的创立呢?于是就开发了该 Composer 扩大包。 装置composer require sockstack/laragen --dev应用# 创立 servicephp artisan make:service {name}# 创立 repositoryphp artisan make:repository {name}案例一php artisan make:repository UserRepository在 app/Repositories 目录下生成 UserRepository.php 的文件,内容如下: <?phpnamespace App\Repositories;class UserRepository{ public function __construct() { parent::__construct(); }}案例二php artisan make:repository User/UserRepository在 app/Repositories/User 目录下生成 UserRepository.php 的文件,内容如下: <?phpnamespace App\Repositorys\User;class UserRepository{ public function __construct() { parent::__construct(); }}案例三php artisan make:service UserService在 app/Services 目录下生成 UserService.php 的文件,内容如下: ...

June 26, 2021 · 1 min · jiezi

关于laravel:Laravel-框架使用心得记录

此文记录我在应用 Laravel 过程中遇到的问题与心得:版本 Laravel 8 Eloquent & Model模型属性默认值不能用 date() 函数:

June 17, 2021 · 1 min · jiezi

关于laravel:laravel-邮件告警发送邮件

第一步批改配置文件: MAIL_DRIVER=smtpMAIL_HOST=smtp.exmail.qq.comMAIL_PORT=465MAIL_USERNAME=邮箱地址MAIL_PASSWORD=邮箱受权码MAIL_ENCRYPTION=sslMAIL_FROM_ADDRESS=邮箱地址MAIL_FROM_NAME=邮箱名称(本人定义)这里应用的是腾讯企业邮箱的smtp驱动,可依据理论状况来更改第二步生成邮件类,所有的邮寄类配置都在 build 办法中实现,能够调用from,subject, view, 和 attach 来配置邮件的内容和发送 php artisan make:mail AlarmsMail第三步,编辑邮件类 <?phpnamespace App\Mail;use Illuminate\Bus\Queueable;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Mail\Mailable;use Illuminate\Queue\SerializesModels;class AlarmsMail extends Mailable implements ShouldQueue{ use Queueable, SerializesModels; private $err; /** * Create a new message instance. * * @return void */ public function __construct($e) { $data = [ 'msg' => $e->getMessage(), 'code' => $e->getCode(), 'file' => $e->getFile(), 'line' => $e->getLine(), ]; $this->err = $data; $this->subject = "XXXX告警"; } /** * Build the message. * * @return $this */ public function build() { return $this->view('mail.alarms', $this->err); }}第四步,创立视图 ...

June 11, 2021 · 1 min · jiezi

关于laravel:Laravel-Octane-初体验

Laravel Octane 曾经公布好几周了,虽说目前还处于 beta 状态,也挡不住开发者对他的酷爱,一个月不到,其在 GitHub 的 star 数量已超过 2K;局部开发者已将他们的我的项目运行在 Laravel Octane 之上。 如果你还在张望,也可等等一两周后的稳定版(原文公布于 2021-04-29,目前(05-27)已 releases)。 We will likely go ahead and tag Octane 1.0 as stable next week Taylor Otwell on Twitter.为了体验一把减速的魔力,作者已拿一个简略的 H5 我的项目在生产环境下试了试水,除了一些乌七八糟的问题,其余的都令作者激动不已,客户还示意咱们的平台好快啊,下次还找你。 Laravel Octane 的组成Laravel Octane 内置了两个高性能的应用服务:Swoole 和 RoadRunner,正如官网文档介绍的: Octane boots your application once, keeps it in memory, and then feeds it requests at supersonic speeds.咱们晓得,Laravel 框架始终很优良,然而他在性能方面却始终为人诟病。框架的 boot 工夫可能比业务解决工夫还长,并且随着我的项目第三方 service provider 的增多,其启动速度越来越不受控。而 Laravel Octane 则通过启动 Application 一次,常驻内存的形式来减速咱们的利用。 ...

May 27, 2021 · 5 min · jiezi

关于laravel:丰富-Eloquent-ORM-的-where-查询条件的解析场景

个人感觉 Eloquent ORM 的 where 条件解析场景并不是那么的丰盛,很多条件的拼装都须要引入额定的 orWhere, whereNotIn, whereBetween, whereNotBetween 来辅助实现。这样在做一些形象的底层查询方法时,不是很敌对,下层传递的查问条件是不确定的,如果能灵便的解析各种混合式的查问条件(用数组的形式形容),应用起来会更高效灵便些。 /** * 渲染简单的 where 查问条件 * @param Builder $query * @param $conditions */public static function renderWhereMixedEloquent(Builder $query, $conditions){ $lastEl = end($conditions); reset($conditions); if (is_string($lastEl) && (('or' == $lastEl || 'and' == $lastEl))) { $logic = $lastEl; array_pop($conditions); } else { $logic = 'and'; } $conditionsKeys = array_keys($conditions); $conditionsKeyFirst = $conditionsKeys[0]; if (is_numeric($conditionsKeyFirst)) { if (is_array($conditions[$conditionsKeyFirst])) { if ('or' == $logic) { $query->where(function (Builder $query) use ($conditions) { foreach ($conditions as $conditionsSub) { $query->orWhere(function (Builder $query) use ($conditionsSub) { static::renderWhere($query, $conditionsSub); }); } }); } else { $query->where(function (Builder $query) use ($conditions) { foreach ($conditions as $conditionsSub) { $query->where(function (Builder $query) use ($conditionsSub) { static::renderWhere($query, $conditionsSub); }); } }); } } else { $operator = $conditions[1]; switch ($operator) { case 'in': $query->whereIn($conditions[0], $conditions[2], $logic); break; case 'between': $query->whereBetween($conditions[0], $conditions[2], $logic); break; case 'not in': $query->whereIn($conditions[0], $conditions[2], $logic, true); break; case 'not between': $query->whereBetween($conditions[0], $conditions[2], $logic, true); break; default: $query->where(...$conditions); } } } else { $query->where(function (Builder $query) use ($logic, $conditions) { if ('and' == $logic) { foreach ($conditions as $col => $val) { $query->where([$col => $val]); } } else { foreach ($conditions as $col => $val) { $query->orWhere([$col => $val]); } } }); }}应用示例简略的and条件 ...

May 26, 2021 · 2 min · jiezi

关于laravel:dcatadmin-大文件上传前端直传解决

昨天遇到了一个后端传输导致nginx502的问题 明天在调整了代码之后,遂将解决方案贴出前端直传的益处:加重应用服务器的压力,将压力分给了oss 这一点特地是在上传大文件时特地显著的,php是要耗费很大一部分内存去解决前端分片上传来的文件再传输给oss,如果文件特地大,耗时长nginx会间接502 咱们没必要去调整nginx的超时工夫把路走窄了。间接由客户端直传oss吧。实现后效果图 因为dcat-admin是高度封装的。改它的组件根本不事实,不过$form->view()办法能够引入一个视图文件.我的想法是用vue封装一个上传的组件,而后通过该办法引入。正好laravel提供了前端脚手架laravel mix 整合了vue。laravel版本7.x#### 开始一套梭 composer require laravel/ui --dev //装置前端脚手架php artisan ui vue //公布vue文件npm installnpm install ali-oss --save //装置oss js-sdknpm install clipboard --save //装置复制插件npm run watch //命令监督热加载、编译应用element-ui的组件,所以咱们引入它npm i element-ui -S在app.js文件全局加载 import ElementUI from 'element-ui';import 'element-ui/lib/theme-chalk/index.css';Vue.use(ElementUI);import Clipboard from 'clipboard';Vue.prototype.Clipboard=Clipboard;并新建组件OssFile<template> <div> <el-upload class="upload-demo" action="" ref="upload" :file-list="fileList" :limit="2" :on-change="handleChange" :on-remove="handleRemove" :auto-upload="false" accept="" > <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <el-button style="margin-left: 10px;" size="small" type="success" @click="submitForm">直传oss</el-button> <el-button style="margin-left: 10px;" size="small" type="success" @click="resumeUpload">持续</el-button> <el-button style="margin-left: 10px;" size="small" type="success" @click="stopUplosd">暂停</el-button> <el-button style="margin-left: 10px;" size="small" type="success" @click="abortMultipartUpload">革除切片</el-button> </el-upload> <el-progress :percentage="percentage" :status="uploadStatus"></el-progress> <span class="copybtn" @click="copy" :data-clipboard-text="fileName" >{{ fileName }}</span> </div></template><script>import Clipboard from 'clipboard';let OSS = require('ali-oss') // 引入ali-oss插件const client = new OSS({ region: 'oss-cn-shenzhen',//依据那你的Bucket地点来填写 accessKeyId: '',//本人账户的accessKeyId accessKeySecret: '',//本人账户的accessKeySecret bucket: '',//bucket名字});export default { name: "OssFile", data () { return { fileName:"", fileList:[], file: null, tempCheckpoint: null, // 用来缓存以后切片内容 uploadId: '', uploadStatus: null, // 进度条上传状态 percentage: 0, // 进度条百分比 uploadName: '', //Object所在Bucket的残缺门路 } }, mounted() { window.addEventListener('online', this.resumeUpload); }, methods: { copy() { var clipboard = new Clipboard(".copybtn"); clipboard.on("success", (e) => { this.$message({ message: '复制胜利', type: 'success' }); // 开释内存 clipboard.destroy(); }); clipboard.on("error", (e) => { // 不反对复制 this.$message({ message: '该浏览器不反对主动复制', type: 'success' }); // 开释内存 clipboard.destroy(); }); }, // 点击上传至服务器 submitForm(file) { this.multipartUpload(); }, // 勾销分片上传事件 async abortMultipartUpload() { window.removeEventListener('online', this.resumeUpload) const name = this.uploadName; // Object所在Bucket的残缺门路。 const uploadId = this.upload; // 分片上传uploadId。 const result = await client.abortMultipartUpload(name, uploadId); console.log(result, '=======革除切片===='); }, // 暂停分片上传。 stopUplosd () { window.removeEventListener('online', this.resumeUpload) // 暂停时革除工夫监听 let result = client.cancel(); console.log( result, '---------暂停上传-----------') }, // 切片上传 async multipartUpload () { if (!this.file) { this.$message.error('请抉择文件') return } console.log("this.uploadStatus",this.file, this.uploadStatus); console.log("文件列表:"+this.fileList) console.log("文件:"+this.file) this.percentage = 0 try { //object-name能够自定义为文件名(例如file.txt)或目录(例如abc/test/file.txt)的模式,实现将文件上传至以后Bucket或Bucket下的指定目录。 let result = await client.multipartUpload(this.file.name, this.file, { headers: { 'Content-Disposition': 'inline', 'Content-Type': this.file.type //留神:依据图片或者文件的后缀来设置,我试验用的‘.png’的图片,具体为什么下文解释 }, progress: (p, checkpoint) => { this.tempCheckpoint = checkpoint; this.upload = checkpoint.uploadId this.uploadName = checkpoint.name this.percentage = p * 100 // console.log(p, checkpoint, this.percentage, '---------uploadId-----------') // 断点记录点。浏览器重启后无奈间接持续上传,您须要手动触发上传操作。 }, meta: { year: 2020, people: 'dev' }, mime: this.file.type }); console.log(result, this.percentage, 'result= 切片上传完毕='); this.$nextTick(()=>{ this.fileName = 'https://image.mythinkcar.cn/'+result.name }) console.log(this.fileName) } catch (e) { console.log(e) window.addEventListener('online', this.resumeUpload) // 该监听放在断网的异样解决 // 捕捉超时异样。 if (e.code === 'ConnectionTimeoutError') { // 申请超时异样解决 this.uploadStatus = 'exception' console.log("TimeoutError"); } } }, // 复原上传。 async resumeUpload () { window.removeEventListener('online', this.resumeUpload) if (!this.tempCheckpoint) { this.$message.error('请先上传') return } this.uploadStatus = null try { let result = await client.multipartUpload(this.file.name, this.file, { headers: { 'Content-Disposition': 'inline', 'Content-Type': this.file.type //留神:依据图片或者文件的后缀来设置,我试验用的‘.png’的图片,具体为什么下文解释 }, progress: (p, checkpoint) => { this.percentage = p * 100 console.log(p, checkpoint, 'checkpoint----复原上传的切片信息-------') this.tempCheckpoint = checkpoint; }, checkpoint: this.tempCheckpoint, meta: { year: 2020, people: 'dev' }, mime: this.file.type }) console.log(result, 'result-=-=-复原上传完毕') } catch (e) { console.log(e, 'e-=-=-'); } }, // 抉择文件产生扭转 handleChange(file, fileList) { this.fileList = fileList.filter(row => row.uid == file.uid) this.file = file.raw // 文件扭转时上传 // this.submitForm(file) }, handleRemove(file, fileList) { this.percentage = 0 //进度条置空 this.fileList = [] }, }}</script><style>.avatar-uploader .el-upload { border: 1px dashed #d9d9d9; border-radius: 6px; cursor: pointer; position: relative; overflow: hidden;}.avatar-uploader .el-upload:hover { border-color: #409EFF;}.avatar-uploader-icon { font-size: 28px; color: #8c939d; width: 150px; height: 150px; line-height: 150px; text-align: center;}.avatar { width: 150px; height: 150px; display: block;}</style>app.js中引入组件Vue.component('oss-file', require('./components/uploads/OssFile.vue').default);view目录新建oss.blade.php 引入组件 <oss-file></oss-file><link rel="stylesheet" href="{{mix('css/app.css')}}"><div id="app"><div class="container"> <oss-file></oss-file></div></div><script src="{{mix('js/app.js')}}"></script>最初 $form->html(view('uploads.oss')); $form->text('link','直传后填入地址');完满解决~~~碰到的问题 ...

May 21, 2021 · 3 min · jiezi

关于laravel:Laravel-Octane-10-正式发布了

简介Laravel Octane通过应用功能强大的应用程序服务器(包含Swoole 和RoadRunner )为应用程序提供服务,从而加强了应用程序的性能。Octane疏导您的应用程序一次,将其保留在内存中,而后以超音速提供申请。官网地址 装置能够通过Composer软件包管理器装置Octane: composer require laravel/octane装置Octane之后,您能够执行octane:install Artisan命令,该命令会将Octane的配置文件装置到您的应用程序中: php artisan octane:install 装置条件PHP8+laravel v.8.37+ RoadRunnerRoadRunner由应用Go构建的RoadRunner二进制文件提供能源。首次启动基于RoadRunner的Octane服务器时,Octane将为您下载并装置RoadRunner二进制文件。 RoadRunner Via Laravel SailRoadRunner具体应用能够查看原文。 Swoole装置pecl install swoole启动你的服务能够通过octane:startArtisan命令启动Octane服务器。默认状况下,此命令将利用server应用程序octane配置文件的配置选项指定的服务器:php artisan octane:start设置利用HTTPS.配置OCTANE_HTTPS=false设置启动服务的容器OCTANE_SERVER=swoole利用代码热加载php artisan octane:start --watch留神 应用该命令之前,应该确保本地装置了Node 服务.您应该在您的project:library中装置Chokidar 文件监督库:npm install --save-dev chokidar您能够应用watch应用程序的config/octane.php配置文件中的配置选项来配置应监督的目录和文件。 指定worker过程数默认状况下,Octane将为您的计算机提供的每个CPU内核启动一个应用程序申请工作程序。而后,这些工作程序将在进入您的应用程序时用于解决传入的HTTP申请。您能够--workers在调用octane:start命令时手动指定要应用该选项的工人数量: php artisan octane:start --workers=4如果应用的是Swoole应用程序服务器,则还能够指定要启动的“工作工作者”数量: php artisan octane:start --workers=4 --task-workers=6指定最大的申请数php artisan octane:start --max-requests=250服务重启您能够应用以下octane:reload命令失常重启Octane服务器的应用程序工作程序。通常,应在部署后执行此操作,以便将新部署的代码加载到内存中并用于解决后续申请:php artisan octane:reload服务进行您能够应用octane:stopArtisan命令进行Octane服务器:php artisan octane:stop查看服务状态php artisan octane:statusOctane 依赖注入因为Octane会一次疏导您的应用程序并在解决申请时将其保留在内存中,因而在构建应用程序时应留神一些注意事项。例如,您的应用程序服务提供商的registerand boot办法仅在申请启动程序最后启动时执行一次。在后续申请中,雷同的应用程序实例将被重用。 有鉴于此,在将应用程序服务容器或申请注入到任何对象的构造函数中时,应分外小心。这样,该对象可能具备旧版本的容器或后续申请中的申请。 Octane将主动解决重置申请之间的任何第一方框架状态。然而,Octane并不总是晓得如何重置应用程序创立的全局状态。因而,您应该理解如何以Octane敌对的形式构建应用程序。上面,咱们将探讨应用辛烷值时可能引起问题的最常见状况。 容器注入通常,应防止将应用程序服务容器或HTTP申请实例注入其余对象的构造函数中。例如,以下绑定将整个应用程序服务容器注入到作为单例绑定的对象中: use App\Service;/** * Register any application services. * * @return void */public function register(){ $this->app->singleton(Service::class, function ($app) { return new Service($app); });}<p>在此示例中,如果Service在应用程序启动过程中解析了该实例,则该容器将被注入到服务中,并且该Service实例将在后续申请中保留该容器。对于您的特定应用程序,这可能不是问题;然而,这可能导致容器意外失落在疏导周期前期或后续申请中增加的绑定。 ...

May 19, 2021 · 2 min · jiezi

关于laravel:laraveladmin-后台管理用户扩展一个字段

咱们心愿可能做一个性能,这个性能是给admin_user加一个viewself字段,当拜访文章治理性能时,如果开启此字段,只展现admin用户本人的文章。 首先咱们在数据库中给admin_user增加一个字段 20200702140148 新建一个Model继承Administrator,增加本人的字段 app\Models\CustomAdministrator.php <?php namespace App\Models; use Encore\Admin\Auth\Database\Administrator; class CustomAdministrator extends Administrator{ public function __construct( array $attributes = [] ) { parent::__construct( $attributes ); array_push( $this->fillable, 'viewself' ); }}新建一个controller 继承 UserController app\Admin\Controllers\CustomUserController.php <?phpnamespace App\Admin\Controllers;use Encore\Admin\Controllers\UserController; class CustomUserController extends UserController { protected function grid() { $g = parent::grid(); //$g->column( 'viewself', '只看本人' ); $states = [ 'on' => ['text' => 'YES'], 'off' => ['text' => 'NO'], ]; $g->viewself()->switch($states); return $g; } public function form() { $f = parent::form(); $f->switch( 'viewself','只看本人' ); return $f; }}笼罩原来的adminuser的路由器 ...

May 14, 2021 · 1 min · jiezi

关于laravel:升级Laravel-Valet-版本

Laravel Valet,Mac平台上的极简Laravel开发环境,早已公布了2.0版本,该版本次要蕴含了一些bug修复以及将内置服务器从Caddy替换成Nginx。 降级到 Valet 2.0降级到新版本很简略,只需几步就能够实现。 首先,备份你的~/.valet目录,而后进行正在运行的Valet并将其卸载: $valet stop$valet uninstall最初,降级到最新版本的Valet。能够通过Git或Composer来降级,这取决于你装置Valet的形式,比方我之前是通过Composer全局装置的,所以首先我须要批改~/.composer/composer.json中valet的版本号: "laravel/valet": "^2.0"而后运行Composer全局更新命令以更新Valet依赖: $composer global update最初咱们应用Valet装置器执行装置和重启命令: $valet install$valet restart 此时查看Valet版本会发现曾经降级到2.0版本: Valet驱动目前Valet反对的驱动如下: ● Basic ● Bedrock ● Cake ● Concrete5 ● Contao ● CraftCMS ● Drupal ● Jigsaw ● Joomla ● Katana ● Kirby ● Laravel ● Sculpin ● Statamic ● Symfony 当然,如果需要的话你也能够参考官网文档创立自定义的驱动。

May 10, 2021 · 1 min · jiezi

关于laravel:laraveladmin-关联查询

原文地址:https://blog.csdn.net/yang101... rights_exchange_log表为权利兑换记录,关联了用户id(user_id),须要依据用户手机号来查问用户兑换记录,冀望的最终SQL如下: SELECT * FROM `rights_exchange_log` LEFT JOIN `fk_member` ON `fk_member`.`id` = `rights_exchange_log`.`member_id` WHERE `fk_member`.`tel` = 12312321312办法1:model中做下关联,controller层像一般变量间接查问过滤即 public function crmMember(){ return $this->belongsTo(\App\Models\crm\MemberModel::class, 'member_id');}$grid->filter(function ($filter){ $filter->like('crmMember.tel', '用户手机号');});办法2:手动查问而后拼接条件 $grid->filter(function ($filter){ $filter->where(function ($query) { $uid_list = \App\Models\halo\MemberModel::query()->where('mobile', 'like', "%{$this->input}%")->select('id')->get()->toArray(); $query->whereIn('member_id', $uid_list); }, '用户手机号');});这种办法能够跨库查问,我理论场景rights_exchange_log在crm库,member在用户核心库,这种办法刚好实用

May 10, 2021 · 1 min · jiezi

关于laravel:Laravel8xVueAntDesign前后端分离后台管理系统

我的项目介绍基于 Laravel8.x+AntDesign+Vue 开发的权限架构及内容治理框架,采纳全新的前端UI框架,反对多主题切换,前端UI框架齐全适配手机端、PAD终端以及PC电脑终端,框架内置残缺的权限架构体系以及惯例根底模块:用户治理、角色治理、菜单治理、职级治理、岗位治理、部门治理、系统日志、布局治理、广告治理、配置管理、字典治理、等等,旗舰版重点集成了代码生成器的性能,能够一键生成整个模块的全副代码,包含PHP后端代码以及Vue+AntDesign前端UI代码,生成后能够间接运行,无需人工开发;框架专一于为中小企业提供最佳的行业根底后盾框架解决方案,执行效率、扩展性、稳定性值得信赖,操作体验晦涩,应用十分便捷,欢送大家应用及进行二次开发。 模块化:全新的架构和模块化的开发机制,便于灵便扩大和二次开发。模型/栏目/分类信息体系:通过栏目和模型绑定,以及不同的模型类型,不同栏目能够实现差异化的性能,轻松实现诸如资讯、下载、探讨和图片等性能。通过分类信息和栏目绑定,能够主动建设索引表,轻松实现简单的信息检索。是一套基于Laravel8.x + Vue + AntDesign开发进去的框架。罕用类封装,日志、缓存、验证、字典、文件(本地、七牛云)。等等,目前兼容浏览器(Chrome、Firefox、360浏览器等)适用范围:能够开发OA、ERP、BPM、CRM、WMS、TMS、MIS、BI、电商平台后盾、物流管理系统、快递管理系统、教务管理系统等各类管理软件。 环境要求:PHP >= 7.3PDO PHP ExtensionMBstring PHP ExtensionCURL PHP Extension开启动态重写 性能个性谨严标准: 提供一套有利于团队合作的结构设计、编码、数据等标准。高效灵便: 清晰的分层设计、钩子行为扩大机制,解耦设计更能灵便应答需要变更。谨严平安: 清晰的零碎执行流程,谨严的异样检测和平安机制,具体的日志统计,为零碎保驾护航。组件化: 欠缺的组件化设计,丰盛的表单组件,让开发列表和表单更得心应手。无需前端开发,省时省力。简略上手快: 构造清晰、代码标准、在开发疾速的同时还兼顾性能的极致谋求。本身特色: 权限治理、组件丰盛、第三方利用多、分层解耦化设计和先进的设计思维。高级进阶: 分布式、负载平衡、集群、Redis、分库分表。命令行: 命令行性能,一键治理利用扩大。 开发者信息零碎名称:RXThinkCMF_AVL8_PRO权限及内容管理系统旗舰版作者:RXThinkCMF研发核心作者QQ:1175401194官网网址:http://www.rxthink.cn/文档网址:http://docs.avl.pro.rxthink.cn/开源协定:Apache 2.0 后盾演示(用户名:admin 明码:123456)演示地址:http://manage.avl.pro.rxthink...演示账号:admin演示明码:123456 技术支持技术支持QQ:1175401194 效果图展现

May 9, 2021 · 1 min · jiezi

关于laravel:Laravel8xVueAntDesign前后端分离通用后台管理系统

我的项目介绍基于 Laravel8.x+AntDesign+Vue 开发的权限架构及内容治理框架,采纳全新的前端UI框架,反对多主题切换,前端UI框架齐全适配手机端、PAD终端以及PC电脑终端,框架内置残缺的权限架构体系以及惯例根底模块:用户治理、角色治理、菜单治理、职级治理、岗位治理、部门治理、系统日志、布局治理、广告治理、配置管理、字典治理、等等,旗舰版重点集成了代码生成器的性能,能够一键生成整个模块的全副代码,包含PHP后端代码以及Vue+AntDesign前端UI代码,生成后能够间接运行,无需人工开发;框架专一于为中小企业提供最佳的行业根底后盾框架解决方案,执行效率、扩展性、稳定性值得信赖,操作体验晦涩,应用十分便捷,欢送大家应用及进行二次开发。 模块化:全新的架构和模块化的开发机制,便于灵便扩大和二次开发。模型/栏目/分类信息体系:通过栏目和模型绑定,以及不同的模型类型,不同栏目能够实现差异化的性能,轻松实现诸如资讯、下载、探讨和图片等性能。通过分类信息和栏目绑定,能够主动建设索引表,轻松实现简单的信息检索。是一套基于Laravel8.x + Vue + AntDesign开发进去的框架。罕用类封装,日志、缓存、验证、字典、文件(本地、七牛云)。等等,目前兼容浏览器(Chrome、Firefox、360浏览器等)适用范围:能够开发OA、ERP、BPM、CRM、WMS、TMS、MIS、BI、电商平台后盾、物流管理系统、快递管理系统、教务管理系统等各类管理软件。 环境要求:PHP >= 7.3PDO PHP ExtensionMBstring PHP ExtensionCURL PHP Extension开启动态重写 性能个性谨严标准: 提供一套有利于团队合作的结构设计、编码、数据等标准。高效灵便: 清晰的分层设计、钩子行为扩大机制,解耦设计更能灵便应答需要变更。谨严平安: 清晰的零碎执行流程,谨严的异样检测和平安机制,具体的日志统计,为零碎保驾护航。组件化: 欠缺的组件化设计,丰盛的表单组件,让开发列表和表单更得心应手。无需前端开发,省时省力。简略上手快: 构造清晰、代码标准、在开发疾速的同时还兼顾性能的极致谋求。本身特色: 权限治理、组件丰盛、第三方利用多、分层解耦化设计和先进的设计思维。高级进阶: 分布式、负载平衡、集群、Redis、分库分表。命令行: 命令行性能,一键治理利用扩大。 开发者信息零碎名称:RXThinkCMF_AVL8_PRO权限及内容管理系统旗舰版作者:RXThinkCMF研发核心作者QQ:1175401194官网网址:http://www.rxthink.cn/文档网址:http://docs.avl.pro.rxthink.cn/开源协定:Apache 2.0 后盾演示(用户名:admin 明码:123456)演示地址:http://manage.avl.pro.rxthink...演示账号:admin演示明码:123456 技术支持技术支持QQ:1175401194 效果图展现

May 9, 2021 · 1 min · jiezi

关于laravel:Laravel8xVueAntDesign一站式后台系统开发平台

我的项目介绍基于 Laravel8.x+AntDesign+Vue 开发的权限架构及内容治理框架,采纳全新的前端UI框架,反对多主题切换,前端UI框架齐全适配手机端、PAD终端以及PC电脑终端,框架内置残缺的权限架构体系以及惯例根底模块:用户治理、角色治理、菜单治理、职级治理、岗位治理、部门治理、系统日志、布局治理、广告治理、配置管理、字典治理、等等,旗舰版重点集成了代码生成器的性能,能够一键生成整个模块的全副代码,包含PHP后端代码以及Vue+AntDesign前端UI代码,生成后能够间接运行,无需人工开发;框架专一于为中小企业提供最佳的行业根底后盾框架解决方案,执行效率、扩展性、稳定性值得信赖,操作体验晦涩,应用十分便捷,欢送大家应用及进行二次开发。 模块化:全新的架构和模块化的开发机制,便于灵便扩大和二次开发。模型/栏目/分类信息体系:通过栏目和模型绑定,以及不同的模型类型,不同栏目能够实现差异化的性能,轻松实现诸如资讯、下载、探讨和图片等性能。通过分类信息和栏目绑定,能够主动建设索引表,轻松实现简单的信息检索。是一套基于Laravel8.x + Vue + AntDesign开发进去的框架。罕用类封装,日志、缓存、验证、字典、文件(本地、七牛云)。等等,目前兼容浏览器(Chrome、Firefox、360浏览器等)适用范围:能够开发OA、ERP、BPM、CRM、WMS、TMS、MIS、BI、电商平台后盾、物流管理系统、快递管理系统、教务管理系统等各类管理软件。环境要求:PHP >= 7.3PDO PHP ExtensionMBstring PHP ExtensionCURL PHP Extension开启动态重写性能个性谨严标准: 提供一套有利于团队合作的结构设计、编码、数据等标准。高效灵便: 清晰的分层设计、钩子行为扩大机制,解耦设计更能灵便应答需要变更。谨严平安: 清晰的零碎执行流程,谨严的异样检测和平安机制,具体的日志统计,为零碎保驾护航。组件化: 欠缺的组件化设计,丰盛的表单组件,让开发列表和表单更得心应手。无需前端开发,省时省力。简略上手快: 构造清晰、代码标准、在开发疾速的同时还兼顾性能的极致谋求。本身特色: 权限治理、组件丰盛、第三方利用多、分层解耦化设计和先进的设计思维。高级进阶: 分布式、负载平衡、集群、Redis、分库分表。命令行: 命令行性能,一键治理利用扩大。开发者信息零碎名称:RXThinkCMF_AVL8_PRO权限及内容管理系统旗舰版作者:RXThinkCMF研发核心作者QQ:1175401194官网网址:http://www.rxthink.cn/文档网址:http://docs.avl.pro.rxthink.cn/开源协定:Apache 2.0后盾演示(用户名:admin 明码:123456)演示地址:http://manage.avl.pro.rxthink.cn/演示账号:admin演示明码:123456技术支持技术支持QQ:1175401194 效果图展现

May 8, 2021 · 1 min · jiezi

关于laravel:laraveloctane-体验及压测

laravel-octane 必须在 php8 之上运行,无奈本地的 Mamp 最高还是 php7,所以只能用 docker 跑一下啦。 创立容器在本地开个docker工作目录,不便映射和编辑我的项目代码。 mkdir ~/workspace/docker/ -p && cd ~/workspace/docker/docker run -it --name php8 \-v "$PWD":/exports/apps \-w /exports/apps --entrypoint="/bin/bash" \-p 8081:8081 \php:8.0.3-cli这里用 swoole 加持吧, roadrunner 没用过,前面再说。 容器部署组件、依赖都在容器中解决 # 登录容器docker exec -it php8 /bin/bash# 不更新拉不到安装包 fkapt-get update && apt-get upgradeapt-get install libzip-devapt-get install apache2-utilsapt-get install net-toolsapt-get install inetutils-ping# 热加载用的 node chokidar 须要话能够装置npmapt-get install nodejs npmnpm config set registry https://registry.npm.taobao.org# 在拉取 composer 包时须要 否则用 git 去拉源码那叫一个慢哟pecl install zippecl install swooleecho extension=zip.so >> /usr/local/etc/php/conf.d/docker-php-ext-sodium.iniecho extension=swoole.so >> /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini# 装置 pcntl octane 信号通信须要docker-php-ext-install pcntldocker-php-ext-install pdo_mysqlphp -m装置 composercurl -sS https://getcomposer.org/installer | phpmv composer.phar /usr/local/bin/composercomposer --versioncomposer config -g repo.packagist composer https://mirrors.aliyun.com/composer/创立 laravel && octanecomposer create-project laravel/laravel --prefer-dist -vvv laravel_octanecd laravel_octane# 装置 octanecomposer require laravel/octanephp artisan octane:installphp artisan key:generate# .env# 数据库我用的宿主机的# mac 容器拜访宿主机 mysql 应用 docker.for.mac.host.internal 即可DB_CONNECTION=mysqlDB_HOST=docker.for.mac.host.internalDB_PORT=3306DB_DATABASE=laravel_octaneDB_USERNAME=rootDB_PASSWORD=123456启动服务--watch ...

April 23, 2021 · 2 min · jiezi

关于laravel:Laravel集成图片验证码

1. 根底的装置/用法请参照我的项目文档github: https://github.com/mewebstudi... 2. api调用接口http://localhost/captcha/api/math math能够替换为配置文件的所定义的验证码类型 该接口返回json,次要应用两个参数key和img key须要一起传递给后盾做验证 img是图片base64 用作前端显示 后盾验证 $rules = ['captcha' => 'required|captcha_api:'. request('key') . ',default'];$validator = validator()->make(request()->all(), $rules);3. 集成passport做登录验证通过middleware形式拦挡验证创立CheckLoginCaptchaMiddleware中间件 <?phpnamespace App\Http\Middleware;use Closure;use Illuminate\Http\Request;class CheckLoginCaptchaMiddleware{ /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle(Request $request, Closure $next) { if($request->path()==="oauth/token"){ // 判断是否是passport登录接口 $check = validator($request->all(),[ 'captcha' => 'required|captcha_api:'. request('key') . ',login' ]); if(!$check->passes()){ return response(["message"=>$check->errors()->first()],400); } } return $next($request); }}在Http/kernel.php ...

April 12, 2021 · 1 min · jiezi

关于laravel:Laravel配置界面操作处理

以邮箱配置为例 1. config辅助函数提取数据config("mail.defaut")设置数据config(["mail.defaut"=>"ddddd"])2. 数据库存储 配置信息存储在数据中 自定义实现即可模型 <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Setting extends Model { use HasFactory; protected $fillable = [ 'setting_key', 'setting_type', 'setting_value', ]; }控制器 <?php namespace App\Http\Controllers\API; use Response; use Storage; use Log; use Cache; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Models\Setting; class EmailSettingsController extends Controller { private $keys = [ "MAIL_MAILER", "MAIL_HOST", "MAIL_PORT", "MAIL_USERNAME", "MAIL_PASSWORD", "MAIL_ENCRYPTION", "MAIL_FROM_ADDRESS", "MAIL_FROM_NAME", ]; public function index(Request $request){ $emailSettings = [ "MAIL_MAILER"=>config("mail.default"), "MAIL_HOST"=>config("mail.mailers.smtp.host"), "MAIL_PORT"=>config("mail.mailers.smtp.port"), "MAIL_USERNAME"=>config("mail.mailers.smtp.username"), "MAIL_PASSWORD"=>config("mail.mailers.smtp.password"), "MAIL_ENCRYPTION"=>config("mail.mailers.smtp.encryption"), "MAIL_FROM_ADDRESS"=>config("mail.from.address"), "MAIL_FROM_NAME"=>config("mail.from.name") ]; return response(["data"=>$emailSettings]); } public function update(Request $request){ $check = validator($request->all(),[ 'MAIL_MAILER' =>'required', 'MAIL_HOST' =>'required', 'MAIL_PORT' =>'required', 'MAIL_USERNAME' =>'required', 'MAIL_PASSWORD' =>'required', 'MAIL_ENCRYPTION' =>'required', 'MAIL_FROM_ADDRESS' =>'required', 'MAIL_FROM_NAME' =>'required', ]); if($check->passes()){ Setting::whereIn("setting_key",$this->keys)->delete(); $settings = []; foreach($this->keys as $key){ $settings[$key] = [ "setting_key"=>$key, "setting_type"=>"string", "setting_value"=>$request->input($key) ]; } Setting::insert($settings); return response(['message'=>"数据已保留!"]); }else{ return response(['check_errors'=>$check->errors()],400); } } public function test(Request $request){ } }3. 中间件 通过中间件批改对应路由下的邮箱配置 <?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use App\Models\Setting; class EmailSettingMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle(Request $request, Closure $next) { $keys = [ "MAIL_MAILER"=>"mail.default", "MAIL_HOST"=>"mail.mailers.smtp.host", "MAIL_PORT"=>"mail.mailers.smtp.port", "MAIL_USERNAME"=>"mail.mailers.smtp.username", "MAIL_PASSWORD"=>"mail.mailers.smtp.password", "MAIL_ENCRYPTION"=>"mail.mailers.smtp.encryption", "MAIL_FROM_ADDRESS"=>"mail.from.address", "MAIL_FROM_NAME"=>"mail.from.name", ]; $settings = Setting::whereIn("setting_key",collect($keys)->keys()->toArray())->get(); foreach ($settings as $item) { config([$keys[$item->setting_key]=>$item->setting_value]); } return $next($request); } }

April 6, 2021 · 1 min · jiezi

关于laravel:LaravelPassportVue实现Oauth2登录认证

Laravel+Passport+Vue实现Oauth2登录认证前情提要: 这里次要详诉一些细节和实践和局部代码,这里不讲 Oauth2 是什么阮一峰: OAuth 2.0 的四种形式 这里简略形容一下,Oauth次要是4形式 受权码(authorization code)形式,指的是第三方利用先申请一个受权码,而后再用该码获取令牌。隐藏式: 有些 Web 利用是纯前端利用,没有后端, 容许间接向前端颁发令牌。这种形式没有受权码这个两头步骤,所以称为(受权码)"隐藏式"(implicit)。密码式: 如果你高度信赖某个利用,RFC 6749 也容许用户把用户名和明码,间接通知该利用。该利用就应用你的明码,申请令牌,这种形式称为"密码式"(password)。凭证式: 最初一种形式是凭证式(client credentials),实用于没有前端的命令行利用,即在命令行下申请令牌。以上4中形式中,除了受权码模式都非常简单,也就是平时的登录 而后 发放 token,而后前端设置token 申请鉴权即可,这里不说这个,自行实际及了解(我认为和jwt的操作没什么区别) 所以次要形容受权码模式 受权码模式应用场景在平时的登录中,应用最多的第一为明码登录,第二的也就是受权码模式这种鉴权形式了 参考: 微信第三方利用应用微信受权登录 、 包含QQ受权微博登录 等等 明细他么都有非常明显的特点, 例如微信公众号: 唤起微信用户登录 流程: 公众号登录 -> 微信申请受权 -> 确认 -> 返回原平台 -> 登录胜利 公众号作为一个应用程序, 1、获取用户信息的时候,发现用户未登录,而后重定向受权核心(微信),2、微信监测用户登录态,登录态失常(一般来说在公众号中关上都是登录的),用户确认,3、确认后微信依据开发者配置的重定向地址,携带code 返回公众号。4、公众号监测到用户曾经受权胜利,后端将获取到的code,向微信发动申请 asses_token5、微信确认code可用,返回用户蕴含的权限(scope)和 token 曾经 刷新 token6、公众号确认用户信息可用,将token存储起来,并且返回数据给客户端7、接下来的每次申请,客户端都将携带token向公众号后端发动申请,公众号后端会进行判断token是否过期,过期则反复如上步骤能够参考阮一峰对于受权码模式的形容 在Laravel 中应用 Passport举荐官网文档https://laravel.com/docs/8.x/passport 装置命令// 1、请装置对应Laravel 版本的passport// 2、能够疏忽版本 composer require laravel/passport --ignore-platform-reqs -vvvcomposer require laravel/passport -vvv// artisan 运行// 数据表创立php artisan migrate// 秘钥创立php artisan passport:install// 创立一个客户端php artisan passport:client// 创立实现后,能够从 database.oauth_clients 表中看到// 留神一下, 一般来说你刚创立的client_id 是 3// Personal Access Client : 集体拜访客户端模式// Password Grant Client : 明码拜访模式模型// 这里咱们同时配置了 jwt,因为咱们用的是前后端拆散,没有采纳 根本的web鉴权登录namespace App\Models\Module;use Illuminate\Notifications\Notifiable;use Laravel\Passport\HasApiTokens;use Illuminate\Foundation\Auth\User as Authenticatable;use Tymon\JWTAuth\Contracts\JWTSubject;class ModuleUsers extends Authenticatable implements JWTSubject{ protected $table = 't_module_user'; use HasApiTokens, Notifiable; public function getJWTIdentifier() { return $this->getKey(); } public function getJWTCustomClaims() { return []; }}设置一下自定义的Client模型次要是因为,我想免受权,就是不须要确认受权间接跳转走namespace App\Models\Passport;use Laravel\Passport\Client as BaseClient;class Client extends BaseClient{ /** * Determine if the client should skip the authorization prompt. * * @return bool */ public function skipsAuthorization() { return true; }}-----// app/Providers/AuthServiceProvider.phpclass AuthServiceProvider extends ServiceProvider { ... public function boot() { $this->registerPolicies(); // 笼罩原来的 model Passport::useClientModel(Client::class); }}配置Guard这里咱们不应用默认的 guard : guard 值得是维持登录态的货色客户端咱们采纳 client guard受权核心咱们采纳 oauth guard ...

March 23, 2021 · 4 min · jiezi

关于laravel:使用-Laradock-部署多项目运行

将我的项目放在 laradock 的同级目录下: * laradock* project-1* project-2基于 laradock/nginx/sites 目录内的配置模板,减少对应我的项目的 Nginx 配置文件: laradock/nginx/sites/app.conf laradock/nginx/sites/project-1.conf laradock/nginx/sites/project-2.conf 3. 依据须要批改配置文件的 `root` ,`server_name` ,`error_log` 等配置项;4. 配置 `hosts` 信息:127.0.0.1 project-1.test 127.0.0.1 project-2.test 5. 启动容器:docker-compose up -d nginx mysql redis workspace > php-fpm 会随容器主动启动。6. 进入容器:docker-compose exec workspace bash # 以宿主机用户进入容器 docker-compose exec --user=laradock workspace bash # for Windows PowerShell docker exec -it {workspace-container-id} bash > 进入容器后可执行 Artisan, Composer, PHPUnit, Gulp 等命令。7. 测试容器:<?php $dsn = "mysql:host=mysql;port=3306;dbname=test"; $pdo = new PDO($dsn, 'root', 'root'); $stmt = $pdo->query("select * from users"); $data = $stmt->fetch(2); var_dump($data); ...

January 25, 2021 · 1 min · jiezi

关于laravel:用Laravel轻松处理千万级数据

在Laravel中应用cursor来查问并解决数据 (轻松解决千万级的数据)事发现场最近在我的项目中遇到内存不足的问题, 测试环境中的PHP内存只有64M,在导出的时候, 数据量比拟大,这个时候会呈现内存溢出的谬误;如何解决目前想到两种办法: 调整php.ini文件中memory_limit配置项; 或者在调用办法中调整内存大小ini_set('memory_limit', "").应用Laravel的Lazy Collection.思考到批改配置文件的影响范畴过大, 以及对导出的实时性要求不是很高, 所以咱们抉择了第二种办法.Lazy Collection如何应用Lazy Collection? 很简略, 将查问构建器链开端的get()更改为cursor()就好了 ! cursor ( )cursor的原理cursor的实现应用了 yield 关键字, yield关键字是生成器函数的外围, 它的调用模式跟return很像, 不同之处在于return会返回值并且终止函数执行, 而yield会返回值给循环调用生成器的代码并且只是暂停生成器函数.cursor()的代码如下 /** * Get a generator for the given query. * * @return Generator */ public function cursor() { foreach ($this->applyScopes()->query->cursor() as $record) { yield $this->newModelInstance()->newFromBuilder($record); } } 因为应用了yield关键字, 在循环cursor生成器的时候,能够渐进式的解决数据,即便在内存很小的状况下,也能够轻松解决千万级的数据! 真的是十分不便哦!

December 24, 2020 · 1 min · jiezi

关于laravel:laravel-vue-跨域问题

我的项目后端是laravel,前端vue,前后端拆散我的项目。 其中一个页面做新增操作时报跨域谬误,NO 'Access-Control-Allow-Origin'; 同一个零碎其余页面都OK,所以排除配置起因。 最初发现问题所在:后端页面引入了一个trait,该trait名称不合乎psr-4主动加载标准,批改名称后谬误隐没。 does not comply with psr-4 autoloading standard. It will not autoload anymore in Composer v2.0. in phar:///usr/local/bin/composer/src/Composer/Autoload/ClassMapGenerator.php:201

December 24, 2020 · 1 min · jiezi

关于laravel:一些非常好用的laravel框架扩展包你还不知道么

前言自从有了 composer 包管理工具,呈现大量优良的扩大包,让咱们能够解放双手,大大提高咱们的开发效率,有了更多的工夫去 enjoy life and accompany family,上面我将会列出工作中用到的一些扩大包,心愿对大家有所帮忙,我不会给出具体的应用阐明,大家在应用之前最好先去看下官网的文档,以文档为主,show time,enjoy!!! 扩大包1、PHP 导出百万级数据到表格简介: PHP 导出是一个比拟常见的性能,但惯例的导出却有一个内存瓶颈,导致速度慢,甚至会将整个服务给挂掉。 这里,采纳了PHP 迭代器 yield,开发了一个简略的 composer 包,应用起来比较简单,导出百万级数据,不会拖慢整个服务。 应用: composer require haveyb/export-csv地址: https://packagist.org/package...2、jwt扩大包简介: Json web token (JWT), 是为了在网络应用环境间传递申明而执行的一种基于JSON的凋谢规范((RFC 7519).该 token 被设计为紧凑且平安的,特地实用于分布式站点的单点登录(SSO)场景。JWT 的申明个别被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也能够减少一些额定的其它业务逻辑所必须的申明信息,该token也可间接被用于认证,也可被加密。 应用: composer require tymon/jwt-auth地址: https://github.com/tymondesig...3、laravel 框架代码提醒扩大包 laravel-ide-helper简介: 在应用模型或者门面的时候,编辑器无奈主动提醒模型有哪些属性和办法,这个扩大包间接从源代码欠缺PHP正文,以致于编辑器能够主动提醒模型或者门面有哪些属性和办法。 应用: composer require --dev barryvdh/laravel-ide-helperphp artisan ide-helper:generate - PHPDoc generation for Laravel Facadesphp artisan ide-helper:models - PHPDocs for modelsphp artisan ide-helper:meta - PhpStorm Meta file地址: https://github.com/barryvdh/l...4、图片生成或者裁剪扩大包 BaconQrCode简介: ...

December 24, 2020 · 1 min · jiezi

关于laravel:CentOS7基于LNMP安装配置Laravel

前言间隔上一次接触Laravel还是2015年的时候,这一次基于CentOS7的LNMP(Linux, Nginx, MySQL, PHP)再从新回味下当年部署的乐趣,文档里记录的是手动部署的步骤,ansible自动化部署代码我就不放进去了,有问题能够留言征询。 更新历史2020年10月21日 - 初稿 浏览原文 - https://wsgzao.github.io/post... 软件版本php版本各位能够抉择7.3以上,我本人抉择了7.2的最新版CentOS Linux release 7.xnginx 1.16.xMySQL 5.7.xphp-fpm 7.2.xComposer 1.xlaravel 7.xnodejs v6.xnpm 3.xyarn 1.x降级EPEL仓库EPEL (Extra Packages for Enterprise Linux,企业版Linux的额定软件包) 是Fedora小组保护的一个软件仓库我的项目,为RHEL/CentOS提供他们默认不提供的软件包。这个源兼容RHEL及像CentOS和Scientific Linux这样的衍生版本。 更多具体介绍查看这里:EPEl 咱们须要Nginx装置的EPEL仓库,因为官网CentOS仓库中不存在Nginx软件包。 sudo yum -y install epel-release装置Nginx应用LNMP环境下运行Laravel。Nginx是其中的Web服务器局部,能够从EPEL仓库装置。 # 装置Nginxsudo yum -y install nginx# 装置实现后,启动Nginx并将其增加到零碎自启动sudo systemctl start nginxsudo systemctl enable nginx# Nginx默认运行在80端口,应用上面的netstat命令查看。netstat -plntu | grep 80装置php-fpm在CentOS根底库中不存在PHP 7.2,咱们须要从名为remi或webtatic的第三方仓库中装置它。 形式一 remi仓库(举荐)之所以举荐它是因为它十分不便切换PHP的版本。更多仓库相干信息参考这里。 装置 sudo rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remisudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpmsudo yum-config-manager --enable remi-php72 # 默认remi仓库禁用的,在理论须要的时候启用sudo yum update# sudo yum search php72 | moresudo yum install -y php72 php72-php-fpm php72-php-gd php72-php-json php72-php-mbstring php72-php-mysqlnd php72-php-xml php72-php-xmlrpc php72-php-opcache php72-php-pecl-zipsudo mkdir -p /run/php-fpm/remi-php72 # 创立一个sock寄存的目录sudo ln -s `which php72` /usr/local/sbin/php # 建设软连贯不便命令行应用执行完下面的命令后,CentOS零碎上曾经装置了PHP 7.2, 装置好的php72目录在/etc/opt/remi/php72, 也能够参考这个链接查看更多操作详情。 ...

December 16, 2020 · 3 min · jiezi

关于laravel:从零开始学Laravel三数据迁移migration以及seed-factory批量生产测试数据

一.数据库迁徙migration1.输出以下命令,建设migration文件 php artisan make:migration create_admin_user_table --create=admin_user这时会在migrations下生成带有日期的migration php文件,代码如下,这只是例子,能够依据具体情况批改 <?phpuse IlluminateDatabaseMigrationsMigration;use IlluminateDatabaseSchemaBlueprint;use IlluminateSupportFacadesSchema;class CreateAdminUserTable extends Migration{ /** * Run the migrations. * * @return void */ public function up() { Schema::create('admin_user', function (Blueprint $table) { $table->id(); $table->string('username'); $table->string('password'); $table->string('email'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('admin_user'); }}2.输出以下命令,进行数据库迁徙 docker exec dracohub_myapp_1 php artisan migrate查看表构造如图,迁徙胜利 二.seed factory 工厂批量生产测试数据、1.输出以下命令,创立seeder php artisan make:seeder AdminUserTableSeederAdminUserTableSeeder.php ...

December 9, 2020 · 1 min · jiezi

关于laravel:开源文档管理系统-Wizard-126-发布

概述Wizard 是一款开源的文档管理系统,反对 Markdown 文档,Swagger 文档以及表格文档,适应于中小规模的技术团队文档治理,完全免费。Wizard 并不是一款云产品,不提供任何云服务,如果你的团队想要应用他,你必须在本人公司外部独立部署。正因为这样,你的数据和技术文档平安是有保障的,不会泄露给任何不信赖的第三方。 更新内容本次更新(1.2.6)次要蕴含以下内容 反对文档批量导入,当初你能够通过通过文件上传的形式批量导入文件了 反对用户表演性能,管理员能够表演为其它用户,以其它普通用户的视角进行操作 减少将文档标记为已过期的性能,过期的文档能够通过色彩和文字与其余文档辨别进去 Markdown 图片上传当初反对 SVG 格局的文件上传和展现了文档点赞性能用户为文档点赞后,显示点赞用户的用户名 更多功能更新参考我的项目的 Releases 页面。 性能概览我的项目的地址为 https://github.com/mylxsw/wizard作为一款开源的文档管理系统,Wizard 次要反对上面这些性能 文档治理 Markdown 文档治理,反对各种性能扩大(流程图,LaTex,数据结构等)Swagger API 文档治理表格 文档治理(相似于简化版的在线 Excel)用户权限 相似于 Gitlab 的权限管理体系,你能够建设用户组,为一组用户调配我的项目的读写权限基于 LDAP 的对立身份认证(LDAP/流动目录),你能够将其接入到公司对立的账户管理体系,只须要批改几行配置文档评论文档变更历史,文档变更差别比照多主题自在切换我的项目分组,你能够将一些相关联的我的项目组成一个组,不便更快的检索文档其它 文档附件文档分享浏览模式内容模板文档搜寻等等局部性能展现Markdown 文档展现 Swagger 文档展现 光明主题模式 表格文档展现 文档差别比照 更多功能展现请查看我的项目的 Wiki 文档。 对于代码我的项目采纳了 Laravel 框架开发,目前版本曾经降级到 5.8(最开始为5.4,一路降级过去)。为了进步开发效率,放弃架构的简洁,在开发过程中,始终防止引入过多的内部组件,尽可能的利用 Laravel 提供的各种组件,比方 Authentication,Authorization,Events,Mail,Notifications 等,非常适合用来学习 Laravel 框架。 总结如果你在为公司寻找一款开源收费的 开发文档/API文档治理 工具,无妨考虑一下 Wizard 我的项目(多一个抉择,为什么不尝试下呢),肯定不会让你悲观的。如果你是一名 PHP 或者 Laravel 老手,想找个我的项目学习一下如何用 Laravel 做 Web 开发,这个我的项目更加不能错过! ...

December 6, 2020 · 1 min · jiezi

关于laravel:从零开始学Laravel二Laravel集成Swagger

我是Java转的php,这两天开始学习php,然而因为赶进度学的很快,3天功夫就开始搭建Laravel框架了,只是说是知其然而不知其所以然,相当于从零开始,写的学习Laraveldemo的源码在我的github akaedison/blog (github.com) 上,大家刚开始学的话能够参照一下。 一.Swagger的装置这里咱们抉择darkaonline/l5-swagger,这个集成了很多swagger组件,比拟不便。1.应用composer增加该包,具体应用哪个版本能够参照下图,也能够在https://github.com/DarkaOnLin... 查看 composer require darkaonline/l5-swagger2.公布 php artisan vendor:publish --provider "L5SwaggerL5SwaggerServiceProvider"3.如果Laravel >=5.5,找到app.php,如图增加L5SwaggerL5SwaggerServiceProvider::class当初swagger的装置是实现了,接下来就是配置和正文的编写 二.Swagger的配置1.新建一个SwaggerController,用于测试swagger php artisan make:controller SwaggerController 这里把SwaggerController的代码放在这里,大家能够参考下正文的写法 <?phpnamespace AppHttpControllers;use AppModelsModelsBook;use SymfonyComponentHttpFoundationJsonResponse;/** * @OAInfo(title="图书",version="1") * Class BookController * @package AppHttpControllers */class BookController extends Controller{ /** * @OAGet( * path="/api/book/{id}", * @OAParameter( * name="id", * required=true, * in="path" * ), * @OAResponse(response=200,description="返回依据id查问的书") * ) * @param $id * @return IlluminateHttpJsonResponse|JsonResponse */ public function getBookById($id) { // 依据id查问 $book = Book::query()->find($id); // return response()是返回想要 json()转换成json字符串然而是unicode setEncodingOptions设置编码 return response()->json($book)->setEncodingOptions(JSON_UNESCAPED_UNICODE); } /** * @OAget( * path="/api/allBook", * @OAResponse(response=200,description="查问所有图书") * ) * @return IlluminateHttpJsonResponse|JsonResponse */ public function getAllBook() { $books = Book::all(); return response()->json($books)->setEncodingOptions(JSON_UNESCAPED_UNICODE); }}而后在路由中配置2.依据写好的正文生成api文档运行以下命令 ...

December 3, 2020 · 1 min · jiezi

关于laravel:在Laravel项目中使用Elasticsearch

Elasticsearch概念Elasticsearch是一个基于Lucene的搜寻服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码公布,是一种风行的企业级搜索引擎。Elasticsearch用于云计算中,可能达到实时搜寻,稳固,牢靠,疾速,装置使用方便。官网客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其余语言中都是可用的。 Elastic 的底层是开源库 Lucene。然而,你没法间接用 Lucene,必须本人写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。 装置Elasticsearch参考装置Elasticsearch我应用centos服务器,装置命令如下 # Download and install the public signing key:$ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch# 增加 yum 源$ vim /etc/yum.repos.d/elasticsearch-7.x.repo# 要增加的内容 ##################################################################[elasticsearch-7.x] name=Elasticsearch repository for 7.x packagesbaseurl=https://artifacts.elastic.co/packages/7.x/yumgpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearchenabled=1 autorefresh=1 type=rpm-md################################################################################ 装置 es$ yum install -y elasticsearch# 治理 es$ systemctl start elasticsearch.service$ systemctl stop elasticsearch.service# 测试 elasticsearch# 参考 https://www.elastic.co/guide/cn/elasticsearch/guide/current/running-elasticsearch.html$ curl http://127.0.0.1:9200?pretty 外网拜访Elasticsearch参考这两篇文章elasticsearch外网拜访设置,elasticsearch装置及启动异样解决 默认状况下装置elasticsearch之后是无奈进行外网拜访的,能够通过设置来实现这一目标 1、编辑elasticsearch配置文件:vim /etc/config/elasticsearch.yml 找到network.host这一行,更改为network.host: 0.0.0.0 2、重启服务,发现报错 ...

November 25, 2020 · 4 min · jiezi

关于laravel:laravel上传图片之后目录有图片但是访问不到404

1.问题形容Laravel后盾上传图片胜利并返回拜访链接,但拜访图片时报404,查看了对应目录中是有图片的?2.解决方案Laravel我的项目只有public目录能够拜访,其余目录是不容许拜访的,而图片默认是上传到storage目录的,造成图片链接没问题,就是拜访不到图片。怎么办呢?很简略,在public下建设文件软链接执行命令:php artisan storage:link命令执行结束后,就会在我的项目里多出一个 public/storage,这个 storage 就是一个软链接,它指向 storage/app/public 目录。public/storage(软连贯) → storage/app/public而后就能够用地址间接拜访public外面的照片了!

October 30, 2020 · 1 min · jiezi

关于laravel:开源文档管理系统-Wizard-125-发布

概述Wizard 是一款开源的文档管理系统,反对 Markdown 文档,Swagger 文档以及表格文档,适应于中小规模的技术团队文档治理,完全免费。Wizard 并不是一款云产品,不提供任何云服务,如果你的团队想要应用他,你必须在本人公司外部独立部署。正因为这样,你的数据和技术文档平安是有保障的,不会泄露给任何不信赖的第三方。 更新内容本次更新(1.2.5)次要蕴含以下内容 Markdown 文档图片反对点击查看大图,反对图片缩放查看反对文档评估,能够对文档依照 “很赞”、“看不懂”、“潦草” 打分 解决历史文档查看不反对表格文档的问题其它 Bugfix更多功能更新参考我的项目的 Releases 页面。 性能概览我的项目的地址为 https://github.com/mylxsw/wizard作为一款开源的文档管理系统,Wizard 次要反对上面这些性能 文档治理 Markdown 文档治理,反对各种性能扩大(流程图,LaTex,数据结构等)Swagger API 文档治理表格 文档治理(相似于简化版的在线 Excel)用户权限 相似于 Gitlab 的权限管理体系,你能够建设用户组,为一组用户调配我的项目的读写权限基于 LDAP 的对立身份认证(LDAP/流动目录),你能够将其接入到公司对立的账户管理体系,只须要批改几行配置文档评论文档变更历史,文档变更差别比照多主题自在切换我的项目分组,你能够将一些相关联的我的项目组成一个组,不便更快的检索文档其它 文档附件文档分享浏览模式内容模板文档搜寻等等你能够拜访 http://wizard.aicode.cc/ 在线体验 Wizard 的性能。 在线版本的 Wizard 因为服务器配置比拟低,拜访可能会比较慢,而且权限比拟凋谢,任何人都能够编辑,内容比拟乱一些。局部性能展现Markdown 文档展现 Swagger 文档展现 光明主题模式 表格文档展现 文档差别比照 更多功能展现请查看我的项目的 Wiki 文档。 对于代码我的项目采纳了 Laravel 框架开发,目前版本曾经降级到 5.8(最开始为5.4,一路降级过去)。为了进步开发效率,放弃架构的简洁,在开发过程中,始终防止引入过多的内部组件,尽可能的利用 Laravel 提供的各种组件,比方 Authentication,Authorization,Events,Mail,Notifications 等,非常适合用来学习 Laravel 框架。 总结如果你在为公司寻找一款开源收费的 开发文档/API文档治理 工具,无妨考虑一下 Wizard 我的项目(多一个抉择,为什么不尝试下呢),肯定不会让你悲观的。如果你是一名 PHP 或者 Laravel 老手,想找个我的项目学习一下如何用 Laravel 做 Web 开发,这个我的项目更加不能错过! ...

October 26, 2020 · 1 min · jiezi

关于laravel:Laravel58

环境问题(2020-10-14 2H)SQLTATE[42000]: Syntax error or access violation: 1071 Specified key was too long: max key length is 1000 bytes (SQL: alter table `test` and index `test_title_index`(`title`)) 解决形式 时区问题(2020-10-14 0.2H)namespace AppHttpMiddleware;VerifyCsrfToken::class 新增public function handle($request, Closure $next) {// 应用CSRF//return parent::handle($request, $next);// 禁用CSRFreturn $next($request);}相干文件 - header('access-Control-Allow-Origin:*');

October 22, 2020 · 1 min · jiezi

关于laravel:laravel模型的一些特性

1模型复制replicate办法能够保留一个新的模型正本,例如:此处的$user与$NewUser,$shipping与$NewShipping的根本数据是统一的$user = \App\User::find(1);$newUser = $user->replicate();$newUser->save();$shipping = App\Address::create([ 'type' => 'shipping', 'line_1' => '123 Example Street', 'city' => 'Victorville', 'state' => 'CA', 'postcode' => '90001',]);$NewShipping=$shipping->replicate();2模型校验is办法能够校验两个模型实例是否领有雷同的主键,表,数据库连贯$user=\App\User::find(1);$sameUser=\App\User::find(1);$diffUser=\App\User::find(2);$user->is($sameUser);//true$user->is($diffUser);//false

October 20, 2020 · 1 min · jiezi

关于laravel:Laravel-配合-jwt-使用

测试应用的是Laravel5.5版本。装置composer require tymon/jwt-auth=1.0.0-rc.5配置生成配置php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"php artisan jwt:secretauth配置<?phpreturn [ ... 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], // 应用jwt 'api' => [ 'driver' => 'jwt', 'provider' => 'apiUser', ], ], 'providers' => [ ... // 指定model 'apiUser' => [ 'driver' => 'eloquent', 'model' => App\ApiUser::class, ], ],];编码控制器: <?phpnamespace App\Http\Controllers\Api;use App\ApiUser;use App\Http\Controllers\Controller;use Illuminate\Http\Request;use Tymon\JWTAuth\Facades\JWTAuth;class AuthController extends Controller{ /** * 中间件去除login和refresh * * @return void */ public function __construct() { $this->middleware('auth:api', ['except' => ['login','refresh']]); } /** * Get a JWT via given credentials. * * @return \Illuminate\Http\JsonResponse */ public function login(Request $request) { $credentials = $request->only('phone', 'password'); if (count($credentials) < 2) { return response()->json(['error' => 'Unauthorized'], 401); } $user = ApiUser::where('phone', $credentials['phone']) ->where('password', md5($credentials['password'])) ->first(); if (empty($user) || !$token = JWTAuth::fromUser($user)) { return response()->json(['error' => 'Unauthorized'], 401); } // dd($token); return $this->respondWithToken($token); } /** * Get the authenticated User. * * @return \Illuminate\Http\JsonResponse */ public function me() { return response()->json(auth('api')->user()); } /** * Log the user out (Invalidate the token). * * @return \Illuminate\Http\JsonResponse */ public function logout() { auth()->logout(); return response()->json(['message' => 'Successfully logged out']); } /** * Refresh a token. * * @return \Illuminate\Http\JsonResponse */ public function refresh() { return $this->respondWithToken(auth('api')->refresh()); } /** * Get the token array structure. * * @param string $token * * @return \Illuminate\Http\JsonResponse */ protected function respondWithToken($token) { return response()->json([ 'access_token' => $token, 'token_type' => 'bearer', 'expires_in' => auth('api')->factory()->getTTL() * 60 ]); }}路由: ...

October 19, 2020 · 2 min · jiezi

关于laravel:Laravel-统一错误处理为-JSON

Laravel中的AppExceptionsHandler 类负责记录应用程序触发的所有异样,这在咱们开发过程中非常不便,总是try...catch使代码太过繁琐且可读性大大降低,那么怎么应用它解决异样为json呢? 咱们能够新建一个class,用来解决异样返回。 <?php/** * Author: sai * Date: 2020/1/15 * Time: 14:31 */namespace App\Exceptions;class ApiException extends \Exception{ const ERROR_CODE = 1001; const ERROR_MSG = 'ApiException'; private $data = []; /** * BusinessException constructor. * * @param string $message * @param string $code * @param array $data */ public function __construct(string $message, string $code, $data = []) { $this->code = $code ? : self::ERROR_CODE; $this->message = $message ? : self::ERROR_MSG; $this->data = $data; } /** * @return array */ public function getData() { return $this->data; } /** * 异样输入 */ public function render($request) { return response()->json([ 'data' => $this->getData(), 'code' => $this->getCode(), 'messgae' => $this->getMessage(), ], 200); }}而后咱们在Handler退出,退出$dontReport,便不会应用自带的错误处理,而应用自定义的解决。 ...

October 18, 2020 · 1 min · jiezi

关于laravel:Laravel6配合MaatwebsiteExcel-实现-Excel-导入

前一段须要我的项目中须要通过Excel导入用户,之前用过phpexcel,总感觉太过繁琐,印象中phpexcel也很久没更新,看到我的项目中有应用Maatwebsite\Excel,便尝试应用一下。 装置composer require maatwebsite/excel导入生成导入类php artisan make:import AdminsImport --model=Admin会看到app上面生成了Imports文件夹。 欠缺业务逻辑<?phpnamespace App\Imports;use App\Models\Admin;use function EasyWeChat\Kernel\Support\str_random;use Maatwebsite\Excel\Concerns\ToModel;class AdminsImport implements ToModel{ /** * @param array $row * * @return \Illuminate\Database\Eloquent\Model|null */ public function model(array $row) { //过滤表头和空行,我这边表头的第一个单元格是id,具体自行调整 if (empty($row[0]) || $row[0] == 'id') { return null; } return new Admin([ 'username' => $row[2], 'password' => bcrypt($row[3]), 'api_token' => str_random(60), ]); }}导入工作<?phpnamespace App\Console\Commands;use App\Imports\AdminsImport;use Illuminate\Console\Command;use Maatwebsite\Excel\Facades\Excel;class ImportAdmin extends Command{ /** * The name and signature of the console command. * * @var string */ protected $signature = 'importAdmin'; /** * The console command description. * * @var string */ protected $description = '导入admin'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { Excel::import(new AdminsImport(), storage_path('files/export.xlsx')); $this->info($this->description.'实现'); }}其余逻辑当然,可能业务必不仅仅是写入数据,可能有一些设计具体业务的操作,那么你能够这样操作。 ...

October 18, 2020 · 3 min · jiezi

关于laravel:Laravel6-配合-MaatwebsiteExcel-实现-Excel-导出

相比导入,我的项目中导出场景更多,估摸着当初有十多个导出了,之前写了导入,这会才把导出补上。 装置之前说过,这里说一下配置,尽管已有默认配置,但还是有批改配置的场景,所以倡议生成配置文件。 配置//生成config/excel.phpphp artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"配置只提一个,其余正文蛮细的, 'csv' => [ 'delimiter' => ',', 'enclosure' => '"', 'line_ending' => PHP_EOL, // 导出csv中文乱码,把use_bom设为true即可 'use_bom' => true, 'include_separator_line' => false, 'excel_compatibility' => false,],接下来,来实现一个导出的demo阐明下罕用的一些点。 DEMOphp artisan make:export MultiExport生成文件如下: <?phpnamespace App\Exports;use Maatwebsite\Excel\Concerns\FromCollection;class MultiExport implements FromCollection{ /** * @return \Illuminate\Support\Collection */ public function collection() { // }}自定义sheet,减少 WithTitle自定义列名,减少WithHeadings不想应用Collection,替换FromCollection应用FromArray多个sheet,替换FromCollection应用WithMultipleSheets通过革新: <?php/** * 多重导出 */namespace App\Exports;use App\Exports\MultiExportA;use App\Exports\MultiExportB;use Maatwebsite\Excel\Concerns\WithMultipleSheets;class MultiExport implements WithMultipleSheets{ private $date; public function __construct($date) { $this->date = $date; } public function sheets(): array { $sheets = []; $sheets[] = new MultiExportA($this->date); $sheets[] = new MultiExportB($this->date); return $sheets; }}---// MultiExportA,MultiExportB类比即可<?phpnamespace App\Exports;use Maatwebsite\Excel\Concerns\FromArray;use Maatwebsite\Excel\Concerns\WithHeadings;use Maatwebsite\Excel\Concerns\WithTitle;use App\Models\ExportA;class MultiExportA implements FromArray, WithTitle, WithHeadings{ private $date; public function __construct($date, $cityId) { $this->date = $date; } public function headings(): array { return [ 'ID', '名称', '价格', '手机' ]; } /** * @return array */ public function array() : array { $data = ExportA::where('date', $this->date) ->get() ->toArray(); $ret = []; foreach ($data as $val) { // 一段神奇的代码计算出了价格 $price = ...; $ret[] = [ 'id' => $val['id']."\t", 'name' => $val['name'], 'price' => $price, // 转换为文本,编码excel应用了迷信计数法 'mobile' => $val['mobile']."\t", ]; } return $ret; } /** * @return string */ public function title(): string { return '表格A'; }}应用 ...

October 18, 2020 · 1 min · jiezi

关于laravel:Laravel常用代码合集

用Laravel也有不短的工夫了,也用过不少版本了,以下代码是在日常我的项目中收集,作为笔记,也分享进去,心愿对你有点用途。注:版本没标注,若有不兼容的问题,微调即可。 验证不太习惯独自弄个Request验证类,比拟习惯上面的写法: use Illuminate\Http\Request;use Illuminate\Support\Facades\Validator; $inputData = $request->only(['name', 'address', 'mobile', 'draw_id']); $messages = [ 'required'=>':attribute为必填项', 'int'=>':attribute参数类型谬误', 'max'=>':attribute长度不得超过 :size', ]; $validator = Validator::make($inputData, [ 'draw_id' => 'required|int', 'name' => 'required', 'mobile' => 'required', 'address' => 'required', ], $messages,[ 'name'=>'收货人姓名', 'mobile'=>'手机号码', 'address'=>'收货地址', ]); if ($validator->fails()) { return self::response([], current($validator->errors()->all()), 2); }自定义验证比方罕用的手机号验证: php artisan make:rule Mobile而后改一下: /** * Mobile次要代码 * 验证是否通过 * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value) { // return preg_match('/^1\d{10}$/', $value); } /** * 错误信息 * * @return string */ public function message() { return '手机号格局不正确'; }而后这么用起来: ...

October 16, 2020 · 4 min · jiezi

关于laravel:Laravel-使用-Elasticsearch-作为日志存储

简介在理论开发中,咱们发现在 Debug 的时候常常须要查问日志。而传统的形式是须要 SSH 到生产环境,而后应用 cat,tail 和 grep 等命令查问日志,且无奈进行日志的统计和剖析,深度开掘这些日志的价值。本片文章的侧重点在于优雅的让 Laravel 间接将日志写入 Elasticsearch,当然你也能够抉择应用Filebeat 采集 Laravel 的本地日志。 装置Elasticsearch依赖包composer require elasticsearch/elasticsearch .env环境变量配置# 批改日志存在通道LOG_CHANNEL=elasticsearch# 增加 elasticsearch 日志存储配置ELASTIC_HOST=http://elasticsearch:9200 # elasticsearch 服务地址ELASTIC_LOGS_INDEX=shopem-store-es-logs # elasticsearch 日志存储索引名 增加日志通道在config/logging.php 文件里的 channels 里增加如下配置 'elasticsearch' => [ 'driver' => 'monolog', 'level' => 'debug', 'handler' => \Monolog\Handler\ElasticsearchHandler::class, 'formatter' => \Monolog\Formatter\ElasticsearchFormatter::class, 'formatter_with' => [ 'index' => env('ELASTIC_LOGS_INDEX'), 'type' => '_doc', ], 'handler_with' => [ 'client' => \Elasticsearch\ClientBuilder::create()->setHosts([env('ELASTIC_HOST')])->build(), ],], ...

October 12, 2020 · 1 min · jiezi

关于laravel:9-个-Laravel-Auth-脚手架相关的小技巧

转载自 Laravel 论坛:https://learnku.com/laravel/t...Laravel领有一个很棒的现成的用户认证零碎,当然咱们也须要在在某些中央自定义一些配置。对于某些自定义配置,咱们并不需要再去寻找一个扩大包或者写一大堆代码。让咱们来钻研一下这套认证零碎背地暗藏着哪些乏味的性能。 技巧 1. Auth::routes() 参数咱们应该都晓得办法 Auth::routes() 来自于 Laravel UI package (在Laravel 7之前, 它被蕴含在内核中)。 但你晓得它能够承受一个数组来启用/禁用特定的认证路由吗? 对于Laravel 7,上面是可用的参数及其默认值: Auth::routes([ 'login' => true, 'logout' => true, 'register' => true, 'reset' => true, // 用于重置明码 'confirm' => false, // 用于额定的明码确认 'verify' => false, // 用于邮箱认证]);这些参数仅启用或禁用某些路由。 要理解它们是如何工作的,能够查看文件Laravel UI中的AuthRouteMethods: return function ($options = []) { // 登录路由... if ($options['login'] ?? true) { $this->get('login', 'Auth\LoginController@showLoginForm')->name('login'); $this->post('login', 'Auth\LoginController@login'); } // 登前途由... if ($options['logout'] ?? true) { $this->post('logout', 'Auth\LoginController@logout')->name('logout'); } // 注册路由... if ($options['register'] ?? true) { $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register'); $this->post('register', 'Auth\RegisterController@register'); } // 明码重设路由... if ($options['reset'] ?? true) { $this->resetPassword(); } // 明码确认路由... if ($options['confirm'] ?? class_exists($this->prependGroupNamespace('Auth\ConfirmPasswordController'))) { $this->confirmPassword(); } // 邮箱验证路由... if ($options['verify'] ?? false) { $this->emailVerification(); }};技巧 2. Laravel UI: 仅生成控制器官网文档指定了应用 Laravel UI 的次要办法: ...

September 23, 2020 · 3 min · jiezi

关于laravel:Laravel-Model-优化-属性缓存attribute-cache-优化

问题背景接上一篇博客:Laravel Model 优化 - 增加属性缓存(attribute cache) 之前实现的AttributeCacheHelper,尽管实现解决每次申请中动静属性反复触发SQL执行的问题,然而也引入了一个新的问题,减少了代码量,保护老本也减少了,增加100个动静属性,就要实现200个函数,应用数量大起来,算是个噩梦了。 实现缓存映射上面尝试改良这个问题,现将所有的缓存属性整合到一个数组中,通过cacheKey去指向解析函数。 首先实现一个数组 cacheable 用于治理attribute与实体函数的映射。 如balance的属性会映射到refreshBalance函数上。 private $cacheable = [ 'posts_count' => 'postCount', 'balancde' => 'refreshBalance',];如何解决这个属性映射呢,能够应用 PHP 提供的魔术办法 __ get 来进行解决,而后批改attribute cache helper的 __get 函数,首先会去查看这个属性是否在缓存映射数组中,如果存在的话,间接去缓存中获取该数据,如果数据不存在,则执行映射函数来获取执行后的后果,并缓存起来,反之,如果属性不存在缓存映射数组中,则转发到model自身的 __get 魔术办法中,再进行解决。 <?phpnamespace App\Traits;trait AttributeCacheHelper{ private $cachedAttributes = []; public function __get($key) { if (array_key_exists($key, $this->cacheable)) { return $this->getCachedAttribute($key, [$this, $this->cacheable[$key]]); } return parent::__get($key); } public function getCachedAttribute(string $key, callable $callable) { if (!array_key_exists($key, $this->cachedAttributes)) { $this->setCachedAttribute($key, call_user_func($callable)); } return $this->cachedAttributes[$key]; } public function setCachedAttribute(string $key, $value) { return $this->cachedAttributes[$key] = $value; } public function refresh() { $this->cachedAttributes = []; return parent::refresh(); }}实现以上操作后,改良的后属性缓存,便无需定义两个函数了,只须要定义一个映射函数,而后将其指向到须要结构的动静属性中即可。 ...

September 20, 2020 · 2 min · jiezi

关于laravel:扩展推荐-laraveldownloadlink-生成下载链接

转载自 Laravel 论坛:https://learnku.com/laravel/t...这个扩大包容许你生成文件的下载链接。 装置后,你能够执行以下操作: $link = DownloadLink::disk('public')->filePath('uploads/test.txt')->generate();// zkTu70fieUFZLGMoEP95l1RQfFj5zCOqHlM0XBTnc6ZaZTtm4GY5xPXGGLzLEAVe配置文件中的默认下载路由为「download」,所以如果你的域名是「example.com」,则应应用此链接: example.com/download/{link}// 例如example.com/download/zkTu70fieUFZLGMoEP95l1RQfFj5zCOqHlM0XBTnc6ZaZTtm4GY5xPXGGLzLEAVe留神: 你须要将 {link} 替换成生成的链接。 你能够应用以下命令公布配置文件: php artisan vendor:publish --provider="Armancodes\DownloadLink\DownloadLinkServiceProvider" --tag="config"这是已公布的配置文件的内容: return [ /* |-------------------------------------------------------------------------- | Download Route |-------------------------------------------------------------------------- | | Download route will be added to your app URL for using download links. | E.g. if your app URL is "example.com", then if your set the download route to | "download" it will be "example.com/download/{link}". | */ 'download_route' => 'download',];应用你能够应用给定名称显式设置要保留和下载的文件名: ...

September 16, 2020 · 1 min · jiezi

关于laravel:记录-Laravel-中-GraphQL-接口请求频率

前言起源:通常在产品的运行过程,咱们可能会做数据埋点,以此来晓得用户触发的行为,拜访了多少页面,做了哪些操作,来不便产品依据用户爱好的做不同的调整和举荐,同样在服务端开发层面,也要做好“数据埋点”,去记录接口的响应时长、接口调用频率,参数频率等,不便咱们从后端角度去剖析和优化问题,如果遇到异样行为或者大量攻打起源,咱们能够具体针对到某个接口去进行优化。 我的项目环境: framework:laravel 5.8+cache : redis >= 2.6.0目前我的项目中简直都应用的是 graphql 接口,采纳的 package 是 php lighthouse graphql,那么次要的场景就是去统计好,graphql 接口的申请次数即可。 实现GraphQL Record Middleware首先建设一个middleware 用于稍后记录接口的申请频率,在这里能够应用artisan 脚手架疾速创立: php artisan make:middleware GraphQLRecord<?phpnamespace App\Http\Middleware;use Closure;class GraphQLRecord{ /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { return $next($request); }}而后增加到 app/config/lighthouse.php middleware 配置中,或后增加到我的项目中 app/Http/Kernel.php 中,设置为全局中间件 'middleware' => [ \App\Http\Middleware\GraphQLRecord::class, \Nuwave\Lighthouse\Support\Http\Middleware\AcceptJson::class,],获取 GraphQL Operation Namepublic function handle($request, Closure $next){ $opName = $request->get('operationName'); return $next($request);}获取到 Operation Name 之后,开始就通过在Redis 来实现一个接口计数器。 ...

August 30, 2020 · 4 min · jiezi

关于laravel:laravel开源版华登区块狗

开源地址:https://github.com/tp5er/laravel-admin-block 介绍华登区块狗每只的价格在100至15000之间,分成5种狗: 普登是100至300之间, 勇登是301至900之间, 卓登是901至2500之间, 稀登是2501至6000之间, 承登是6001至15000之间。 每天下午开始抢狗,有9个工夫点:14:00 15:00、16:30、17:00、17:30、19:30、 20:00、20:30、21:00。 盈利点 平台提供宠物狗的交易信息、玩家交易信息对接、交易信用保护等服务,并收取交易手续费。大家在领养宠物狗的过程中,都在耗费微分,咱们不多计算,如果有2000人每天预约,每人充值30元/天,2000*30=6万元/天,一个月180万收益. 玩家收益: 1)这么好的我的项目分享给搭档,一级推广处分8%、二级3%、三级5%,也仅有三级。例如:你有100人直推团队,每人每天领养5000元总价值的区块宠物狗,因而团队收益是50003%100=15000元 2)每日产出 充值微分流程: 会员购买微分须要线下转账给平台指定账号以及备注好id,后盾收到款后,后盾给会员充值微分 会员买狗卖狗规定:点对点交易、无地方账户 集体对集体点对点交易,平台没有资金积淀、每天结算,平安、疾速点对点交易,没有资金池。所有交易金额不通过平台,点对点交易。也就是说,买狗时,你把钱打到对方账号;卖狗时,对方把钱打到你账号。 软件架构laravel + laravel-admin + mysql 齐全开源 装置教程git clone 仓库地址 your-pathcd your-pathcomposer installphp artisan admin:install定时工作 crontab -e* * * * * php your-path/artisan schedule:run >> /dev/null 2>&1工作队列 nohup php your-path/artisan queue:work --tries=3 --sleep=3 &GIT部署应用技巧目录权限chown -R www:www your-pathchmod 775 -R your-path/public/ your-path/storage/chmod 775 -R your-path/storage/app/疏忽权限导致git变动git config --add core.filemode false清理缓存命令php artisan clear-compiledphp artisan cache:clearphp artisan config:clearphp artisan route:clear应用阐明华登区块狗抢狗交易规则1、提前预约!(没抢到的,微分会退还)。 ...

August 14, 2020 · 1 min · jiezi

关于laravel:laravel开源版华登区块狗

开源地址:https://github.com/tp5er/laravel-admin-block 介绍华登区块狗每只的价格在100至15000之间,分成5种狗: 普登是100至300之间, 勇登是301至900之间, 卓登是901至2500之间, 稀登是2501至6000之间, 承登是6001至15000之间。 每天下午开始抢狗,有9个工夫点:14:00 15:00、16:30、17:00、17:30、19:30、 20:00、20:30、21:00。 盈利点 平台提供宠物狗的交易信息、玩家交易信息对接、交易信用保护等服务,并收取交易手续费。大家在领养宠物狗的过程中,都在耗费微分,咱们不多计算,如果有2000人每天预约,每人充值30元/天,2000*30=6万元/天,一个月180万收益. 玩家收益: 1)这么好的我的项目分享给搭档,一级推广处分8%、二级3%、三级5%,也仅有三级。例如:你有100人直推团队,每人每天领养5000元总价值的区块宠物狗,因而团队收益是50003%100=15000元 2)每日产出 充值微分流程: 会员购买微分须要线下转账给平台指定账号以及备注好id,后盾收到款后,后盾给会员充值微分 会员买狗卖狗规定:点对点交易、无地方账户 集体对集体点对点交易,平台没有资金积淀、每天结算,平安、疾速点对点交易,没有资金池。所有交易金额不通过平台,点对点交易。也就是说,买狗时,你把钱打到对方账号;卖狗时,对方把钱打到你账号。 软件架构laravel + laravel-admin + mysql 齐全开源 装置教程git clone 仓库地址 your-pathcd your-pathcomposer installphp artisan admin:install定时工作 crontab -e* * * * * php your-path/artisan schedule:run >> /dev/null 2>&1工作队列 nohup php your-path/artisan queue:work --tries=3 --sleep=3 &GIT部署应用技巧目录权限chown -R www:www your-pathchmod 775 -R your-path/public/ your-path/storage/chmod 775 -R your-path/storage/app/疏忽权限导致git变动git config --add core.filemode false清理缓存命令php artisan clear-compiledphp artisan cache:clearphp artisan config:clearphp artisan route:clear应用阐明华登区块狗抢狗交易规则1、提前预约!(没抢到的,微分会退还)。 ...

August 14, 2020 · 1 min · jiezi

关于laravel:开发laravel扩展

Preview effect

August 12, 2020 · 1 min · jiezi

关于laravel:Laravel-Homestead安装php-redis扩展

Laravel Homestead装置php redis扩大环境Homestead 0.6.0Homestead 装置参照 Laravel Homestead下的环境配置和装置。装置phpredis登录到 Homestead$ vagrant ssh下载 phpredis$ git clone https://github.com/phpredis/phpredis.git进入 phpredis 目录$ cd phpredis编译装置$ /usr/bin/phpize7.0$ ./configure --with-php-config=/usr/bin/php-config7.0$ make && make install这里的 php 版本是 7.0,所以 phpize 和 php-config 的版本也须要保持一致。编译装置实现后,redis 的 php 扩大在 modules 目录中,文件名是 redis.so。查看 php 的扩大目录$ php -i | grep extension_dirextension_dir => /usr/lib/php/20151012 => /usr/lib/php/20151012这里的扩大目录是/usr/lib/php/20151012。复制 redis.so 到 php 的扩大目录$ sudo cp ./modules/redis.so /usr/lib/php/20151012web模式下配置扩大创立 /etc/php/7.0/fpm/conf.d/20-redis.ini,代码如下:extension=redis.so查看 phpinfo 如上图所示,胜利在 web 模式下配置 redis 扩大。cli模式下配置扩大创立 /etc/php/7.0/cli/conf.d/20-redis.ini,代码如下:extension=redis.so查看 php 扩大$ php -m | grep redisredis如上所示,胜利在 cli 模式下配置 redis 扩大。

August 10, 2020 · 1 min · jiezi

关于laravel:如何将-Laravel-的日志推到-Kafka

Laravel Kafka Logger应用扩大包 laravel-kafka-logger 将 Laravel 的日志推到 Kafka,而后由 ELK 生产、存储、出现。 要求依赖要求php-rdkafka>=4.0.0依赖装置1.装置 rdkafka git clone --depth 1 https://github.com/edenhill/librdkafka.git /tmp/librdkafka && cd /tmp/librdkafka && ./configure && make -j$(nproc) && make install && rm -rf /tmp/librdkafkapecl install rdkafka2.装置 laravel-kafka-logger # Laravel 5.xcomposer require "hhxsv5/laravel-kafka-logger:~1.0.0"# Laravel 6.x & 7.xcomposer require "hhxsv5/laravel-kafka-logger:~2.0.0"开始应用1.批改配置文件 config/logging.php return [ 'channels' => [ // ... 'kafka' => Hhxsv5\LKL\KafkaLogger::getDefinition(['topic' => env('LOG_KAFKA_TOPIC', 'laravel-logs')]), ],];2.批改 .env LOG_CHANNEL=kafkaLOG_KAFKA_BROKER_LIST=kafka:9092LOG_KAFKA_TOPIC=laravel-logs3.好了,开始记日志 Log::info('用户登录', ['uid-hhxsv5']);

August 9, 2020 · 1 min · jiezi

关于laravel:开源文档管理系统-Wizard-123-发布

概述Wizard 是一款开源的文档管理系统,反对 Markdown 文档,Swagger 文档以及表格文档,适应于中小规模的技术团队文档治理,完全免费。Wizard 并不是一款云产品,不提供任何云服务,如果你的团队想要应用他,你必须在本人公司外部独立部署。正因为这样,你的数据和技术文档平安是有保障的,不会泄露给任何不信赖的第三方。 更新内容本次更新(1.2.3)次要蕴含以下内容 Markdown 文档减少 扩大语法,用于展现黑白背景的提醒文案优化 Latex 公式展现成果,解决导出 PDF 文档中无奈展现公式的问题Markdown 文档上传图片后,反对弹窗中批改图片展现宽度和高度其它 Bugfix更多功能更新参考我的项目的 Releases 页面。 性能概览我的项目的地址为 https://github.com/mylxsw/wizard作为一款开源的文档管理系统,Wizard 次要反对上面这些性能 文档治理 Markdown 文档治理,反对各种性能扩大(流程图,LaTex,数据结构等)Swagger API 文档治理表格 文档治理(相似于简化版的在线 Excel)用户权限 相似于 Gitlab 的权限管理体系,你能够建设用户组,为一组用户调配我的项目的读写权限基于 LDAP 的对立身份认证(LDAP/流动目录),你能够将其接入到公司对立的账户管理体系,只须要批改几行配置文档评论文档变更历史,文档变更差别比照多主题自在切换我的项目分组,你能够将一些相关联的我的项目组成一个组,不便更快的检索文档其它 文档附件文档分享浏览模式内容模板文档搜寻等等你能够拜访 http://wizard.aicode.cc/ 在线体验 Wizard 的性能。 在线版本的 Wizard 因为服务器配置比拟低,拜访可能会比较慢,而且权限比拟凋谢,任何人都能够编辑,内容比拟乱一些。局部性能展现Markdown 文档展现 Swagger 文档展现 光明主题模式 表格文档展现 文档差别比照 更多功能展现请查看我的项目的 Wiki 文档。 对于代码我的项目采纳了 Laravel 框架开发,目前版本曾经降级到 5.8(最开始为5.4,一路降级过去)。为了进步开发效率,放弃架构的简洁,在开发过程中,始终防止引入过多的内部组件,尽可能的利用 Laravel 提供的各种组件,比方 Authentication,Authorization,Events,Mail,Notifications 等,非常适合用来学习 Laravel 框架。 ...

August 4, 2020 · 1 min · jiezi

关于laravel:laravel-框架使用mongodb-保存日志

1.php 装置mongodb 扩大2.在laravel根目录,执行composer require mongodb/mongodb3.在logging.php 配置mongodb驱动 'mongodb' => [ 'driver' => 'monolog', 'handler' => Monolog\Handler\MongoDBHandler::class, 'formatter' => 'default', 'handler_with' => [ 'mongodb' => new Client("mongodb://localhost:27017"), 'database' => "mongolog", 'collection' => "logs", ], ],4.测试执行php artisan tinker输出:Log::warning("mongolog test");查看mongodb 数据库后果: use mongolog;db.logs.find()[ { "_id": {"$oid": "5f2789d82e933325a57cf5d2"},"channel": "local","context": { "exception": { "class": "Symfony\\Component\\Console\\Exception\\CommandNotFoundException", "message": "Command \"think\" is not defined.", "code": 0, "file": "/home/gordon/workspace/php/blog/vendor/symfony/console/Application.php:644", "trace": "#0 /home/gordon/workspace/php/blog/vendor/symfony/console/Application.php(228): Symfony\\Component\\Console\\Application->find('think')\n#1 /home/gordon/workspace/php/blog/vendor/symfony/console/Application.php(140): Symfony\\Component\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#2 /home/gordon/workspace/php/blog/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))\n#3 /home/gordon/workspace/php/blog/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#4 /home/gordon/workspace/php/blog/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#5 {main}" }},"datetime": {"$date": "2020-08-03T03:51:52.847Z"},"extra": [],"level": 400,"level_name": "ERROR","message": "Command \"think\" is not defined."}, { ...

August 3, 2020 · 1 min · jiezi

关于laravel:构造一个仿Laravel-Mvc框架-视图View

紧接着后面两篇内容,本章开始叙述视图模块的集成。 结构一个仿Laravel Mvc框架 - 路由结构一个仿Laravel Mvc框架 - 模型在laravel框架的视图中,常常用到blade模板,通过其简洁的语法和数据绑定形式,绝对于间接嵌入html中开发几乎不要难受太多。 上面咱们进行引入,与其对应的组件是 illuminate/view,引入命令如下: composer require "illuminate/view":"*" 而后须要在入口文件 public/index.php 处,配置好以下几点: blade模板编译门路视图寄存门路对视图服务及文件服务进行注册残缺操作代码如下: <?phpuse Illuminate\Container\Container;use Illuminate\Events\EventServiceProvider;use Illuminate\Http\Request;use Illuminate\Routing\RoutingServiceProvider;use Illuminate\Database\Capsule\Manager;use Illuminate\Support\Fluent;use Illuminate\View\ViewServiceProvider;use Illuminate\Filesystem\FilesystemServiceProvider;//首页入口//调用主动加载文件require __DIR__ . '/../vendor/autoload.php';//实例化服务容器,对事件服务提供者及路由服务提供者进行注册$app = new Container;with(new EventServiceProvider($app))->register();with(new RoutingServiceProvider($app))->register();//启动 Eloquent ORM模块进行配置$dbManager = new Manager();$dbManager->addConnection(require '../config/database.php');$dbManager->bootEloquent();//配置视图贮存模块$app->instance('config', new Fluent);//设置编译模板门路$app['config']['view.compiled'] = dirname(dirname(__FILE__)) . '/storage/framework/views';//视图门路$app['config']['view.paths'] = ['../resources/views/'];with(new ViewServiceProvider($app))->register();with(new FilesystemServiceProvider($app))->register();//加载路由配置require __DIR__ . './../app/Http/routes/routers.php';//实例化申请并散发解决申请$request = Request::createFromGlobals();$response = $app['router']->dispatch($request);//返回响应申请$response->send();配置实现后,开始编写blade模板,在下面的配置中,将视图寄存门路设置在框架下的resources/views/ 目录下,咱们尝试建设一个welcome.blade.php <h3>laravel blade 模板视图</h3>用户ID:{{ $data['id'] }} <br/>用户昵称:{{ $data['name'] }} <br/>用户账号:{{ $data['account'] }} <br/>而后再去更改首页控制器(IndexController)的逻辑,咱们将数据返回到该视图上。 ...

August 2, 2020 · 1 min · jiezi

关于laravel:构造一个仿Laravel-Mvc框架-视图View

紧接着后面两篇内容,本章开始叙述视图模块的集成。 结构一个仿Laravel Mvc框架 - 路由结构一个仿Laravel Mvc框架 - 模型在laravel框架的视图中,常常用到blade模板,通过其简洁的语法和数据绑定形式,绝对于间接嵌入html中开发几乎不要难受太多。 上面咱们进行引入,与其对应的组件是 illuminate/view,引入命令如下: composer require "illuminate/view":"*" 而后须要在入口文件 public/index.php 处,配置好以下几点: blade模板编译门路视图寄存门路对视图服务及文件服务进行注册残缺操作代码如下: <?phpuse Illuminate\Container\Container;use Illuminate\Events\EventServiceProvider;use Illuminate\Http\Request;use Illuminate\Routing\RoutingServiceProvider;use Illuminate\Database\Capsule\Manager;use Illuminate\Support\Fluent;use Illuminate\View\ViewServiceProvider;use Illuminate\Filesystem\FilesystemServiceProvider;//首页入口//调用主动加载文件require __DIR__ . '/../vendor/autoload.php';//实例化服务容器,对事件服务提供者及路由服务提供者进行注册$app = new Container;with(new EventServiceProvider($app))->register();with(new RoutingServiceProvider($app))->register();//启动 Eloquent ORM模块进行配置$dbManager = new Manager();$dbManager->addConnection(require '../config/database.php');$dbManager->bootEloquent();//配置视图贮存模块$app->instance('config', new Fluent);//设置编译模板门路$app['config']['view.compiled'] = dirname(dirname(__FILE__)) . '/storage/framework/views';//视图门路$app['config']['view.paths'] = ['../resources/views/'];with(new ViewServiceProvider($app))->register();with(new FilesystemServiceProvider($app))->register();//加载路由配置require __DIR__ . './../app/Http/routes/routers.php';//实例化申请并散发解决申请$request = Request::createFromGlobals();$response = $app['router']->dispatch($request);//返回响应申请$response->send();配置实现后,开始编写blade模板,在下面的配置中,将视图寄存门路设置在框架下的resources/views/ 目录下,咱们尝试建设一个welcome.blade.php <h3>laravel blade 模板视图</h3>用户ID:{{ $data['id'] }} <br/>用户昵称:{{ $data['name'] }} <br/>用户账号:{{ $data['account'] }} <br/>而后再去更改首页控制器(IndexController)的逻辑,咱们将数据返回到该视图上。 ...

August 2, 2020 · 1 min · jiezi

关于laravel:关于Laravel中的ServiceProvider

有些敌人说,看了很多材料也不太明确 ServiceProvider 到底是干嘛用的,明天我试图用大白话聊一聊 ServiceProvier。 构想一个场景,你写了一个CMS,那天然就蕴含了路由、配置、数据库迁徙、帮忙函数或类等。如果你要用 ServiceProvider 的形式接入到 Laravel,应该怎么办? 咱们在上述用了 “接入到 Laravel” 这样的字眼,实质上就是把这些信息通知 Kernel。如何通知呢?应用 Laravel 提供的 ServiceProvider,默认 ServiceProvider 要提供两个办法 register 和 boot。 register 就是把实例化对象的形式注册到容器中。boot 就是做一些把配置文件推到我的项目根目录下的 config 目录上面,加载配置到 Kernel 或加载路由等动作。 程序是先 register 再 boot。这点能够在源码中失去佐证: 干说也无趣,剖析一个开源的 ServiceProvider 更直观。 https://github.com/tymondesig... 看这个开源组件的 ServiceProvider 是怎么写的: https://github.com/tymondesig... public function boot(){ $path = realpath(__DIR__.'/../../config/config.php'); $this->publishes([$path => config_path('jwt.php')], 'config'); $this->mergeConfigFrom($path, 'jwt'); $this->aliasMiddleware(); $this->extendAuthGuard();}非常简单,把配置文件推到 config 目录下,加载配置文件,给中间件设置一个别名,扩大一下 AuthGuard。 看它的基类 https://github.com/tymondesig... public function register(){ $this->registerAliases(); $this->registerJWTProvider(); $this->registerAuthProvider(); $this->registerStorageProvider(); $this->registerJWTBlacklist(); $this->registerManager(); $this->registerTokenParser(); $this->registerJWT(); $this->registerJWTAuth(); $this->registerPayloadValidator(); $this->registerClaimFactory(); $this->registerPayloadFactory(); $this->registerJWTCommand(); $this->commands('tymon.jwt.secret');}protected function registerNamshiProvider(){ $this->app->singleton('tymon.jwt.provider.jwt.namshi', function ($app) { return new Namshi( new JWS(['typ' => 'JWT', 'alg' => $this->config('algo')]), $this->config('secret'), $this->config('algo'), $this->config('keys') ); });}/** * Register the bindings for the Lcobucci JWT provider. * * @return void */protected function registerLcobucciProvider(){ $this->app->singleton('tymon.jwt.provider.jwt.lcobucci', function ($app) { return new Lcobucci( new JWTBuilder(), new JWTParser(), $this->config('secret'), $this->config('algo'), $this->config('keys') ); });}实质上就是注册一些实例化对象的办法到容器,用于起初的主动拆卸,解决注入的依赖问题。 ...

July 31, 2020 · 1 min · jiezi