- Laravel 教程
- Laravel - 首页
- Laravel - 概述
- Laravel - 安装
- Laravel - 应用结构
- Laravel - 配置
- Laravel - 路由
- Laravel - 中间件
- Laravel - 命名空间
- Laravel - 控制器
- Laravel - 请求
- Laravel - Cookie
- Laravel - 响应
- Laravel - 视图
- Laravel - Blade 模板
- Laravel - 重定向
- Laravel - 数据库操作
- Laravel - 错误与日志
- Laravel - 表单
- Laravel - 本地化
- Laravel - Session
- Laravel - 验证
- Laravel - 文件上传
- Laravel - 发送邮件
- Laravel - Ajax
- Laravel - 错误处理
- Laravel - 事件处理
- Laravel - Facades
- Laravel - Contracts
- Laravel - CSRF 保护
- Laravel - 认证
- Laravel - 授权
- Laravel - Artisan 命令行工具
- Laravel - 加密
- Laravel - 散列
- 理解发布流程
- Laravel - 游客用户权限
- Laravel - Artisan 命令
- Laravel - 分页自定义
- Laravel - Dump Server
- Laravel - Action URL
- Laravel 有用资源
- Laravel 快速指南
- Laravel - 有用资源
- Laravel - 讨论
Laravel 快速指南
Laravel - 概述
Laravel 是一个开源的 PHP 框架,它强大且易于理解。它遵循模型-视图-控制器 (MVC) 设计模式。Laravel 重用不同框架的现有组件,这有助于创建 Web 应用程序。因此设计的 Web 应用程序更加结构化和实用。
Laravel 提供了丰富的功能集,其中包含了 CodeIgniter、Yii 等 PHP 框架以及 Ruby on Rails 等其他编程语言的基本特性。Laravel 拥有非常丰富的功能,可以提高 Web 开发速度。
如果您熟悉 Core PHP 和 Advanced PHP,Laravel 将使您的任务更容易。如果您计划从头开始开发网站,它可以节省大量时间。此外,用 Laravel 构建的网站是安全的,可以防止多种 Web 攻击。
Laravel 的优势
在基于 Laravel 设计 Web 应用程序时,它为您提供以下优势:
由于 Laravel 框架,Web 应用程序变得更具可扩展性。
由于 Laravel 在开发 Web 应用程序时重用其他框架的组件,因此在设计 Web 应用程序时节省了大量时间。
它包含命名空间和接口,因此有助于组织和管理资源。
Composer
Composer 是一个包含所有依赖项和库的工具。它允许用户根据指定的框架(例如,Laravel 安装中使用的框架)创建项目。借助 Composer,可以轻松安装第三方库。
所有依赖项都记录在源文件夹中的 **composer.json** 文件中。
Artisan
Laravel 中使用的命令行界面称为 **Artisan**。它包含一组命令,可帮助构建 Web 应用程序。这些命令是从 Symphony 框架中整合的,从而在 Laravel 5.1(Laravel 的最新版本)中增加了附加功能。
Laravel 的特性
Laravel 提供以下关键特性,使其成为设计 Web 应用程序的理想选择:
模块化
Laravel 提供 20 个内置库和模块,有助于增强应用程序。每个模块都与 Composer 依赖项管理器集成,从而简化了更新。
可测试性
Laravel 包含有助于通过各种测试用例进行测试的功能和帮助程序。此功能有助于根据要求维护代码。
路由
Laravel 为用户提供了一种灵活的方法来定义 Web 应用程序中的路由。路由有助于更好地扩展应用程序并提高其性能。
配置管理
在 Laravel 中设计的 Web 应用程序将在不同的环境中运行,这意味着其配置将不断变化。Laravel 提供了一种一致的方法来有效地处理配置。
查询构建器和 ORM
Laravel 集成了一个查询构建器,它有助于使用各种简单的链式方法查询数据库。它提供了 **ORM**(对象关系映射)和称为 Eloquent 的 **ActiveRecord** 实现。
模式构建器
模式构建器在 PHP 代码中维护数据库定义和模式。它还跟踪数据库迁移方面的变化。
模板引擎
Laravel 使用 **Blade 模板**引擎,这是一种轻量级的模板语言,用于设计包含动态内容的预定义块的层次结构块和布局。
电子邮件
Laravel 包含一个 **mail** 类,它有助于从 Web 应用程序发送包含丰富内容和附件的邮件。
身份验证
用户身份验证是 Web 应用程序中的常见功能。Laravel 简化了身份验证的设计,因为它包括 **注册、忘记密码** 和 **发送密码提醒** 等功能。
Redis
Laravel 使用 **Redis** 连接到现有的会话和通用缓存。Redis 直接与会话交互。
队列
Laravel 包括队列服务,例如向大量用户发送电子邮件或指定的 **Cron** 作业。这些队列有助于更轻松地完成任务,而无需等待先前任务完成。
事件和命令总线
Laravel 5.1 包含 **命令总线**,它有助于以简单的方式执行命令和调度事件。Laravel 中的命令根据应用程序的生命周期运行。
Laravel - 安装
Laravel 使用 **composer** 来管理依赖项。在安装 Laravel 之前,请确保您的系统上已安装 Composer。在本节中,您将看到 Laravel 的安装过程。
您必须按照以下步骤将 Laravel 安装到您的系统中:
**步骤 1** - 访问以下网址并下载 composer 以将其安装到您的系统中。
https://getcomposer.org.cn/download/
**步骤 2** - 安装 Composer 后,在命令提示符中键入 Composer 命令来检查安装,如下面的屏幕截图所示。
**步骤 3** - 在您的系统中的任何位置为新的 Laravel 项目创建一个新目录。然后,移动到您创建新目录的路径,并在那里键入以下命令来安装 Laravel。
composer create-project laravel/laravel –-prefer-dist
现在,我们将重点关注 5.7 版本的安装。在 Laravel 5.7 版本中,您可以通过键入以下命令来安装完整的框架:
composer create-project laravel/laravel test dev-develop
该命令的输出如下所示:
Laravel 框架可以直接使用开发分支安装,该分支包含最新的框架。
**步骤 4** - 以上命令将在当前目录中安装 Laravel。通过执行以下命令启动 Laravel 服务。
php artisan serve
**步骤 5** - 执行上述命令后,您将看到如下所示的屏幕:
**步骤 6** - 复制上面屏幕截图中以灰色下划线的 URL,并在浏览器中打开该 URL。如果您看到以下屏幕,则表示 Laravel 已成功安装。
Laravel - 应用结构
Laravel 中的应用程序结构基本上是项目中包含的文件夹、子文件夹和文件的结构。在 Laravel 中创建项目后,我们将获得此处所示的应用程序结构概述。
此处显示的快照指的是 Laravel 的根文件夹,即 **laravel-project**。它包含各种子文件夹和文件。文件夹和文件的分析以及它们的功能方面如下所述:
App
它是应用程序文件夹,包含项目的整个源代码。它包含事件、异常和中间件声明。app 文件夹包含各种子文件夹,如下所述:
Console
Console 包含 Laravel 必要的 artisan 命令。它包含一个名为 **Commands** 的目录,其中所有命令都以适当的签名声明。**Kernal.php** 文件调用在 **Inspire.php** 中声明的命令。
如果我们需要在 Laravel 中调用特定命令,则应对此目录进行相应的更改。
Events
此文件夹包含项目的所有事件。
事件用于触发活动、引发错误或必要的验证,并提供更大的灵活性。Laravel 将所有事件保存在一个目录下。包含的默认文件是 **event.php**,其中声明了所有基本事件。
Exceptions
此文件夹包含处理异常所需的所有方法。它还包含处理所有异常的 **handle.php** 文件。
Http
**Http** 文件夹包含控制器、中间件和应用程序请求的子文件夹。由于 Laravel 遵循 MVC 设计模式,因此此文件夹包含为特定目录定义的模型、控制器和视图。
**Middleware** 子文件夹包含中间件机制,包括过滤器机制以及响应和请求之间的通信。
**Requests** 子文件夹包含应用程序的所有请求。
Jobs
**Jobs** 目录维护 Laravel 应用程序排队的活动。基类在所有作业之间共享,并提供一个中心位置来将它们放在一个屋檐下。
Listeners
侦听器依赖于事件,它们包含用于处理事件和异常的方法。例如,声明的 **login** 事件包含 **LoginListener** 事件。
Policies
策略是包含授权逻辑的 PHP 类。Laravel 包含一个功能,可以在此子文件夹内的策略类中创建所有授权逻辑。
Providers
此文件夹包含注册核心服务器事件和配置 Laravel 应用程序所需的所有服务提供商。
Bootstrap
此文件夹包含所有应用程序引导脚本。它包含一个名为 **cache** 的子文件夹,其中包含与缓存 Web 应用程序相关的所有文件。您还可以找到 **app.php** 文件,它初始化引导所需的脚本。
Config
**config** 文件夹包含 Laravel 应用程序平稳运行所需的各种配置和相关参数。config 文件夹中包含的各种文件如下所示。文件名根据与其关联的功能而运行。
Database
顾名思义,此目录包含数据库功能的各种参数。它包含三个子目录,如下所示:
**Seeds** - 这包含用于单元测试数据库的类。
**Migrations** - 此文件夹有助于查询 Web 应用程序中使用的数据库的迁移。
**Factories** - 此文件夹用于生成大量数据记录。
Public
这是根文件夹,用于初始化 Laravel 应用程序。它包含以下文件和文件夹:
.htaccess − 此文件提供服务器配置。
javascript 和 css − 这些文件被视为资源文件 (assets)。
index.php − 此文件是初始化 Web 应用程序所必需的。
Resources (资源)
Resources 目录包含增强 Web 应用程序的文件。此目录中包含的子文件夹及其用途解释如下:
assets − assets 文件夹包含 LESS 和 SCSS 等文件,这些文件是为 Web 应用程序设置样式所必需的。
lang − 此文件夹包含本地化或国际化的配置。
views − views 是与最终用户交互的 HTML 文件或模板,在 MVC 架构中起着主要作用。
请注意,resources 目录将被扁平化,而不是包含 assets 文件夹。下图显示了相同的图形表示:
Storage (存储)
这是存储所有日志和 Laravel 项目运行时经常需要的必要文件的文件夹。此目录中包含的子文件夹及其用途如下:
app − 此文件夹包含按顺序调用的文件。
framework − 它包含经常调用的会话、缓存和视图。
Logs − 所有异常和错误日志都记录在此子文件夹中。
Tests (测试)
所有单元测试用例都包含在此目录中。测试用例类的命名约定为 **驼峰式命名法 (camel_case)**,并遵循与类功能一致的约定。
Vendor (供应商)
Laravel 完全基于 Composer 依赖项,例如安装 Laravel 设置或包含第三方库等。Vendor 文件夹包含所有 Composer 依赖项。
除了上述文件之外,Laravel 还包含其他一些文件,这些文件在各种功能中起着主要作用,例如 GitHub 配置、包和第三方库。
应用程序结构中包含的文件如下所示:
Laravel - 配置
在上一章中,我们已经看到 Laravel 的基本配置文件包含在 **config** 目录中。在本章中,让我们讨论配置中包含的类别。
环境配置
环境变量是为 Web 应用程序提供 Web 服务列表的变量。所有环境变量都在 **.env** 文件中声明,其中包含初始化配置所需的参数。
默认情况下,**.env** 文件包含以下参数:
APP_ENV = local APP_DEBUG = true APP_KEY = base64:ZPt2wmKE/X4eEhrzJU6XX4R93rCwYG8E2f8QUA7kGK8 = APP_URL = https://127.0.0.1 DB_CONNECTION = mysql DB_HOST = 127.0.0.1 DB_PORT = 3306 DB_DATABASE = homestead DB_USERNAME = homestead DB_PASSWORD = secret CACHE_DRIVER = file SESSION_DRIVER = file QUEUE_DRIVER = sync REDIS_HOST = 127.0.0.1 REDIS_PASSWORD = null REDIS_PORT = 6379 MAIL_DRIVER = smtp MAIL_HOST = mailtrap.ioMAIL_PORT = 2525 MAIL_USERNAME = null MAIL_PASSWORD = null MAIL_ENCRYPTION = null
重要提示
使用 Laravel 的基本配置文件时,需要注意以下几点:
**.env** 文件不应提交到应用程序源代码管理,因为每个开发人员或用户都有一些预定义的 Web 应用程序环境配置。
对于备份选项,开发团队应该包含 **.env.example** 文件,其中应包含默认配置。
检索环境变量
可以通过 **env-helper** 函数访问在 **.env** 文件中声明的所有环境变量,这些函数将调用相应的参数。每当应用程序从用户端接收请求时,这些变量也会列入 **$_ENV** 全局变量中。您可以按如下所示访问环境变量:
'env' => env('APP_ENV', 'production'),
**env-helper** 函数在 **config** 文件夹中包含的 **app.php** 文件中调用。上面的示例调用基本本地参数。
访问配置值
您可以使用全局 config 辅助函数轻松访问应用程序中任何位置的配置值。如果配置值未初始化,则返回默认值。
例如,要设置默认时区,可以使用以下代码:
config(['app.timezone' => 'Asia/Kolkata']);
配置缓存
为了提高性能并提升 Web 应用程序的速度,缓存所有配置值非常重要。缓存配置值的命令是:
config:cache
以下屏幕截图显示了系统方法中的缓存:
维护模式
有时您可能需要更新一些配置值或对您的网站进行维护。在这种情况下,将其置于 **维护模式** 将使操作更容易。处于维护模式的此类 Web 应用程序会抛出名为 **MaintenanceModeException** 的异常,其状态代码为 503。
您可以使用以下命令启用 Laravel Web 应用程序的维护模式:
php artisan down
以下屏幕截图显示了 Web 应用程序停机时的外观:
完成更新和其他维护工作后,您可以使用以下命令禁用 Web 应用程序的维护模式:
php artisan up
现在,您可以发现网站显示输出,功能正常,表明维护模式已移除,如下所示:
Laravel - 路由
在 Laravel 中,所有请求都借助路由进行映射。基本路由将请求路由到关联的控制器。本章讨论 Laravel 中的路由。
Laravel 中的路由包括以下类别:
- 基本路由
- 路由参数
- 命名路由
基本路由
所有应用程序路由都在 **app/routes.php** 文件中注册。此文件告诉 Laravel 它应该响应的 URI,并且关联的控制器将对其进行特定调用。欢迎页面的示例路由可以在下面给出的屏幕截图中看到:
Route::get ('/', function () { return view('welcome');});
示例
请观察以下示例,以了解有关路由的更多信息:
app/Http/routes.php
<?php Route::get('/', function () { return view('welcome'); });
resources/view/welcome.blade.php
<!DOCTYPE html> <html> <head> <title>Laravel</title> <link href = "https://fonts.googleapis.com/css?family=Lato:100" rel = "stylesheet" type = "text/css"> <style> html, body { height: 100%; } body { margin: 0; padding: 0; width: 100%; display: table; font-weight: 100; font-family: 'Lato'; } .container { text-align: center; display: table-cell; vertical-align: middle; } .content { text-align: center; display: inline-block; } .title { font-size: 96px; } </style> </head> <body> <div class = "container"> <div class = "content"> <div class = "title">Laravel 5.1</div> </div> </div> </body> </html>
路由机制如下图所示:
现在让我们详细了解路由机制中涉及的步骤:
**步骤 1** − 最初,我们应该执行应用程序的根 URL。
**步骤 2** − 现在,执行的 URL 应与 **route.php** 文件中的相应方法匹配。在本例中,它应匹配方法和根 ('/') URL。这将执行相关函数。
**步骤 3** − 该函数调用模板文件 **resources/views/welcome.blade.php**。接下来,该函数调用带有参数 **'welcome'** 的 **view()** 函数,不使用 **blade.php**。
这将产生如下图所示的 HTML 输出:
路由参数
有时在 Web 应用程序中,您可能需要捕获通过 URL 传递的参数。为此,您应该修改 **routes.php** 文件中的代码。
您可以通过此处讨论的两种方式捕获 **routes.php** 文件中的参数:
必需参数
这些参数是必须捕获才能路由 Web 应用程序的参数。例如,必须从 URL 中捕获用户的识别号。这可以通过定义路由参数来实现,如下所示:
Route::get('ID/{id}',function($id) { echo 'ID: '.$id; });
可选参数
有时开发人员可以将参数设置为可选参数,并且可以在 URL 中的参数名称后添加 **?** 来实现。务必将默认值作为参数名称提及。请查看以下示例,该示例显示如何定义可选参数:
Route::get('user/{name?}', function ($name = 'TutorialsPoint') { return $name;});
以上示例检查值是否与 **TutorialsPoint** 匹配,并相应地路由到定义的 URL。
命名路由
命名路由允许以方便的方式创建路由。可以使用 route 定义上的 name 方法指定路由的链接。以下代码显示了使用控制器创建命名路由的示例:
Route::get('user/profile', 'UserController@showProfile')->name('profile');
用户控制器将调用参数为 **profile** 的函数 **showProfile**。参数使用 route 定义上的 **name** 方法。
Laravel - 中间件
中间件充当请求和响应之间的桥梁。它是一种过滤机制。本章向您解释 Laravel 中的中间件机制。
Laravel 包含一个中间件,用于验证应用程序用户是否已通过身份验证。如果用户已通过身份验证,则将其重定向到主页;否则,如果未通过身份验证,则将其重定向到登录页面。
可以通过执行以下命令创建中间件:
php artisan make:middleware <middleware-name>
将 **<middleware-name>** 替换为您中间件的名称。您创建的中间件可以在 **app/Http/Middleware** 目录中看到。
示例
请观察以下示例,以了解中间件机制:
**步骤 1** − 现在让我们创建 AgeMiddleware。要创建它,我们需要执行以下命令:
php artisan make:middleware AgeMiddleware
**步骤 2** − 成功执行命令后,您将收到以下输出:
**步骤 3** − **AgeMiddleware** 将在 **app/Http/Middleware** 中创建。新创建的文件将已经为您创建了以下代码。
<?php namespace App\Http\Middleware; use Closure; class AgeMiddleware { public function handle($request, Closure $next) { return $next($request); } }
注册中间件
在使用每个中间件之前,我们需要注册它。Laravel 中有两种类型的中间件。
- 全局中间件
- 路由中间件
**全局中间件** 将在应用程序的每个 HTTP 请求上运行,而 **路由中间件** 将分配给特定路由。中间件可以在 **app/Http/Kernel.php** 中注册。此文件包含两个属性 **$middleware** 和 **$routeMiddleware**。**$middleware** 属性用于注册全局中间件,**$routeMiddleware** 属性用于注册特定于路由的中间件。
要注册全局中间件,请在 $middleware 属性的末尾列出类。
protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ];
要注册特定于路由的中间件,请向 $routeMiddleware 属性添加键和值。
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, ];
示例
我们在前面的示例中创建了 **AgeMiddleware**。我们现在可以在特定于路由的中间件属性中注册它。注册该中间件的代码如下所示。
以下是 **app/Http/Kernel.php** 的代码:
<?php namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ]; protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'Age' => \App\Http\Middleware\AgeMiddleware::class, ]; }
中间件参数
我们还可以使用中间件传递参数。例如,如果您的应用程序具有不同的角色,例如用户、管理员、超级管理员等,并且您希望根据角色对操作进行身份验证,则可以通过使用中间件传递参数来实现此目的。我们创建的中间件包含以下函数,我们可以在 **$next** 参数后传递自定义参数。
public function handle($request, Closure $next) { return $next($request); }
示例
**步骤 1** − 通过执行以下命令创建 RoleMiddleware:
php artisan make:middleware RoleMiddleware
**步骤 2** − 成功执行后,您将收到以下输出:
**步骤 3** − 在 **app/Http/Middleware/RoleMiddleware.php** 中新创建的 RoleMiddleware 的 handle 方法中添加以下代码。
<?php namespace App\Http\Middleware; use Closure; class RoleMiddleware { public function handle($request, Closure $next, $role) { echo "Role: ".$role; return $next($request); } }
**步骤 4** − 在 **app\Http\Kernel.php** 文件中注册 RoleMiddleware。在该文件中添加以灰色突出显示的行以注册 RoleMiddleware。
**步骤 5** − 执行以下命令以创建 **TestController**:
php artisan make:controller TestController --plain
**步骤 6** − 成功执行上述步骤后,您将收到以下输出:
**步骤 7** − 将以下代码行复制到 **app/Http/TestController.php** 文件。
app/Http/TestController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class TestController extends Controller { public function index() { echo "<br>Test Controller."; } }
**步骤 8** − 在 **app/Http/routes.php** 文件中添加以下代码行。
app/Http/routes.php
Route::get('role',[ 'middleware' => 'Role:editor', 'uses' => 'TestController@index', ]);
**步骤 9** − 访问以下 URL 以测试带有参数的中间件
https://127.0.0.1:8000/role
**步骤 10** − 输出将如下图所示。
可终止中间件
可终止中间件在响应发送到浏览器后执行某些任务。这可以通过在中间件中创建具有terminate方法的中间件来实现。可终止中间件应与全局中间件一起注册。terminate方法将接收两个参数$request和$response。可以按照以下代码所示创建terminate方法。
示例
步骤 1 − 执行以下命令创建TerminateMiddleware。
php artisan make:middleware TerminateMiddleware
步骤 2 − 以上步骤将产生以下输出:
步骤 3 − 将以下代码复制到新创建的TerminateMiddleware中的app/Http/Middleware/TerminateMiddleware.php文件。
<?php namespace App\Http\Middleware; use Closure; class TerminateMiddleware { public function handle($request, Closure $next) { echo "Executing statements of handle method of TerminateMiddleware."; return $next($request); } public function terminate($request, $response) { echo "<br>Executing statements of terminate method of TerminateMiddleware."; } }
步骤 4 − 在app\Http\Kernel.php文件中注册TerminateMiddleware。在该文件中添加灰色突出显示的行以注册TerminateMiddleware。
步骤 5 − 执行以下命令创建ABCController。
php artisan make:controller ABCController --plain
步骤 6 − 成功执行URL后,您将收到以下输出:
步骤 7 − 将以下代码复制到app/Http/ABCController.php文件。
app/Http/ABCController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class ABCController extends Controller { public function index() { echo "<br>ABC Controller."; } }
**步骤 8** − 在 **app/Http/routes.php** 文件中添加以下代码行。
app/Http/routes.php
Route::get('terminate',[ 'middleware' => 'terminate', 'uses' => 'ABCController@index', ]);
步骤 9 − 访问以下URL以测试可终止中间件。
https://127.0.0.1:8000/terminate
**步骤 10** − 输出将如下图所示。
Laravel - 命名空间
命名空间可以定义为一类元素,其中每个元素都具有与该关联类唯一的名称。它可以与其他类中的元素共享。
命名空间声明
use关键字允许开发人员缩短命名空间。
use <namespace-name>;
Laravel中使用的默认命名空间是App,但是用户可以更改命名空间以与Web应用程序匹配。使用artisan命令创建用户定义的命名空间的方法如下:
php artisan app:name SocialNet
创建的命名空间可以包含各种功能,这些功能可以在控制器和各种类中使用。
Laravel - 控制器
在MVC框架中,字母“C”代表控制器。它充当视图和模型之间的流量导向器。在本章中,您将学习Laravel中的控制器。
创建控制器
根据您使用的操作系统,打开命令提示符或终端,并键入以下命令使用Artisan CLI(命令行界面)创建控制器。
php artisan make:controller <controller-name> --plain
将<controller-name>替换为您控制器的名称。这将创建一个简单的构造函数,因为我们正在传递参数——plain。如果您不想创建简单的构造函数,可以忽略该参数。创建的构造函数可以在app/Http/Controllers中看到。
您将看到已经为您完成了一些基本的编码工作,您可以添加自定义编码。创建的控制器可以通过以下语法从routes.php调用。
语法
Route::get(‘base URI’,’controller@method’);
示例
步骤 1 − 执行以下命令创建UserController。
php artisan make:controller UserController --plain
步骤 2 − 成功执行后,您将收到以下输出。
步骤 3 − 您可以在app/Http/Controller/UserController.php中看到创建的控制器,其中已经为您编写了一些基本代码,您可以根据需要添加自己的代码。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class UserController extends Controller { // }
控制器中间件
我们之前已经了解过中间件,它也可以与控制器一起使用。中间件也可以分配给控制器的路由或控制器构造函数中。您可以使用middleware方法将中间件分配给控制器。注册的中间件也可以限制在控制器的某些方法中。
将中间件分配到路由
Route::get('profile', [ 'middleware' => 'auth', 'uses' => 'UserController@showProfile' ]);
这里我们将auth中间件分配给profile路由中的UserController。
在控制器构造函数中分配中间件
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class UserController extends Controller { public function __construct() { $this->middleware('auth'); } }
这里我们使用UserController构造函数中的middleware方法分配auth中间件。
示例
步骤 1 − 将以下代码行添加到app/Http/routes.php文件中并保存。
routes.php
<?php Route::get('/usercontroller/path',[ 'middleware' => 'First', 'uses' => 'UserController@showPath' ]);
步骤 2 − 通过执行以下代码行创建名为FirstMiddleware的中间件。
php artisan make:middleware FirstMiddleware
步骤 3 − 将以下代码添加到新创建的FirstMiddleware(位于app/Http/Middleware)的handle方法中。
FirstMiddleware.php
<?php namespace App\Http\Middleware; use Closure; class FirstMiddleware { public function handle($request, Closure $next) { echo '<br>First Middleware'; return $next($request); } }
步骤 4 − 执行以下命令创建名为SecondMiddleware的中间件。
php artisan make:middleware SecondMiddleware
步骤 5 − 将以下代码添加到新创建的SecondMiddleware(位于app/Http/Middleware)的handle方法中。
SecondMiddleware.php
<?php namespace App\Http\Middleware; use Closure; class SecondMiddleware { public function handle($request, Closure $next) { echo '<br>Second Middleware'; return $next($request); } }
步骤 6 − 执行以下命令创建一个名为UserController的控制器。
php artisan make:controller UserController --plain
步骤 7 − 成功执行URL后,您将收到以下输出:
步骤 8 − 将以下代码复制到app/Http/UserController.php文件。
app/Http/UserController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class UserController extends Controller { public function __construct() { $this->middleware('Second'); } public function showPath(Request $request) { $uri = $request->path(); echo '<br>URI: '.$uri; $url = $request->url(); echo '<br>'; echo 'URL: '.$url; $method = $request->method(); echo '<br>'; echo 'Method: '.$method; } }
步骤 9 − 如果您尚未执行,请执行以下命令启动php的内部Web服务器。
php artisan serve
步骤 10 − 访问以下URL。
https://127.0.0.1:8000/usercontroller/path
步骤 11 − 输出将如下图所示。
RESTful资源控制器
在创建应用程序时,我们经常需要执行CRUD(创建、读取、更新、删除)操作。Laravel使这项工作变得轻松。只需创建一个控制器,Laravel就会自动提供所有CRUD操作的方法。您还可以为routes.php文件中的所有方法注册单个路由。
示例
步骤 1 − 执行以下命令创建一个名为MyController的控制器。
php artisan make:controller MyController
步骤 2 − 在以下文件中添加以下代码:
app/Http/Controllers/MyController.php文件。
app/Http/Controllers/MyController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class MyController extends Controller { public function index() { echo 'index'; } public function create() { echo 'create'; } public function store(Request $request) { echo 'store'; } public function show($id) { echo 'show'; } public function edit($id) { echo 'edit'; } public function update(Request $request, $id) { echo 'update'; } public function destroy($id) { echo 'destroy'; } }
步骤 3 − 在app/Http/routes.php文件中添加以下代码行。
app/Http/routes.php
Route::resource('my','MyController');
步骤 4 − 我们现在通过使用resource注册控制器来注册MyController的所有方法。以下是资源控制器处理的操作表。
方法 | 路径 | 动作 | 路由名称 |
---|---|---|---|
GET | /my | index | my.index |
GET | /my/create | create | my.create |
POST | /my | store | my.store |
GET | /my/{my} | show | my.show |
GET | /my/{my}/edit | edit | my.edit |
PUT/PATCH | /my/{my} | update | my.update |
DELETE | /my/{my} | destroy | my.destroy |
步骤 5 − 尝试执行下表中显示的URL。
URL | 描述 | 输出图片 |
---|---|---|
https://127.0.0.1:8000/my | 执行MyController.php的index方法 | index |
https://127.0.0.1:8000/my/create | 执行MyController.php的create方法 | create |
https://127.0.0.1:8000/my/1 | 执行MyController.php的show方法 | show |
https://127.0.0.1:8000/my/1/edit | 执行MyController.php的edit方法 | edit |
隐式控制器
隐式控制器允许您定义单个路由来处理控制器中的每个操作。您可以使用如下所示的Route:controller方法在route.php文件中定义它。
Route::controller(‘base URI’,’<class-name-of-the-controller>’);
将<class-name-of-the-controller>替换为您为控制器指定的类名。
控制器的方法名应以HTTP动词(如get或post)开头。如果以get开头,它将只处理get请求;如果以post开头,它将处理post请求。在HTTP动词之后,您可以为方法命名,但它应遵循URI的标题大小写版本。
示例
步骤 1 − 执行以下命令创建一个控制器。我们保留了类名ImplicitController。您可以随意为类命名。
php artisan make:controller ImplicitController --plain
步骤 2 − 成功执行步骤1后,您将收到以下输出:
步骤 3 − 将以下代码复制到
app/Http/Controllers/ImplicitController.php文件。
app/Http/Controllers/ImplicitController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class ImplicitController extends Controller { /** * Responds to requests to GET /test */ public function getIndex() { echo 'index method'; } /** * Responds to requests to GET /test/show/1 */ public function getShow($id) { echo 'show method'; } /** * Responds to requests to GET /test/admin-profile */ public function getAdminProfile() { echo 'admin profile method'; } /** * Responds to requests to POST /test/profile */ public function postProfile() { echo 'profile method'; } }
步骤 4 − 将以下代码行添加到app/Http/routes.php文件,以将请求路由到指定的控制器。
app/Http/routes.php
Route::controller('test','ImplicitController');
构造函数注入
Laravel服务容器用于解析所有Laravel控制器。因此,您可以对控制器在其构造函数中可能需要的任何依赖项进行类型提示。依赖项将自动解析并注入到控制器实例中。
示例
步骤 1 − 将以下代码添加到app/Http/routes.php文件。
app/Http/routes.php
class MyClass{ public $foo = 'bar'; } Route::get('/myclass','ImplicitController@index');
步骤 2 − 将以下代码添加到
app/Http/Controllers/ImplicitController.php文件。
app/Http/Controllers/ImplicitController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class ImplicitController extends Controller { private $myclass; public function __construct(\MyClass $myclass) { $this->myclass = $myclass; } public function index() { dd($this->myclass); } }
步骤 3 − 访问以下URL以测试构造函数注入。
https://127.0.0.1:8000/myclass
步骤 4 − 输出将如下图所示。
方法注入
除了构造函数注入外,您还可以对控制器的操作方法进行类型提示依赖项。
示例
步骤 1 − 将以下代码添加到app/Http/routes.php文件。
app/Http/routes.php
class MyClass{ public $foo = 'bar'; } Route::get('/myclass','ImplicitController@index');
步骤 2 − 将以下代码添加到
app/Http/Controllers/ImplicitController.php文件。
app/Http/Controllers/ImplicitController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class ImplicitController extends Controller { public function index(\MyClass $myclass) { dd($myclass); } }
步骤 3 − 访问以下URL以测试构造函数注入。
https://127.0.0.1:8000/myclass
它将产生以下输出:
Laravel - 请求
在本章中,您将详细学习Laravel中的请求。
检索请求URI
“path”方法用于检索请求的URI。is方法用于检索与方法参数中指定的特定模式匹配的请求URI。要获取完整的URL,我们可以使用url方法。
示例
步骤 1 − 执行以下命令创建一个名为UriController的新控制器。
php artisan make:controller UriController –plain
步骤 2 − 成功执行URL后,您将收到以下输出:
步骤 3 − 创建控制器后,在该文件中添加以下代码。
app/Http/Controllers/UriController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class UriController extends Controller { public function index(Request $request) { // Usage of path method $path = $request->path(); echo 'Path Method: '.$path; echo '<br>'; // Usage of is method $pattern = $request->is('foo/*'); echo 'is Method: '.$pattern; echo '<br>'; // Usage of url method $url = $request->url(); echo 'URL method: '.$url; } }
步骤 4 − 在app/Http/route.php文件中添加以下代码行。
app/Http/route.php
Route::get('/foo/bar','UriController@index');
步骤 5 − 访问以下URL。
https://127.0.0.1:8000/foo/bar
步骤 6 − 输出将如下图所示。
检索输入
可以在Laravel中轻松检索输入值。无论使用的是“get”还是“post”方法,Laravel方法都将以相同的方式检索这两种方法的输入值。我们可以通过两种方式检索输入值。
- 使用input()方法
- 使用Request实例的属性
使用input()方法
input()方法接受一个参数,即表单中字段的名称。例如,如果表单包含用户名字段,则可以通过以下方式访问它。
$name = $request->input('username');
使用Request实例的属性
与input()方法类似,我们可以直接从请求实例中获取username属性。
$request->username
示例
观察以下示例以了解更多关于请求的信息:
步骤 1 − 创建一个注册表单,用户可以在其中注册自己,并将表单存储在resources/views/register.php中
<html> <head> <title>Form Example</title> </head> <body> <form action = "/user/register" method = "post"> <input type = "hidden" name = "_token" value = "<?php echo csrf_token() ?>"> <table> <tr> <td>Name</td> <td><input type = "text" name = "name" /></td> </tr> <tr> <td>Username</td> <td><input type = "text" name = "username" /></td> </tr> <tr> <td>Password</td> <td><input type = "text" name = "password" /></td> </tr> <tr> <td colspan = "2" align = "center"> <input type = "submit" value = "Register" /> </td> </tr> </table> </form> </body> </html>
步骤 2 − 执行以下命令创建一个UserRegistration控制器。
php artisan make:controller UserRegistration --plain
步骤 3 − 成功执行上述步骤后,您将收到以下输出:
步骤 4 − 将以下代码复制到
app/Http/Controllers/UserRegistration.php控制器。
app/Http/Controllers/UserRegistration.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class UserRegistration extends Controller { public function postRegister(Request $request) { //Retrieve the name input field $name = $request->input('name'); echo 'Name: '.$name; echo '<br>'; //Retrieve the username input field $username = $request->username; echo 'Username: '.$username; echo '<br>'; //Retrieve the password input field $password = $request->password; echo 'Password: '.$password; } }
步骤 5 − 在app/Http/routes.php文件中添加以下代码行。
app/Http/routes.php
Route::get('/register',function() { return view('register'); }); Route::post('/user/register',array('uses'=>'UserRegistration@postRegister'));
步骤 6 − 访问以下URL,您将看到如下图所示的注册表单。键入注册详细信息并单击“注册”,您将在第二页看到我们已检索并显示的用户注册详细信息。
https://127.0.0.1:8000/register
步骤 7 − 输出将类似于以下图片。
Laravel - Cookie
Cookie在处理Web应用程序上的用户会话时起着重要作用。在本章中,您将学习如何在基于Laravel的Web应用程序中使用Cookie。
创建Cookie
Laravel 的全局 Cookie 助手可以创建 Cookie。它是一个 **Symfony\Component\HttpFoundation\Cookie** 的实例。可以使用 withCookie() 方法将 Cookie 附加到响应中。创建一个 **Illuminate\Http\Response** 类的响应实例来调用 withCookie() 方法。Laravel 生成的 Cookie 是加密和签名的,客户端无法修改或读取。
下面是一个带有说明的示例代码。
//Create a response instance $response = new Illuminate\Http\Response('Hello World'); //Call the withCookie() method with the response method $response->withCookie(cookie('name', 'value', $minutes)); //return the response return $response;
Cookie() 方法将接收 3 个参数。第一个参数是 Cookie 的名称,第二个参数是 Cookie 的值,第三个参数是 Cookie 自动删除之前的持续时间。
可以使用 forever 方法将 Cookie 设置为永久有效,如下面的代码所示。
$response->withCookie(cookie()->forever('name', 'value'));
检索 Cookie
设置 Cookie 后,可以使用 cookie() 方法检索 Cookie。此 cookie() 方法只接收一个参数,即 Cookie 的名称。可以使用 **Illuminate\Http\Request** 实例调用 cookie 方法。
下面是一个示例代码。
//’name’ is the name of the cookie to retrieve the value of $value = $request->cookie('name');
示例
观察下面的例子,了解更多关于 Cookie 的信息:
**步骤 1** - 执行以下命令创建一个控制器,我们将在其中操作 Cookie。
php artisan make:controller CookieController --plain
**步骤 2** − 成功执行后,您将收到以下输出:
**步骤 3** - 将以下代码复制到
**app/Http/Controllers/CookieController.php** 文件中。
app/Http/Controllers/CookieController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Http\Response; use App\Http\Requests; use App\Http\Controllers\Controller; class CookieController extends Controller { public function setCookie(Request $request) { $minutes = 1; $response = new Response('Hello World'); $response->withCookie(cookie('name', 'virat', $minutes)); return $response; } public function getCookie(Request $request) { $value = $request->cookie('name'); echo $value; } }
**步骤 4** - 在 **app/Http/routes.php** 文件中添加以下行。
app/Http/routes.php
Route::get('/cookie/set','CookieController@setCookie'); Route::get('/cookie/get','CookieController@getCookie');
**步骤 5** - 访问以下 URL 来设置 Cookie。
https://127.0.0.1:8000/cookie/set
**步骤 6** - 输出将如下所示。截图中的窗口来自 Firefox,但根据您的浏览器,也可以从 Cookie 选项中检查 Cookie。
**步骤 7** - 访问以下 URL 从上面的 URL 获取 Cookie。
https://127.0.0.1:8000/cookie/get
**步骤 8** - 输出将如下面的图片所示。
Laravel - 响应
Web 应用程序根据许多参数以多种方式响应用户的请求。本章详细解释了 Laravel Web 应用程序中的响应。
基本响应
Laravel 提供了几种不同的返回响应方式。响应可以从路由或控制器发送。可以发送的基本响应是简单的字符串,如下面的示例代码所示。此字符串将自动转换为相应的 HTTP 响应。
示例
步骤 1 − 将以下代码添加到app/Http/routes.php文件。
app/Http/routes.php
Route::get('/basic_response', function () { return 'Hello World'; });
**步骤 2** - **访问**以下 URL 测试基本响应。
https://127.0.0.1:8000/basic_response
**步骤 3** - 输出将如下面的图片所示。
附加标头
可以使用 header() 方法将标头附加到响应中。我们还可以附加一系列标头,如下面的示例代码所示。
return response($content,$status) ->header('Content-Type', $type) ->header('X-Header-One', 'Header Value') ->header('X-Header-Two', 'Header Value');
示例
观察下面的例子,了解更多关于响应的信息:
步骤 1 − 将以下代码添加到app/Http/routes.php文件。
app/Http/routes.php
Route::get('/header',function() { return response("Hello", 200)->header('Content-Type', 'text/html'); });
**步骤 2** - 访问以下 URL 测试基本响应。
https://127.0.0.1:8000/header
**步骤 3** - 输出将如下面的图片所示。
附加 Cookie
**withcookie()** 助手方法用于附加 Cookie。使用此方法生成的 Cookie 可以通过使用响应实例调用 **withcookie()** 方法来附加。默认情况下,Laravel 生成的所有 Cookie 都是加密和签名的,因此客户端无法修改或读取它们。
示例
观察下面的例子,了解更多关于附加 Cookie 的信息:
步骤 1 − 将以下代码添加到app/Http/routes.php文件。
app/Http/routes.php
Route::get('/cookie',function() { return response("Hello", 200)->header('Content-Type', 'text/html') ->withcookie('name','Virat Gandhi'); });
**步骤 2** - **访问**以下 URL 测试基本响应。
https://127.0.0.1:8000/cookie
**步骤 3** - 输出将如下面的图片所示。
JSON 响应
可以使用 json 方法发送 JSON 响应。此方法会自动将 Content-Type 标头设置为 **application/json**。**json** 方法会自动将数组转换为相应的 **json** 响应。
示例
观察下面的例子,了解更多关于 JSON 响应的信息:
**步骤 1** - 在 **app/Http/routes.php** 文件中添加以下行。
app/Http/routes.php
Route::get('json',function() { return response()->json(['name' => 'Virat Gandhi', 'state' => 'Gujarat']); });
**步骤 2** - 访问以下 URL 测试 json 响应。
https://127.0.0.1:8000/json
**步骤 3** - 输出将如下面的图片所示。
Laravel - 视图
在 MVC 框架中,字母 **“V”** 代表 **视图**。它将应用程序逻辑和表示逻辑分开。视图存储在 **resources/views** 目录中。通常,视图包含应用程序将提供的 HTML。
示例
观察下面的例子,了解更多关于视图的信息:
**步骤 1** - 复制以下代码并将其保存到 **resources/views/test.php**
<html> <body> <h1>Hello, World</h1> </body> </html>
**步骤 2** - 在 **app/Http/routes.php** 文件中添加以下行,为上面的视图设置路由。
app/Http/routes.php
Route::get('/test', function() { return view('test'); });
**步骤 3** - 访问以下 URL 查看视图的输出。
https://127.0.0.1:8000/test
步骤 4 − 输出将如下图所示。
向视图传递数据
在构建应用程序时,可能需要向视图传递数据。将数组传递给视图助手函数。传递数组后,可以使用键在 HTML 文件中获取该键的值。
示例
观察下面的例子,了解更多关于向视图传递数据的信息:
**步骤 1** - 复制以下代码并将其保存到 **resources/views/test.php**
<html> <body> <h1><?php echo $name; ?></h1> </body> </html>
**步骤 2** - 在 **app/Http/routes.php** 文件中添加以下行,为上面的视图设置路由。
app/Http/routes.php
Route::get('/test', function() { return view('test',[‘name’=>’Virat Gandhi’]); });
**步骤 3** - 键名的值将传递给 test.php 文件,$name 将被该值替换。
**步骤 4** - 访问以下 URL 查看视图的输出。
https://127.0.0.1:8000/test
**步骤 5** - 输出将如下面的图片所示。
与所有视图共享数据
我们已经了解了如何向视图传递数据,但有时需要向所有视图传递数据。Laravel 使这变得更简单。有一种称为 **share()** 的方法可用于此目的。**share()** 方法将接收两个参数,键和值。通常,可以在服务提供者的 boot 方法中调用 **share()** 方法。我们可以使用任何服务提供者,**AppServiceProvider** 或我们自己的服务提供者。
示例
观察下面的例子,了解更多关于与所有视图共享数据的信息:
**步骤 1** - 在 **app/Http/routes.php** 文件中添加以下行。
app/Http/routes.php
Route::get('/test', function() { return view('test'); }); Route::get('/test2', function() { return view('test2'); });
**步骤 2** - 创建两个视图文件 - **test.php** 和 **test2.php**,代码相同。这两个文件将共享数据。将以下代码复制到这两个文件中。**resources/views/test.php & resources/views/test2.php**
<html> <body> <h1><?php echo $name; ?></h1> </body> </html>
**步骤 3** - 更改 **app/Providers/AppServiceProvider.php** 文件中 boot 方法的代码,如下所示。(这里,我们使用了 share 方法,我们传递的数据将与所有视图共享。)**app/Providers/AppServiceProvider.php**
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { view()->share('name', 'Virat Gandhi'); } /** * Register any application services. * * @return void */ public function register() { // } }
**步骤 4** - **访问**以下 URL。
https://127.0.0.1:8000/test https://127.0.0.1:8000/test2
**步骤 5** - 输出将如下面的图片所示。
Laravel - Blade 模板
Laravel 5.1 引入了使用 **Blade**(一个模板引擎)设计独特布局的概念。这样设计的布局可以被其他视图使用,并包含一致的设计和结构。
与其他模板引擎相比,Blade 在以下方面是独一无二的:
它不限制开发人员在视图中使用纯 PHP 代码。
这样设计的 Blade 视图会被编译和缓存,直到它们被修改。
此处给出的屏幕截图显示了 Laravel 的完整目录结构。
您可以观察到所有视图都存储在 **resources/views** 目录中,Laravel 框架的默认视图是 **welcome.blade.php**。
请注意,其他 Blade 模板也是类似创建的。
创建 Blade 模板布局的步骤
您必须使用以下步骤创建 Blade 模板布局:
步骤 1
在 **resources/views** 文件夹内创建一个 layout 文件夹。我们将使用此文件夹将所有布局存储在一起。
创建一个名为 **master.blade.php** 的文件,该文件将包含与其关联的以下代码:
<html> <head> <title>DemoLaravel - @yield('title')</title> </head> <body> @yield('content') </body> </html>
步骤 2
在此步骤中,您应该扩展布局。扩展布局包括定义子元素。Laravel 使用 **Blade @extends** 指令来定义子元素。
扩展布局时,请注意以下几点:
在 Blade 布局中定义的视图以独特的方式注入容器。
视图的各个部分被创建为子元素。
子元素存储在 layouts 文件夹中,名为 **child.blade.php**
此处显示了一个显示扩展上面创建的布局的示例:
@extends('layouts.app') @section('title', 'Page Title') @section('sidebar') @parent <p>This refers to the master sidebar.</p> @endsection @section('content') <p>This is my body content.</p> @endsection
步骤 3
要在视图中实现子元素,您应该根据需要定义布局。
观察此处显示的屏幕截图。您可以发现登录页面中提到的每个链接都是超链接。请注意,您还可以使用上面给出的步骤,使用 Blade 模板将它们创建为子元素。
Laravel - 重定向
命名路由用于为路由指定特定名称。可以使用 **“as”** 数组键分配名称。
Route::get('user/profile', ['as' => 'profile', function () { // }]);
**注意** - 在这里,我们将名称 **profile** 分配给路由 **user/profile**。
重定向到命名路由
示例
观察下面的例子,了解更多关于重定向到命名路由的信息:
**步骤 1** - 创建一个名为 test.php 的视图,并将其保存到
resources/views/test.php.
<html> <body> <h1>Example of Redirecting to Named Routes</h1> </body> </html>
**步骤 2** - 在 **routes.php** 中,我们为 **test.php** 文件设置了路由。我们将其重命名为 **testing**。我们还设置了另一个路由 **redirect**,它将请求重定向到命名路由 **testing**。
app/Http/routes.php
Route::get('/test', ['as'=>'testing',function() { return view('test2'); }]); Route::get('redirect',function() { return redirect()->route('testing'); });
**步骤 3** - 访问以下 URL 测试命名路由示例。
https://127.0.0.1:8000/redirect
**步骤 4** - 执行上述 URL 后,您将被重定向到 https://127.0.0.1:8000/test,因为我们正在重定向到命名路由 **testing**。
**步骤 5** - 成功执行 URL 后,您将收到以下输出:
重定向到控制器操作
不仅是命名路由,我们还可以重定向到控制器操作。我们只需要简单地将控制器和 **action** 的名称传递给 action 方法,如下面的示例所示。如果要传递参数,可以将其作为 action 方法的第二个参数传递。
return redirect()->action(‘NameOfController@methodName’,[parameters]);
示例
**步骤 1** - 执行以下命令创建一个名为 **RedirectController** 的控制器。
php artisan make:controller RedirectController --plain
**步骤 2** − 成功执行后,您将收到以下输出:
**步骤 3** - 将以下代码复制到文件
app/Http/Controllers/RedirectController.php.
app/Http/Controllers/RedirectController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class RedirectController extends Controller { public function index() { echo "Redirecting to controller's action."; } }
**步骤 4** - 在 **app/Http/routes.php** 中添加以下行。
app/Http/routes.php
Route::get('rr','RedirectController@index'); Route::get('/redirectcontroller',function() { return redirect()->action('RedirectController@index'); });
**步骤 5** - 访问以下 URL 测试示例。
https://127.0.0.1:8000/redirectcontroller
步骤 6 − 输出将如下图所示。
Laravel - 数据库操作
Laravel 使数据库处理变得非常容易。Laravel 目前支持以下 4 个数据库:
- MySQL
- Postgres
- SQLite
- SQL Server
可以使用原始 SQL、流畅查询构建器和 Eloquent ORM 向数据库发出查询。为了理解 Laravel 的所有 CRUD(创建、读取、更新、删除)操作,我们将使用简单的学生管理系统。
连接到数据库
在 **config/database.php** 文件中配置数据库,并在 MySQL 中创建如下表所示的 college 数据库和结构。
数据库:College
表:student
列名 | 列数据类型 | 额外 |
---|---|---|
Id | int(11) | 主键 | 自动递增 |
Name | varchar(25) |
我们将了解如何在学生表中使用 Laravel 从数据库添加、删除、更新和检索记录。
序号 | 记录和描述 |
---|---|
1 | 插入记录
我们可以使用 DB facade 和 insert 方法插入记录。 |
2 | 检索记录
配置数据库后,我们可以使用 DB facade 和 select 方法检索记录。 |
3 | 更新记录
我们可以使用 DB facade 和 update 方法更新记录。 |
4 | 删除记录
我们可以使用 DB facade 和 delete 方法删除记录。 |
Laravel - 错误和日志记录
本章介绍 Laravel 项目中的错误和日志记录以及如何处理它们。
错误
一个正在进行的项目,注定会有一些错误。当您启动一个新的 Laravel 项目时,错误和异常处理已经为您配置好了。通常,在本地环境中,我们需要查看错误以进行调试。我们需要在生产环境中向用户隐藏这些错误。这可以通过在应用程序根目录中存储的环境文件 **.env** 中设置变量 **APP_DEBUG** 来实现。
对于本地环境,**APP_DEBUG** 的值应为 **true**,但对于生产环境,应将其设置为 **false** 以隐藏错误。
**注意** - 更改 **APP_DEBUG** 变量后,应重新启动 Laravel 服务器。
日志记录
日志记录是一种重要的机制,系统可以通过它记录生成的错误。它有助于提高系统的可靠性。Laravel 支持不同的日志记录模式,例如单一模式、每日模式、syslog 模式和 errorlog 模式。您可以在 **config/app.php** 文件中设置这些模式。
'log' => 'daily'
您可以在 **storage/logs/laravel.log** 文件中查看生成的日志条目。
Laravel - 表单
Laravel 提供了各种内置标签,可以轻松安全地处理 HTML 表单。所有主要的 HTML 元素都是使用 Laravel 生成的。为此,我们需要使用 composer 将 HTML 包添加到 Laravel。
示例 1
**步骤 1** − 执行以下命令来继续。
composer require illuminate/html
**步骤 2** − 这将添加 HTML 包到 Laravel,如下面的图片所示。
**步骤 3** − 现在,我们需要将上面显示的包添加到 Laravel 配置文件,该文件存储在 **config/app.php** 中。打开此文件,您将看到 Laravel 服务提供程序的列表,如下面的图片所示。在下面的图片中,按照带框的指示添加 HTML 服务提供程序。
**步骤 4** − 在同一文件中为 HTML 和 Form 添加别名。请注意下图中带框的两行,并添加这两行。
**步骤 5** − 现在一切设置完毕。让我们看看如何使用 Laravel 标签使用各种 HTML 元素。
打开表单
{{ Form::open(array('url' => 'foo/bar')) }} // {{ Form::close() }}
生成标签元素
echo Form::label('email', 'E-Mail Address');
生成文本输入
echo Form::text('username');
指定默认值
echo Form::text('email', '[email protected]');
生成密码输入
echo Form::password('password');
生成文件输入
echo Form::file('image');
生成复选框或单选按钮输入
echo Form::checkbox('name', 'value'); echo Form::radio('name', 'value');
生成选中的复选框或单选按钮输入
echo Form::checkbox('name', 'value', true); echo Form::radio('name', 'value', true);
生成下拉列表
echo Form::select('size', array('L' => 'Large', 'S' => 'Small'));
生成提交按钮
echo Form::submit('Click Me!');
示例 2
**步骤 1** − 复制以下代码以创建一个名为
resources/views/form.php 的视图.
resources/views/form.php 的视图
<html> <body> <?php echo Form::open(array('url' => 'foo/bar')); echo Form::text('username','Username'); echo '<br/>'; echo Form::text('email', '[email protected]'); echo '<br/>'; echo Form::password('password'); echo '<br/>'; echo Form::checkbox('name', 'value'); echo '<br/>'; echo Form::radio('name', 'value'); echo '<br/>'; echo Form::file('image'); echo '<br/>'; echo Form::select('size', array('L' => 'Large', 'S' => 'Small')); echo '<br/>'; echo Form::submit('Click Me!'); echo Form::close(); ?> </body> </html>
**步骤 2** − 在 **app/Http/routes.php** 中添加以下行,以添加 form.php 视图的路由。
app/Http/routes.php
Route::get('/form',function() { return view('form'); });
**步骤 3** − 访问以下 URL 以查看表单。
https://127.0.0.1:8000/form
步骤 4 − 输出将如下图所示。
Laravel - 本地化
Laravel 的本地化功能支持在应用程序中使用不同的语言。您需要将所有不同语言的字符串存储在一个文件中,这些文件存储在 **resources/views** 目录中。您应该为每种受支持的语言创建一个单独的目录。所有语言文件都应返回如下所示的键值字符串数组。
<?php return [ 'welcome' => 'Welcome to the application' ];
示例
**步骤 1** − 为语言创建 3 个文件 - **英语、法语** 和 **德语**。将英语文件保存在 **resources/lang/en/lang.php**
<?php return [ 'msg' => 'Laravel Internationalization example.' ]; ?>
**步骤 2** − 将法语文件保存在 **resources/lang/fr/lang.php**。
<?php return [ 'msg' => 'Exemple Laravel internationalisation.' ]; ?>
**步骤 3** − 将德语文件保存在 **resources/lang/de/lang.php**。
<?php return [ 'msg' => 'Laravel Internationalisierung Beispiel.' ]; ?>
**步骤 4** − 通过执行以下命令创建一个名为 **LocalizationController** 的控制器。
php artisan make:controller LocalizationController --plain
**步骤 5** − 成功执行后,您将收到以下输出:
**步骤 6** − 将以下代码复制到文件
app/Http/Controllers/LocalizationController.php
app/Http/Controllers/LocalizationController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class LocalizationController extends Controller { public function index(Request $request,$locale) { //set’s application’s locale app()->setLocale($locale); //Gets the translated message and displays it echo trans('lang.msg'); } }
**步骤 7** − 在 **app/Http/routes.php** 文件中为 LocalizationController 添加路由。请注意,我们在 localization/ 后面传递了 {locale} 参数,我们将使用它来查看不同语言的输出。
app/Http/routes.php
Route::get('localization/{locale}','LocalizationController@index');
**步骤 8** − 现在,让我们访问不同的 URL 来查看所有不同的语言。执行以下 URL 以查看英文输出。
https://127.0.0.1:8000/localization/en
**步骤 9** − 输出将如下面的图片所示。
**步骤 10** − 执行以下 URL 以查看法语输出。
https://127.0.0.1:8000/localization/fr
步骤 11 − 输出将如下图所示。
**步骤 12** − 执行以下 URL 以查看德语输出
https://127.0.0.1:8000/localization/de
**步骤 13** − 输出将如下面的图片所示。
Laravel - Session
会话用于跨请求存储有关用户的信息。Laravel 提供了各种驱动程序,例如 **file、cookie、apc、array、Memcached、Redis** 和 **database** 来处理会话数据。默认情况下使用文件驱动程序,因为它很轻量级。会话可以在存储在 **config/session.php** 中的文件中进行配置。
访问会话数据
要访问会话数据,我们需要一个会话实例,可以通过 HTTP 请求访问。获取实例后,我们可以使用 **get()** 方法,它将接受一个参数 **“key”** 来获取会话数据。
$value = $request->session()->get('key');
您可以使用 **all()** 方法获取所有会话数据,而不是 **get()** 方法。
存储会话数据
可以使用 **put()** 方法将数据存储在会话中。**put()** 方法将接受两个参数:“键”和“值”。
$request->session()->put('key', 'value');
删除会话数据
**forget()** 方法用于从会话中删除项目。此方法将采用 **“key”** 作为参数。
$request->session()->forget('key');
使用 **flush()** 方法代替 **forget()** 方法删除所有会话数据。使用 **pull()** 方法从会话中检索数据并在之后删除它。pull() 方法也将采用 **key** 作为参数。**forget()** 方法和 **pull()** 方法的区别在于 **forget()** 方法不会返回会话的值,而 **pull()** 方法会返回它并从会话中删除该值。
示例
**步骤 1** − 通过执行以下命令创建一个名为 **SessionController** 的控制器。
php artisan make:controller SessionController --plain
**步骤 2** − 成功执行后,您将收到以下输出:
**步骤 3** − 将以下代码复制到文件
app/Http/Controllers/SessionController.php。
app/Http/Controllers/SessionController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class SessionController extends Controller { public function accessSessionData(Request $request) { if($request->session()->has('my_name')) echo $request->session()->get('my_name'); else echo 'No data in the session'; } public function storeSessionData(Request $request) { $request->session()->put('my_name','Virat Gandhi'); echo "Data has been added to session"; } public function deleteSessionData(Request $request) { $request->session()->forget('my_name'); echo "Data has been removed from session."; } }
**步骤 4** − 在 **app/Http/routes.php** 文件中添加以下几行。
app/Http/routes.php
Route::get('session/get','SessionController@accessSessionData'); Route::get('session/set','SessionController@storeSessionData'); Route::get('session/remove','SessionController@deleteSessionData');
**步骤 5** − 访问以下 URL **在会话中设置数据**。
https://127.0.0.1:8000/session/set
步骤 6 − 输出将如下图所示。
**步骤 7** − 访问以下 URL **从会话中获取数据**。
https://127.0.0.1:8000/session/get
**步骤 8** - 输出将如下面的图片所示。
**步骤 9** − 访问以下 URL **删除会话数据**。
https://127.0.0.1:8000/session/remove
**步骤 10** − 您将看到如下面的图片所示的消息。
Laravel - 验证
在设计应用程序时,验证是最重要的方面。它验证传入的数据。默认情况下,基本控制器类使用 **ValidatesRequests** 特性,该特性提供了一种方便的方法来使用各种强大的验证规则来验证传入的 HTTP 请求。
Laravel 中可用的验证规则
Laravel 将始终检查会话数据中的错误,如果可用,则会自动将其绑定到视图。因此,重要的是要注意,在每次请求中,所有视图中始终可以使用 **$errors** 变量,允许您方便地假设 **$errors** 变量始终已定义并且可以安全地使用。下表显示了 Laravel 中所有可用的验证规则。
Laravel 中可用的验证规则 | ||
---|---|---|
已接受 | 活动URL | 之后(日期) |
字母 | 字母和短横线 | 字母数字 |
数组 | 之前(日期) | 介于之间 |
布尔值 | 已确认 | 日期 |
日期格式 | 不同 | 位数 |
位数介于之间 | 电子邮件 | 存在(数据库) |
图像(文件) | 在…之中 | 整数 |
IP 地址 | JSON | 最大值 |
MIME 类型(文件) | 最小值 | 不在…之中 |
数字 | 正则表达式 | 必需 |
如果需要 | 除非需要 | 与…一起需要 |
与所有一起需要 | 无需… | 无需所有… |
相同 | 大小 | 字符串 |
时区 | 唯一(数据库) | URL |
**$errors** 变量将是 **Illuminate\Support\MessageBag** 的实例。错误消息可以通过添加如下所示的代码在视图文件中显示。
@if (count($errors) > 0) <div class = "alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
示例
**步骤 1** − 通过执行以下命令创建一个名为 **ValidationController** 的控制器。
php artisan make:controller ValidationController --plain
**步骤 2** − 成功执行后,您将收到以下输出:
**步骤 3** - 将以下代码复制到
**app/Http/Controllers/ValidationController.php** 文件。
app/Http/Controllers/ValidationController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class ValidationController extends Controller { public function showform() { return view('login'); } public function validateform(Request $request) { print_r($request->all()); $this->validate($request,[ 'username'=>'required|max:8', 'password'=>'required' ]); } }
**步骤 4** − 创建一个名为 **resources/views/login.blade.php** 的视图文件,并将以下代码复制到该文件中。
resources/views/login.blade.php
<html> <head> <title>Login Form</title> </head> <body> @if (count($errors) > 0) <div class = "alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <?php echo Form::open(array('url'=>'/validation')); ?> <table border = '1'> <tr> <td align = 'center' colspan = '2'>Login</td> </tr> <tr> <td>Username</td> <td><?php echo Form::text('username'); ?></td> </tr> <tr> <td>Password</td> <td><?php echo Form::password('password'); ?></td> </tr> <tr> <td align = 'center' colspan = '2' ><?php echo Form::submit('Login'); ? ></td> </tr> </table> <?php echo Form::close(); ?> </body> </html>
**步骤 5** − 在 **app/Http/routes.php** 中添加以下几行。
app/Http/routes.php
Route::get('/validation','ValidationController@showform'); Route::post('/validation','ValidationController@validateform');
**步骤 6** − 访问以下 URL 以测试验证。
https://127.0.0.1:8000/validation
**步骤 7** − 单击 **“登录”** 按钮,无需在文本字段中输入任何内容。输出将如下面的图片所示。
Laravel - 文件上传
在 Laravel 中上传文件非常容易。我们只需要创建一个用户可以选择要上传的文件的视图文件,以及一个将处理上传文件的控制器。
在视图文件中,我们需要通过添加以下代码行来生成文件输入。
Form::file('file_name');
在 Form::open() 中,我们需要添加 **‘files’=>’true’**,如下所示。这使得表单可以分多部分上传。
Form::open(array('url' => '/uploadfile','files'=>'true'));
示例
**步骤 1** − 创建一个名为 **resources/views/uploadfile.php** 的视图文件,并将以下代码复制到该文件中。
resources/views/uploadfile.php
<html> <body> <?php echo Form::open(array('url' => '/uploadfile','files'=>'true')); echo 'Select the file to upload.'; echo Form::file('image'); echo Form::submit('Upload File'); echo Form::close(); ?> </body> </html>
**步骤 2** − 通过执行以下命令创建一个名为 **UploadFileController** 的控制器。
php artisan make:controller UploadFileController --plain
**步骤 3** − 成功执行后,您将收到以下输出:
步骤 4 − 将以下代码复制到
**app/Http/Controllers/UploadFileController.php** 文件。
app/Http/Controllers/UploadFileController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class UploadFileController extends Controller { public function index() { return view('uploadfile'); } public function showUploadFile(Request $request) { $file = $request->file('image'); //Display File Name echo 'File Name: '.$file->getClientOriginalName(); echo '<br>'; //Display File Extension echo 'File Extension: '.$file->getClientOriginalExtension(); echo '<br>'; //Display File Real Path echo 'File Real Path: '.$file->getRealPath(); echo '<br>'; //Display File Size echo 'File Size: '.$file->getSize(); echo '<br>'; //Display File Mime Type echo 'File Mime Type: '.$file->getMimeType(); //Move Uploaded File $destinationPath = 'uploads'; $file->move($destinationPath,$file->getClientOriginalName()); } }
**步骤 5** − 在 **app/Http/routes.php** 中添加以下几行。
app/Http/routes.php
Route::get('/uploadfile','UploadFileController@index'); Route::post('/uploadfile','UploadFileController@showUploadFile');
**步骤 6** − 访问以下 URL 以测试上传文件功能。
https://127.0.0.1:8000/uploadfile
**步骤 7** − 您将收到如下面的图片所示的提示。
Laravel - 发送邮件
Laravel 使用功能丰富的免费库 **SwiftMailer** 发送电子邮件。使用库函数,我们可以轻松地发送电子邮件,而无需太多麻烦。电子邮件模板的加载方式与视图相同,这意味着您可以使用 Blade 语法并将数据注入到模板中。
下表显示了 **send** 函数的语法和属性:
语法 | void send(string|array $view, array $data, Closure|string $callback) |
参数 |
|
返回值 | 无 |
描述 | 发送电子邮件。 |
在第三个参数中,$callback closure 接收消息实例,并使用该实例,我们还可以调用以下函数并更改消息,如下所示。
- $message → subject('欢迎来到 Tutorials Point');
- $message → from('[email protected]', 'Mr. Example');
- $message → to('[email protected]', 'Mr. Example');
一些不太常用的方法包括:
- $message → sender('[email protected]', 'Mr. Example');
- $message → returnPath('[email protected]');
- $message → cc('[email protected]', 'Mr. Example');
- $message → bcc('[email protected]', 'Mr. Example');
- $message → replyTo('[email protected]', 'Mr. Example');
- $message → priority(2);
要附加或嵌入文件,您可以使用以下方法:
- $message → attach('path/to/attachment.txt');
- $message → embed('path/to/attachment.jpg');
邮件可以作为 HTML 或文本发送。您可以通过传递如下所示的数组,在第一个参数中指示要发送的邮件类型。默认类型为 HTML。如果要发送纯文本邮件,请使用以下语法。
语法
Mail::send([‘text’=>’text.view’], $data, $callback);
在此语法中,第一个参数采用数组。使用 **text** 作为视图的键名作为键的值。
示例
**步骤 1** − 我们现在将从 Gmail 帐户发送电子邮件,为此,您需要在 Laravel 环境文件 **-.env** 文件中配置您的 Gmail 帐户。在您的 Gmail 帐户中启用 2 步验证,并创建一个特定于应用程序的密码,然后更改 .env 参数,如下所示。
.env
MAIL_DRIVER = smtp MAIL_HOST = smtp.gmail.com MAIL_PORT = 587 MAIL_USERNAME = your-gmail-username MAIL_PASSWORD = your-application-specific-password MAIL_ENCRYPTION = tls
**步骤 2** − 更改 **.env** 文件后,执行以下两个命令以清除缓存并重新启动 Laravel 服务器。
php artisan config:cache
**步骤 3** − 通过执行以下命令创建一个名为 **MailController** 的控制器。
php artisan make:controller MailController --plain
**步骤 4** − 成功执行后,您将收到以下输出:
**步骤 5** − 将以下代码复制到
**app/Http/Controllers/MailController.php** 文件。
app/Http/Controllers/MailController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Mail; use App\Http\Requests; use App\Http\Controllers\Controller; class MailController extends Controller { public function basic_email() { $data = array('name'=>"Virat Gandhi"); Mail::send(['text'=>'mail'], $data, function($message) { $message->to('[email protected]', 'Tutorials Point')->subject ('Laravel Basic Testing Mail'); $message->from('[email protected]','Virat Gandhi'); }); echo "Basic Email Sent. Check your inbox."; } public function html_email() { $data = array('name'=>"Virat Gandhi"); Mail::send('mail', $data, function($message) { $message->to('[email protected]', 'Tutorials Point')->subject ('Laravel HTML Testing Mail'); $message->from('[email protected]','Virat Gandhi'); }); echo "HTML Email Sent. Check your inbox."; } public function attachment_email() { $data = array('name'=>"Virat Gandhi"); Mail::send('mail', $data, function($message) { $message->to('[email protected]', 'Tutorials Point')->subject ('Laravel Testing Mail with Attachment'); $message->attach('C:\laravel-master\laravel\public\uploads\image.png'); $message->attach('C:\laravel-master\laravel\public\uploads\test.txt'); $message->from('[email protected]','Virat Gandhi'); }); echo "Email Sent with attachment. Check your inbox."; } }
**步骤 6** − 将以下代码复制到 **resources/views/mail.blade.php** 文件。
resources/views/mail.blade.php
<h1>Hi, {{ $name }}</h1> l<p>Sending Mail from Laravel.</p>
**步骤 7** − 在 **app/Http/routes.php** 中添加以下几行。
app/Http/routes.php
Route::get('sendbasicemail','MailController@basic_email'); Route::get('sendhtmlemail','MailController@html_email'); Route::get('sendattachmentemail','MailController@attachment_email');
**步骤 8** − 访问以下 URL 以测试基本电子邮件。
https://127.0.0.1:8000/sendbasicemail
**步骤 9** − 输出屏幕将如下所示。检查您的收件箱以查看基本电子邮件输出。
**步骤 10** − 访问以下 URL 以测试 HTML 电子邮件。
https://127.0.0.1:8000/sendhtmlemail
**步骤 11** − 输出屏幕将如下所示。检查您的收件箱以查看 html 电子邮件输出。
**步骤 12** − 访问以下 URL 以测试带有附件的 HTML 电子邮件。
https://127.0.0.1:8000/sendattachmentemail
**步骤 13** − 您可以看到以下输出
注意 − 在MailController.php文件中,from方法中的电子邮件地址应为您可以发送电子邮件的地址。通常,它应该是您服务器上配置的电子邮件地址。
Laravel - Ajax
Ajax(异步JavaScript和XML)是一套Web开发技术,它利用客户端使用的许多Web技术来创建异步Web应用程序。在您的视图文件中导入jquery库以使用jquery的ajax函数,这些函数将用于使用ajax从服务器发送和接收数据。在服务器端,您可以使用response()函数向客户端发送响应,并使用json()函数链接response函数以JSON格式发送响应。
json() 函数语法
json(string|array $data = array(), int $status = 200, array $headers = array(), int $options)
示例
步骤1 − 创建一个名为resources/views/message.php的视图文件,并将以下代码复制到该文件中。
<html> <head> <title>Ajax Example</title> <script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"> </script> <script> function getMessage() { $.ajax({ type:'POST', url:'/getmsg', data:'_token = <?php echo csrf_token() ?>', success:function(data) { $("#msg").html(data.msg); } }); } </script> </head> <body> <div id = 'msg'>This message will be replaced using Ajax. Click the button to replace the message.</div> <?php echo Form::button('Replace Message',['onClick'=>'getMessage()']); ?> </body> </html>
步骤2 − 通过执行以下命令创建一个名为AjaxController的控制器。
php artisan make:controller AjaxController --plain
**步骤 3** − 成功执行后,您将收到以下输出:
步骤 4 − 将以下代码复制到
app/Http/Controllers/AjaxController.php 文件。
app/Http/Controllers/AjaxController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class AjaxController extends Controller { public function index() { $msg = "This is a simple message."; return response()->json(array('msg'=> $msg), 200); } }
**步骤 5** − 在 **app/Http/routes.php** 中添加以下几行。
app/Http/routes.php
Route::get('ajax',function() { return view('message'); }); Route::post('/getmsg','AjaxController@index');
步骤6 − 访问以下URL以测试Ajax功能。
https://127.0.0.1:8000/ajax
步骤7 − 您将被重定向到一个页面,您将在其中看到如下所示的消息。
步骤8 − 单击按钮后,输出将如下所示。
Laravel - 错误处理
大多数Web应用程序都有特定的错误处理机制。利用这些机制,它们可以跟踪错误和异常,并将它们记录下来以分析性能。在本节中,您将阅读有关Laravel应用程序中错误处理的内容。
重要提示
在进一步详细了解Laravel中的错误处理之前,请注意以下重要事项:
对于任何新项目,Laravel默认情况下在App\Exceptions\Handler类中记录错误和异常。然后将它们提交回用户进行分析。
当您的Laravel应用程序设置为调试模式时,每个在您的Web应用程序中发生的错误都会显示包含堆栈跟踪的详细错误消息。
默认情况下,调试模式设置为false,您可以将其更改为true。这使用户能够使用堆栈跟踪跟踪所有错误。
Laravel项目的配置包括debug选项,该选项确定向用户显示有关错误的信息量。在Web应用程序中,默认情况下,该选项设置为.env文件中环境变量中定义的值。
该值在本地开发环境中设置为true,在生产环境中设置为false。
如果在生产环境中将该值设置为true,则与最终用户共享敏感信息的风险更高。
错误日志
在Web应用程序中记录错误有助于跟踪它们并规划删除它们的策略。可以在config/app.php文件中配置Web应用程序中的日志信息。处理Laravel中的错误日志时,请注意以下几点:
Laravel使用monolog PHP日志记录库。
用于错误跟踪的日志记录参数为single、daily、syslog和errorlog。
例如,如果您希望将错误消息记录到日志文件中,则应将应用程序配置中的log值设置为daily,如下面的命令所示:
'log' => env('APP_LOG',’daily’),
如果将daily日志模式作为参数,Laravel默认情况下会保留5天的错误日志。如果您希望更改日志文件的最大数量,则必须将配置文件中的log_max_files参数设置为所需的值。
‘log_max_files’ => 25;
严重性级别
由于Laravel使用monolog PHP日志记录库,因此有各种参数用于分析严重性级别。可用的各种严重性级别包括error、critical、alert和emergency消息。您可以设置严重性级别,如下面的命令所示:
'log_level' => env('APP_LOG_LEVEL', 'error')
Laravel - 事件处理
事件提供了一个简单的观察者实现,允许用户订阅和监听Web应用程序中触发的各种事件。Laravel中的所有事件类都存储在app/Events文件夹中,监听器存储在app/Listeners文件夹中。
在Web应用程序中生成事件和监听器的artisan命令如下所示:
php artisan event:generate
此命令将事件和监听器生成到上面讨论的各个文件夹中。
事件和监听器为解耦Web应用程序提供了一种很好的方法,因为一个事件可以有多个相互独立的监听器。artisan命令创建的events文件夹包含以下两个文件:event.php和SomeEvent.php。它们显示如下:
Event.php
<?php namespace App\Events; abstract class Event{ // }
如上所述,event.php包含类Event的基本定义,并调用命名空间App\Events。请注意,用户定义的或自定义事件在此文件中创建。
SomeEvent.php
<?php namespace App\Events; use App\Events\Event; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class SomeEvent extends Event{ use SerializesModels; /** * Create a new event instance. * * @return void */ public function __construct() { // } /** * Get the channels the event should be broadcast on. * * @return array */ public function broadcastOn() { return []; } }
请注意,此文件使用序列化来广播Web应用程序中的事件,并且此文件中也初始化了必要的参数。
例如,如果我们需要在构造函数中初始化order变量以注册事件,我们可以按以下方式进行:
public function __construct(Order $order) { $this->order = $order; }
Listeners
监听器处理注册事件中提到的所有活动。artisan命令event:generate在app/listeners目录中创建所有listeners。Listeners文件夹包含一个文件EventListener.php,其中包含处理监听器所需的所有方法。
EventListener.php
<?php namespace App\Listeners; use App\Events\SomeEvent; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class EventListener{ /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param SomeEvent $event * @return void */ public function handle(SomeEvent $event) { // } }
如代码中所述,它包含用于管理各种事件的handle函数。我们可以创建各种针对单个事件的独立监听器。
Laravel - Facades
Facade为应用程序服务容器中可用的类提供了一个静态接口。Laravel Facades充当服务容器中底层类的静态代理,在保持比传统静态方法更高的可测试性和灵活性的同时,提供了简洁、富有表现力的语法的优势。
如何创建Facade
以下是创建Laravel中Facade的步骤:
步骤1 − 创建PHP类文件。
步骤2 − 将该类绑定到服务提供者。
步骤3 − 将该服务提供者注册到
Config\app.php作为提供者。
步骤4 − 创建此类扩展的类
Illuminate\Support\Facades\Facade。
步骤5 − 将步骤4注册到Config\app.php作为别名。
Facade类引用
Laravel附带许多Facades。下表显示了内置的Facade类引用:
Facade | 类 | 服务容器绑定 |
---|---|---|
App | Illuminate\Foundation\Application | app |
Artisan | Illuminate\Contracts\Console\Kernel | artisan |
Auth | Illuminate\Auth\AuthManager | auth |
Auth(实例) | Illuminate\Auth\Guard | |
Blade | Illuminate\View\Compilers\BladeCompiler | blade.compiler |
Bus | Illuminate\Contracts\Bus\Dispatcher | |
Cache | Illuminate\Cache\Repository | cache |
Config | Illuminate\Config\Repository | config |
Cookie | Illuminate\Cookie\CookieJar | cookie |
Crypt | Illuminate\Encryption\Encrypter | encrypter |
DB | Illuminate\Database\DatabaseManager | db |
DB(实例) | Illuminate\Database\Connection | |
Event | Illuminate\Events\Dispatcher | events |
File | Illuminate\Filesystem\Filesystem | files |
Gate | Illuminate\Contracts\Auth\Access\Gate | |
Hash | Illuminate\Contracts\Hashing\Hasher | hash |
Input | Illuminate\Http\Request | request |
Lang | Illuminate\Translation\Translator | translator |
Log | Illuminate\Log\Writer | log |
Illuminate\Mail\Mailer | mailer | |
Password | Illuminate\Auth\Passwords\PasswordBroker | auth.password |
Queue | Illuminate\Queue\QueueManager | queue |
Queue(实例) | Illuminate\Queue\QueueInterface | |
Queue(基类) | Illuminate\Queue\Queue | |
Redirect | Illuminate\Routing\Redirector | redirect |
Redis | Illuminate\Redis\Database | redis |
Request | Illuminate\Http\Request | request |
Response | Illuminate\Contracts\Routing\ResponseFactory | |
Route | Illuminate\Routing\Router | router |
Schema | Illuminate\Database\Schema\Blueprint | |
Session | Illuminate\Session\SessionManager | session |
Session(实例) | Illuminate\Session\Store | |
Storage (存储) | Illuminate\Contracts\Filesystem\Factory | filesystem |
URL | Illuminate\Routing\UrlGenerator | url |
Validator | Illuminate\Validation\Factory | validator |
Validator(实例) | Illuminate\Validation\Validator | |
View | Illuminate\View\Factory | view |
View(实例) | Illuminate\View\View |
示例
步骤1 − 通过执行以下命令创建一个名为TestFacadesServiceProvider的服务提供者。
php artisan make:provider TestFacadesServiceProvider
**步骤 2** − 成功执行后,您将收到以下输出:
步骤3 − 在App/Test处创建一个名为TestFacades.php的类。
App/Test/TestFacades.php
<?php namespace App\Test; class TestFacades{ public function testingFacades() { echo "Testing the Facades in Laravel."; } } ?>
步骤4 − 在“App/Test/Facades”处创建一个名为“TestFacades.php”的Facade类。
App/Test/Facades/TestFacades.php
<?php namespace app\Test\Facades; use Illuminate\Support\Facades\Facade; class TestFacades extends Facade { protected static function getFacadeAccessor() { return 'test'; } }
步骤5 − 在App/Test/Facades处创建一个名为TestFacadesServiceProviders.php的Facade类。
App/Providers/TestFacadesServiceProviders.php
<?php namespace App\Providers; use App; use Illuminate\Support\ServiceProvider; class TestFacadesServiceProvider extends ServiceProvider { public function boot() { // } public function register() { App::bind('test',function() { return new \App\Test\TestFacades; }); } }
步骤6 − 在config/app.php文件中添加服务提供者,如下图所示。
config/app.php
步骤7 − 在config/app.php文件中添加别名,如下图所示。
config/app.php
步骤8 − 在app/Http/routes.php中添加以下几行。
app/Http/routes.php
Route::get('/facadeex', function() { return TestFacades::testingFacades(); });
步骤9 − 访问以下URL以测试Facade。
https://127.0.0.1:8000/facadeex
步骤10 − 访问URL后,您将收到以下输出:
Laravel - Contracts
Laravel契约是一组接口,具有框架提供的各种功能和核心服务。
例如,Illuminate\Contracts\Queue\Queue契约使用排队作业所需的方法,而Illuminate\Contracts\Mail\Mailer使用发送电子邮件的方法。
每个定义的契约都包含框架的相应实现。所有Laravel契约都可以在下面提到的GitHub存储库中找到:
https://github.com/illuminate/contracts
此存储库提供了Laravel框架中可用的各种契约,可以下载并相应地使用。
重要提示
使用Laravel契约时,请注意以下重要事项:
必须在类的构造函数中定义Facades。
契约在类中显式定义,您无需在构造函数中定义契约。
示例
考虑Laravel中使用的授权契约,如下所示:
<?php namespace Illuminate\Contracts\Auth\Access; interface Authorizable{ /** * Determine if the entity has a given ability. * * @param string $ability * @param array|mixed $arguments * @return bool */ public function can($ability, $arguments = []); }
该契约使用一个名为can的函数,其中包含一个名为ability的参数和一个名为arguments的参数,该参数使用数组形式的用户标识。
您需要按照以下语法定义一个契约:
interface <contract-name>
契约类似于外观模式,用于创建健壮且经过良好测试的 Laravel 应用程序。使用契约和外观模式之间存在多种实际差异。
以下代码演示了如何使用契约来缓存资源库:
<?php namespace App\Orders; use Illuminate\Contracts\Cache\Repository as Cache; class Repository{ /** * The cache instance. */ protected $cache; /** * Create a new repository instance. * * @param Cache $cache * @return void */ public function __construct(Cache $cache) { $this->cache = $cache; } }
契约不包含任何实现和新的依赖项;易于编写指定契约的替代实现,因此用户可以替换缓存实现而无需修改任何代码库。
Laravel - CSRF 保护
CSRF 指的是针对 Web 应用程序的跨站请求伪造攻击。CSRF 攻击是由系统的已认证用户执行的未经授权的活动。因此,许多 Web 应用程序容易受到此类攻击。
Laravel 提供以下 CSRF 保护方式:
Laravel 内置了一个 CSRF 插件,它为每个活动的用戶会话生成令牌。这些令牌验证操作或请求是由相关的已认证用户发送的。
实现
本节详细讨论了在 Laravel 中实现 CSRF 保护的方法。在继续进行 CSRF 保护之前,需要注意以下几点:
CSRF 实现在 Web 应用程序中声明的 HTML 表单内。您必须在表单中包含一个隐藏的已验证 CSRF 令牌,以便 Laravel 的 CSRF 保护中间件可以验证请求。语法如下:
<form method = "POST" action="/profile"> {{ csrf_field() }} ... </form>
您可以使用 JavaScript HTTP 库方便地构建 JavaScript 驱动的应用程序,因为这会将 CSRF 令牌包含到每个传出的请求中。
名为resources/assets/js/bootstrap.js的文件注册了 Laravel 应用程序的所有令牌,并包含一个存储带有Axios HTTP 库的csrf-token的meta标签。
没有 CSRF 令牌的表单
考虑以下几行代码。它们显示一个表单,该表单将两个参数作为输入:email 和 message。
<form> <label> Email </label> <input type = "text" name = "email"/> <br/> <label> Message </label> <input type="text" name = "message"/> <input type = ”submit” name = ”submitButton” value = ”submit”> </form>
以上代码的结果是最终用户可以查看的以下表单:
上面显示的表单将接受来自授权用户的任何输入信息。这可能会使 Web 应用程序容易受到各种攻击。
请注意,提交按钮包含控制器部分的功能。postContact 函数用于关联视图的控制器中。如下所示:
public function postContact(Request $request) { return $request-> all(); }
请注意,该表单不包含任何 CSRF 令牌,因此作为输入参数共享的敏感信息容易受到各种攻击。
包含 CSRF 令牌的表单
以下几行代码显示了使用 CSRF 令牌重新设计的表单:
<form method = ”post” > {{ csrf_field() }} <label> Email </label> <input type = "text" name = "email"/> <br/> <label> Message </label> <input type = "text" name = "message"/> <input type = ”submit” name = ”submitButton” value = ”submit”> </form>
获得的输出将返回包含以下令牌的 JSON:
{ "token": "ghfleifxDSUYEW9WE67877CXNVFJKL", "name": "TutorialsPoint", "email": "[email protected]" }
这是单击提交按钮时创建的 CSRF 令牌。
Laravel - 认证
身份验证是识别用户凭据的过程。在 Web 应用程序中,身份验证由会话管理,会话接收诸如电子邮件或用户名和密码之类的输入参数来进行用户身份识别。如果这些参数匹配,则认为用户已通过身份验证。
命令
Laravel 使用以下命令创建表单和关联的控制器来执行身份验证:
php artisan make:auth
此命令有助于成功创建身份验证脚手架,如下面的屏幕截图所示:
控制器
用于身份验证过程的控制器是HomeController。
<?php namespace App\Http\Controllers; use App\Http\Requests; use Illuminate\Http\Request; class HomeController extends Controller{ /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('auth'); } /** * Show the application dashboard. * * @return \Illuminate\Http\Response */ public function index() { return view('home'); } }
因此,生成的脚手架应用程序创建了登录页面和注册页面以执行身份验证。它们如下所示:
登录
注册
手动验证用户
Laravel 使用Auth外观来帮助手动验证用户。它包含attempt方法来验证其电子邮件和密码。
考虑以下LoginController代码行,其中包含所有身份验证功能:
<?php // Authentication mechanism namespace App\Http\Controllers; use Illuminate\Support\Facades\Auth; class LoginController extends Controller{ /** * Handling authentication request * * @return Response */ public function authenticate() { if (Auth::attempt(['email' => $email, 'password' => $password])) { // Authentication passed... return redirect()->intended('dashboard'); } } }
Laravel - 授权
在上一章中,我们学习了 Laravel 中的身份验证过程。本章向您解释 Laravel 中的授权过程。
身份验证和授权的区别
在进一步学习 Laravel 中的授权过程之前,让我们了解身份验证和授权之间的区别。
在身份验证中,系统或 Web 应用程序通过用户提供的凭据来识别其用户。如果发现凭据有效,则对其进行身份验证,否则则不进行身份验证。
在授权中,系统或 Web 应用程序会检查已认证的用户是否可以访问他们试图访问或请求的资源。换句话说,它会检查他们在请求资源上的权限。如果发现他们可以访问资源,则表示他们已获得授权。
因此,身份验证涉及检查用户凭据的有效性,而授权则涉及检查已认证用户对资源的权限。
Laravel 中的授权机制
Laravel 提供了一种简单的授权机制,该机制包含两种主要方法,即Gates和Policies。
编写 Gates 和 Policies
Gates 用于确定用户是否有权执行指定的动作。它们通常在App/Providers/AuthServiceProvider.php中使用 Gate 外观定义。Gates 也是声明用于执行授权机制的函数。
Policies 在数组中声明,并用于使用授权机制的类和方法中。
以下几行代码解释了如何在 Laravel Web 应用程序中使用 Gates 和 Policies 来授权用户。请注意,在此示例中,boot函数用于授权用户。
<?php namespace App\Providers; use Illuminate\Contracts\Auth\Access\Gate as GateContract; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider{ /** * The policy mappings for the application. * * @var array */ protected $policies = [ 'App\Model' => 'App\Policies\ModelPolicy', ]; /** * Register any application authentication / authorization services. * * @param \Illuminate\Contracts\Auth\Access\Gate $gate * @return void */ public function boot(GateContract $gate) { $this->registerPolicies($gate); // } }
Laravel - Artisan 命令行工具
Laravel 框架提供三种主要的命令行交互工具,即:Artisan、Ticker和REPL。本章将详细解释 Artisan。
Artisan 简介
Artisan 是 Laravel 中常用的命令行界面,它包含一组有助于开发 Web 应用程序的命令。
示例
以下是 Artisan 中的一些命令及其各自的功能:
启动 Laravel 项目
php artisan serve
启用缓存机制
php artisan route:cache
查看 Artisan 支持的可用命令列表
php artisan list
查看任何命令的帮助信息,并查看可用的选项和参数
php artisan help serve
以下屏幕截图显示了上述命令的输出:
编写命令
除了 Artisan 中列出的命令外,用户还可以创建一个自定义命令,该命令可用于 Web 应用程序。请注意,命令存储在app/console/commands目录中。
创建用户定义命令的默认命令如下所示:
php artisan make:console <name-of-command>
键入上述命令后,您将看到如下所示的屏幕截图中的输出:
为DefaultCommand创建的文件名为DefaultCommand.php,如下所示:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; class DefaultCommand extends Command{ /** * The name and signature of the console command. * * @var string */ protected $signature = 'command:name'; /** * The console command description. * * @var string */ protected $description = 'Command description'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { // } }
此文件包含用户定义命令的签名和说明。名为handle的公共函数在执行命令时执行功能。这些命令在同一目录中的Kernel.php文件中注册。
您还可以为用户定义的命令创建任务计划,如下面的代码所示:
<?php namespace App\Console; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel { /** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ // Commands\Inspire::class, Commands\DefaultCommand::class ]; /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { // $schedule->command('inspire') // ->hourly(); } }
请注意,给定命令的任务计划是在名为schedule的函数中定义的,该函数包含一个用于计划任务的参数,该参数采用hourly参数。
命令注册在命令数组中,该数组包含命令的路径和名称。
注册命令后,它将列在 Artisan 命令中。当您调用指定命令的 help 属性时,将显示签名和说明部分中包含的值。
让我们看看如何查看我们命令DefaultCommand的属性。您应该使用如下所示的命令:
php artisan help DefaultCommand
Laravel - 加密
加密是使用某些算法将纯文本转换为消息的过程,以便任何第三方用户都无法读取信息。这对于传输敏感信息很有帮助,因为入侵者针对传输信息的可能性较小。
加密使用称为密码学的过程执行。要加密的文本称为明文,加密后获得的文本或消息称为密文。将密文转换为明文的过程称为解密。
Laravel 使用AES-256和AES-128加密器,它使用 OpenSSL 进行加密。Laravel 中包含的所有值都使用消息认证码协议进行签名,以便一旦加密,底层值就不会被篡改。
配置
在 Laravel 中生成密钥的命令如下所示:
php artisan key:generate
请注意,此命令使用 PHP 安全随机字节生成器,您可以看到如下所示的屏幕截图中的输出:
上述命令有助于生成可在 Web 应用程序中使用的密钥。观察下面的屏幕截图:
注意
加密的值在config/app.php文件中正确对齐,该文件包含两个用于加密的参数,即key和cipher。如果使用此密钥的值未正确对齐,则 Laravel 中加密的所有值都将不安全。
加密过程
可以使用 Laravel 类控制器的encrypt 助手对值进行加密。这些值使用 OpenSSL 和 AES-256 密码进行加密。所有加密的值都使用消息认证码 (MAC) 进行签名,以检查加密字符串的任何修改。
以下代码在控制器中提到,用于存储秘密或敏感消息。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class DemoController extends Controller{ ** * Store a secret message for the user. * * @param Request $request * @param int $id * @return Response */ public function storeSecret(Request $request, $id) { $user = User::findOrFail($id); $user->fill([ 'secret' => encrypt($request->secret) ])->save(); } }
解密过程
值的解密使用decrypt 助手完成。观察以下几行代码:
use Illuminate\Contracts\Encryption\DecryptException; // Exception for decryption thrown in facade try { $decrypted = decrypt($encryptedValue); } catch (DecryptException $e) { // }
请注意,如果由于使用了无效的 MAC 而解密过程不成功,则会抛出相应的异常。
Laravel - 散列
哈希(Hashing)是将字符串转换为较短的固定值或密钥的过程,该值或密钥代表原始字符串。Laravel 使用 **Hash** 门面,提供了一种安全的方式来以哈希方式存储密码。
基本用法
以下截图显示了如何创建一个名为 **passwordController** 的控制器,用于存储和更新密码:
以下代码行解释了 **passwordController** 的功能和用法:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use App\Http\Controllers\Controller class passwordController extends Controller{ /** * Updating the password for the user. * * @param Request $request * @return Response */ public function update(Request $request) { // Validate the new password length... $request->user()->fill([ 'password' => Hash::make($request->newPassword) // Hashing passwords ])->save(); } }
使用 **make** 方法存储哈希密码。此方法允许管理常用的 Laravel 中的 **bcrypt** 哈希算法的工作因子。
验证密码与哈希值
应将密码与哈希值进行验证,以检查用于转换的字符串。为此,可以使用 **check** 方法。如下面的代码所示:
if (Hash::check('plain-text', $hashedPassword)) { // The passwords match... }
请注意,**check** 方法将纯文本与 **hashedPassword** 变量进行比较,如果结果为真,则返回真值。
Laravel - 理解发布流程
每个 Web 应用框架都有自己的版本历史记录,并且一直在更新和维护。每个最新版本都带来新的功能,其中一些功能已被更改或弃用,因此了解哪个版本适合您的项目非常重要。
对于 Laravel,目前有两个活跃版本,如下所示:
- Laravel 4 - 于 2013 年 5 月发布
- Laravel 5.1 - 于 2015 年 2 月发布
Laravel 5.1 还包含各种版本,最新版本为 Laravel 5.1.5,其中包含用于 Web 开发的所有强大功能。Laravel 的路线图或版本发布如下图所示:
在理解 Laravel 的发布流程方面,以下几点值得注意:
在 Laravel 5.1 中删除了旧的 **app/models** 目录。
所有控制器、中间件和请求都分组在一个目录下,位于 app/Http 文件夹中。
新的文件夹 **Providers** 目录取代了 Laravel 4.x 版本中之前的 **app/start** 文件。
所有语言文件和视图都已移动到 **resources** 目录。
新的 artisan 命令 **route:cache** 用于注册新路由,并包含在 Laravel 5.1 及更高版本中。
Laravel 支持 **HTTP 中间件**,还包括 **CSRF 令牌** 和身份验证模型。
所有身份验证模型都位于一个名为 **resources/views/auth** 的目录下。它包括用户注册、身份验证和密码控制器。
Laravel 版本发布
版本 | 发布日期 | Bug 修复截止日期 | 安全修复截止日期 |
---|---|---|---|
V1 | 2011年6月 | - | - |
V2 | 2011年9月 | - | - |
v3 | 2012年2月 | - | - |
v4 | 2013年5月 | - | - |
5.0 | 2015年2月4日 | 2015年8月4日 | 2016年2月4日 |
5.1 (LTS) | 2015年6月9日 | 2017年6月9日 | 2018年6月9日 |
5.2 | 2015年12月21日 | 2016年6月21日 | 2016年12月21日 |
5.3 | 2016年8月23日 | 2017年2月23日 | 2017年8月23日 |
5.4 | 2017年1月24日 | 2017年7月24日 | 2018年1月24日 |
5.5 (LTS) | 2017年8月30日 | 2019年8月30日 | 2020年8月30日 |
5.6 | 2018年2月7日 | 2018年8月7日 | 2019年2月7日 |
5.7 | 2018年9月4日 | 2019年2月4日 | 2019年9月4日 |
请注意,突出显示的版本表示最新版本。
Laravel - 游客用户权限
访客用户门禁功能是 2018 年 9 月发布的最新 5.7 版本的附加功能。此功能用于启动特定用户的授权过程。
在 Laravel 5.6 中,有一个过程用于为未经身份验证的用户返回 **false**。在 Laravel 5.7 中,我们可以允许访客进行授权检查,方法是在指定的控制器中使用特定的 **nullable** 类型提示,如下所示:
<?php Gate::define('view-post', function (?User $user) { // Guests });
代码解释
通过使用 **nullable** 类型提示,当将访客用户传递给门禁时,$user 变量将为 null。然后,您可以根据需要决定是否授权操作。如果允许空类型并返回 true,则访客将拥有授权。如果不使用空类型提示,则对于 Laravel 5.7,访客将自动获得 403 响应,如下面的快照所示:
403 和 404 错误的区别在于,当用户尝试访问未知资源或 URL 时显示 404,如上图快照所示,如果未经授权的用户访问网站,则显示 403 错误。
Laravel - Artisan 命令
Laravel 5.7 提供了一种处理和测试新命令的新方法。它包括测试 artisan 命令的新功能,演示如下:
class ArtisanCommandTest extends TestCase{ public function testBasicTest() { $this->artisan('nova:create', [ 'name' => 'My New Admin panel' ]) ->expectsQuestion('Please enter your API key', 'apiKeySecret') ->expectsOutput('Authenticating...') ->expectsQuestion('Please select a version', 'v1.0') ->expectsOutput('Installing...') ->expectsQuestion('Do you want to compile the assets?', 'yes') ->expectsOutput('Compiling assets...') ->assertExitCode(0); } }
代码解释
这里在测试用例模块下创建了一个名为“ArtisanCommandTest”的新类。它包含一个基本函数 **testBasicTest**,其中包含各种断言功能。
artisan 命令 **expectsQuestion** 包含两个属性。一个带有问题,另一个带有 **apiKeySecret**。在这里,artisan 验证 apiKeySecret 并验证用户发送的输入。
同样的情况也适用于“请选择一个版本”的问题,用户需要在此处提及特定版本。
Laravel - 分页自定义
Laravel 包含一个分页功能,可帮助用户或开发者添加分页功能。Laravel 分页器与查询构建器和 Eloquent ORM 集成。paginate 方法会自动处理设置所需的限制和定义的偏移量。它只接受一个参数进行分页,即每页显示的项目数量。
Laravel 5.7 包含一种新的分页方法,用于自定义分页器每一侧的页数。新的方法不再需要自定义分页视图。
自定义分页视图代码演示如下:
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; use App\Http\Controllers\Controller; class UserController extends Controller{ /** * Show all of the users for the application. * * @return Response */ public function index() { $users = DB::table('users')->paginate(15); return view('user.index', ['users' => $users]); } }
根据 Laravel 标准进行的新分页自定义如下:
<?php User::paginate(10)->onEachSide(5);
请注意,**onEachSide** 指的是每 10 条分页记录的细分和 5 的细分。
Laravel - Dump Server
Laravel dump 服务器随 Laravel 5.7 版本一起提供。以前的版本不包含任何 dump 服务器。Dump 服务器将是 laravel/laravel composer 文件中的开发依赖项。
随着 5.7 版本的发布,您将获得此命令,其中包含开箱即用的概念,允许用户将数据转储到控制台或 HTML 文件,而不是浏览器。命令执行如下:
php artisan dump-server # Or send the output to an HTML file php artisan dump-server --format=html > dump.html
解释
该命令在后台运行一个服务器,有助于收集从应用程序发送的数据,并将输出通过控制台发送。当命令不在前台运行时,dump() 函数应默认工作。
Laravel - Action URL
Laravel 5.7 引入了一项名为“可调用操作 URL”的新功能。此功能类似于 Laravel 5.6 中接受 action 方法中字符串的功能。Laravel 5.7 中引入的新语法的主要目的是直接允许您访问控制器。
Laravel 5.6 版本中使用的语法如下:
<?php $url = action('UserController@profile', ['id' => 1]);
Laravel 5.7 中调用的类似操作如下:
<?php $url = action([PostsController::class, 'index']);
新的可调用数组语法格式的一个优点是,如果开发者使用支持代码导航的文本编辑器或 IDE,则可以直接导航到控制器的功能。