首页
统计
留言
Search
1
PHP中使用反射
995 阅读
2
phpstorm配置SFTP
938 阅读
3
Go语言——结构体
792 阅读
4
PhpStorm 使用 AI 代码生成工具 Codeium
778 阅读
5
关于PHP的垃圾回收机制
762 阅读
后端
PHP
Go
数据库
其他
前端
其他技术
生活杂谈
登录
Search
标签搜索
Laravel
Mysql
RPC
Redis
Liunx
PHP
CSS
ES
算法
开发工具
断点续传
反射
phpstorm
工具
防盗链
CURL
设计模式
面试
Nginx
搜索引擎
quhe.net
首页
栏目
后端
PHP
Go
数据库
其他
前端
其他技术
生活杂谈
页面
统计
留言
搜索到
43
篇与
后端
的结果
2025-03-13
PHP7到PHP8新特性(持续更新)
PHP 8.0PHP 8.1PHP 8.2PHP 8.3PHP 8.4
2025年03月13日
111 阅读
0 评论
0 点赞
2024-08-02
更换宝塔面板www目录的操作方法
一:如果是纯净系统还没安装宝塔面板:/mnt 更换成你的另一块磁盘分区名称第一步:进入mnt目录(mnt是数据盘名称,有很多是home,你的数据盘名称是什么就用那么名称替换data就好)cd /mnt 第二步:创建宝塔面板安装需要用的www目录mkdir www 第三步:建立/mnt/www的软连接到/www(也就是给系统根目录建立一个www的“快捷方式”指向/mnt/www)ln -s /mnt/www /www 第四步:正常安装宝塔面板即可二:如果已经安装了宝塔面板和WEB环境:/mnt 更换成你的另一块磁盘分区名称第一步:移动系统根目录下的www到mntmv /www /mnt/www 第二步:建立/data/www的软连接到/wwwln -s /mnt/www /www 第三步:重启服务器reboot 第四步:重启宝塔面板服务service bt restart 第五步:打开宝塔面板,CTRL+F5刷新浏览器缓存PS:Linux下的软链接类似于windows下的快捷方式 ,如上面的示例,当我们执行命令 cd /www/的时候 实际上是进入了 /mnt/ ,操作前切记备份数据,防止因误操作引起数据丢失!!!
2024年08月02日
40 阅读
0 评论
0 点赞
2023-10-13
DcatAdmin行操作按钮样式调整(图标+文字)
效果更改方式在 app/Admin/Actions/Grid/ 下新建 TextActions.php 文件,内容如下<?php namespace App\Admin\Actions\Grid; use Dcat\Admin\Grid\Displayers\Actions; /** * 重写行操作按钮样式 */ class TextActions extends Actions { /** * @return string */ protected function getViewLabel() { $label = trans('admin.show'); return '<i class="feather icon-eye text-success"></i> <span class="text-success">' . $label . '</span>  '; } /** * @return string */ protected function getEditLabel() { $label = trans('admin.edit'); return '<i class="feather icon-edit-1 text-custom"></i> <span class="text-custom">' . $label . '</span>  '; } /** * @return string */ protected function getQuickEditLabel() { $label = trans('admin.edit'); $label2 = trans('admin.quick_edit'); return '<i class="feather icon-edit-1 text-custom"></i> <span class="text-custom" title="' . $label2 . '">' . $label . '</span>  '; } /** * @return string */ protected function getDeleteLabel() { $label = trans('admin.delete'); return '<i class="feather icon-alert-triangle text-danger"></i> <span class="text-danger">' . $label . '</span>  '; } } 在 config/admin.php 中更改配置项 grid.grid_action_class, 如下// The global Grid action display class. 'grid_action_class' => App\Admin\Actions\Grid\TextActions::class,
2023年10月13日
76 阅读
0 评论
1 点赞
2022-12-28
Composer忽略环境扩展依赖强制安装
今天需要安装phpstan ,但是执行composer require的时候报错了,报之前的某个composer包需要某某拓展,但是因为这是本地环境,我并不需要管其他包的情况,我只想用phpstan,因此需要强制安装,命令如下:composer install --ignore-platform-reqs composer update --ignore-platform-reqs
2022年12月28日
176 阅读
0 评论
0 点赞
2022-12-06
Laravel 最佳实践
本文翻译自 https://github.com/alexeymezenin/laravel-best-practices单一职责原则一个类和一个方法应该只有一个责任。例如:public function getFullNameAttribute(): string { if (auth()->user() && auth()->user()->hasRole('client') && auth()->user()->isVerified()) { return 'Mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name; } else { return $this->first_name[0] . '. ' . $this->last_name; } }更优的写法:public function getFullNameAttribute(): string { return $this->isVerifiedClient() ? $this->getFullNameLong() : $this->getFullNameShort(); } public function isVerifiedClient(): bool { return auth()->user() && auth()->user()->hasRole('client') && auth()->user()->isVerified(); } public function getFullNameLong(): string { return 'Mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name; } public function getFullNameShort(): string { return $this->first_name[0] . '. ' . $this->last_name; }🔝 返回目录保持控制器的简洁如果您使用的是查询生成器或原始SQL查询,请将所有与数据库相关的逻辑放入Eloquent模型或Repository类中。例如:public function index() { $clients = Client::verified() ->with(['orders' => function ($q) { $q->where('created_at', '>', Carbon::today()->subWeek()); }]) ->get(); return view('index', ['clients' => $clients]); }更优的写法:public function index() { return view('index', ['clients' => $this->client->getWithNewOrders()]); } class Client extends Model { public function getWithNewOrders() { return $this->verified() ->with(['orders' => function ($q) { $q->where('created_at', '>', Carbon::today()->subWeek()); }]) ->get(); } }🔝 返回目录使用自定义Request类来进行验证把验证规则放到 Request 类中.例子:public function store(Request $request) { $request->validate([ 'title' => 'required|unique:posts|max:255', 'body' => 'required', 'publish_at' => 'nullable|date', ]); ... }更优的写法:public function store(PostRequest $request) { ... } class PostRequest extends Request { public function rules() { return [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', 'publish_at' => 'nullable|date', ]; } }🔝 返回目录业务代码要放到服务层中控制器必须遵循单一职责原则,因此最好将业务代码从控制器移动到服务层中。例子:public function store(Request $request) { if ($request->hasFile('image')) { $request->file('image')->move(public_path('images') . 'temp'); } ... }更优的写法:public function store(Request $request) { $this->articleService->handleUploadedImage($request->file('image')); ... } class ArticleService { public function handleUploadedImage($image) { if (!is_null($image)) { $image->move(public_path('images') . 'temp'); } } }🔝 返回目录DRY原则 不要重复自己尽可能重用代码,SRP可以帮助您避免重复造轮子。 此外尽量重复使用Blade模板,使用Eloquent的 scopes 方法来实现代码。例子:public function getActive() { return $this->where('verified', 1)->whereNotNull('deleted_at')->get(); } public function getArticles() { return $this->whereHas('user', function ($q) { $q->where('verified', 1)->whereNotNull('deleted_at'); })->get(); }更优的写法:public function scopeActive($q) { return $q->where('verified', 1)->whereNotNull('deleted_at'); } public function getActive() { return $this->active()->get(); } public function getArticles() { return $this->whereHas('user', function ($q) { $q->active(); })->get(); }🔝 返回目录使用ORM而不是纯sql语句,使用集合而不是数组使用Eloquent可以帮您编写可读和可维护的代码。 此外Eloquent还有非常优雅的内置工具,如软删除,事件,范围等。例子:SELECT * FROM `articles` WHERE EXISTS (SELECT * FROM `users` WHERE `articles`.`user_id` = `users`.`id` AND EXISTS (SELECT * FROM `profiles` WHERE `profiles`.`user_id` = `users`.`id`) AND `users`.`deleted_at` IS NULL) AND `verified` = '1' AND `active` = '1' ORDER BY `created_at` DESC更优的写法:Article::has('user.profile')->verified()->latest()->get();🔝 返回目录集中处理数据例子:$article = new Article; $article->title = $request->title; $article->content = $request->content; $article->verified = $request->verified; // Add category to article $article->category_id = $category->id; $article->save();更优的写法:$category->article()->create($request->validated());🔝 返回目录不要在模板中查询,尽量使用惰性加载例子 (对于100个用户,将执行101次DB查询):@foreach (User::all() as $user) {{ $user->profile->name }} @endforeach更优的写法 (对于100个用户,使用以下写法只需执行2次DB查询):$users = User::with('profile')->get(); @foreach ($users as $user) {{ $user->profile->name }} @endforeach🔝 返回目录注释你的代码,但是更优雅的做法是使用描述性的语言来编写你的代码例子:if (count((array) $builder->getQuery()->joins) > 0)加上注释:// 确定是否有任何连接 if (count((array) $builder->getQuery()->joins) > 0)更优的写法:if ($this->hasJoins())🔝 返回目录不要把 JS 和 CSS 放到 Blade 模板中,也不要把任何 HTML 代码放到 PHP 代码里例子:let article = `{{ json_encode($article) }}`;更好的写法:<input id="article" type="hidden" value='@json($article)'> Or <button class="js-fav-article" data-article='@json($article)'>{{ $article->name }}<button>在Javascript文件中加上:let article = $('#article').val();当然最好的办法还是使用专业的PHP的JS包传输数据。🔝 返回目录在代码中使用配置、语言包和常量,而不是使用硬编码例子:public function isNormal() { return $article->type === 'normal'; } return back()->with('message', 'Your article has been added!');更优的写法:public function isNormal() { return $article->type === Article::TYPE_NORMAL; } return back()->with('message', __('app.article_added'));🔝 返回目录使用社区认可的标准Laravel工具强力推荐使用内置的Laravel功能和扩展包,而不是使用第三方的扩展包和工具。如果你的项目被其他开发人员接手了,他们将不得不重新学习这些第三方工具的使用教程。此外,当您使用第三方扩展包或工具时,你很难从Laravel社区获得什么帮助。 不要让你的客户为额外的问题付钱。想要实现的功能标准工具第三方工具权限PoliciesEntrust, Sentinel 或者其他扩展包资源编译工具Laravel Mix, ViteGrunt, Gulp, 或者其他第三方包开发环境Laravel Sail, HomesteadDocker部署Laravel ForgeDeployer 或者其他解决方案自动化测试PHPUnit, MockeryPhpspec, Pest页面预览测试Laravel DuskCodeceptionDB操纵EloquentSQL, Doctrine模板BladeTwig数据操纵Laravel集合数组表单验证Request classes他第三方包,甚至在控制器中做验证权限Built-in他第三方包或者你自己解决API身份验证Laravel Passport, Laravel Sanctum第三方的JWT或者 OAuth 扩展包创建 APIBuilt-inDingo API 或者类似的扩展包创建数据库结构Migrations直接用 DB 语句创建本土化Built-in第三方包实时消息队列Laravel Echo, Pusher使用第三方包或者直接使用WebSockets创建测试数据Seeder classes, Model Factories, Faker手动创建测试数据任务调度Laravel Task Scheduler脚本和第三方包数据库MySQL, PostgreSQL, SQLite, SQL ServerMongoDB🔝 返回目录遵循laravel命名约定来源 PSR standards.另外,遵循Laravel社区认可的命名约定:对象规则更优的写法应避免的写法控制器单数ArticleControllerArticlesController路由复数articles/1article/1路由命名带点符号的蛇形命名users.show_activeusers.show-active, show-active-users模型单数UserUsershasOne或belongsTo关系单数articleCommentarticleComments, article_comment所有其他关系复数articleCommentsarticleComment, article_comments表单复数article_commentsarticle_comment, articleComments透视表按字母顺序排列模型article_useruser_article, articles_users数据表字段使用蛇形并且不要带表名meta_titleMetaTitle; article_meta_title模型参数蛇形命名$model->created_at$model->createdAt外键带有_id后缀的单数模型名称article_idArticleId, id_article, articles_id主键-idcustom_id迁移-2017_01_01_000000_create_articles_table2017_01_01_000000_articles方法驼峰命名getAllget_all资源控制器tablestoresaveArticle测试类驼峰命名testGuestCannotSeeArticletest_guest_cannot_see_article变量驼峰命名$articlesWithAuthor$articles_with_author集合描述性的, 复数的$activeUsers = User::active()->get()$active, $data对象描述性的, 单数的$activeUser = User::active()->first()$users, $obj配置和语言文件索引蛇形命名articles_enabledArticlesEnabled; articles-enabled视图短横线命名show-filtered.blade.phpshowFiltered.blade.php, show_filtered.blade.php配置蛇形命名google_calendar.phpgoogleCalendar.php, google-calendar.php内容 (interface)形容词或名词AuthenticationInterfaceAuthenticatable, IAuthenticationTrait使用形容词NotifiableNotificationTraitTrait (PSR)adjectiveNotifiableTraitNotificationEnumsingularUserTypeUserTypes, UserTypeEnumFormRequestsingularUpdateUserRequestUpdateUserFormRequest, UserFormRequest, UserRequestSeedersingularUserSeederUsersSeeder🔝 返回目录尽可能使用简短且可读性更好的语法例子:$request->session()->get('cart'); $request->input('name');更优的写法:session('cart'); $request->name;更多示例:常规写法更优雅的写法Session::get('cart')session('cart')$request->session()->get('cart')session('cart')Session::put('cart', $data)session(['cart' => $data])$request->input('name'), Request::get('name')$request->name, request('name')return Redirect::back()return back()is_null($object->relation) ? null : $object->relation->idoptional($object->relation)->idreturn view('index')->with('title', $title)->with('client', $client)return view('index', compact('title', 'client'))$request->has('value') ? $request->value : 'default';$request->get('value', 'default')Carbon::now(), Carbon::today()now(), today()App::make('Class')app('Class')->where('column', '=', 1)->where('column', 1)->orderBy('created_at', 'desc')->latest()->orderBy('age', 'desc')->latest('age')->orderBy('created_at', 'asc')->oldest()->select('id', 'name')->get()->get(['id', 'name'])->first()->name->value('name')🔝 返回目录使用IOC容器来创建实例 而不是直接new一个实例创建新的类会让类之间的更加耦合,使得测试越发复杂。请改用IoC容器或注入来实现。例子:$user = new User; $user->create($request->validated());更优的写法:public function __construct(User $user) { $this->user = $user; } ... $this->user->create($request->validated());🔝 返回目录避免直接从 .env 文件里获取数据将数据传递给配置文件,然后使用config()帮助函数来调用数据例子:$apiKey = env('API_KEY');更优的写法:// config/api.php 'key' => env('API_KEY'), // Use the data $apiKey = config('api.key');🔝 返回目录使用标准格式来存储日期,用访问器和修改器来修改日期格式例子:{{ Carbon::createFromFormat('Y-d-m H-i', $object->ordered_at)->toDateString() }} {{ Carbon::createFromFormat('Y-d-m H-i', $object->ordered_at)->format('m-d') }}更优的写法:// Model protected $casts = [ 'ordered_at' => 'datetime', ]; public function getSomeDateAttribute($date) { return $date->format('m-d'); } // View {{ $object->ordered_at->toDateString() }} {{ $object->ordered_at->some_date }}🔝 返回目录其他的一些好建议永远不要在路由文件中放任何的逻辑代码。尽量不要在Blade模板中写原始 PHP 代码。🔝 返回目录
2022年12月06日
78 阅读
0 评论
1 点赞
1
2
...
9