当前位置:网站首页>laravel-实践
laravel-实践
2022-08-08 16:28:00 【流火如夏xx】
安装laravel
composer create-project --prefer-dist laravel/laravel larabbs "8.*"
查看版本号
php artisan --version
伪静态
location / {
try_files $uri $uri/ /index.php?$query_string;
}
laravel-modules安装
- 首先在 Laravel 项目根目录下使用 Composer 安装该扩展包
composer require nwidart/laravel-modules
- 通过运行如下命令来发布配置文件
php artisan vendor:publish --provider="Nwidart\Modules\LaravelModulesServiceProvider"
- 通过如下命令生成应用的第一个模块。
php artisan module:make Admin
4.要让模块目录中定义的类可以自动加载,需要配置根目录下的composer.json
{
"autoload": {
"psr-4": {
"App\\": "app/",
"Modules\\": "Modules/"
}
}
}
- 配置完成后运行以下命令让修改生效
composer dump-autoload
- 执行域名加模块名(例如:http://test.com/admin)
路由
基础
定义在 routes/api.php 文件中的路由,将自动应用 /api URI 前缀,可以通过修改 RouteServiceProvider 类来修改前缀和其他路由组选项。
- 基础路由
Route::get('/greeting', function () {
return 'Hello World';
});
//http://laram.com/api/v1/admin/user
Route::group(['prefix' => 'v1/admin','middleware'=>'admin_api_auth'],function () {
//路径用“\”分割
Route::post('/user', "v1\[email protected]");
});
- 可用路由方法
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
- 可响应多个HTTP请求的路由
Route::match(['get', 'post'], '/', function () {
//
});
Route::any('/', function () {
//
});
路由参数
- 必填参数
Route::get('/user/{id}', function ($id) {
return 'User '.$id;
});
//在路由中定义多个参数
Route::get('/posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
- 可选参数
Route::get('/user/{name?}', function ($name = null) {
return $name;
});
Route::get('/user/{name?}', function ($name = 'John') {
return $name;
});
- 正则表达式约束
Route::get('/user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
Route::get('/user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
//正则表达式模式具
Route::get('/user/{id}/{name}', function ($id, $name) {
//
})->whereNumber('id')->whereAlpha('name');
Route::get('/user/{name}', function ($name) {
//
})->whereAlphaNumeric('name');
Route::get('/user/{id}', function ($id) {
//
})->whereUuid('id');
Route::get('/category/{category}', function ($category) {
//
})->whereIn('category', ['movie', 'song', 'painting']);
- 全局约束
// App\Providers\RouteServiceProvider 类的 boot 方法
public function boot()
{
Route::pattern('id', '[0-9]+');
}
命名路由
Route::get('/user/profile', function () {
//
})->name('profile');
路由名称应始终是唯一的
路由组
- 路由中间件
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// 使用第一个和第二个中间件...
});
Route::get('/user/profile', function () {
// 使用第一个和第二个中间件...
});
});
- 控制器
use App\Http\Controllers\OrderController;
Route::controller(OrderController::class)->group(function () {
Route::get('/orders/{id}', 'show');
Route::post('/orders', 'store');
});
- 子域路由
Route::domain('{account}.example.com')->group(function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
- 路由前缀
Route::prefix('admin')->group(function () {
Route::get('/users', function () {
// Matches The "/admin/users" URL
});
});
中间件
1.创建中间件
php artisan make:middleware EnsureTokenIsValid
将在app/Http/Middleware 目录中放置一个新的 EnsureTokenIsValid 类。HTTP 请求在到达应用程序之前必须通过这个中间件
以下中间件将在应用程序处理请求之前**执行一些任务:
<?php
namespace App\Http\Middleware;
use Closure;
class EnsureTokenIsValid
{
public function handle($request, Closure $next)
{
// 执行操作
return $next($request);
}
}
此中间件将在请求由应用程序处理后执行其任务:
<?php
namespace App\Http\Middleware;
use Closure;
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// 执行操作
return $response;
}
}
- 注册中间件
在 app/Http/Kernel.php 类的
$middleware ------------------>全局中间件
routeMiddleware ------------>将中间件分配给路由
'admin_api_auth' => \Modules\Admin\Http\Middleware\AdminApiAuth::class,
Route::get('/profile', function () {
//
})->middleware('admin_api_auth');
Route::middleware('admin')->prefix('v1/admin')->group(function () {
Route::post('/user', "v1\[email protected]");
});
//排除中间件
Route::withoutMiddleware([EnsureTokenIsValid::class])->group(function () {
Route::get('/profile', function () {
//
});
});
依赖注入和控制器
//构造函数注入
<?php
namespace App\Http\Controllers;
use App\Repositories\UserRepository;
class UserController extends Controller
{
/** * 用户存储库实例。 */
protected $users;
/** * 创建一个新的控制器实例。 * * @param \App\Repositories\UserRepository $users * @return void */
public function __construct(UserRepository $users)
{
$this->users = $users;
}
}
//方法注入
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/** * 存储一个新用户。 * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */
public function store(Request $request)
{
$name = $request->name;
//
}
}
请求
与请求交互
//检索请求路径 : http://larabbs/api/v1/admin/user
$request->path(): //api/v1/admin/user
//检查请求路径 / 路由
$request->is('api/v1/admin/*'):
$request->routeIs('admin.*'):
//检索请求 URL(完整 URL)
$request->url(): //http://larabbs/api/v1/admin/user
$request->fullUrl():
$request->fullUrlWithQuery(['type' => 'phone']);
//检索请求主机
$request->host();
$request->httpHost();
$request->schemeAndHttpHost();
//检索请求方法
$request->method();
$request->isMethod('post');
//请求头
$request->header('X-Header-Name')
$request->header('X-Header-Name', 'default');
$request->hasHeader('X-Header-Name');
//请求 IP 地址
$request->ip();
//请求协商
$request->getAcceptableContentTypes();
//接受内容类型的数组
$request->accepts(['text/html', 'application/json'])
接收数据
//检索所有输入数据
$request->all();
$request->collect();
//检索一个输入值
$request->input('name');
$request->input('name', 'Sally');
$request->input('products.0.name');
$request->input('products.*.name');
$request->input();
//从查询字符串中检索输入
$request->query('name');
//检索输入数据的一部分
$request->only(['username', 'password']);
$request->only('username', 'password');
$request->except(['credit_card']);
$request->except('credit_card');
//判断输入值是否存在
$request->has('name')
$request->has(['name', 'email'])
//存在,并且不为空
$request->filled('name')
//合并附加输入
$request->merge(['votes' => 0]);
//请求的输入数据中不存在相应的键
$request->mergeIfMissing(['votes' => 0]);
旧数据
- 在两次请求之间保持数据
$request->flash();
- 将请求数据的子集传送给 Session(将密码之类的敏感数据排除在 Session 外):
$request->flashOnly(['username', 'email']);
$request->flashExcept('password');
- 获取旧数据
//old 方法会从 Session 取出之前被闪存的输入数据
$request->old('username');
文件
- 获取上传的文件
$file = $request->file('photo');
$file = $request->photo;
$request->hasFile('photo')
//验证成功上传
$request->file('photo')->isValid()
//文件路径和扩展名
$path = $request->photo->path();
$extension = $request->photo->extension();
- 存储上传的文件
$path = $request->photo->store('images');
$path = $request->photo->store('images', 's3');
//接受路径、文件名和磁盘名作为其参数
$path = $request->photo->storeAs('images', 'filename.jpg');
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');
响应
- Response 对象
return response()->json($result,400);
- 文件下载
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
- 文件响应(用户的浏览器中显示文件)
return response()->file($pathToFile);
return response()->file($pathToFile, $headers);
验证和错误处理
- **创建Modules\Admin\Http\Requests\TestRequest **
php artisan modul:make-request TestRequest Admin
- 添加验证规则和提示信息
<?php
namespace Modules\Admin\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class TestRequest extends FormRequest
{
public function rules()
{
return [
'id'=>'required|is_positive_integer',
];
}
/** * Determine if the user is authorized to make this request. * * @return bool */
public function authorize()
{
return true;
}
public function messages()
{
return ['id.required'=>'id必填','id.is_positive_integer'=>'id需为整数'];
}
}
- 自定义验证规则
在Modules\Admin\ProvidersRouteServiceProvider下
use Validator;
public function boot()
{
parent::boot();
//验证正整数
Validator::extend('is_positive_integer', function($attribute, $value, $parameters, $validator) {
if (is_numeric($value) && is_int($value + 0) && ($value + 0) > 0) {
return true;
}else{
return false;
}
});
}
- 异常处理
在App\Exceptions\Handler下
public function render($request, Throwable $exception)
{
if($request->is("api/*")){
// api接口主动抛出的异常
if($exception instanceof ValidationException){
$result = [
"code"=>404,
"message"=>array_values($exception->errors())[0][0],
];
return response()->json($result,400);
}
else{
$result = [
"code"=>400,
"message"=>$exception->getMessage(),
];
return response()->json($result,400);
}
}
return parent::render($request, $exception);
}
}
边栏推荐
猜你喜欢
pytorch安装过程中出现torch.cuda.isavailable()=False问题
Share these new Blender plugins that designers must not miss in 2022
Taro小程序跨端开发入门实战
【软件工程之美 - 专栏笔记】40 | 最佳实践:小团队如何应用软件工程?
【入门PCB】立创eda的学习
腾讯云产品可观测最佳实践 (Function)
国产数据库的红利还能“吃”多久?
‘xxxx‘ is declared but its value is never read.Vetur(6133)
Jingdong T9 pure hand type 688 pages of god notes, SSM framework integrates Redis to build efficient Internet applications
基于LEAP模型的能源环境发展、碳排放建模预测及不确定性分析
随机推荐
[Unity entry plan] Unity instance - how to protect data members through encapsulation in C#
京东T9纯手打688页神笔记,SSM框架整合Redis搭建高效互联网应用
国产数据库的红利还能“吃”多久?
【MySQL哪些字段适合建索引,哪些查询条件会导致索引失效】
Redis design and implementation notes (1)
10 Top Open Source Caching Tools for Linux in 2020
携手数字创新 共筑国产生态 7月份AntDB与5款产品完成互认证
Beetl使用记录
论文解读(soft-mask GNN)《Soft-mask: Adaptive Substructure Extractions for Graph Neural Networks》
国内部分手机游戏开始显示用户IP属地
Building and Visualizing Sudoku Games with Pygame
NFT质押挖矿分红系统开发逻辑功能介绍
高数_证明_基本初等函数的导数公式
Grid 布局介绍
OpenAI怎么写作「谷歌小发猫写作」
Share these new Blender plugins that designers must not miss in 2022
Metamask插件中-添加网络和切换网络
力扣207,课程表
带你玩转“超大杯”ECS特性及实验踩坑【华为云至简致远】
Node简介