Laravel 从2.0开始就被不少程序员所熟知并流行起来。目前最新的版本是5.0。Laravel 3.x 与之后的 4.x 和 5.x有着非常大的变化。通过官方文档或中文社区的文档可以看得出来。
更多相关更查看官方文档
- 中文文档地址:点击查看
因为 Laravel 4.x出来的时间不是特别长,以及 Laravel 5.x 比 4.x 在更优秀。所以,我们研究与使用就以 5.x 为基准。
一、安装 Composer
Composer 是 PHP 用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件。
关于 Composer 的中文文档地址:http://www.phpcomposer.com/
Linux & Mac 安装方式
1 | sudo -s |
如果您的 Composer 版本过低,则会有警告提示。通过如此命令升级您的 Composer
1 | sudo /usr/local/bin/composer self-update |
关于 Composer 的命令操作以及包加载的优化,请查看上面的地址。
二、PHP 环境需求
- PHP 版本 >= 5.4
- Mcrypt PHP 扩展。此扩展是用来加密解密用的。支持多种加密方式。
- OpenSSL PHP 扩展。为 https 提供驱动支持。当然,还有更多功能。
- Mbstring PHP 扩展。处理各国语言字符的扩展。
- Tokenizer PHP 扩展。PHP 源码分析工具。
三、Laravel 框架出击
1)使用 Composer 下载 Laravel 安装包:
1 | composer global require "laravel/installer=~1.1" |
以上命令在任何位置执行都可以。是全局有效。
提示:如果网络不好。请任性地使用VPN吧。没有?买呗!!!
命令正常执行,会有如下输出:
1 | Changed current directory to /Users/qlj/.composer |
请确定把 ~/.composer/vendor/bin 路径放置于您的 PATH 里, 这样 laravel 执行文件就会存在你的系统。
2)mac 下将 laravel 放到系统 PATH 变量中
1 | vim ~/.bash_profile |
在文件末尾追加以下代码:
1 | export PATH=/Users/qlj/.composer/vendor/bin:$PATH |
小贴士:mac和linux终端一般用bash来进行解析。当bash在读完了整体环境变量的/etc/profile并借此调用其他配置文件后,接下来则是会读取用户自定义的个人配置文件。bash读取的文件总共有三种:
~/.bash_profile ~/.bash_login ~/.profile
其实bash再启动是只读上面文件的一个,而读取的顺序则是依照上面的顺序。也就是说读到bash_profile就不读后面的了,如果bash_profile不存在,后面的才能有机会。
设置成功之后,请关闭当前会话的所有命令行窗口。因为,修改~/.bash_profile 这一类文件只能再下次启动命令窗口的时候才会加载。已经打开的窗口不能自动重新加载。这也是导致很多人设置成功之后,在命令输入 laravel 命令提示找不到命令的原因所在。
3)创建第一个 Laravel 项目
在上面的第2步中,我们已经将 ~/.composer/vendor/bin 放到了系统的 PATH 变量中。此时,我们在命令行中可以使用 laravel 命令来创建一个项目了。进入你项目所在的目录下:
1 | cd /Users/qlj/codespace/phpcode |
执行成功会输出如下信息:
1 | Crafting application... |
此时进入 laravel 目录下,可以看到已经为我们生成了一个完整的项目目录结构。关于目录结构我们后面再细细介绍。
4)让 Laravel 跑起来
- 在 /etc/hosts 增加一个测试地址网站:test.laravel.com
- 在 apache的http-vhosts.conf 同步增加一个虚拟服务器。代码如下:
1 | <VirtualHost *:80> |
在浏览器地址栏输入:test.laravel.com
如果看到了 Laravel 的 LOGO。说明,您已经安装成功了。
如果报以下错误:
1 | Use of undefined constant MCRYPT_RIJNDAEL_128 - assumed 'MCRYPT_RIJNDAEL_128' |
这是您没有安装 PHP mcrypt 扩展导致。
Mac 系统下安装 mcrypt:
4.1) mac 系统mcrypt库安装
1 | brew install mcrypt |
如果您的系统是 Centos 之类的系统,通过以下命令可以更新PHP或相关扩展所依赖系统扩展。
1 | sudo -s |
4.2)PHP mcrypt 扩展库安装
因为PHP5.3以上版本mcrypt核心中已经内置了mcrypt扩展。由于,不同版本的PHP默认开启与否不一样。因为,我的是Mac内置的PHP5.4.30没有开启。所以,有两种方法安装mcrypt扩展。
4.2.1)源码完全安装
这种方式就是下载一个 php 源码码下来,然后完整编译php 源码安装。安装方式略。
4.2.2)增量源码安装
这种方式下载一个与当前系统PHP版本一致的php源码包,然后,把源码里面的扩展包的mcrypt进行编译安装。这种方式花时间较少。不影响当前的PHP配置。
因为我不想改变现有环境的PHP。所以,我选择第二种增量安装方式。这种方式以前也没有试过。权当一次学习吧。
首先,我们去下载php源码。地址:http://cn.php.net/releases/
我选择了中国的镜像下载点:地址http://cn2.php.net/get/php-5.4.30.tar.gz/from/this/mirror
下载成功之后,执行命令:
1 | tar -zxvf mirror |
上面的./configure 后台是配置mcrypt的位置。因为 php 通过PHP的mcrypt扩展调用系统的mcrypt扩展来完成加密的。
修改php.ini文件。在文件末尾增加一行:
1 | extension=mcrypt.so |
4.3 让项目的 storage 目录具备写入权限
1 | chmod 0777 storage |
Laravel 框架默认会将缓存、session、日志写入该目录。
5)Laravel5 目录结构介绍
- Laravel RootPath
- app
- Commands
- Console –
- Events – 所有应用事件定义在这里
- Exceptions – 自定义异常
- Handlers
- Http – Controler在这里。因为Controller都是与Http请求相关。
- Providers – 类似于四层架构的S层(服务层)
- bootstrap – 启动框架时执行里面的程序
- config – 框架所有的配置全部在这里
- database – 数据库迁移等操作在这里
- public – 项目的入口文件
- resources – 图片、样式、JS等资源文件存放位置
- storage – 模板缓存、应用缓存、session、日志存放这里
- tests – phpunit单元测试程序放这里
- vendor – 第三方包以及 Laravel 核心包放这里
更多请看:http://www.golaravel.com/laravel/docs/5.0/structure/
6)GET && POST
7)数据库操作
7.1 配置
配置文件地址:app/config/database.php
Laravel 支持读写分离。配置非常简单。
1 | 'mysql' => [ |
目前 Laravel 支持四种数据库系统: MySQL、Postgres、SQLite、以及 SQL Server。
个人观点:Postgres 数据库在国外使用越来越广泛,并且性能以及管理优于MySQL。也是开源免费的关系型数据库。
7.2 执行 Select 查找
1 | $results = DB::select('select * from users where id = ?', [1]); |
select 方法会返回一个 array 结果。
7.3 执行 Insert 语法
1 | DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']); |
7.4 执行 Update 语法
1 | DB::update('update users set votes = 100 where name = ?', ['John']); |
7.5 执行 Delete 语法
1 | DB::delete('delete from users'); |
注意: update 和 delete 语法会返回在操作中所影响的数据笔数。
7.6 事务操作
1 | DB::transaction(function() |
除了这种以原生语句操作数据库的方式外,还有一种就是采用对象方法的形式组装SQL语句并执行。
7.7 从数据表中取得所有的数据列
1 | $users = DB::table('users')->get(); |
7.8 从数据表中分块查找数据列
1 | DB::table('users')->chunk(100, function($users) |
7.9 从数据表中取得单一数据列的单一字段
1 | $name = DB::table('users')->where('name', 'John')->pluck('name'); |
7.10 取得单一字段值的列表
1 | $roles = DB::table('roles')->lists('title'); |
7.11 更多高级用法
1 | $users = DB::table('users') |
7.12 打印执行的SQL语句
这个功能可以说是非常实用且常用的功能了。
开启日志:
1 | DB::connection()->enableQueryLog(); |
要得到执行过的查找纪录数组,你可以使用 getQueryLog 方法:
1 | $queries = DB::getQueryLog(); |
7.13 Laravel 5 ActiverRecord 详解
以下是 Laravel 5 ActiveRecord 操作
由于 Model 这样的东西是属于多个系统(前台、后台、其他)。所以,一般情况下,我们都是将其放在一起。而不是与某个系统关联放一起。所以,我们将会用到 composer 来实现自动加载。
首先,在项目根目录下面创建一个 models 目录。当然,你也可以在其他位置创建这个目录。中需要在 composer里面能加载到即可。
其次,以创建 user 表的 model 为例。在 models 目录下创建一个 User.php 脚本。代码如下:
1 |
|
注意。因为,我们的 users 类需要继承 Model。所以,需要:
1 | use Illuminate\Database\Eloquent\Model; |
我们将 models 目录映射为 Models PHP命名空间。单单,使用 namespace Models的话,在项目中使用还不能正确加载。所以,我们需要 composer 工具来为我们正确让其他脚本能加载到。
修改项目根目录下的 composer.json 文件,找到 autoload 那块json。
1 | "autoload": { |
从上面可以看出。我已经将相对于项目根目录下的 models 映射为 Models 全名空间了。
现在,我们来使用 User 操作数据:
1 | use Models; |
更多关于Laravel ActiveRecord的操作参考中文文档:http://www.golaravel.com/laravel/docs/5.0/eloquent/
如果您曾经使用如下命令优化过 composer 包。那么,很有可能导致修改 composer.json没效果。
1 | composer dump-autoload --optimize |
那么,您需要修改之后,再执行此命令来清除之后的优化缓存。
8)缓存操作
Laravel 为各种不同的缓存系统提供一致的 API 。您可以在此为应用程序指定使用哪一种缓存系统, Laravel 支持各种常见的后端缓存系统,如 Memcached 和 Redis 。
配置文件:app/config/cache.php
8.1 保存对象到缓存中
1 | Cache::put('key', 'value', $minutes); |
8.2 使用 Carbon 对象配置缓存过期时间
1 | $expiresAt = Carbon::now()->addMinutes(10); |
8.3 若是对象不存在,则将其存入缓存中
1 | Cache::add('key', 'value', $minutes); |
当对象确实被加入缓存时,使用 add 方法将会返回 true 否则会返回 false 。
8.4 确认对象是否存在
1 | if (Cache::has('key')) |
8.5 从缓存中取得对象
1 | $value = Cache::get('key'); |
8.6 取得对象或是返回默认值
1 | $value = Cache::get('key', 'default'); |
8.7 永久保存对象到缓存中
1 | Cache::forever('key', 'value'); |
8.8 有时候您会希望从缓存中取得对象,而当此对象不存在时会保存一个默认值,您可以使用 Cache::remember 方法:
1 | $value = Cache::remember('users', $minutes, function() |
8.9 从缓存中删除对象
1 | Cache::forget('key'); |
更多关于缓存的中文文档:http://www.golaravel.com/laravel/docs/5.0/cache/
9)Session操作
使用session之前,需要先对 Laravel 配置进行设置。默认的 session 保存在 storage 中。通过配置,我们可以保存到memcached、redis等缓存服务器中。
配置文件:app/config/session.php
9.1 读取 Session 值
1 | $value = Session::get('key'); |
9.2 写入 Session 值
1 | Session::push('user.teams', 'developers'); |
9.3 从 Session 取回对象,并删除
1 | $value = Session::pull('key', 'default'); |
9.4 从 Session 取出所有对象
1 | $data = Session::all(); |
9.5 判断对象在 Session 中是否存在
1 | if (Session::has('users')) |
9.6 从 Session 中移除对象
1 | Session::forget('key'); |
9.7 清空所有 Session
1 | Session::flush(); |
9.8 重新产生 Session ID
1 | Session::regenerate(); |
更多关于 session 的中文文档:http://www.golaravel.com/laravel/docs/5.0/session/
10)Cookie 操作
10.1 读取Cookie值
1 | $value = Request::cookie('name'); |
10.2 写入Cookie值
1 | $response = new Illuminate\Http\Response('Hello World'); |
稍微复杂点。如果使用use加载命令空间。代码会变成如下:
1 | $response = new Response('Hello World'); |
11)Laravel Commands
12) Laravel artisan 命令
关于 artisan 命令的使用,我们在创建项目的时候,已经使用过一次了。有了这个命令,在开发中我们会省掉很多体力活。关于更多的命令使用,请看中文文档:http://www.golaravel.com/laravel/docs/5.0/artisan/
13)分页
13.1 最简单的分页
1 | $users = DB::table('users')->paginate(15); |
13.2 对 Eloquent 模型分页
1 | $allUsers = User::paginate(15); |
13.3 追回参数到URL末尾
在分页的时候,我们会搜索查询分页。默认情况下,是不会把URL中的参数附加上去的。于是,就有了以下的解决方案:
1 | $users = DB::table('users')->paginate(15)->appends(array('keyword' => '菠萝蜜')); |
Laravel 分页是非常方便快捷的。更多的文档请参考中文文档:http://www.golaravel.com/laravel/docs/5.0/pagination/
14)实用的辅助方法
14.1 产生给定控制器行为的网址。
1 | $url = action('HomeController@getIndex', $params); |
注意:HomeController以及getIndex必须是存在的类和方法。否则,会报错。
14.2 产生给定路由名称的网址。
1 | $url = route('routeName', []); |
14.3 产生资源的网址。
1 | $url = asset('img/photo.jpg'); |
14.4 产生给定路径的 HTTPS 完整网址。
1 | echo secure_url('foo/bar', $parameters = array()); |
14.5 产生给定路径的完整网址。
1 | echo url('foo/bar', $parameters = array(), $secure = null); |
14.6 返回 取得现在 CSRF token 的值。
1 | $token = csrf_token(); |
14.7 打印给定变量并结束脚本执行。
1 | dd($value); |
更多辅助方法参考中文文档:http://www.golaravel.com/laravel/docs/5.0/helpers/
15)配置多个应用
16)配置ssdb存储session
16.1 首先,我们要安装配置ssdb
1、下载
1 | wget https://github.com/ideawu/ssdb/archive/master.zip |
2、解压并安装
1 | unzip master |
3、启动ssdb
1 | ./ssdb-server ssdb.conf |
4、随服务器重启
1 | vim /etc/rc.local |
5、停止 ssdb-server
1 | ./ssdb-server ssdb.conf -s stop |
16.2 实现 PHP SessionHandlerInterface 接口
说起 SessionHandlerInterface 接口大家可能都比较陌生。但是,他在如今的 PHP 框架中却充满了他的影子。比如我们常见的YII、ThinkPHP等框架都已经使用它很久了。他到底是什么东西呢?
SessionHandlerInterface 从名字上来解释就是 Session会话句柄接口。他的功能就是专门用来扩展 Session 会话的管理。通过扩展该接口,您可以将 session 会话的数据存储在任意您熟知的存储介质中。比如:mysql、memcache、redis等。
咱们来看看 SessionHandlerInterface 接口的定义:1
2
3
4
5
6
7
8
9SessionHandlerInterface {
/* 方法 */
abstract public bool close ( void )
abstract public bool destroy ( string $session_id )
abstract public bool gc ( string $maxlifetime )
abstract public bool open ( string $save_path , string $name )
abstract public string read ( string $session_id )
abstract public bool write ( string $session_id , string $session_data )
}
- 1、open 方法通常用于将数据存储置于文件中的情况下,打开文件代码存储位置。因为,我们要将数据存放于内存或数据库这样的存储介质中。所以,一般来说,这个方法不需要实现。留空即可。
- 2、destroy 方法应该从永久存储移除与 $sessionId 关联的数据。
- 3、gc 方法应该销毁所有比给定 $lifetime UNIX 时间戳记还旧的 session 数据。对于会自己过期的系统如 Memcached 和 Redis,这个方法可以留空。
- 4、write 方法应该写入给定 $data 字串与 $sessionId 的关联到一些永久存储系统,例如:MongoDB、 Dynamo、等等。
- 5、read 方法应该返回与给定 $sessionId 关联的 session 数据的字串形态。当你的驱动取回或保存 session 数据时不需要做任何序列化或进行其他编码,因为 Laravel 将会为你进行序列化
- 6、close 方法,就像 open 方法,通常也可以忽略。对大部份的驱动来说,并不需要它。
知道了每个方法的功能。那么接下来,一起来实现将 session 数据保存到ssdb中。
以下是我实现的用于session数据存储到ssdb的类。已经通过真实项目检验。
1 |
|
我是在ssdb/phpssdb包中继承并增加的。
以上代码因为用到了 ssdb ,所以,我们还需要安装 ssdb 客户端代码。
首先,在项目的 composer.json 中对应的节增加如下代码:
1 | ... |
其次,在对应项目根目录下执行如下命令:
1 | composer update |
通过这样执行之后会在命令行输出以下内容,说明安装成功:
1 | qinlj:laravel qlj$ composer update |
16.3)让 Laravel 接受 ssdb session 驱动
Laravel 框架提供了一个注册session扩展驱动类的方法。在项目根目录\app\Providers\AppServiceProvider.php文件中的boot()方法增加如下代码:
1 | // 注册 ssdb session 扩展。 |
超级友情提示:Session、Cookie、Db等这种类对应的命名空间是:
1 | Illuminate\Support\Facades\Session |
这是为了摒弃各种难用的底层驱动封装的方法提供的顶层友好的类。