Laravel - 快速指南
Laravel - 概述
Laravel 是一个开源 PHP 框架,它功能强大且易于理解。它遵循模型-视图-控制器设计模式。Laravel 重用不同框架的现有组件,这有助于创建 Web 应用程序。这样设计的 Web 应用程序更加结构化和实用。
Laravel 提供了一组丰富的功能,融合了 PHP 框架(如 CodeIgniter、Yii)和其他编程语言(如 Ruby on Rails)的基本功能。Laravel 具有一组非常丰富的功能,可提高 Web 开发的速度。
如果您熟悉核心 PHP 和高级 PHP,Laravel 将使您的任务更轻松。如果您计划从头开始开发网站,它可以节省大量时间。此外,使用 Laravel 构建的网站非常安全,可以防止多种网络攻击。
Laravel 的优势
当您基于 Laravel 设计 Web 应用程序时,Laravel 为您提供以下优势 −
由于使用了 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 包含一个查询生成器,它有助于使用各种简单的链式方法查询数据库。它提供了名为 Eloquent 的 ORM(对象关系映射器)和 ActiveRecord 实现。
Schema Builder
Schema Builder 在 PHP 代码中维护数据库定义和模式。它还维护与数据库迁移相关的更改跟踪。
模板引擎
Laravel 使用 Blade Template 引擎,这是一种轻量级模板语言,用于设计包含动态内容的预定义块的分层块和布局。
电子邮件
Laravel 包含一个 mail 类,可帮助从 Web 应用程序发送具有丰富内容和附件的邮件。
身份验证
用户身份验证是 Web 应用程序中的常见功能。 Laravel 简化了身份验证的设计,因为它包含注册、忘记密码和发送密码提醒等功能。
Redis
Laravel 使用Redis连接到现有会话和通用缓存。Redis 直接与会话交互。
队列
Laravel 包含队列服务,例如向大量用户发送电子邮件或指定的Cron作业。这些队列有助于以更简单的方式完成任务,而无需等待上一个任务完成。
事件和命令总线
Laravel 5.1 包含命令总线,它有助于以简单的方式执行命令和分派事件。Laravel 中的命令按照应用程序的生命周期运行。
Laravel - 安装和环境设置
为了管理依赖项,Laravel 使用 composer。在安装 Laravel 之前,请确保您的系统上安装了 Composer。在本章中,您将看到 Laravel 的安装过程。
您必须按照下面给出的步骤将 Laravel 安装到您的系统上 −
步骤 1 − 访问以下 URL 并下载 composer 以将其安装在您的系统上。
https://getcomposer.org/download/
步骤 2 −安装 Composer 后,在命令提示符中输入 Composer 命令检查安装情况,如以下屏幕截图所示。
![Composer](/laravel/images/composer.jpg)
步骤 3 − 在系统中的任何位置为新的 Laravel 项目创建一个新目录。之后,移动到您创建新目录的路径,并在那里输入以下命令来安装 Laravel。
composer create-project laravel/laravel –-prefer-dist
现在,我们将重点介绍版本 5.7 的安装。在 Laravel 5.7 版本中,您可以通过输入以下命令来安装完整框架 −
composer create-project laravel/laravel test dev-develop
命令输出如下所示 −
可以使用包含最新框架的 evolve 分支直接安装 Laravel 框架。
步骤 4 − 上述命令将在当前目录中安装 Laravel。通过执行以下命令启动 Laravel 服务。
php artisan serve
步骤 5 −执行上述命令后,您将看到如下所示的屏幕 −
![Administrator](/laravel/images/administrator.jpg)
第 6 步 − 复制上图灰色下划线的 URL,然后在浏览器中打开该 URL。如果您看到以下屏幕,则表示 Laravel 已成功安装。
![Laravel Installed](/laravel/images/laravel_installed.jpg)
Laravel - 应用程序结构
Laravel 中的应用程序结构基本上是项目中包含的文件夹、子文件夹和文件的结构。在 Laravel 中创建项目后,我们将获得应用程序结构的概览,如下图所示。
此处显示的快照指的是 Laravel 的根文件夹,即 laravel-project。它包括各种子文件夹和文件。下面给出了文件夹和文件的分析及其功能方面 −
![Root Directory](/laravel/images/root_directory.jpg)
App
它是应用程序文件夹,包含项目的整个源代码。它包含事件、异常和中间件声明。 app 文件夹包含各种子文件夹,如下所述 −
Console
Console 包含 Laravel 所需的 artisan 命令。它包含一个名为 Commands 的目录,其中所有命令都使用适当的签名声明。文件 Kernal.php 调用 Inspire.php 中声明的命令。
![Console](/laravel/images/console.jpg)
如果我们需要在 Laravel 中调用特定命令,那么我们应该在此目录中进行适当的更改。
Events
此文件夹包含项目的所有事件。
![Events](/laravel/images/events.jpg)
事件用于触发活动、引发错误或必要的验证并提供更大的灵活性。 Laravel 将所有事件保存在一个目录下。包含的默认文件是 event.php,其中声明了所有基本事件。
Exceptions
此文件夹包含处理异常所需的所有方法。它还包含处理所有异常的文件 handle.php。
Http
Http 文件夹包含用于控制器、中间件和应用程序请求的子文件夹。由于 Laravel 遵循 MVC 设计模式,此文件夹包含为特定目录定义的模型、控制器和视图。
Middleware 子文件夹包含中间件机制,包括过滤机制以及响应与请求之间的通信。
Requests 子文件夹包含应用程序的所有请求。
Jobs
Jobs 目录维护为 Laravel 应用程序排队的活动。基类在所有作业之间共享,并提供一个中心位置将它们放在一个屋檐下。
侦听器
侦听器依赖于事件,它们包含用于处理事件和异常的方法。例如,声明的 login 事件包含 LoginListener 事件。
策略
策略是包含授权逻辑的 PHP 类。Laravel 包含一项功能,可在此子文件夹内的策略类中创建所有授权逻辑。
提供程序
此文件夹包含注册核心服务器事件和配置 Laravel 应用程序所需的所有服务提供商。
Bootstrap
此文件夹包含所有应用程序引导脚本。它包含一个名为 cache 的子文件夹,其中包含与缓存 Web 应用程序相关的所有文件。您还可以找到文件 app.php,该文件初始化引导所需的脚本。
配置
config 文件夹包含 Laravel 应用程序顺利运行所需的各种配置和相关参数。配置文件夹中包含的各种文件如下图所示。文件名根据与它们相关的功能工作。
![Config-folder](/laravel/images/configfolder.jpg)
数据库
顾名思义,此目录包含数据库功能的各种参数。它包括以下三个子目录 −
Seeds − 其中包含用于单元测试数据库的类。
Migrations − 此文件夹有助于查询迁移 Web 应用程序中使用的数据库。
Factories − 此文件夹用于生成大量数据记录。
Public
它是根文件夹,有助于初始化 Laravel 应用程序。它包括以下文件和文件夹 −
.htaccess − 此文件提供服务器配置。
javascript 和 css −这些文件被视为资产。
index.php − 此文件是初始化 Web 应用程序所必需的。
Resources
Resources 目录包含可增强 Web 应用程序的文件。此目录中包含的子文件夹及其用途如下所述 −
assets − assets 文件夹包含 LESS 和 SCSS 等文件,这些文件是设置 Web 应用程序样式所必需的。
lang − 此文件夹包含本地化或内部化的配置。
views −视图是与最终用户交互并在 MVC 架构中发挥主要作用的 HTML 文件或模板。
请注意,资源目录将被扁平化,而不是具有资产文件夹。 相同的图形表示如下所示 −
![资源目录更改](/laravel/images/resource_directory_changes.jpg)
存储
这是存储 Laravel 项目运行时经常需要的所有日志和必要文件的文件夹。此目录中包含的子文件夹及其用途如下所示 −
app − 此文件夹包含连续调用的文件。
framework −它包含经常调用的会话、缓存和视图。
日志 − 所有异常和错误日志都在此子文件夹中跟踪。
测试
所有单元测试用例都包含在此目录中。测试用例类的命名约定是 camel_case,并遵循类功能的约定。
供应商
Laravel 完全基于 Composer 依赖项,例如安装 Laravel 设置或包含第三方库等。Vendor 文件夹包含所有 Composer 依赖项。
除了上述文件外,Laravel 还包括一些其他文件,这些文件在 GitHub 配置、包和第三方库等各种功能中发挥主要作用。
应用程序结构中包含的文件如下所示 −
![Files](/laravel/images/files.jpg)
Laravel - 配置
在上一章中,我们已经看到 Laravel 的基本配置文件包含在 config 目录中。在本章中,让我们讨论配置中包含的类别。
环境配置
环境变量是那些为您的 Web 应用程序提供 Web 服务列表的变量。所有环境变量都在 .env 文件中声明,该文件包含初始化配置所需的参数。
默认情况下,.env 文件包含以下参数 −
APP_ENV = local APP_DEBUG = true APP_KEY = base64:ZPt2wmKE/X4eEhrzJU6XX4R93rCwYG8E2f8QUA7kGK8 = APP_URL = http://localhost 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 文件中声明的所有环境变量都可以通过 env-helper 函数访问,这些函数将调用相应的参数。每当应用程序从用户端收到请求时,这些变量也会列在 $_ENV 全局变量中。您可以按如下所示访问环境变量 −
'env' => env('APP_ENV', 'production'),
env-helper 函数在 config 文件夹中的 app.php 文件中调用。上面给出的示例是调用基本的本地参数。
访问配置值
您可以使用全局配置帮助函数在应用程序的任何位置轻松访问配置值。如果未初始化配置值,则返回默认值。
例如,要设置默认时区,请使用以下代码 −
config(['app.timezone' => 'Asia/Kolkata']);
配置缓存
为了提高性能并增强 Web 应用程序,缓存所有配置值非常重要。缓存配置值的命令是 −
config:cache
以下屏幕截图显示了系统方法中的缓存 −
![配置缓存](/laravel/images/configuration_caching.jpg)
维护模式
有时您可能需要更新某些配置值或对网站进行维护。在这种情况下,将其保持在维护模式可以让您更轻松。处于维护模式的 Web 应用程序会抛出异常,即 MaintenanceModeException,状态代码为 503。
您可以使用以下命令在 Laravel Web 应用程序上启用维护模式 −
php artisan down
![PHP Artisian Down](/laravel/images/php_artisian_down.jpg)
以下屏幕截图显示了 Web 应用程序关闭时的样子 −
![启动维护模式](/laravel/images/start_maintenance_mode.jpg)
完成更新和其他维护工作后,您可以使用以下命令在 Web 应用程序上禁用维护模式 −
php artisan up
![启动维护](/laravel/images/php_artisian_up.jpg)
现在,您可以发现网站显示的输出功能正常,并显示维护模式现已删除,如下所示 −
![Laravel Installed](/laravel/images/laravel_installed.jpg)
Laravel - 路由
在 Laravel 中,所有请求都借助路由进行映射。基本路由将请求路由到关联的控制器。本章讨论 Laravel 中的路由。
Laravel 中的路由包括以下类别 −
- 基本路由
- 路由参数
- 命名路由
基本路由
所有应用程序路由都在 app/routes.php 文件中注册。此文件告诉 Laravel 它应该响应的 URI,关联的控制器将对其进行特定调用。欢迎页面的示例路由如下图所示 −
![Routes](/laravel/images/routes.jpg)
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>
路由机制如下图所示 −
![路由机制](/laravel/images/routing_mechanism.jpg)
现在让我们详细了解路由机制所涉及的步骤 −
步骤 1 − 首先,我们应该执行应用程序的根 URL。
步骤 2 − 现在,执行的 URL 应该与 route.php 文件中的相应方法匹配。在本例中,它应该匹配方法和根 ('/') URL。这将执行相关函数。
步骤 3 −该函数调用模板文件 resources/views/welcome.blade.php。接下来,该函数使用参数 'welcome' 调用 view() 函数,而不使用 blade.php。
这将产生 HTML 输出,如下图所示 −
![Laravel5](/laravel/images/laravel5.jpg)
路由参数
有时在 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。
命名路由
命名路由允许一种方便的创建路由的方式。可以使用 name 方法在路由定义上指定路由的链接。以下代码显示了使用控制器 − 创建命名路由的示例
Route::get('user/profile', 'UserController@showProfile')->name('profile');
用户控制器将调用函数 showProfile,参数为 profile。参数使用 name 方法应用于路由定义。
Laravel - 中间件
中间件充当请求和响应之间的桥梁。它是一种过滤机制。本章将向您介绍 Laravel 中的中间件机制。
Laravel 包含一个中间件,用于验证应用程序的用户是否经过身份验证。如果用户经过身份验证,则重定向到主页,否则,如果未通过身份验证,则重定向到登录页面。
可以通过执行以下命令 − 来创建中间件
php artisan make:middleware <middleware-name>
将 <middleware-name> 替换为您的中间件的名称。您创建的中间件可以在 app/Http/Middleware 目录中看到。
示例
观察以下示例以了解中间件机制 −
步骤 1 − 现在让我们创建 AgeMiddleware。要创建它,我们需要执行以下命令 −
php artisan make:middleware AgeMiddleware
步骤 2 − 成功执行命令后,您将收到以下输出 −
![AgeMiddleware](/laravel/images/agemiddleware.jpg)
步骤 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 −执行成功后,您将收到以下输出 −
![Middleware Parameters](/laravel/images/middleware_parameters.jpg)
步骤 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。
![RoleMiddleware](/laravel/images/rolemiddleware.jpg)
步骤 5 − 执行以下命令创建 TestController −
php artisan make:controller TestController --plain
步骤 6 − 成功执行上述步骤后,您将收到以下输出 −
![TestController](/laravel/images/testcontroller.jpg)
步骤 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 以使用参数测试中间件
http://localhost:8000/role
步骤 10 − 输出将如下图所示显示。
![角色编辑器](/laravel/images/role_editor.jpg)
Terminable 中间件
Terminable 中间件在将响应发送到浏览器后执行某些任务。这可以通过在中间件中创建带有 terminate 方法的中间件来实现。Terminable 中间件应在全局中间件中注册。终止方法将接收两个参数 $request 和 $response。终止方法可以按照以下代码所示创建。
示例
步骤 1 − 通过执行以下命令创建 TerminateMiddleware。
php artisan make:middleware TerminateMiddleware
步骤 2 − 上述步骤将产生以下输出 −
![Terminable Middleware](/laravel/images/terminable_middleware.jpg)
步骤 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。
![TerminateMiddleware](/laravel/images/terminatemiddleware.jpg)
步骤 5 − 执行以下命令,创建 ABCController。
php artisan make:controller ABCController --plain
步骤 6 −成功执行 URL 后,您将收到以下输出 −
![ABCController](/laravel/images/abccontroller.jpg)
步骤 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 测试 Terminable 中间件。
http://localhost:8000/terminate
步骤 10 − 输出将如下图所示。
![ABC Controller](/laravel/images/abc_controller.jpg)
Laravel - 命名空间
命名空间可以定义为元素类,其中每个元素都具有与该关联类唯一的名称。它可以与其他类中的元素共享。
命名空间声明
use 关键字允许开发人员缩短命名空间。
use <namespace-name>;
Laravel 中使用的默认命名空间是 App,但用户可以更改命名空间以与 Web 应用程序匹配。使用 artisan 命令创建用户定义的命名空间如下 −
php artisan app:name SocialNet
![Select Git](/laravel/images/select_git.jpg)
一旦创建命名空间,就可以包含各种功能,这些功能可以在控制器和各种类中使用。
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 −执行成功后,您将收到以下输出。
![UserController](/laravel/images/usercontroller.jpg)
步骤 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 { // }
控制器中间件
我们之前见过中间件,它也可以与控制器一起使用。中间件也可以分配给控制器的路由或控制器的构造函数中。您可以使用中间件方法将中间件分配给控制器。已注册的中间件也可以限制为控制器的某些方法。
将中间件分配给路由
Route::get('profile', [ 'middleware' => 'auth', 'uses' => 'UserController@showProfile' ]);
这里我们在配置文件路由中将身份验证中间件分配给 UserController。
在 Controller 的构造函数中分配中间件
<?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 构造函数中的中间件方法分配 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 − 在 app/Http/Middleware 中新建的 FirstMiddleware 的 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 − 在 app/Http/Middleware 中新建的 SecondMiddleware 的 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 后,您将收到以下输出 −
![UserController1](/laravel/images/usercontroller1.jpg)
步骤 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。
http://localhost:8000/usercontroller/path
步骤 11 − 输出将如下图所示显示。
![UserController2](/laravel/images/usercontroller2.jpg)
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 − 我们现在通过使用资源注册控制器来注册 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 | 说明 | 输出图像 |
---|---|---|
http://localhost:8000/my | Executes index method of MyController.php | index |
http://localhost:8000/my/create | Executes create method of MyController.php | create |
http://localhost:8000/my/1 | Executes show method of MyController.php | show |
http://localhost:8000/my/1/edit | Executes edit method of MyController.php | edit |
隐式控制器
隐式控制器允许您定义单个路由来处理控制器中的每个操作。您可以在 route.php 文件中使用 Route:controller 方法定义它,如下所示。
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 后,您将收到以下输出 −
![Implicitcontroller](/laravel/images/implicitcontroller.jpg)
步骤 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 测试构造函数注入。
http://localhost:8000/myclass
步骤 4 − 输出将如下图所示显示。
![Myclass](/laravel/images/constructor_injection.jpg)
方法注入
除了构造函数注入,您还可以在控制器的操作方法上键入 — 提示依赖项。
示例
步骤 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 测试构造函数注入。
http://localhost:8000/myclass
它将产生以下输出 −
![Constructor Injection](/laravel/images/constructor_injection.jpg)
Laravel - 请求
在本章中,您将详细了解 Laravel 中的请求。
检索请求 URI
"path" 方法用于检索请求的 URI。is 方法用于检索与方法参数中指定的特定模式匹配的请求 URI。要获取完整的 URL,我们可以使用 url 方法。
示例
步骤 1 − 执行以下命令创建一个名为 UriController 的新控制器。
php artisan make:controller UriController –plain
步骤 2 −成功执行 URL 后,您将收到以下输出 −
![UriController](/laravel/images/uricontroller.jpg)
步骤 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) { // path 方法的用法 $path = $request->path(); echo 'Path Method:'.$path; echo '<br>'; // is 方法的用法 $pattern = $request->is('foo/*'); echo 'is Method:'.$pattern; echo '<br>'; // url 方法的用法 $url = $request->url(); echo 'URL Method:'.$url; } }
步骤 4 − 在 app/Http/route.php 文件中添加以下行。
app/Http/route.php
Route::get('/foo/bar','UriController@index');
步骤 5 − 访问以下网址。
http://localhost:8000/foo/bar
步骤 6 − 输出将如下图所示显示。
![Path Method](/laravel/images/path_method.jpg)
检索输入
可以在 Laravel 中轻松检索输入值。无论使用什么方法 "get" 或 "post",Laravel 方法都会以相同的方式检索这两种方法的输入值。我们可以通过两种方式检索输入值。
- 使用 input() 方法
- 使用 Request 实例的属性
使用 input() 方法
input() 方法接受一个参数,即表单中字段的名称。例如,如果表单包含用户名字段,那么我们可以通过以下方式访问它。
$name = $request->input('username');
使用 Request 实例的属性
与 input() 方法类似,我们可以直接从请求实例获取用户名属性。
$request->username
示例
观察以下示例以了解有关 Requests 的更多信息 −
步骤 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 − 成功执行上述步骤后,您将收到以下输出 −
![UserRegistration](/laravel/images/userregistration.jpg)
步骤 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) { //检索名称输入字段 $name = $request->input('name'); echo 'Name:'.$name; echo '<br>'; //检索用户名输入字段 $username = $request->username; echo 'Username:'.$username; echo '<br>'; //检索密码输入字段 $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 − 访问以下网址,您将看到注册表单,如下图所示。输入注册详细信息并单击"注册",您将在第二页看到我们已检索并显示了用户注册详细信息。
http://localhost:8000/register
步骤 7 −输出将类似于以下图片所示。
![Registration](/laravel/images/registration.jpg)
Laravel - Cookie
Cookie 在 Web 应用程序上处理用户会话时起着重要作用。在本章中,您将了解如何在基于 Laravel 的 Web 应用程序中使用 Cookie。
创建 Cookie
Cookie 可以通过 Laravel 的全局 Cookie 助手创建。它是 Symfony\Component\HttpFoundation\Cookie 的一个实例。可以使用 withCookie() 方法将 Cookie 附加到响应。创建 Illuminate\Http\Response 类的响应实例以调用 withCookie() 方法。Laravel 生成的 Cookie 经过加密和签名,客户端无法修改或读取。
以下是带有说明的示例代码。
//创建响应实例 $response = new Illuminate\Http\Response('Hello World'); //使用响应方法调用 withCookie() 方法 $response->withCookie(cookie('name', 'value', $minutes)); //返回响应 return $response;
Cookie() 方法将接受 3 个参数。第一个参数是 cookie 的名称,第二个参数是 cookie 的值,第三个参数是 cookie 的持续时间,超过该时间后 cookie 将自动删除。
可以使用 forever 方法永久设置 Cookie,如以下代码所示。
$response->withCookie(cookie()->forever('name', 'value'));
检索 Cookie
设置 cookie 后,我们可以通过 cookie() 方法检索 cookie。此 cookie() 方法仅接受一个参数,即 cookie 的名称。可以使用 Illuminate\Http\Request 实例来调用 cookie 方法。
以下是示例代码。
//'name' 是要检索其值的 cookie 的名称 $value = $request->cookie('name');
示例
观察以下示例以了解有关 Cookies 的更多信息 −
步骤 1 − 执行以下命令创建一个控制器,我们将在其中操作 cookie。
php artisan make:controller CookieController --plain
步骤 2 −执行成功后,您将收到以下输出 −
![CookieController](/laravel/images/cookiecontroller.jpg)
步骤 3 − 复制以下代码
app/Http/Controllers/CookieController.php file.
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。
http://localhost:8000/cookie/set
步骤 6 − 输出将如下所示。屏幕截图中显示的窗口取自 Firefox,但根据您的浏览器,也可以从 cookie 选项中检查 cookie。
![Hello World](/laravel/images/hello_world.jpg)
步骤 7 − 访问以下 URL 以从上述 URL 获取 cookie。
http://localhost:8000/cookie/get
步骤 8 − 输出将如下图所示。
![Virat](/laravel/images/virat.jpg)
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 以测试基本响应。
http://localhost:8000/basic_response
步骤 3 − 输出将如下图所示显示。
![Basic Response](/laravel/images/basic_response.jpg)
附加标头
可以使用 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 以测试基本响应。
http://localhost:8000/header
步骤 3 −输出将如下图所示显示。
![Hello](/laravel/images/hello.jpg)
附加 Cookies
withcookie() 辅助方法用于附加 cookies。使用此方法生成的 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 以测试基本响应。
http://localhost:8000/cookie
步骤 3 − 输出将如下图所示显示。
![Hello](/laravel/images/hello.jpg)
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 响应。
http://localhost:8000/json
步骤 3 − 输出将如下图所示。
![Json Response](/laravel/images/json_response.jpg)
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 以查看视图的输出。
http://localhost:8000/test
步骤 4 −输出将如下图所示显示。
![Understanding Views](/laravel/images/understanding_views.jpg)
将数据传递给视图
在构建应用程序时,可能需要将数据传递给视图。将数组传递给视图辅助函数。传递数组后,我们可以使用该键在 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 − 键 name 的值将传递给 test.php 文件,并且 $name 将由该值替换。
步骤 4 − 访问以下 URL 以查看视图的输出。
http://localhost:8000/test
步骤 5 − 输出将如下图所示显示。
![Virat Gandhi](/laravel/images/virat_gandhi.jpg)
与所有视图共享数据
我们已经了解了如何将数据传递给视图,但有时需要将数据传递给所有视图。Laravel 使这变得更简单。有一个名为 share() 的方法可用于此目的。 share() 方法将接受两个参数,即 key 和 value。通常,可以从服务提供者的 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。
http://localhost:8000/test http://localhost:8000/test2
步骤 5 − 输出将如下图所示。
![Virat Gandhi](/laravel/images/virat_gandhi.jpg)
Laravel - Blade 模板
Laravel 5.1 引入了使用 Blade(一种模板引擎)来设计独特布局的概念。这样设计的布局可供其他视图使用,并包含一致的设计和结构。
与其他模板引擎相比,Blade 在以下方面是独一无二的 −
它不限制开发人员在视图中使用纯 PHP 代码。
这样设计的 blade 视图会被编译和缓存,直到被修改为止。
![Welcome Blade](/laravel/images/welcome_blade.jpg)
Laravel 的完整目录结构在此处给出的屏幕截图中显示。
您可以观察到所有视图都存储在 resources/views 目录中,Laravel 框架的默认视图是 welcome.blade.php。
请注意,还创建了其他 blade 模板类似地。
创建 Blade 模板布局的步骤
您必须使用以下步骤创建 blade 模板布局 −
步骤 1
在 resources/views 文件夹中创建一个布局文件夹。我们将使用此文件夹将所有布局存储在一起。
创建一个名为 master.blade.php 的文件名,其中包含以下代码 −
<html> <head> <title>DemoLaravel - @yield('title')</title> </head> <body> @yield('content') </body> </html>
步骤 2
在此步骤中,您应该扩展布局。扩展布局涉及定义子元素。Laravel 使用 Blade @extends 指令来定义子元素。
扩展布局时,请注意以下几点 −
Blade Layout 中定义的视图以独特的方式注入容器。
视图的各个部分都是作为子元素创建的。
子元素存储在布局文件夹中,作为 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
要在视图中实现子元素,您应该以所需的方式定义布局。
![Landing Page](/laravel/images/landing_page.jpg)
观察此处显示的屏幕截图。您可以发现登录页面中提到的每个链接都是超链接。请注意,您也可以使用上面给出的过程,借助 blade 模板将它们创建为子元素。
Laravel - 重定向
命名路由用于为路由指定特定名称。可以使用 "as" 数组键分配名称。
Route::get('user/profile', ['as' => 'profile', function () { // }]);
注意 − 在这里,我们为路由 user/profile 指定了名称 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 以测试命名路由示例。
http://localhost:8000/redirect
步骤 4 − 执行上述 URL 后,您将被重定向到 http://localhost:8000/test,因为我们正在重定向到命名路由测试。
步骤 5 − 成功执行 URL 后,您将收到以下输出 −
![Virat Gandhi](/laravel/images/virat_gandhi.jpg)
重定向到控制器操作
不仅可以使用命名路由,还可以重定向到控制器操作。我们只需将 action 的控制器和名称传递给操作方法,如以下示例所示。如果要传递参数,可以将其作为操作方法的第二个参数传递。
return redirect()->action('NameOfController@methodName',[parameters]);
示例
步骤 1 − 执行以下命令创建一个名为 RedirectController 的控制器。
php artisan make:controller RedirectController --plain
步骤 2 −执行成功后,您将收到以下输出 −
![Redirect Controller](/laravel/images/redirect_controller.jpg)
步骤 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 测试示例。
http://localhost:8000/redirectcontroller
步骤 6 −输出将如下图所示显示。
![RedirectController.jpg](/laravel/images/redirectcontroller.jpg)
Laravel - 使用数据库
Laravel 使数据库处理变得非常容易。Laravel 目前支持以下 4 个数据库 −
- MySQL
- Postgres
- SQLite
- SQL Server
可以使用原始 SQL、流畅查询生成器和 Eloquent ORM 触发对数据库的查询。为了理解 Laravel 的所有 CRUD(创建、读取、更新、删除)操作,我们将使用简单的学生管理系统。
连接到数据库
在 config/database.php 文件中配置数据库,并在 MySQL 中创建具有下表所示结构的大学数据库。
数据库:大学
表:学生
列名称 | 列数据类型 | 额外 |
---|---|---|
Id | int(11) | 主键 | 自动增量 |
Name | varchar(25) |
我们将了解如何使用 Laravel 在学生表中添加、删除、更新和从数据库中检索记录。
Sr.No. | 记录 &描述 |
---|---|
1 | 插入记录
我们可以使用带有 insert 方法的 DB 外观插入记录。 |
2 | 检索记录
配置数据库后,我们可以使用带有 select 方法的 DB 外观检索记录。 |
3 | 更新记录
我们可以使用带有 update 的 DB 外观更新记录方法。 |
4 | 删除记录
我们可以使用带有 delete 方法的 DB 外观删除记录。 |
Laravel - 错误和日志
本章介绍 Laravel 项目中的错误和日志以及如何处理它们。
错误
项目在进行中,难免会出现一些错误。当您启动新的 Laravel 项目时,已经为您配置了错误和异常处理。通常,在本地环境中,我们需要查看错误以进行调试。我们需要在生产环境中向用户隐藏这些错误。这可以通过在存储在应用程序根目录中的环境文件 .env 中设置的变量 APP_DEBUG 来实现。
对于本地环境,APP_DEBUG 的值应为 true,但对于生产,需要将其设置为 false 以隐藏错误。
注意 −更改 APP_DEBUG 变量后,您应该重新启动 Laravel 服务器。
日志记录
日志记录是系统记录生成的错误的重要机制。它有助于提高系统的可靠性。Laravel 支持不同的日志记录模式,如单一、每日、系统日志和错误日志模式。您可以在 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,如下图所示。
![HTML Package](/laravel/images/html_package.jpg)
步骤 3 −现在,我们需要将上面显示的包添加到存储在 config/app.php 中的 Laravel 配置文件中。打开此文件,您将看到 Laravel 服务提供商列表,如下图所示。添加 HTML 服务提供商,如下图轮廓框中所示。
![Laravel Service](/laravel/images/laravel_service.jpg)
步骤 4 − 在同一文件中为 HTML 和表单添加别名。注意下图轮廓框中指示的两行,并添加这两行。
![Outlined Box](/laravel/images/outlined_box.jpg)
步骤 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', 'example@gmail.com');
生成密码输入
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', 'example@gmail.com'); 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 中添加以下行,为 view form.php 添加路由
app/Http/routes.php
Route::get('/form',function() { return view('form'); });
步骤 3 − 访问以下网址查看表单。
http://localhost:8000/form
步骤 4 − 输出将如下图所示显示。
![View Form](/laravel/images/view_form.jpg)
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 − 执行成功后,您将收到以下输出 −
![LocalizationController](/laravel/images/localizationcontroller.jpg)
步骤 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) { //设置应用程序区域 app()->setLocale($locale); //获取翻译后的消息并显示它 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 以查看英语输出。
http://localhost:8000/localization/en
步骤 9 −输出将如下图所示显示。
![Laravel Internationalization](/laravel/images/laravel_internationalization.jpg)
步骤 10 − 执行以下 URL 以查看法语输出。
http://localhost:8000/localization/fr
步骤 11 − 输出将如下图所示显示。
![法语示例](/laravel/images/french_example.jpg)
步骤 12 −执行以下 URL 以查看德语输出
http://localhost:8000/localization/de
步骤 13 − 输出将如下图所示显示。
![德语示例](/laravel/images/german_example.jpg)
Laravel - 会话
会话用于在请求中存储有关用户的信息。Laravel 提供各种驱动程序,如文件、cookie、apc、数组、Memcached、Redis和数据库来处理会话数据。默认情况下,使用文件驱动程序,因为它是轻量级的。可以在存储在config/session.php的文件中配置会话。
访问会话数据
要访问会话数据,我们需要一个可以通过 HTTP 请求访问的会话实例。获取实例后,我们可以使用get()方法,该方法将接受一个参数"key"来获取会话数据。
$value = $request->session()->get('key');
您可以使用 all() 方法获取所有会话数据,而不是 get() 方法。
存储会话数据
可以使用 put() 方法将数据存储在会话中。put() 方法将采用两个参数,即 "key" 和 "value"。
$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 − 成功执行后,您将收到以下输出 −
![SessionController](/laravel/images/sessioncontroller.jpg)
步骤 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 以 在会话中设置数据。
http://localhost:8000/session/set
步骤 6 −输出将如下图所示显示。
![会话中的数据](/laravel/images/data_in_session.jpg)
步骤 7 − 访问以下 URL 以 从会话中获取数据。
http://localhost:8000/session/get
步骤 8 − 输出将如下图所示显示。
![Virat Gandhi](/laravel/images/virat_gandhi.jpg)
步骤 9 −访问以下 URL 以删除会话数据。
http://localhost:8000/session/remove
步骤 10 − 您将看到如下图所示的消息。
![Session](/laravel/images/session.jpg)
Laravel - 验证
验证是设计应用程序时最重要的方面。它验证传入的数据。默认情况下,基本控制器类使用 ValidatesRequests 特性,该特性提供了一种方便的方法,可以使用各种强大的验证规则来验证传入的 HTTP 请求。
Laravel 中可用的验证规则
Laravel 将始终检查会话数据中的错误,并自动将它们绑定到视图(如果可用)。因此,重要的是要注意,$errors 变量在每个请求的所有视图中始终可用,让您可以方便地假设 $errors 变量始终已定义并且可以安全使用。下表显示了 Laravel 中所有可用的验证规则。
Laravel 中可用的验证规则 | ||
---|---|---|
Accepted | Active URL | After (Date) |
Alpha | Alpha Dash | Alpha Numeric |
Array | Before (Date) | Between |
Boolean | Confirmed | Date |
Date Format | Different | Digits |
Digits Between | Exists (Database) | |
Image (File) | In | Integer |
IP Address | JSON | Max |
MIME Types(File) | Min | Not In |
Numeric | Regular Expression | Required |
Required If | Required Unless | Required With |
Required With All | Required Without | Required Without All |
Same | Size | String |
Timezone | Unique (Database) | 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 − 执行成功后,您将收到以下输出 −
![ValidationController](/laravel/images/validationcontroller.jpg)
步骤 3 − 将以下代码复制到
app/Http/Controllers/ValidationController.php file.
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 − 访问以下网址以测试验证。
http://localhost:8000/validation
步骤 7 − 单击 "登录" 按钮,而无需在文本字段中输入任何内容。输出将如下图所示。
![Login](/laravel/images/login.jpg)
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 − 成功执行后,您将收到以下输出 −
![UploadFileController](/laravel/images/uploadfilecontroller.jpg)
步骤 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'); //显示文件名 echo '文件名:'.$file->getClientOriginalName(); echo '<br>'; //显示文件扩展名 echo '文件扩展名:'.$file->getClientOriginalExtension(); echo '<br>'; //显示文件实际路径 echo '文件实际路径:'.$file->getRealPath(); echo '<br>'; //显示文件大小 echo '文件大小:'.$file->getSize(); echo '<br>'; //显示文件 MIME 类型 echo '文件 MIME 类型:'.$file->getMimeType(); //移动已上传的文件 $destinationPath = 'uploads'; $文件->移动($destinationPath,$文件->getClientOriginalName()); } }
步骤 5 − 在 app/Http/routes.php 中添加以下几行。
app/Http/routes.php
Route::get('/uploadfile','UploadFileController@index'); Route::post('/uploadfile','UploadFileController@showUploadFile');
步骤 6 − 访问以下 URL 以测试上传文件功能。
http://localhost:8000/uploadfile
步骤 7 −您将收到如下图所示的提示。
![浏览文件](/laravel/images/browse_file.jpg)
![Browse File](/laravel/images/browse_file.jpg)
Laravel - 发送电子邮件
Laravel 使用功能丰富的免费库 SwiftMailer 发送电子邮件。使用库函数,我们可以轻松发送电子邮件,而不会有太多麻烦。电子邮件模板的加载方式与视图相同,这意味着您可以使用 Blade 语法并将数据注入模板。
下表显示了 send 函数的语法和属性 −
语法 | void send(string|array $view, array $data, Closure|string $callback) |
参数 |
|
返回 | 无 |
描述 | 发送电子邮件。 |
在第三个参数中,$callback 闭包接收到消息实例,通过该实例,我们还可以调用以下函数并更改消息,如下所示。
- $message → subject('Welcome to the Tutorials Point');
- $message → from('email@example.com', 'Mr. Example');
- $message → to('email@example.com', 'Mr. Example');
一些不太常见的方法包括 −
- $message → sender('email@example.com', 'Mr. Example');
- $message → returnPath('email@example.com');
- $message → cc('email@example.com', 'Mr. Example');
- $message → bcc('email@example.com', 'Mr. Example');
- $message → replyTo('email@example.com', 'Mr. Example');
- $message → priority(2);
要附加或嵌入文件,您可以使用以下方法 −
- $message → attachment('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 帐户中启用两步验证并创建应用程序特定密码,然后更改 .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 − 执行成功后,您将收到以下输出 −
![MailController](/laravel/images/mailcontroller.jpg)
步骤 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('abc@gmail.com', 'Tutorials Point')->subject ('Laravel Basic Testing Mail'); $message->from('xyz@gmail.com','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('abc@gmail.com', 'Tutorials Point')->subject ('Laravel HTML Testing Mail'); $message->from('xyz@gmail.com','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('abc@gmail.com', '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 est.txt'); $message->from('xyz@gmail.com','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 以测试基本电子邮件。
http://localhost:8000/sendbasicemail
步骤 9 − 输出屏幕将如下所示。检查您的收件箱以查看基本电子邮件输出。
![Basic Email Sent](/laravel/images/basic_email_sent.jpg)
步骤 10 −访问以下 URL 以测试 HTML 电子邮件。
http://localhost:8000/sendhtmlemail
步骤 11 − 输出屏幕将如下所示。检查您的收件箱以查看 html 电子邮件输出。
![HTML Email](/laravel/images/html_email.jpg)
步骤 12 − 访问以下 URL 以测试带有附件的 HTML 电子邮件。
http://localhost:8000/sendattachmentemail
步骤 13 −您可以看到以下输出
![Email Sent](/laravel/images/email_sent.jpg)
注意 − 在 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 − 成功执行后,您将收到以下输出 −
![AjaxController](/laravel/images/ajaxcontroller.jpg)
步骤 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 功能。
http://localhost:8000/ajax
步骤 7 −您将被重定向到一个页面,在该页面上您将看到如下图所示的消息。
![替换消息](/laravel/images/replace_message.jpg)
步骤 8 − 单击按钮后,输出将显示如下图所示。
![简单消息](/laravel/images/simple_message.jpg)
Laravel - 错误处理
大多数 Web 应用程序都有特定的错误处理机制。它们使用这些机制来跟踪错误和异常,并记录它们以分析性能。在本章中,您将阅读有关 Laravel 应用程序中的错误处理的内容。
要点
在进一步详细了解 Laravel 中的错误处理之前,请注意以下要点 −
对于任何新项目,Laravel 默认在 App\Exceptions\Handler 类中记录错误和异常。然后将它们提交回给用户进行分析。
当您的 Laravel 应用程序设置为调试模式时,Web 应用程序中发生的每个错误都会显示带有堆栈跟踪的详细错误消息。
![Error Log](/laravel/images/error_log.jpg)
默认情况下,调试模式设置为 false,您可以将其更改为 true。这使用户能够使用堆栈跟踪跟踪所有错误。
![App Debug](/laravel/images/app_debug.jpg)
Laravel 项目的配置包括 debug 选项,该选项决定要向用户显示多少有关错误的信息。在 Web 应用程序中,默认情况下,该选项设置为 .env 文件的环境变量中定义的值。
在本地开发环境中,该值设置为 true,在生产环境中,该值设置为 false。
如果在生产环境中将该值设置为 true,则与最终用户共享敏感信息的风险更高。
错误日志
在 Web 应用程序中记录错误有助于跟踪错误并制定消除错误的策略。可以在 Web 应用程序中的 config/app.php 文件中配置日志信息。在 Laravel 中处理错误日志时请注意以下几点 −
Laravel 使用 monolog PHP 日志库。
用于错误跟踪的日志参数是 single、daily、syslog 和 errorlog。
例如,如果您希望将错误消息记录在日志文件中,则应将应用程序配置中的日志值设置为 daily,如以下命令所示 −
'log' => env('APP_LOG','daily'),
如果将 daily 日志模式作为参数,则 Laravel 默认会记录 5 天 的错误日志。如果您希望更改日志文件的最大数量,则必须将配置文件中的 log_max_files 参数设置为所需值。
'log_max_files' => 25;
严重性级别
由于 Laravel 使用 monolog PHP 日志库,因此有各种参数用于分析严重性级别。可用的各种严重性级别包括 error、critical、alert 和 emergency messages。您可以按照以下命令设置严重性级别 −
'log_level' => env('APP_LOG_LEVEL', 'error')
Laravel - 事件处理
事件提供了一个简单的观察者实现,允许用户订阅和监听在 Web 应用程序中触发的各种事件。Laravel 中的所有事件类都存储在 app/Events 文件夹中,而监听器则存储在 app/Listeners 文件夹中。
用于在 Web 应用程序中生成事件和监听器的 artisan 命令如下所示 −
php artisan event:generate
此命令将事件和监听器生成到上述相应的文件夹中。
![Event Generator](/laravel/images/event_generator.jpg)
事件和监听器是解耦 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; }
侦听器
侦听器处理正在注册的事件中提到的所有活动。artisan 命令 event:generate 在 app/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
Facades 为应用程序服务容器中可用的类提供静态接口。Laravel facades 充当服务容器中底层类的静态代理,提供简洁、富有表现力的语法优势,同时比传统静态方法保持更高的可测试性和灵活性。
如何创建 Facade
以下是在 Laravel 中创建 Facade 的步骤 −
步骤 1 − 创建 PHP 类文件。
步骤 2 − 将该类绑定到服务提供商。
步骤 3 −将该 ServiceProvider 注册到
Config\app.php 作为提供程序。
步骤 4 − 创建该类扩展的类
lluminate\Support\Facades\Facade。
步骤 5 − 将第 4 点注册到 Config\app.php 作为别名。
Facade 类参考
Laravel 附带许多 Facade。下表显示内置的 Facade 类参考 −
Facade | 类 | 服务容器绑定 |
---|---|---|
App | Illuminate\Foundation\Application | app |
Artisan | Illuminate\Contracts\Console\Kernel | artisan |
Auth | Illuminate\Auth\AuthManager | auth |
Auth (Instance) | 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 (Instance) | 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 (Instance) | Illuminate\Queue\QueueInterface | |
Queue (Base Class) | 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 (Instance) | Illuminate\Session\Store | |
Storage | Illuminate\Contracts\Filesystem\Factory | filesystem |
URL | Illuminate\Routing\UrlGenerator | url |
Validator | Illuminate\Validation\Factory | validator |
Validator (Instance) | Illuminate\Validation\Validator | |
View | Illuminate\View\Factory | view |
View (Instance) | Illuminate\View\View |
示例
步骤 1 − 通过执行以下命令创建一个名为 TestFacadesServiceProvider 的服务提供程序。
php artisan make:provider TestFacadesServiceProvider
步骤 2 − 执行成功后,您将收到以下输出 −
![FacadesServiceProvider](/laravel/images/facadesserviceprovider.jpg)
步骤 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
![服务提供者](/laravel/images/service_provider.jpg)
步骤 7 − 在文件 config/app.php 中添加别名,如下图所示。
config/app.php
![别名](/laravel/images/alias.jpg)
步骤 8 −在 app/Http/routes.php 中添加以下几行。
app/Http/routes.php
Route::get('/facadeex', function() { return TestFacades::testingFacades(); });
步骤 9 − 访问以下 URL 以测试 Facade。
http://localhost:8000/facadeex
步骤 10 − 访问 URL 后,您将收到以下输出 −
![Testing Facades](/laravel/images/testing_facades.jpg)
Laravel - Contracts(契约)
Laravel Contracts (契约)是一组接口,具有框架提供的各种功能和核心服务。
例如,Illuminate\Contracts\Queue\Queue 契约使用排队作业所需的方法,而 Illuminate\Contracts\Mail\Mailer 使用发送电子邮件的方法。
定义的每个契约都包含框架的相应实现。如下所述,所有 Laravel 合约均可在 GitHub 存储库中找到 −
https://github.com/illuminate/contracts
此存储库提供了 Laravel 框架中可用的各种合约,您可以下载并相应地使用它们。
要点
在使用 Laravel 合约时,请注意以下要点 −
必须在类的构造函数中定义外观。
合约在类中明确定义,您无需在构造函数中定义合约。
示例
考虑下面提到的 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 应用程序的所有令牌,并包含 meta 标记,该标记使用 Axios HTTP 库 存储 csrf-token。
没有 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>
上述代码的结果为最终用户可以查看的下方表单 −
![Contact Form](/laravel/images/contact_form.jpg)
上述表单将接受来自授权用户的任何输入信息。这可能会使 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": "421660149@qq.com" }
这是单击提交按钮时创建的 CSRF 令牌。
Laravel - 身份验证
身份验证是识别用户凭据的过程。在 Web 应用程序中,身份验证由会话管理,会话采用电子邮件或用户名和密码等输入参数来识别用户。如果这些参数匹配,则表示用户已通过身份验证。
命令
Laravel 使用以下命令创建表单和相关控制器来执行身份验证 −
php artisan make:auth
此命令有助于成功创建身份验证脚手架,如以下屏幕截图所示 −
![Authentication](/laravel/images/authentication.jpg)
控制器
用于身份验证过程的控制器是 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/images/login_page.jpg)
注册
![注册](/laravel/images/register.jpg)
手动验证用户
Laravel 使用 Auth 外观来帮助手动验证用户。它包括 attempt 方法来验证他们的电子邮件和密码。
考虑以下 LoginController 的代码行,其中包括用于身份验证的所有函数 −
<?php // 身份验证机制 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 提供了一种简单的授权机制,其中包含两种主要方式,即门和策略。
编写门和策略
门用于确定用户是否被授权执行指定的操作。它们通常使用 Gate 外观在 App/Providers/AuthServiceProvider.php 中定义。 Gates 也是为执行授权机制而声明的函数。
策略在数组中声明,并在使用授权机制的类和方法中使用。
以下代码行向您解释了如何在 Laravel Web 应用程序中使用 Gates 和策略授权用户。请注意,在此示例中,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 Help Serve](/laravel/images/artisan_help_serve.jpg)
编写命令
除了 Artisan 中列出的命令外,用户还可以创建可在 Web 应用程序中使用的自定义命令。请注意,命令存储在 app/console/commands 目录中。
创建用户定义命令的默认命令如下所示 −
php artisan make:console <name-of-command>
输入上述命令后,您可以看到如下图所示的输出 −
![defaultCommand](/laravel/images/default_command.jpg)
为 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 命令中。当您调用指定命令的帮助属性时,将显示签名和描述部分中包含的值。
让我们看看如何查看命令 DefaultCommand 的属性。您应该使用如下所示的命令 −
php artisan help DefaultCommand
Laravel - 加密
加密是使用某些算法将纯文本转换为消息的过程,以使任何第三用户都无法读取该信息。 这有助于传输敏感信息,因为入侵者瞄准传输的信息的机会较少。
加密是使用称为密码术的过程执行的。 要加密的文本称为纯文本,加密后获得的文本或消息称为密文。 将密文转换为纯文本的过程称为解密。
Laravel 使用AES-256和AES-128加密器,它们使用 Open SSL 进行加密。 Laravel 中包含的所有值均使用协议 消息认证码 进行签名,因此加密后底层值就无法被篡改。
配置
用于在 Laravel 中生成 密钥 的命令如下所示 −
php artisan key:generate
请注意,此命令使用 PHP 安全随机字节生成器,您可以看到如下屏幕截图所示的输出 −
![Artisan Key](/laravel/images/artisan_key.jpg)
上面给出的命令有助于生成可用于 Web 应用程序的密钥。观察下面的屏幕截图 −
注意
用于加密的值在 config/app.php 文件中正确对齐,其中包含两个用于加密的参数,即 key 和 cipher。如果使用此密钥的值未正确对齐,则 Laravel 中加密的所有值都将不安全。
加密过程
可以使用 Laravel 类的控制器中的 encrypt 帮助程序 来加密值。这些值使用 OpenSSL 和 AES-256 密码加密。所有加密值均使用消息认证码 (MAC) 进行签名,以检查加密字符串是否被修改。
![defaultCommand](/laravel/images/defaultcommand.jpg)
下面显示的代码在控制器中提及,用于存储机密或敏感消息。
<?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; // Facade 中引发解密异常 try { $decrypted = decrypt($encryptedValue); } catch (DecryptException $e) { // }
请注意,如果由于使用了无效 MAC 导致解密过程不成功,则会引发相应的异常。
Laravel - 哈希处理
哈希处理是将一串字符转换为较短的固定值或表示原始字符串的键的过程。Laravel 使用 Hash 外观,它提供了一种以哈希方式存储密码的安全方法。
基本用法
以下屏幕截图显示了如何创建名为 passwordController 的控制器,用于存储和更新密码 −
![Password](/laravel/images/password.jpg)
以下代码行解释了 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)) { // 密码匹配... }
请注意,check 方法将纯文本与 hashedPassword 变量进行比较,如果结果为真,则返回真值。
Laravel - 了解发布版本历史
每个 Web 应用程序框架都有自己的版本历史,并且始终在更新和维护。每个最新版本都带来了新功能和功能,这些功能要么已更改,要么已弃用,因此了解哪个版本适合您的项目非常重要。
对于 Laravel,有两个活动版本,如下所示 −
- Laravel 4- 于 2013 年 5 月发布
- Laravel 5.1- 于 2015 年 2 月发布
Laravel 5.1 还包括各种版本,最新版本的 Laravel 5.1.5 包含所有适用于 Web 开发的强大功能。 Laravel 的路线图或版本发布如下图所示 −
![Laravel Release Process](/laravel/images/laravel_release_process.jpg)
在理解 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 发布
版本 | 发布 | 错误修复直到 | 安全修复直到 |
---|---|---|---|
V1 | June 2011 | - | - |
V2 | September 2011 | - | - |
v3 | February 2012 | - | - |
v4 | May 2013 | - | - |
5.0 | Feb 4th, 2015 | Aug 4th, 2015 | Feb 4th, 2016 |
5.1 (LTS) | Jun 9th, 2015 | Jun 9th, 2017 | Jun 9th, 2018 |
5.2 | Dec 21st, 2015 | Jun 21st, 2016 | Dec 21st, 2016 |
5.3 | Aug 23rd, 2016 | Feb 23rd, 2017 | Aug 23rd, 2017 |
5.4 | Jan 24th, 2017 | Jul 24th, 2017 | Jan 24th, 2018 |
5.5 (LTS) | Aug 30th, 2017 | Aug 30th, 2019 | Aug 30th, 2020 |
5.6 | Feb 7th, 2018 | Aug 7th, 2018 | Feb 7th, 2019 |
5.7 | Sep 4, 2018 | Feb 4th, 2019 | Sep 4th, 2019 |
请注意,突出显示的版本标记最新版本。
Laravel - 访客用户门
访客用户门功能是 2018 年 9 月发布的最新 5.7 版本的附加功能。此功能用于启动特定用户的授权流程。
在 Laravel 5.6 中,有一个过程用于对未经身份验证的用户返回 false。在 Laravel 5.7 中,我们可以通过在指定控制器中使用特定的 nullable 类型提示允许访客进行授权检查,如下所示 −
<?php Gate::define('view-post', function (?User $user) { // Guest });
代码说明
通过使用 nullable 类型提示,当访客用户传递到门时,$user 变量将为空。然后,您可以决定是否授权该操作。如果您允许可空类型并返回 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 - 转储服务器
Laravel 转储服务器随 Laravel 5.7 版本一起提供。以前的版本不包含任何转储服务器。转储服务器将是 laravel/laravel 作曲文件中的开发依赖项。
随着 5.7 版本的发布,您将获得此命令,其中包含一个开箱即用的概念,允许用户将数据转储到控制台或 HTML 文件而不是浏览器。命令执行如下 −
php artisan dump-server # 或将输出发送到 HTML 文件 php artisan dump-server --format=html > dump.html
解释
该命令在后台运行一个服务器,帮助收集从应用程序发送的数据,并通过控制台发送输出。当命令不在前台运行时,dump()函数预计默认起作用。
Laravel - Action URL
Laravel 5.7 引入了一项新功能,称为"可调用操作 URL"。此功能类似于 Laravel 5.6 中在操作方法中接受字符串的功能。Laravel 5.7 引入的新语法的主要目的是让您直接访问控制器。
Laravel 5.6 版本中使用的语法如下所示 −
<?php $url = action('UserController@profile', ['id' => 1]);
Laravel 5.7 中调用的类似操作如下 −
<?php $url = action([PostsController::class, 'index']);
新的可调用数组语法格式的一个优点是,如果开发人员使用支持代码导航的文本编辑器或 IDE,则能够直接导航到控制器。