# zy_laravel_web **Repository Path**: liu-chengguo/zy_laravel_web ## Basic Information - **Project Name**: zy_laravel_web - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-01-24 - **Last Updated**: 2022-01-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 安装步骤 - 复制.env.example为.env - 配置.env里的数据库连接信息 - composer update - php artisan migrate - php artisan db:seed - php artisan key:generate - 登录后台:host/admin   帐号:admin  密码:123456 ## 使用教程 - 创建控制器 ``` bash php artisan make:controller PostController php artisan make:controller TestController -s 创建service 文件 ``` - 创建Model ``` bash php artisan make:model Post php artisan make:model Post -f // 生成 模型工厂 php artisan make:model Post -m // 生成 数据库迁移文件 php artisan make:model Post -s // 生成 数据库填充文件 php artisan make:model Post -e // 生成repository 文件 ``` - 创建自定义request规则 (表单验证) ``` bash php artisan make:request PostRequest ``` - 创建Repository仓库 ``` bash php artisan make:model Post -e php artisan make:repository PostRepository ``` - Repository仓库使用案例 ``` bash 创建: create($data) $repository->create(['name'=>'aaa'] ); 创建多个: createMultiple($data) $repository->createMultiple([['name'=>'aaa'] ,['name'=>'bbb']]); 特殊条件: filter($where) $repository->filter(['title'=>'test']) filter(){ Exmple: where('key' , 'value') Model文件下: scopeKey() } 修改: updateById(1,$data); $repository->updateById(1,['name'=>'test']); $repository->Where(['title'=>'test'])->update(['name'=>'test']); 查询: get() $repository->where('id', 4)->get(); 限制: limit($num) $repository->limit(3)->get(); 分页: paginate($num) $repository->paginate(3); ``` - 创建 Service 逻辑层 ``` bash php artisan make:controller TestController -s php artisan make:service PostService ``` - 使用iseed 导出填充文件 ``` bash php artisan iseed tablename php artisan seed:alltable ``` ## 框架层级 - 路由 请求方式有get、post、put、delete、any 文档参考地址:https://learnku.com/docs/laravel/8.x/routing/9365 ``` bash Route::get('/', 'Front\HomeController@index')->name('home.index'); ``` - 中间件 中间件提供了一种方便的机制来过滤进入应用程序的 HTTP 请求。例如,Laravel 包含一个验证用户身份的中间件。 如果用户未能通过认证,中间件会把用户重定向到登录页面。 反之,用户如果通过验证, 中间件将把请求进一步转发到应用程序中。 文档参考地址:https://learnku.com/docs/laravel/8.x/middleware/9366 例子:只有是成年人才能访问 , 用户年龄小于18 把用户重定向到上一层页面, 用户年龄大于等于18岁将把请求进一步转发到应用程序中 ``` bash php artisan make:middleware CheckAge ``` CheckAge文件 ```bash public function handle($request, Closure $next) { if ($request->age <= 18) { return back(); } return $next($request); } ``` 使用方法:在路由上增加路由参数或在路由上层新建一个路由组并设置中间件 ``` bash Route::middleware(['CheckAge'])->group(function () { Route::get('admin/profile', '') }); Route::get('admin/profile', '')->middleware('CheckAge'); ``` - 控制器 控制器和方法只用于流程控制 创建控制器并生成Service辅助层文件 (框架没有生成service文件的命令,这个命令是自定义的,参考App\Console\Commands目录下MakeService和MakeController文件) 控制器做业务转发和参数获取,模板调用,渲染。 ``` bash php artisan make:controller PostController -s 创建service 文件 php artisan make:service PostService 创建service 文件 ``` 使用方法 ``` bash class PostController extends Controller { public function store(Request $request , PostService $service) { // 在 service 文件下store 方法执行保存程序 return $service->store($request); } } ``` - 表单验证 Laravel 提供了几种不同的方法来验证传入应用程序的数据。 默认情况下,Laravel 的基类控制器使用了一个名为 ValidatesRequests 的 trait,它提供了一种方便的方法以使用各种强大的验证规则来验证传入的 HTTP 请求。 文档参考地址:https://learnku.com/docs/laravel/8.x/validation/9374 快速表单验证 ``` bash public function store(Request $request) { $validatedData = $request->validate([ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]); } public function store(Request $request) { $messages = ['required' => 'The :attribute field is required.',]; $rules = ['title' => 'required|unique:posts|max:255','body' => 'required',]; $validator = Validator::make($request->all(), $rules, $messages); } ``` 创建表单请求验证 ``` bash php artisan make:request StoreBlogPost ``` 添加一些验证规则到 rules 方法 ``` bash public function rules() { return [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]; } ``` 自定义验证属性: 表单验证失败会提示中文字段错误,例如:新闻标题必填,新闻标题不能重复,新闻标题必须小于255字符 ``` bash public function attributes() { return [ 'title' => '新闻标题', ]; } ``` 自定义错误消息 ``` bash public function messages() { return [ 'title.required' => 'A title is required', 'body.required' => 'A message is required', ]; } ``` 运行方式: 在方法注入 StoreBlogPostRequest 表单验证请求类 ``` bash class PostController extends Controller { public function store(StoreBlogPostRequest $request) { // todo } } ``` 显示验证错误信息 ``` bash @if ($errors->any()) @foreach ($errors->all() as $error)
  • {{ $error }}
  • @endforeach @endif ``` - 用户授权 Gate 和 Policy策略 授权操作有两种主要方式:gates 和策略。 ###Gates Gates 是用来决定用户是否授权执行给予动作的一个闭包函数,在 App\Providers\AuthServiceProvider 中使用 Gate 来定义 新建一个是否在黑名单中的一个闭包判断函数 , 如果返回true 不在黑名单中 , 返回false 在黑名单中 ``` bash public function boot() { $this->registerPolicies(); // 不在黑名单中 Gate::define('notin-back', function ($user, $xingqiuUser) { return $xingqiuUser->backlist === 0; }); } ``` ``` bash class PostController extends Controller { public function store(StoreBlogPostRequest $request) { // 方式一 Gate::allows('notin-back' , $xingqiuUser); // 方式二 授权不通过会抛出403 权限异常 Gate::authorize('notin-back' , $xingqiuUser); // 方式三 授权不通过会抛出403 权限异常 $this->authorize('notin-back' , $xingqiuUser); } } ``` ### Policy策略 生成策略 , 指定Model 和 guard 设置使用**前台或后台**登录用户的Model ``` bash php artisan make:policy PostPolicy --model=Post --guard=web ``` 策略方法 , 策略注册成功后, 里面会有 view ,create、update、delete 等方法 以下控制器方法将映射到其对应的策略方法: 控制器方法                        策略方法 index              =>          viewAny show              =>          view create              =>          create store              =>          create edit              =>          update update              =>          update destroy              =>          delete update 方法将接收一个 User 和一个 Post 实例作为参数,并应返回 true 或 false,指示用户是否被授权更新给定的 Post。所以,在这个例子中,让我们验证用户的 id 是否与帖子上的 user_id 匹配: ``` bash public function update(User $user, Post $post) { return $user->id === $post->user_id; } ``` 使用方式 ``` bash class PostController extends Controller { public function update(Request $request) { // 方式一 Gate::allows('update' , $post); // 方式二 授权不通过会抛出403 权限异常 Gate::authorize('update' , $post); // 方式三 授权不通过会抛出403 权限异常 $this->authorize('update' , $post); // 方式四 if ($user->can('update', $post)) { // 在相关策略上执行 "create" 方法... } } } // 方式五 中间件使用 Route::put('/post/{post}', function (Post $post) { // 当前用户可以更新帖子... })->middleware('can:update,post'); blade 模板中使用 @can('update', $post) @endcan @cannot('update', $post) @endcan @if(auth()->user()->can('update', $post)) @endif ``` - Service 复杂业务逻辑存放在service文件 ,辅助控制器层,使控制器程序简洁 服务层完成业务的处理; 例如:用户退出星球 , 退出需要执行的操作功能有是否在星球内、 是否是普通会员 、普通会员根据退出时间做退款操作、退出时间小于三天等等 ``` bash class PostController extends Controller { public function quit(Request $request , Service $service) { // 具体业务逻辑在 service 层 , 控制器代码更简洁 return $service->quit($request); } } ``` - Repository 仓库类 所有复杂查询等执行数据库操作 , 都需要在仓库类中定义 创建Model并生成repository辅助层文件 (框架没有生成repository文件的命令,这个命令是自定义的,参考App\Console\Commands目录下MakeRepository和MakeModel文件) ``` bash php artisan make:model Post -e // 创建model使自动创建仓库类 php artisan make:repository PostRepository ``` 例如, 首页查询我创建的星球列表, 我加入的星球列表 ``` bash class PostRepository extend Base{ // 获取我创建的星球 , 执行复杂的SQL查询 public function getMycreateXingqiu(){ return Model::where()->get(); } // 获取我加入的星球 public function getMyJoinXingqiu(){ return Model::where()->get(); } } class HomeService extends Base { // 首页程序的具体业务逻辑 public function index($request , PostRepository $repository) { $repository->getMycreateXingqiu(); // 获取我创建的星球 $repository->getMyJoinXingqiu(); // 获取我加入的星球 } } ``` - Model 模型 Laravel 的 Eloquent ORM 提供了一个漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,以及在数据表中插入新记录。 model层做关联,rpc业务等 同时在文件目录上又添加了Traits工具,做一些工具,服务单独分离,容易管理。 参考文档:https://learnku.com/docs/laravel/8.x/eloquent/9406 创建模型 , 创建模型命令后可以加其他参数 ,来生成更多其他文件 , 例如 -m 数据迁移文件,-s 数据填充文件,-c 创建控制器, -f 模型工厂 等,具体请参考官方文档 ``` bash php artisan make:model Post ``` 模型文件内只定义数据表的变量 , 关联模型方法, 数据查询ScopeWhere 条件方法 , 数据表枚举字段常量。 ``` bash class Xingqiu extends Base { //数据表名称 protected $table = 'xingqiu'; //主键 protected $primaryKey = 'flight_id'; //主键自增 public $incrementing = false; //自动管理时间 public $timestamps = false; // 批量填充 protected $fillable = ['name', 'brief']; // 数据库链接方式 protected $connection = 'connection-name'; /** * 关联模型 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo * * 与用户 一对一关联 */ public function users() { return $this->belongsTo(User::class, 'users_id', 'id'); } /** * 是否免费类型 免费 */ const Free_Yes = 0; /** * 是否免费类型 不免费 ,需支付 */ const Free_No = 1; /** * 是否免费数组 */ const Free_arr = [self::Free_Yes => '免费', self::Free_No => '收费']; /** * @param $value * @return mixed * 返回是否免费 类型 */ // $model->is_free_state 返回is_free对应的枚举类型 public function getIsFreeStateAttribute() { return self::Free_arr[$this->is_free] ?? ''; } } ``` - view Blade模板 Blade 是 Laravel 提供的一个简单而又强大的模板引擎。和其他流行的 PHP 模板引擎不同,Blade 并不限制你在视图中使用原生 PHP 代码 文档地址:https://learnku.com/docs/laravel/8.x/blade/9377 渲染 JSON ``` bash ``` 常用语句 ``` bash {{ $name }} {!! $name !!} // 条件判断 @if @elseif @else @endif @unless == @if(! xxx ) @isset($records) // $records 已经定义但不为空 @endisset @empty($records) // $records 为空…… @endempty // switch @switch($i) @case(1) First case... @break @case(2) Second case... @break @default Default case... @endswitch // 循环 @for ($i = 0; $i < 10; $i++) The current value is {{ $i }} @endfor @foreach ($users as $user)

    This is user {{ $user->id }}

    @endforeach @forelse ($users as $user)
  • {{ $user->name }}
  • @empty

    No users

    @endforelse @while (true)

    looping forever.

    @endwhile // loop 变量 @foreach ($users as $user) @if ($loop->first) This is the first iteration. @endif @if ($loop->last) This is the last iteration. @endif

    This is user {{ $user->id }}

    @endforeach // php代码 @php // @endphp // 引入子视图 @include() // 自定义 If 语句 Blade::if('cloud', function ($provider) { return config('filesystems.default') === $provider; }); @cloud('digitalocean') @endcloud ``` - 层级 Model 层最好就是纯粹的 Laravel 的 Eloquent Model,里面不要有业务逻辑。 增加 Repository 层,将 Model 的业务逻辑封装在这里。 增加 Service 层,将 Controller 的业务逻辑封装在这里。 Controller 层只负责数据获取、校验,调用相应 Service 的方法,返回数据。