当前位置: 首页 > 工具软件 > Laravel-Phone > 使用案例 >

laravel-实践

白吕恭
2023-12-01

安装laravel

composer create-project --prefer-dist laravel/laravel larabbs "8.*"

查看版本号

php artisan --version

伪静态

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

laravel-modules安装

  1. 首先在 Laravel 项目根目录下使用 Composer 安装该扩展包
composer require nwidart/laravel-modules
  1. 通过运行如下命令来发布配置文件
php artisan vendor:publish --provider="Nwidart\Modules\LaravelModulesServiceProvider"
  1. 通过如下命令生成应用的第一个模块。
php artisan module:make Admin

4.要让模块目录中定义的类可以自动加载,需要配置根目录下的composer.json

{
  "autoload": {
    "psr-4": {
      "App\\": "app/",
      "Modules\\": "Modules/"
    }
  }
}
  1. 配置完成后运行以下命令让修改生效
composer dump-autoload
  1. 执行域名加模块名(例如:http://test.com/admin)

路由

基础

定义在 routes/api.php 文件中的路由,将自动应用 /api URI 前缀,可以通过修改 RouteServiceProvider 类来修改前缀和其他路由组选项。

  1. 基础路由
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\IndexController@test");
});
  1. 可用路由方法
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
  1. 可响应多个HTTP请求的路由
Route::match(['get', 'post'], '/', function () {
   //
});

Route::any('/', function () {
   //
});

路由参数

  1. 必填参数
Route::get('/user/{id}', function ($id) {
    return 'User '.$id;
});
//在路由中定义多个参数
Route::get('/posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});
  1. 可选参数
Route::get('/user/{name?}', function ($name = null) {
    return $name;
});

Route::get('/user/{name?}', function ($name = 'John') {
    return $name;
});
  1. 正则表达式约束
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']);
  1. 全局约束
// App\Providers\RouteServiceProvider 类的 boot 方法
public function boot()
{
    Route::pattern('id', '[0-9]+');
}

命名路由

Route::get('/user/profile', function () {
    //
})->name('profile');

路由名称应始终是唯一的

路由组

  1. 路由中间件
Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // 使用第一个和第二个中间件...
    });

    Route::get('/user/profile', function () {
        // 使用第一个和第二个中间件...
    });
});
  1. 控制器
use App\Http\Controllers\OrderController;

Route::controller(OrderController::class)->group(function () {
    Route::get('/orders/{id}', 'show');
    Route::post('/orders', 'store');
});
  1. 子域路由
Route::domain('{account}.example.com')->group(function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});
  1. 路由前缀
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;
    }
}
  1. 注册中间件
    在 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\IndexController@test");
});
//排除中间件
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]);

旧数据

  1. 在两次请求之间保持数据
$request->flash();
  1. 将请求数据的子集传送给 Session(将密码之类的敏感数据排除在 Session 外):
$request->flashOnly(['username', 'email']);
$request->flashExcept('password');
  1. 获取旧数据
//old 方法会从 Session 取出之前被闪存的输入数据
$request->old('username');

文件

  1. 获取上传的文件
$file = $request->file('photo');
$file = $request->photo;
$request->hasFile('photo')
//验证成功上传
$request->file('photo')->isValid()
//文件路径和扩展名
$path = $request->photo->path();
$extension = $request->photo->extension();
  1. 存储上传的文件
$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');

响应

  1. Response 对象
return response()->json($result,400);
  1. 文件下载
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
  1. 文件响应(用户的浏览器中显示文件)
return response()->file($pathToFile);
return response()->file($pathToFile, $headers);

验证和错误处理

  1. **创建Modules\Admin\Http\Requests\TestRequest **
php artisan modul:make-request TestRequest Admin
  1. 添加验证规则和提示信息
<?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需为整数'];
    }
}
  1. 自定义验证规则
    在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;
            }
        });
    }
  1. 异常处理
    在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);
    }
}
 类似资料: