【Laravel框架】对于Laravel框架架构的研究以及视图方法和内置会话在项目里的运用

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Laravel框架】对于Laravel框架架构的研究以及视图方法和内置会话在项目里的运用

架构

首先,应该了解larravel框架的架构模式(设计核心,larravel架构是使用服务组件化开发模式开发的,larravelframework由不同的服务组件组成)
larravel中的多个服务提供商构成了larravel组件。分层设计:将具有相同功能的类库放在同一文件夹中。
larravel框架具有组成服务和组件的多个类。类->服务->组件
Larravel使用基于组件的开发模式,具有多个类->服务->组件,多个类构成服务,多个服务构成组件。
多个组件提供不同的服务,然后多个服务构成我们的项目。
在这里插入图片描述

视图方法

如所见,传递给视图方法的第一个参数是resources/views目录中相应视图文件的名称,第二个参数是包含视图中所有有效数据的数组。在本例中,我们传递一个名称变量,该变量通过使用Blade语法显示在视图中。
当然,视图也可以存储在resources/views的子目录中。嵌套视图可以用“.”符号引用。例如,如果视图存储路径是resources/views/admin/profile.blade。php,我们可以如下引用它:

<?php
namespace App\Providers;
use View;
class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        View::share('key', 'value');
    }
    public function register()
    {
        //
    }
}

视图生成器是呈现视图时的回调函数或类方法。如果每次渲染视图时都要绑定一些数据,则可以使用view Composer将逻辑组织到一个单独的位置。
在本例中,首先在服务提供商中注册视图Composer。我们将使用View facade访问Illuminate Contracts View Factory的底层实现。请记住,Larave不包含默认视图Composer目录。我们可以根据自己的喜好来组织它的路径。例如,我们可以创建app/Http/View/Compoers目录:

<?php
namespace App\Http\ViewComposers;
use Illuminate\View\View;
use Illuminate\Repositories\UserRepository;
class ProfileComposer
{
    protected $users;


    public function __construct(UserRepository $users)
    {
     
        $this->users = $users;

    public function compose(View $view)
    {
        $view->with('count', $this->users->count());
    }
}

在渲染视图之前,将调用Composer类的Compose方法,并将Illuminate view视图实例注入到该方法中,以便可以使用其with方法将数据绑定到视图。
注意:所有视图Composer都通过服务容器进行解析,因此可以在Composer类的构造函数中声明所需的任何依赖项。

View::composer(
    ['profile', 'dashboard'],
    'App\Http\ViewComposers\MyViewComposer'
);

视图创建者与视图编写器非常相似。不同之处在于前者在视图实例化后立即失败,而不是等待视图呈现。使用视图外观的创建者方法注册视图创建者:

View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');

内置会话

Larvel没有使用PHP的内置会话功能,而是实现了一种更灵活、更强大的会话机制。核心逻辑请参考Illuminate Session中间件StartSession的中间件。因此,在Larvel应用程序中,不应尝试使用$_通过session方法获取应用程序的会话值是徒劳的。此外,还有一个大家都很困惑的问题。无法在Larravel的控制器构造函数中获取应用程序会话数据。这是因为Larravel的会话是通过StartSession中间件启动的。由于它是中间件,它将在服务容器注册所有服务后执行,而控制器的构造函数在容器注册服务时执行,因此此时会话尚未启动。如何获取数据?解决方案是发布获取会话数据的逻辑,或者在构造函数中引入StartSession之后执行的中间件。

Schema::create('sessions', function ($table) {
    $table->string('id')->unique();
    $table->unsignedInteger('user_id')->nullable();
    $table->string('ip_address', 45)->nullable();
    $table->text('user_agent')->nullable();
    $table->text('payload');
    $table->integer('last_activity');
});

会话配置文件位于config/session php中默认情况下,Larave使用的会话驱动程序是文件驱动程序,这对许多应用程序来说都没有问题。在生产环境中,可以考虑使用Memcached或Redis驱动程序来获得更好的会话性能,特别是当同一个在线应用程序部署到多台机器时。这是最佳实践。
会话驱动程序用于定义所请求的会话数据的存储位置。Larave可以处理多种类型的驱动程序:
文件–会话数据存储在存储/框架/会话目录中;
Cookie–会话数据存储在已安全加密的Cookie中;
数据库–会话数据存储在数据库中
Memcached/Redis–会话数据存储在Memcached/Redis缓存中,访问速度最快;
Array–会话数据存储在一个简单的PHP数组中,在多个请求之间是非持久的。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller{

    public function show(Request $request, $id)
    {
        $value = $request->session()->get('key');

        //
    }
}

由于这些方法不容易理解,让我们快速了解每种方法:
开放方法用于基于文件的会话存储系统。由于Larave已经有一个文件会话驱动程序,因此不需要在该方法中放置任何代码。可以将其设置为空方法。
与open方法一样,close方法也可以忽略,这是大多数驱动程序所不使用的。
read方法应返回与给定$sessionId匹配的会话数据的字符串版本。从驱动程序获取或存储会话数据不需要序列化或其他编码,因为Larravel已经为我们序列化了它。
write方法应该将给定的$data写入持久存储系统(如MongoDB、Dynamo等)的相应$sessionId。同样,不要执行任何序列化操作。拉拉威尔已经为我们处理过了。

<?php

namespace App\Extensions;

class MongoSessionHandler implements SessionHandlerInterface
{
    public function open($savePath, $sessionName) {}
    public function close() {}
    public function read($sessionId) {}
    public function write($sessionId, $data) {}
    public function destroy($sessionId) {}
    public function gc($lifetime) {}
}

destroy方法从持久存储中删除与$sessionId对应的数据。
gc方法销毁所有大于给定$lifetime的会话数据。对于具有过期机制的系统,如Memcached和Redis,此方法可以留空。
注册驱动程序
会话驱动程序实现后,需要向框架注册它。要向Larravel会话的后端添加其他驱动程序,可以在会话外观上使用extend方法。我们在服务提供商(如AppServiceProvider)的引导方法中调用此方法(或者我们可以自己重新创建一个新的服务提供商):

<?php
namespace App\Providers;
use App\Extensions\MongoSessionHandler;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\ServiceProvider;
class SessionServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Session::extend('mongo', function($app) {
            return new MongoSessionHandler;
        });
    }
    public function register()
    {
        //
    }
}

有时,可能希望存储仅在会话中的下一个请求中有效的数据。这可以通过闪光法实现。此方法中存储的会话数据仅在后续HTTP请求中有效,将被删除.
如果需要在更多请求中保留一次性数据,可以使用刷新方法将所有一次性数据保留到下一个请求中。如果只想保存特定的一次性数据,可以使用keep方法:

$request->session()->reflash();
$request->session()->keep(['username', 'email']);
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
20天前
|
存储 数据采集 监控
信息系统架构开发方法ADM
信息系统架构开发方法ADM
52 5
|
2月前
|
设计模式 前端开发 测试技术
Flutter 项目架构技术指南
探讨Flutter项目代码组织架构的关键方面和建议。了解设计原则SOLID、Clean Architecture,以及架构模式MVC、MVP、MVVM,如何有机结合使用,打造优秀的应用架构。
Flutter 项目架构技术指南
|
2月前
|
分布式计算 算法 调度
课3-详解隐私计算框架的架构和技术要点
隐语架构涵盖产品、算法、计算、资源和硬件五层,旨在实现互联互通和跨域管控。产品层包括SecretPad等,简化用户和集成商体验。算法层涉及PSI/PIR、SCQL和联邦学习,提供隐私保护的数据分析和学习。计算层如RayFed、SPU、HEU等,支持分布式计算和密态处理。资源层的KUSCIA用于跨机构任务编排,硬件层涉及FPGA等加速器。互联互通支持黑盒和白盒模式,确保不同平台协作。跨域管控则强调数据流转控制,保护数据权益。
|
2月前
|
设计模式 负载均衡 网络协议
【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RPC框架(架构技术引导篇)
【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RPC框架(架构技术引导篇)
54 0
|
13天前
|
前端开发 开发者
【专栏】BEM(Block-Element-Modifier)是一种前端命名规范和架构方法,旨在创建清晰、可维护的代码结构。
【4月更文挑战第29天】BEM(Block-Element-Modifier)是一种前端命名规范和架构方法,旨在创建清晰、可维护的代码结构。它包括Block(独立功能单元)、Element(Block的子元素)和Modifier(表示状态或变体)。BEM的特点包括命名一致性、模块化设计、清晰结构和可复用性,适用于代码组织、样式管理、组件化开发和团队协作。虽然命名较长和学习成本是其局限性,但BEM在提升代码质量和效率方面具有显著优势,是前端开发的重要工具。
|
17天前
|
Java Maven Nacos
项目架构设计
项目架构设计
15 1
|
24天前
|
机器学习/深度学习 存储 人工智能
一阶优化算法启发,北大林宙辰团队提出具有万有逼近性质的神经网络架构的设计方法
【4月更文挑战第19天】北京大学林宙辰团队在深度学习领域取得突破,提出基于一阶优化算法的神经网络设计方法,构建具有万有逼近性质的模型,提升训练速度和泛化能力。该方法利用一阶导数信息,高效处理大规模问题。虽然面临非光滑优化和收敛速度挑战,但团队通过正则化和自适应学习率等策略进行改进,相关研究在多个标准数据集上表现出色。
12 1
|
26天前
|
敏捷开发 监控 前端开发
深入理解自动化测试框架Selenium的架构与实践
【4月更文挑战第16天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加快迭代速度的关键手段。Selenium作为一种广泛使用的自动化测试工具,其开源、跨平台的特性使得它成为业界的首选之一。本文旨在剖析Selenium的核心架构,并结合实际案例探讨其在复杂Web应用测试中的高效实践方法。通过详细解读Selenium组件间的交互机制以及如何优化测试脚本,我们希望为读者提供深入理解Selenium并有效运用于日常测试工作的参考。
|
29天前
|
机器学习/深度学习 人工智能 自然语言处理
|
1月前
|
安全 Shell 网络安全
抄个冷板凳---x86架构MS-17010漏洞的多重利用方法
x86架构永恒之蓝漏洞的多重利用复现演示