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.

php通过fsockopen异步发送邮件

不考虑pthreads拓展的话,原生php是不支持多线程的。如果想要在web项目中异步发送邮件或者执行其他php脚本,就可以考虑使用fsockopen的方法:发送一个socket连接请求目标脚本,不需要等待目标脚本执行结果直接关闭socket连接,接着执行后续任务,同时目标脚本由于收到请求,开始响应并执行。这就实现了php的“伪异步”。 $url = YOUR_WEB_PATH . "/send_email";  // 异步执行的目标脚本 $post_data = array();     /** * 构造$post_data */     trigger_async_request($url, $post_data); //

关于CSRF攻击

今天在某个技术群里有网友聊起CSRF攻击,就想起了以前写汤圆网时用到的“盐值”(unique_salt)与token。 一、什么是CSRF攻击及CSRF的防御 可以参考这篇文章:http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html 对于用户提交的涉及到修改数据的请求,最好都要考虑下防御CSRF。 二、加盐再散列(salt md5) 参考wiki:https://zh.wikipedia.org/wiki/%E7%9B%90_%28%E5%AF%86%E7%A0%81%E5%AD%A6%29 三、我曾经的解决方案 我也记不得我这个解决方法是哪里学来的了。=。=# 大概思路是这样: 1. 首先定义一个系统全局的salt值: $config[‘salt’] = ‘abcd1234’; 2. 然后在生成前端页面时,生成timestamp与token: $timestamp = time();

mac系统升级php、php-fpm

因为今天发现系统自带的php-fpm不支持freetype,所以只好重装php-fpm。mac系统还好有homebrew这个神器,大赞。 一、安装php与php-fpm brew install php55 –with-fpm –with-mysql –with-imap –with-gmp –without-apache ps:关于brew安装程序时支持的编译参数,可以使用brew options命令来查看,brew options php55。 又ps:同样,如果想装php5.6或php7,就使用brew install php56、brew install php70 安装完后的php程序/usr/local/Cellar/php55/version/bin,php-fpm在/usr/local/Cellar/php55/version/sbin。配置文件目录在/usr/local/etc/php/5.5。

在线web代理

glype(https://www.glype.com/) 现在好多在线代理网站都是用glype搭的,估计迫于我党的压力,glype官网禁止中国ip的访问 =。=#   php-proxy(https://www.php-proxy.com/) 比glype简单,但更好感觉  

号外号外!老司机代理上线啦~ (=゚ω゚)ノ

嘿嘿,2016年5月20日,老司机代理(http://oldcarman.com)正式上线了。18:56在微信朋友圈装了一下逼,当时我还在社区医院喷喉呢(感冒了)。挺开心的,大概应该算是从3月底开始吧,(第一篇关于squid的日志发表于4月1日),两个月的业余时间内,独自一人完成了这个代理项目,虽然现在注册人数才18人,最高同时在线人数才4人,但还是小有成就感的。 关于老司机代理系统的架构: 代理服务:squid + stunnel (参考之前的文章http://www.hawu.me/operation/886) squid用户验证:python+redis 数据库:mysql、redis 网站:spring mvc + hibernate + bootstrap AdminLTE2模板 现在只是上了第一版,后面还想把支付宝的支付接口给写了,然后再让小布来正式推广我们的老司机代理,看看到底有没市场。如果有时间的话,关于代理还有很多需要改进的。 比如说现在使用基于http auth的用户验证方式,会有两个问题,一个是浏览器的支持不好,每次请求都要弹验证对话框,除非使用代理插件(这点chrome做的不如firefox);另一个问题是每次http请求都要验证http头中的用户信息。我想过一个比较靠谱的方法,就是仿web的session-cookie机制,用户登录后,会创建一个proxy-session,并将该proxy-session-id写入到用户cookie,之后每次用户请求就先判断有无proxy-session,有的话就不需要用户验证了。 再比如是否考虑做客户端,直接封装stunnel,采用用户浏览器 <—>

nginx + tomcat配置

nginx使用反向代理将url转移给tomcat的8080端口。 server { listen 80; server_name www.domain.com; location / { root html; index index.html index.htm; proxy_pass http://localhost:8080/; # 下面的配置将用户访问的url传递给tomcat, #

nginx配置根域名重定向到www.域名

现在用户在输入url访问网站的时候通常不会再去敲http://www这样的前缀,而习惯直接敲域名。http会由浏览器自动添加,但www就必须由站长们来配置了。 首先需要在dns解析上配置对根域名的域名解析: 然后修改nginx的配置: # 301 redirect non-www to www server{ server_name hawu.me; return 301 $scheme://www.$host$request_uri; # return 301 等效于下面这句 #

Scroll to Top