Laravel

Laravel 6 – laravel/ui 中的 vue 与 jquery

Laravel 应该是在5.几之后吧,其laravel/ui项目的前端框架默认使用Bootstrap与Vue。 1. 无法打印vue实例 对于vue官方文档中的例子,我们都可以在浏览器console窗口通过app变量打印出vue实例。 但是在laravel/ui的页面中,我们打印app变量时候,输出的却是id=”app”的那个dom元素,并不是在/resources/js/app.js中定义的vue实例。 const app = new Vue({ el: '#app', }); 原因是laravel mix在编译打包js文件的时候,会将每个js源文件作为一个独立的作用域,这样可以使不同js文件中的变量互不干扰。而这个app变量(打包时候还会将const变成var。。。=。=# js真是迷)的作用域就只在该/resources/js/app.js文件中。在其他地方是无法读取该变量的。 我们可以看一下laravel mix打包后生成的/pulbic/js/app.js文件,整个/resources/js/app.js源文件的代码(包括app变量)都被function(module, exports, […]

Laravel 6 – 加密解密与哈希

1. 加密解密 全局辅助函数: encrypt($value, $serialize = true) decrypt($value, $unserialize = true) Facade: Crypt::encrypt($value, $serialize = true) Crypt::decrypt($value, $unserialize = true)

Laravel 6 – Model的mass assignment

在Laravel的Eloquent ORM中,Mass Assignment是指以数组形式对模型的属性进行赋值,比如:Model->fill(array $attributes) ,Model::create(array $attributes) 。与之对立的是指单一属性的赋值,比如:Model->age=18 。 考虑这么一个场景: 在用户注册的时候,后台通常使用User::create($attributes) 来进行用户模型的创建并写入数据库。这里的$attributes数组来自于用户提交的表单中的$_POST[’email’],  $_POST[‘password’]等属性。正常情况下用户注册时候只会提交表单中列出的属性,所以一切正常。 但是如果有个不怀好意的用户,在提交表单时候添加一些虚假数据进来,比如$_POST[‘user_type’]=’admin’。而偏巧数据库中user表结构就有一个字段’user_type’用来表示用户类型是管理员(admin)还是客户(customer)。那么此时他就成功注册了一个管理员用户。这不是我们想见到的。 为了防止这种情况的发送,Laravel提供了mass assignment保护。在定义一个Model类型的时候,必须通过Model->fillable 或者Model->guarded 变量来指定哪些属性是允许mass assignment的。(这两个成员变量继承自trait GuardsAttributes ,默认情况下所有的属性都不允许mass  assignment。)

Laravel 6 – 输出详细日志

Log::debug(‘debug message’); 的默认输出实在是太简陋了   最起码应该加上输出日志时候的文件与代码所在行吧。幸好Log::debug() 接受一个数组实参作为第二个参数,并格式化后一同输出。所以我们可以把__FILE__魔术常量放在这个数组参数中交给Log打印。 Log::debug(‘debug message’, [‘file’ => __FILE__, ‘line’ => __LINE__]);  输出如下: 我们也可以将一些想要打印的变量放在第二个实参数组中打印,比如: Log::info(‘User failed to login.’,

Laravel 6 – 从基本用户认证深入理解Laravel

启用Laravel的基本用户认证模块后,就会自动生成几个用户注册/登录/密码找回的页面。我们就来从这几个页面深入理解Laravel的用法。 1. 找到路由 这几个路由都由/routes/web.php文件中新增的Auth::routes(); 这一行注册的。 1.1 Facade 这个用法涉及到了Laravel的facade概念,facade是指用看起来像调用类的静态方法的语法(类名::静态方法)来调用容器中对应实例的同名公有方法的一种用法。 我们可以在/config/app.php的aliases数组中找到这个Auth别名,该别名指向实际的facade类‘Auth’ => Illuminate\Support\Facades\Auth::class, 所以在路由/routes/web.php中的Auth::routes()实际上就是Illuminate\Support\Facades\Auth::routes() 然后我们再去看这个…\Facades\Auth的代码。 class Auth extends Facade { protected static

Laravel 6 – 使用Laravel 6的用户认证“脚手架”

1. 创建laravel 6项目 在工作目录下执行如下命令,通过composer创建laravel项目。 composer create-project –prefer-dist laravel/laravel blog “6.*” 该命令会在当前工作目录下生成blog项目目录。整个目录结构如下,关于laravel项目目录结构的说明可以参考Laravel Docs 然后使用php artisan serve 启动网站服务,或者配置nginx来运行网站。 初始的网站只有两个路由,可以通过命令php artisan route:list 来检查路由。

坑,Laravel的cache系统与entrust与throttle

laravel默认是使用file做cache驱动的,但file与database驱动的cache无法支持tag,这就与我用到的entrust插件冲突了,所以改成了array作为cache系统的驱动。 后来想用throttle中间件的时候,发现throttle无效,一猜就是cache的问题,因为改用array做cache后,array其实相当于一次进程获得的内存空间开辟的一块数组,那么如果cache在这个数组里面,请求处理完后,这个数组已经没有啦!所以throttle根本不起作用。想了想最好的办法还是得换redis或者memcache做cache驱动,尤其在生产环境。  

Laravel框架 – 打印容器实例

初学laravel的时候,看到service provider这一块,一直纠结如何才能打印出容器内所有的service provider,因为光靠config/app.php文件,很难从alias看出其对应的service provider到底是哪个。后来才发现,其实在程序的任意地方(Application启动后),都可以通过 Container::getInstance()这个静态方法获取当前的Application实例。或者可以使用在全局helps.php中定义的的 app()方法来获取当前Application实例。 Route::get('/test', function () { dd(app()); // dd(Illuminate\Container\Container::getInstance()); }); 注意: 在laravel中打印变量尤其是“超大型”变量的时候,千万不要直接使用var_dump()。一来不直观,二来大型变量直接 var_dump可能会导致浏览器卡死(我猜应该是卡死在尝试将var_dump数据解析成dom上面)。=。=# 最好使用larave的全局函数dd()或者dump(),输出又美观,又不会卡死浏览器。 ps: 最好用dd吧,少用dump,今天发现一个bug,如果使用dump的话,会导致cookie操作失效=。=#

Laravel框架 – 容器、绑定与依赖注入

laravel框架的核心概念就是容器,打开laravel的入口文件public/index.php,一路追寻,会发现laravel框架在初始化时会新建一个Illuminate\Foundation\Application实例对象赋值给$app这个全局变量。这个Application实例就是我们的laravel容器(Application是Container的子类),是整个laravel程序的基础:   一、容器 容器,就是用来装东西的,对吧。现实中的容器可以用来装水、装米,但编程世界中的容器装的则是一个个实例对象。举个例子,在程序运行过程中,我们可能需要一个Mailer实例来发送邮件,通常直观的做法是在需要的时候才创建这个Mailer实例,但我们也可以在程序初始化的时候先行创建一个Mailer实例,并在容器中注册该实例(laravel中叫做binding),随后在程序中任何需要用到Mailer的地方,就可以直接向容器申请这个实例(laravel叫做resolving)或者由容器进行自动依赖注入。 实际上laravel容器的绑定并不是真的绑定一个实例,而是绑定一个闭包函数,该闭包负责生成要绑定的实例对象。同时在绑定的时候定义是否为单例绑定(laravel中把单例绑定叫做shared)。然后直到程序向容器申请该实例的时候,才真正执行这个闭包函数去生成一个实例。对于非单例绑定,每次resolving都会生成一个新的实例;对于单例绑定,只在第一次resolving的时候生成实例,然后将该实例放入容器的instances数组中(Illuminate\Container\Container->instances),后面在申请时直接从该数组中返回实例。 (如果你有java的spring框架基础的话,那么就很好理解了。laravel容器就相当于spring容器,容器中绑定的实例对象相当于spring bean的概念,他们的目的都是为了依赖注入。另外,laravel的中间件也有点类似spring中切面的概念。推荐可以看一下Craig Walls写的《Spring实战》这本书,对于容器与依赖注入的概念描述得很棒。) (或者,关于容器与依赖注入的概念,还可以参考这篇博文:https://www.insp.top/article/learn-laravel-container) 1. 打印Laravel容器 https://www.hawu.me/coding/1132 2. binding 绑定操作通常在ServiceProvider的register()方法中定义,然后通过写入/config/app.php文件中的providers数组让laravel框架在初始化时自动加载。(当然,你也可以在程序其他地方直接调用bind()与singleton()方法进行绑定) 绑定的作用其实是告诉容器,在解析绑定时候如何生成需要的实例对象。如果一个类不依赖于任何其他类(即构造方法无参)或者它的构造器依赖可以被laravel解析,那么这个类就无需绑定到容器。容器不需要被告知如何生成这样的类对象,因为容器可以通过php的反射机制自动解析出具体对象。 However, there is no

Laravel框架 – 命令行工具artisan

说在前面的话: laravel算是近几年最火的php web开发框架了,在github的php项目中稳居第一(Most Popular PHP Project at Github)。star数量甚至是我先前挚爱codeigniter的两倍。这几天抽空看了下laravel的文档与入门视频(laracasts.com),惊讶于现在的php居然已经能写成这样了,laravel简直就是php届的spring。容器、依赖注入、中间件。。。跟朴实无华的codeigniter相比简直就是在炫技,当然这也成了laravel反对派们的口实——“将追求简单直接的php写成了晦涩臃肿的java”。我试了一下laravel与codeigniter渲染一个index页面的性能,laravel平均耗时80ms,而ci只需要8ms,=。=#  but!who care!“当你需要考虑性能的时候,性能早已不是问题了。” balabala吹完laravel,该说正题了。除了laravel本身的框架之外,laravel还提供了一个屌炸天命令行工具artisan,简直就是开发神器。这篇文章就是想记录下平时常用的命令,免得一段时间不写全忘光光。 一、启动服务 $ php artisan serve 使用这个命令,直接在8000端口启动web服务,而不需要在配置nginx,这对于开发环境特别方便。   二、路由相关 1.

Scroll to Top