目录
1.前言
Laravel是泰勒.奥特威尔(Taylor Otwell)使用PHP语言开发的一款开源的Web应用框架,于2011年6月首次发布,自发布以来备受PHP开发人员的喜爱,其用户的增长速度迅猛。
Laravel是套简洁、 优雅的框架,具有简洁且富于表达性的语法。Laravel 秉承“Don't RepeatYourself" (不要重复)的理念,提倡代码的重用。Laravel 还为开发大型应用提供了各种强大的支持功能,这些功能包括自动验证、路由、Session、 缓存、数据库迁移等。
2.Laravel框架的特点
Laravel框架具有以下特点。
(1)对外只提供一 个人口,从而让框架统-管理项目的所有请求。
(2)采用MVC ( Model-View-Contoller,模型-视图-控制器)设计模式,帮助团队更好地协同开发,为项目后期的维护提供方便。
(3)支持Composer依赖管理工具,可以为项目自动安装依赖包。
(4)采用ORM (Object Relational Mapping,对象关系映射)方式操作数据库,并支持AR ( ActiveRecord,活动记录)模式。
(5)注重代码的模块化和可扩展性。开发者可以通过Laravel组件库Packalyst找到想要添加的组件,组件库中目前大约有15000个程序包,可以满足大部分开发需求。
(6)自带各种方便的服务。Laravel框架提供了开箱即用的用户身份验证功能和缓存系统,以帮助Web应用程序可以快速开发出相应的功能。
(7)具有路由功能。Laravel框架通过路由分发每一 个请求,并可以对请求进行分组。Laravel框架的路由不是动态路由,所有访问的URL必须在路由的配置文件中进行定义,才可以解析到具体的控制器和方法中。
(8)提供Arisan命令行工具。Artisan 命令行是Laravel框架提供的一个比较实用的工具, 可以帮助开发人员自动完成一些工作。 使用Artisan 命令行工具可以自动创建一个模型或一 个控制器,还可以迁移数据库、查看路由等。
3.搭建开发环境
1.下载和安装Composer
1.1 使用安装程序
通过如下地址,下载 composer 的安装包
https://getcomposer.org/download/
1.2 安装阿里云镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
2. 创建laravel项目
两种方式
laravel 安装器
composer 安装
2.1composer 创建项目
https://learnku.com/laravel
说明:创建laravel 项目一定要选择一个英文目录
shift右键打开窗口 执行如下命令
composer create-project --prefer-dist laravel/laravel demo1
2.2 启动项目
php artisan serve
3. 数据库配置
数据库的配置存储于 database.config 中
但 database.config 中又读取了 .even 中的数据
所以需要修改 .env 中的数据库配置
修改完成后,执行如下命令,在指定的数据库中创建表
php artisan migrate:install
4.路由
laravel 的目的是开发项目,一个项目肯定有很多功能,有很多页面组成
与前面 MVC 中的 index.php 一样,laravel 中有一种机制能够根据用户请求的地址的不同,返回不同的页面(功能),这种机制就是路由
当前我们还是循序渐进的讲-- 首先测试一下,根据不同的请求返回不同的简答内容
laravel 框架的路由文件 routes/web.php
4.1 使用闭包返回简单内容
这种路由形式适合返回简单内容
Route::get('/hello',function(){
return 'hello';
});
4.2 使用闭包返回视图
这种方式可以返回更多的内容
比如返回一个视图
Route::get('/user', function () {
return view('user');
});
但是这种方式只能返回静态的html内容
4.3 执行控制器中的方法
事实上,在实际的开发中,我们更加常用的方式是,每个url定位到不同的控制器中的方法
也就是说,当我们请求某个地址时,不会通过view方法直接返回一个视图,而是首先执行某个控制器类中的某个方法,然后这个方法再返回视图
再 app\http\controllers 目录下创建一个控制器文件
输入如下命令
php artisan make:controller NewsController
5.中间件
中间件提供了一种方便的机制来过滤进入应用程序的 HTTP 请求。例如,Laravel 包含一个验证用户身份的中间件。 如果用户未能通过认证,中间件会把用户重定向到登录页面。 反之,用户如果通过验证, 中间件将把请求进一步转发到应用程序中。
当然,除了验证身份外,还可以编写其他的中间件来执行各种任务。例如:CORS 中间件可以负责为所有的应用返回的 responses 添加合适的响应头。日志中间件可以记录所有传入应用的请求。
Laravel 自带了一些中间件,包括身份验证、CSRF 保护等。所有的这些中间件都位于 app/Http/Middleware 目录。
5.1定义中间件
您可以使用 make:middleware
来创建一个中间件:
php artisan make:middleware CheckAge
该命令会在 app/Http/Middleware
目录下放置新的 CheckAge
类。
5.2注册中间件
5.2.1全局中间件
如果你希望中间件在应用处理每个 HTTP
请求期间运行, 只需要在 app/Http/Kernel.php
中的 $middleware
属性中列出这个中间件。
5.2.2中间件组
有时,您可能希望将多个中间件归为一个键,以使其更易于分配给路由。 您可以使用 HTTP 内核的 $middlewareGroups
属性来实现。
5.2.3中间件排序
很少情况下,你可能需要中间件以特定的顺序执行,但是当它们被分配到路由时,你无法控制它们的顺序。在这种情况下,可以使用 app/Http/Kernel.php 文件中的 $middlewarePriority 属性指定中间件的优先级。
5.2.4中间件参数
中间件还可以接收额外的参数。例如,如果你的应用程序需要在执行给定操作之前验证用户是否为给定的「角色」, 你可以创建一个 CheckRole
中间件,由它来接收「角色」名称作为附加参数。
6.csrf保护
Laravel 可以轻松使地保护你的应用程序免受 跨站请求伪造(CSRF)攻击。 跨站点请求伪造是一种恶意攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令。
Laravel 会自动为每个活跃的用户的会话生成一个 CSRF「令牌」。该令牌用于验证经过身份验证的用户是否是向应用程序发出请求的用户。
无论何时,当您在应用程序中定义 HTML 表单时,都应该在表单中包含一个隐藏的 CSRF 标记字段,以便 CSRF 保护中间件可以验证该请求,你可以使用 @csrf Blade 指令来生成令牌字段,如下:
<form method="POST" action="/profile">
@csrf
...
</form>
包含在 web 中间件组里 VerifyCsrfToken 中间件会自动验证请求里的令牌是否与存储在会话中令牌匹配。
6.1.CSRF 令牌 & JavaScript
当构建由 JavaScript 驱动的应用时,可以方便的让 JavaScript HTTP
函数库发起每一个请求时自动附上 CSRF 令牌。默认情况下,resources/js/bootstrap.js 文件中提供的 Axios HTTP 库会使用 cookie 中加密的 XSRF-TOKEN 的值然后在请求时自动发送 X-XSRF-TOKEN 标头。 如果不使用此库,则需要为应用程序手动配置此行为。
6.2.白名单
有时候你可能希望设置一组不需要的 CSRF 保护的 URL 。例如,如果你正在使用 Stripe 处理付款并使用了他们的 webhook 系统,你会需要从 CSRF 的保护中排除 Stripe webhook 处理程序路由,因为 Stripe 并不会给你的路由发送 CSRF 令牌。
典型做法,你可以把这类路由放在 routes/web.php 外,因为 RouteServiceProvider 的 web 中间件适用于该文件中的所有路由。不过,你也可以通过将这类 URL 添加到 VerifyCsrfToken 中间件的 $except 属性来排除对这类路由的 CSRF 保护。
6.3X-CSRF-TOKEN
除了检查 POST 参数中的 CSRF 令牌外, VerifyCsrfToken 中间件还会检查 X-CSRF-TOKEN 请求头。你应该将令牌保存在 HTML meta 标签中,如下:
<meta name="csrf-token" content="{{ csrf_token() }}">
然后,一旦你创建了 meta 标签,就可以指示像 jQuery 这样的库自动将令牌添加到所有请求的头信息中。还可以为基于 AJAX 的应用提供简单,方便的 CSRF 保护。如下:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
6.4X-XSRF-TOKEN
Laravel 将当前的 CSRF 令牌存储在一个 XSRF-TOKEN cookie
中,该 cookie 包含在框架生成的每个响应中。你可以使用 cookie 值来设置 X-XSRF-TOKEN 请求头。
这个 cookie 主要是作为一种方便的方式发送的,因为一些 JavaScript 框架和库,例如 Angular 和 Axios ,会自动将它的值放入 X-XSRF-TOKEN 头中。
7.控制器
为了替代在路由文件中以闭包形式定义的所有的请求处理逻辑,你可能想要使用控制类来组织这些行为。控制器能将相关的请求处理逻辑组成一个单独的类。控制器被存放在 app/Http/Controllers 目录。
7.1基础控制器
7.1.1定义控制器
下面是一个基础控制器类的例子。需要注意的是,该控制器继承了 Laravel 的基础控制器。该类控制器提供了一些便利的方法,比如 middleware 方法,该方法可以为控制器行为添加中间件:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\User;
class UserController extends Controller
{
/**
* 显示指定用户的简介
*
* @param int $id
* @return \Illuminate\View\View
*/
public function show($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
你可以像这样定义一个指向控制器行为的路由:
use App\Http\Controllers\UserController;
Route::get('user/{id}', [UserController::class, 'show']);
当一个请求与指定路由的 URI 匹配时, UserController 控制器中的 show 方法将会执行。路由参数也将会被传递给该方法。
7.1.2单行为控制器
如果你想要定义一个只处理单个行为的控制器,你可以在控制器中放置一个 __invoke 方法:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\User;
class ShowProfile extends Controller
{
/**
* 显示指定用户的简介
*
* @param int $id
* @return \Illuminate\View\View
*/
public function __invoke($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
当注册单个行为控制器的路由时不需要指名方法:
use App\Http\Controllers\ShowProfile;
Route::get('user/{id}', ShowProfile::class);
你可以通过 Artisan 命令工具里的 make:controller 命令中的 --invokable 选项来生成一个可调用的控制器
php artisan make:controller ShowProfile --invokable
7.2控制器中间件
中间件 可以在路由文件中分配给控制器的路由:
Route::get('profile', [UserController::class, 'show'])->middleware('auth');
然而,在控制器的构造函数中指定中间件更为方便。使用控制器构造函数中的 middleware 方法,可以轻松地将中间件分配给控制器。你甚至可以将中间件限制为只在控制器中的某些方法生效:
class UserController extends Controller
{
/**
* 实例化一个新的控制器实例
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('log')->only('index');
$this->middleware('subscribed')->except('store');
}
}
同时,控制器还允许你使用一个闭包来注册中间件。这为不定义整个中间件类的情况下为单个控制器定义中间件提供了一种便捷的方法:
$this->middleware(function ($request, $next) {
// ...
return $next($request);
});
8.请求
8.1接收请求
要通过依赖注入获取当前 HTTP 请求实例,你应该在控制器上引入 Illuminate\Http\Request 类。传入的请求实例将会由 服务容器 自动注入:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* 存储一个新用户
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
//
}
}
8.2依赖注入 & 路由参数
如果你的控制器需要从路由参数中获取数据,你应该在其他依赖项之后列入参数。举个例子,你的路由是这样定义的:
use App\Http\Controllers\UserController;
Route::put('user/{id}', [UserController::class, 'update']);
你可以通过下面的方法来定义控制器,使用 Illuminate\Http\Request 类来获取你的路由参数 id:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* 更新指定的用户
*
* @param Request $request
* @param string $id
* @return Response
*/
public function update(Request $request, $id)
{
//
}
}
8.2通过闭包路由获取参数
你也可以在路由闭包中使用 Illuminate\Http\Request 类, 服务容器会自动的将请求参数注入到路由闭包中:
use Illuminate\Http\Request;
Route::get('/', function (Request $request) {
//
});
9.响应
10.视图
10.1创建视图
视图包含应用程序的 HTML 服务,并且将控制器 / 应用程序逻辑与演示逻辑分开。视图文件存放于 resources/views 目录下。一个简单的视图代码如下所示:
<!-- View stored in resources/views/greeting.blade.php -->
<html>
<body>
<h1>Hello, {{ $name }}</h1>
</body>
</html>
将上述代码存储到 resources/views/greeting.blade.php 后,我们可以使用全局辅助函数 view 将其返回,例如:
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
如你所见, 传递给 view 辅助函数的第一个参数对应 resources/views 目录中视图文件的名称。第二个参数是应该可供视图使用的数据数组。在这种情况下,我们传递 name 变量,该变量将使用 Blade syntax 在视图中显示。
当然,视图文件也可以嵌套在 resources/views 目录的子目录中。「点」符号可以用来引用嵌套视图。例如,如果你的视图存储在 resources/views/admin/profile.blade.php,则可以这样引用它:
return view('admin.profile', $data);
10.1.1判断视图文件是否存在
如果需要判断视图文件是否存在,可以使用 View facade。如果存在,exists 方法会返回 true :
use Illuminate\Support\Facades\View;
if (View::exists('emails.customer')) {
//
}
10.1.2创建第一个可用视图
使用 first 方法,你可以创建给定数组视图中第一个存在的视图。 如果你的应用程序或开发的第三方包允许定制或覆盖视图,这非常有用:
return view()->first(['custom.admin', 'admin'], $data);
当然,也可以通过 View facade 调用这个方法:
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);
10.2向视图传递数据
正如在前面的示例中所看到的,可以将一组数据传递给视图:
return view('greetings', ['name' => 'Victoria']);
以这种方式传递信息时,数据应该是具有键 / 值对的数组。在视图中,可以使用相应的键访问每个值,例如 <?php echo $key; ?>。作为将完整的数据数组传递给 view 辅助函数的替代方法,您可以使用 with 方法将各个数据片段添加到视图中:
return view('greeting')->with('name', 'Victoria');
10.2.1与所有视图共享数据
有时候,你可能需要共享一段数据给应用程序的所有视图。 你可以在服务提供器的 boot 方法中调用视图门面(Facade)的 share 方法。例如,可以将它们添加到 AppServiceProvider 或者为它们生成一个单独的服务提供器:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
View::share('key', 'value');
}
}
11.总结
作为一个非常受欢迎的PHP框架,Laravel提供了一个简洁、优雅的方式来构建高质量的Web应用程序。在学习和使用Laravel的过程中,我获得了以下几点心得体会:
-
文档完善:Laravel的官方文档非常详细,对于初学者来说是一个非常好的学习资源。文档中提供了大量的示例代码和解释,帮助我快速理解和掌握框架的各个部分架构:Laravel采用了经典的MVC(Model-View-Controller)架构,使得代码分离和组织更加清晰。我可以将业务逻辑和界面逻辑分开,提高了代码的可维护性和可重用性。
-
强大的路由系统:Laravel的路由系统非常灵活和强大,可以根据URL路径和HTTP方法定义路由规则。我可以轻松地定义RESTful风格的API路由,简化了API的开发过程。
-
数据库操作简单:Laravel提供了简洁而强大的数据库操作接口,我可以使用Eloquent ORM来进行数据库查询和操作。Eloquent提供了简洁的查询语法和模型关联,大大减少了编写SQL语句的工作量。
-
强大的扩展性:Laravel支持丰富的扩展包,可以轻松地集成第三方库和组件。我可以通过Composer安装和管理扩展包,快速增加框架的功能和特性。
-
测试驱动开发:Laravel鼓励使用测试驱动开发(TDD)的方式编写代码,可以提高代码的质量和稳定性。框架内置了PHPUnit测试工具,并提供了简单的测试接口和断言方法。
总的来说,学习和使用Laravel框架是一种非常愉快和高效的体验。它的设计和开发理念非常先进,可以帮助开发人员快速构建高质量的Web应用程序。无论是初学者还是有一定经验的开发人员,都可以从Laravel中受益并提升自己的开发能力。