Laravel5.0学习--01 入门
本文以laravel5.0.22为例。
生产环境建议使用laravel5.1版本,因为该版本是长期支持版本。5.1文档更详细:http://laravel-china.org/docs/5.1。
环境需求
Laravel5.0 框架有一些系统上的需求:
PHP 版本 >= 5.4
Mcrypt PHP 扩展
OpenSSL PHP 扩展
Mbstring PHP 扩展
Tokenizer PHP 扩展
在 PHP 5.5 之后, 有些操作系统需要手动安装 PHP JSON 扩展包。如果你是使用 Ubuntu,可以通过 apt-get install php5-json 来进行安装。
我该使用Laravel吗
来自知乎网友的讨论:PHP框架Laravel还是Codeigniter? https://www.zhihu.com/question/21617669
CI比较接近原生的PHP,在原有PHP代码的基础上封装了很多类,因为它架构简单,所以容易扩展。从另一个角度来看,也就是没啥架构,最最原始的三层架构。
Laravel 简直就是一次创新,大量吸收了Java,RoR等其他框架的精华,在架构方面,已基本做到现有Php框架最佳,扩展性,伸缩性强大得一塌糊涂,非常适合团队作战。
对于新手来说,Laravel初看上去不太像Php的原本写法了,所谓优雅,就是你光凭代码就可以知道意思,而不用读注释,代码精简复用度非常高;Laravel开发人员都是PHP圈子最顶尖的高手,他们习惯用新的技术和架构,即便如此,Laravel其实上手并不难,一旦以你掌握了它的大致要点后,你会逐渐发现它在每一个方面都全面超越CI,且实用性非常高。(来源:知乎)
简单建议:
如果是个人项目,旨在研究,推荐Laravel;如果是外包或者公司项目,推荐Codeigniter或者ThinkPHP。
特点
RESTful Routing ;
设计精妙的 Blade 模板引擎, 轻快, 不失灵活 ;
合理的 ORM model 层, Eloquent ORM , 借鉴于 Rails 的成功;
migration 数据库版本系统 和 seeding ;
使用包管理器 Composer , 打开了一扇开往春天的门;
强调测试驱动, 整个核心经受过完整的测试, 高质量的代码;
命令行驱动, 可以做到高度自动化 (讲究效率, 代码生成器...) , 借鉴与 rails ;
合理使用 PHP 的新版本特性, 让写代码更加有乐趣, 跟上时代的步伐;
积极向上的社区, 这个很重要呀, 大家都在学习着, 创造着好的工具, 加快开发速度, 提高编程效率, 接受新知识的速度也很快.
对 php 标准化的支持 PHP-FIG — PHP Framework Interop Group
更多阅读:
1、最好的 PHP 框架是什么?为什么? - Charlie Jade 的回答 - 知乎
https://www.zhihu.com/question/19558755/answer/23062110
2、php - Laravel框架相对于其他框架比如CI、TP、Symfony等的优势是什么? - SegmentFault
https://segmentfault.com/q/1010000000489103
安装
使用Composer安装
很多人会卡在这一步。要么是不会Composer,要么就是无法使用Composer安装。
如果还不知道Composer,先去学习了解了解:
1、Composer使用 - 飞鸿影~ - 博客园
http://www.cnblogs.com/52fhy/p/5246013.html
2、Packagist / Composer 中国全量镜像
http://pkg.phpcomposer.com/
3、Composer 中文网
http://www.phpcomposer.com/
如果无法使用用Composer安装,很有可能是仓库访问不了,即被墙了。先更新Composer仓库源:
# 修改 composer 的全局配置文件(推荐方式)
# 打开命令行窗口(windows用户)或控制台(Linux、Mac 用户)并执行如下命令:
composer config -g repo.packagist composer https://packagist.phpcomposer.com
接下来正式开始安装吧!
这里以Laravel 5.0 版本为例(PHP 版本 >=
5.4)。
# 指定5.0.22版本,项目目录是learnlaravel5
composer create-project laravel/laravel learnlaravel5 5.0.22
等待安装(需要5分钟左右):
Installing laravel/laravel (v5.0.22)
- Installing laravel/laravel (v5.0.22)
Downloading: 100%
Created project in learnlaravel5
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
- Installing jakub-onderka/php-console-color (0.1)
Downloading: 100%
- Installing vlucas/phpdotenv (v1.1.0)
Downloading: 100%
- Installing symfony/var-dumper (v2.6.4)
Downloading: 100%
- Installing symfony/translation (v2.6.4)
Downloading: 100%
- Installing symfony/security-core (v2.6.4)
Downloading: 100%
- Installing symfony/routing (v2.6.4)
Downloading: 100%
- Installing symfony/process (v2.6.4)
Downloading: 100%
- Installing symfony/http-foundation (v2.6.4)
Downloading: 100%
- Installing symfony/event-dispatcher (v2.6.4)
Downloading: 100%
- Installing psr/log (1.0.0)
Downloading: 100%
...
Generating autoload files
> php artisan clear-compiled
> php artisan optimize
Generating optimized class loader
Compiling common classes
> php -r "copy('.env.example', '.env');"
> php artisan key:generate
Application key [4FunRLeVWE0jc6QTs3h8vNbDnoa4Qi8Q] set successfully.
安装完便可以访问了:
http://localhost/laravel5/public/index.php
一键安装包下载
一键安装包是在 Laravel 官方 GitHub 仓库源码的基础上安装了依赖库(也就是已经做过 composer install,已经有了 vendor 目录),对于刚接触 Laravel 或者使用 Composer 受挫的用户能够提供快速上手实践 Laravel 的捷径。
Laravel 一键安装包。更新时间:2016年3月7日下午3点04分
master 7.45M http://down.golaravel.com/laravel/laravel-master.zip
v5.2.15 7.46M http://down.golaravel.com/laravel/laravel-v5.2.15.zip
v5.1.11 7.97M http://down.golaravel.com/laravel/laravel-v5.1.11.zip
v5.0.22 5.94M http://down.golaravel.com/laravel/laravel-v5.0.22.zip
v4.2.11 5.06M http://down.golaravel.com/laravel/laravel-v4.2.11.zip
v4.1.27 4.60M http://down.golaravel.com/laravel/laravel-v4.1.27.zip
v4.0.9 6.05M http://down.golaravel.com/laravel/laravel-v4.0.9.zip
项目结构
app
|---Commands
|---Console
|---Events
|---Exceptions
|---Handlers
|---Http
|---Controllers 控制器
|---Middleware 中间件
|---Requests 请求
|---routes.php 路由
|---Providers
|---Services
|---User.php 模型文件
bootstrap
config
database
public
resources
|---lang
|---views 视图
|---welcome.blade.php
|---home.blade.php
storage
|---logs
tests
vendor
.env
artisan
composer.json
server.php
Laravel 框架有一个目录需要额外配置权限:storage
和 vendor
目录要让服务器有写入的权限。
路由(Route)
路由文件在:app/Http/routes.php
。
默认的配置:
Route::get('/', 'WelcomeController@index');//匹配根目录到WelcomeController/index
Route::get('home', 'HomeController@index');//匹配home到HomeController/index
Route::controller('blog', 'BlogController');//匹配BlogController里的所有方法,但控制器里方法必须以get、post开头
//路由组
Route::controllers([
'auth' => 'Auth\AuthController',
'password' => 'Auth\PasswordController',
]);
控制器(Controllers)
控制器路径:app/Http/Controllers
。
示例:WelcomeController.php
<?php
namespace App\Http\Controllers;
class WelcomeController extends Controller {
public function index()
{
return view('welcome');
}
}
继承自根控制器:Controller.php
<?php namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesCommands;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
abstract class Controller extends BaseController {
use DispatchesCommands, ValidatesRequests;
}
生成url
url()方法可以生成符合规范的url。
echo url('greeting');
//输出:http://localhost/laravel5/public/index.php/greeting
配置
配置文件:.env
,包含了数据库和MAIL等配置。
config
目录下也有相关配置。
模型(Model)
与Laravel4系列不同,旧的 app/models
目录已经完全被移除。相对的,Laravel5模型文件都放在 app
目录下,以及默认使用 App
命名空间。
示例:Blog.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Blog extends Model {
public function listAll(){
return $this->all();
}
}
视图(views)
视图根路径:resources/views
。
视图与控制器对应关系:
例如:控制器里
view('welcome'); //对应视图根路径下welcome.blade.php
view('admin.pages.edit', $data); //对应对应视图根路径下admin/pages/edit.blade.php
视图文件代码上实际就是html。但自定义了一些标签。
在视图文件,我们可以使用PHP原生语法来获取传过来的数据:
<html>
<body>
<h1>Hello, <?php echo $name; ?></h1>
</body>
</html>
或者使用Laravel的Blade模板标签:双大括号:
<html>
<body>
<h1>Hello, {{$name}}</h1>
</body>
</html>
控制器(WelcomeController.php)里是这样的:
public function greeting() {
return view('greeting', ['name' => 'James']);
}
注意,测试的时候要新建路由:
Route::get('greeting', 'WelcomeController@greeting');
访问:http://localhost/laravel5/public/index.php/greeting
传递数据到视图
// 使用传统的方法
$view = view('greeting')->with('name', 'Victoria');
// 使用魔术方法
$view = view('greeting')->withName('Victoria');
模板标签语言
示例文件:
layout.blade.php 母视图
<html>
<body>
<h1>Laravel Quickstart</h1>
@yield('content')
</body>
</html>
users.blade.php 普通视图
@extends('layout')
@section('content')
Users!
@endsection
1、输出:使用双花括号: {{$name}}
。
2、继承:@extends
,将copy一份母视图过来。
引入:@include('shared.errors')
引入子视图
3、区域替换:@section
...@endsection
,该标签内的内容将替换在母视图使用@yield
定义的内容。
4、条件语句:@if
...@endif
。
@if (count($records) === 1)
我有一条记录!
@elseif (count($records) > 1)
我有多条记录!
@else
我没有任何记录!
@endif
5、数据遍历、循环:
@for ($i = 0; $i < 10; $i++)
目前的值为 {{ $i }}
@endfor
@foreach ($users as $user)
<p>此用户为 {{ $user->id }}</p>
@endforeach
@forelse ($users as $user)
<li>{{ $user->name }}</li>
@empty
<p>没有用户</p>
@endforelse
@while (true)
<p>我永远都在跑循环。</p>
@endwhile
6、url生成:示例
{{ url('blog/detail/'.$item->id) }}
# 或者
{{ url('blog/detail',array('id'=>$item->id)) }}
控制器里方法括号里接这个参数:
public function getDetail($id){
$blog = new Blog();
$detail = $blog->find($id);
return view('detail', array(
'detail' => $detail
));
}
7、public目录下资源引用
{{asset('/css/main.css')}}
对应public目录下的css/main.css
8、视图可以显示PHP 函数的结果。实际上,可以放置任何想要的 PHP 代码到 Blade 显示的语法里面:
目前的 UNIX 时间戳为 {{ time() }}。
9、禁用渲染
由于许多 JavaScript 框架也使用「大括号」在浏览器中显示指定的表达式,因此可以使用 @
符号来告知 Blade 渲染引擎该表达式应该维持原样。举个例子:
Hello, @{{ name }}.
10、缺省值:
{{ isset($name) ? $name : 'Default' }}
# 或者
{{ $name or 'Default' }}
11、显示未转义过的数据
默认输出的值会自动调用 PHP 的 htmlentities 函数,以避免 XSS 攻击。禁用:
Hello, {!! $name !!}.
参考:Laravel 5.1 中文文档:Blade 模板
http://laravel-china.org/docs/5.1/blade
数据库操作
Laravel中提供DB facade、查询构造器和Eloquent ORM三种数据库操作方式。本文接下来将讲解前两种方式。
数据库相关配置文件都在 config/database.php
。默认从.env
文件中读取配置。
目前 Laravel 支持四种数据库系统: MySQL、Postgres、SQLite、以及 SQL Server。
读写分离:
'mysql' => [
'read' => [
'host' => '192.168.1.1',
],
'write' => [
'host' => '196.168.1.2'
],
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
],
使用DB类进行CURD
需要先引入。
use Illuminate\Support\Facades\DB;
例如:
public function greeting() {
$results = DB::select('select * from blog where id = ?', [1]);
print_r($results);exit;
}
输出:
Array ( [0] => stdClass Object ( [id] => 1 [uid] => 1 [title] => test [content] => hello laravel5! [flag] => 1 [create_time] => 0 [update_time] => 0 ) )
更多方法(来自官方文档):
//执行 Select 查找
$results = DB::select('select * from users where id = ?', [1]);
$results = DB::select('select * from users where id = :id', ['id' => 1]);
//执行 Insert 语法
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
//执行 Update 语法
DB::update('update users set votes = 100 where name = ?', ['John']);
执行 Delete 语法
DB::delete('delete from users');
//执行一般语法
DB::statement('drop table users');
//监听查找事件
DB::listen(function($sql, $bindings, $time)
{
//
});
//数据库事务处理
//你可以使用 transaction 方法,去执行一组数据库事务处理的操作:
DB::transaction(function()
{
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
//手动事务
DB::beginTransaction();
DB::rollback();
DB::commit();
//获取连接
//若要使用多个连接,可以通过 DB::connection 方法取用:
$users = DB::connection('foo')->select(...);
//你也可以取用原始底层的 PDO 实例:
$pdo = DB::connection()->getPdo();
//有时候你可能需要重新连接到特定的数据库:
DB::reconnect('foo');
//如果你因为超过了底层 PDO 实例的 max_connections 的限制,需要关闭特定的数据库连接,可以通过 disconnect 方法:
DB::disconnect('foo');
//查找日志记录
//Laravel 可以在内存里访问这次请求中所有的查找语句。然而在有些例子下要注意,比如一次添加 大量的数据,可能会导致应用程序耗损过多内存。 如果要启用日志,可以使用 enableQueryLog 方法:
DB::connection()->enableQueryLog();
//要得到执行过的查找纪录数组,你可以使用 getQueryLog 方法:
$queries = DB::getQueryLog();
DB类查询构造器
Laravel 查询构造器使用 PDO 参数绑定,以保护应用程序免于 SQL 注入,因此传入的参数不需额外转义特殊字符。
示例:
//获取所有数据列
$users = DB::table('users')->get();
查询:
//根据条件查找,取得单一数据列
$user = DB::table('users')->where('name', 'John')->first();
var_dump($user->name);
//从数据表中取得单一数据列的单一字段
$name = DB::table('users')->where('name', 'John')->pluck('name');
//取得单一字段值的列表:这个方法将会返回数据表 role 的 title 字段值的数组
$roles = DB::table('roles')->lists('title');
$roles = DB::table('roles')->lists('title', 'name');
//指定查询字段
$users = DB::table('users')->select('name', 'email')->get();
$users = DB::table('users')->distinct()->get();
$users = DB::table('users')->select('name as user_name')->get();
//增加查询字段到现有的查询中
$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
//使用 where 及运算符
$users = DB::table('users')->where('votes', '>', 100)->get();
//or
$users = DB::table('users')
->where('votes', '>', 100)
->orWhere('name', 'John')
->get();
//Between
$users = DB::table('users')
->whereBetween('votes', [1, 100])->get();
//Not Between
$users = DB::table('users')
->whereNotBetween('votes', [1, 100])->get();
//In
$users = DB::table('users')
->whereIn('id', [1, 2, 3])->get();
//NotIn
$users = DB::table('users')
->whereNotIn('id', [1, 2, 3])->get();
//Null 找有未配置的值的数据
$users = DB::table('users')
->whereNull('updated_at')->get();
//魔术语句
$admin = DB::table('users')->whereId(1)->first();
$john = DB::table('users')
->whereIdAndEmail(2, 'john@doe.com')
->first();
$jane = DB::table('users')
->whereNameOrAge('Jane', 22)
->first();
//排序(Order By)、分群(Group By) 及 Having
$users = DB::table('users')
->orderBy('name', 'desc')
->groupBy('count')
->having('count', '>', 100)
->get();
//偏移(Offset) 及 限制(Limit)
$users = DB::table('users')->skip(10)->take(5)->get();
//基本的 Join 语法
DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.id', 'contacts.phone', 'orders.price')
->get();
//Left Join 语法
DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
//更高级的 join 子句:
DB::table('users')
->join('contacts', function($join)
{
$join->on('users.id', '=', 'contacts.user_id')->orOn(...);
})
->get();
DB::table('users')
->join('contacts', function($join)
{
$join->on('users.id', '=', 'contacts.user_id')
->where('contacts.user_id', '>', 5);
})
->get();
//群组化参数
DB::table('users')
->where('name', '=', 'John')
->orWhere(function($query)
{
$query->where('votes', '>', 100)
->where('title', '<>', 'Admin');
})
->get();
//上面的查找语法会产生下方的 SQL:
select * from users where name = 'John' or (votes > 100 and title <> 'Admin')
//Exists 语法
DB::table('users')
->whereExists(function($query)
{
$query->select(DB::raw(1))
->from('orders')
->whereRaw('orders.user_id = users.id');
})
->get();
//上面的查找语法会产生下方的 SQL:
select * from users
where exists (
select 1 from orders where orders.user_id = users.id
)
//使用聚合方法
$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
$price = DB::table('orders')->min('price');
$price = DB::table('orders')->avg('price');
$total = DB::table('users')->sum('votes');
新增:
//新增,不会返回新增ID
DB::table('users')->insert(
['email' => 'john@example.com', 'votes' => 0]
);
//新增,返回新增ID
$id = DB::table('users')->insertGetId(
['email' => 'john@example.com', 'votes' => 0]
);
//批量新增
DB::table('users')->insert([
['email' => 'taylor@example.com', 'votes' => 0],
['email' => 'dayle@example.com', 'votes' => 0]
]);
更新:
//更新
DB::table('users')
->where('id', 1)
->update(['votes' => 1]);
//自增或自减一个字段的值
DB::table('users')->increment('votes');
DB::table('users')->increment('votes', 5);
DB::table('users')->decrement('votes');
DB::table('users')->decrement('votes', 5);
//也能够同时指定其他要更新的字段:
DB::table('users')->increment('votes', 1, ['name' => 'John']);
删除:
//删除数据表中的数据
DB::table('users')->where('votes', '<', 100)->delete();
//删除数据表中的所有数据
DB::table('users')->delete();
//清空数据表
DB::table('users')->truncate();
更多查看:http://laravel-china.org/docs/5.0/queries
Eloquent ORM
相比DB类,Laravel 的 Eloquent ORM 提供优雅的 ActiveRecord 实现来和数据库的互动。 每个数据库表会有一个对应的模型文件。
详见下一章。
学习资料
推荐教程:
Laravel 5 系列入门教程(一)【最适合中国人的 Laravel 教程】 - 岁寒
https://lvwenhan.com/laravel/432.html
Laravel 5 中文文档:
- http://laravel-china.org/docs/5.0
- http://laravel-china.org/docs/5.1
- http://www.golaravel.com/laravel/docs/5.0/
更多:
Laravist |Laravel Vuejs Bootstrap 视频教程
https://laravist.com/LaraBase——全栈工程师之家
http://laravelbase.com/Laravel - The PHP Framework For Web Artisans
http://laravel.com/laravel/laravel
https://github.com/laravel/laravel
Laravel5.0学习--01 入门的更多相关文章
- Python学习--01入门
Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...
- Laravel5.0学习--03 Artisan命令
本文以laravel5.0.22为例. 简介 Artisan 是 Laravel 内置的命令行接口.它提供了一些有用的命令协助您开发,它是由强大的 Symfony Console 组件所驱动.利用它, ...
- Laravel5.0学习--02 实例进阶
本文以laravel5.0.22为例. 本节以新建一个简单的博客作为实例. 准备工作 数据库配置 .env文件(也可以直接修改config/database.php) DB_HOST=localhos ...
- Django 2.0 学习(01):Django初识与安装
Django(Python Web框架) Django是一个开放源代码的Web框架,用Python写的.采用了MTV的框架模式,即模型M,模板T和视图V.它最初被开发是用来管理以新闻内容为主的网站,即 ...
- [EntLib]微软企业库5.0 学习之路——第一步、基本入门
话说在大学的时候帮老师做项目的时候就已经接触过企业库了但是当初一直没明白为什么要用这个,只觉得好麻烦啊,竟然有那么多的乱七八糟的配置(原来我不知道有配置工具可以进行配置,请原谅我的小白). 直到去年在 ...
- Spring Boot 2.0 的快速入门(图文教程)
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! Spring Boot 2.0 的快速入门(图文教程) 大家都 ...
- spring学习(01)之IOC
spring学习(01)之IOC IOC:控制反转——Spring通过一种称作控制反转(IOC)的技术促进了低耦合.当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创 ...
- DirectX 总结和DirectX 9.0 学习笔记
转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surfac ...
- PHP学习笔记 - 入门篇(5)
PHP学习笔记 - 入门篇(5) 语言结构语句 顺序结构 eg: <?php $shoesPrice = 49; //鞋子单价 $shoesNum = 1; //鞋子数量 $shoesMoney ...
随机推荐
- Jquery打造的类似新浪微博@提醒功能
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- c# 筛选进程命令行,得其ProcessId(唯一标示符,简称pid),再通过pid结束进程
不说别的,上代码 部分using: using System.Diagnostics; using System.Management; 其中要引用System.Management 1.通过筛选Co ...
- JS-sort排序
var arr = [ 'c', 'd', 'a', 'e' ];// arr.sort();// alert( arr );var arr2 = [ 4,3,5,5,76,2,0,8 ];// ar ...
- ARP包分析(wireshark)
ARP数据报格式(42字节) 这是用wireshark抓到的一个ARP包,42个字节. 这个ARP包的 以太网首部(14字节): 字段 长度(Byte) ...
- RabbitMQ 问题记录
1. rabbitmq安装后无法运行,报错“unable to connect to node rabbit@XXXX: nodedown”. 怀疑局域网内有相同名称的计算机安装了rabbitmq,造 ...
- Excel公式设置单元格颜色
Excel2010 “条件格式"-"新建规则"-"使用公式确定要设置格式的单元格" 公式如下: =OR(H2<=-20%,H2>=20%, ...
- delphi7 编译程序时报win32.indcu.a病毒的解决方法
Delphi7用了很久一直都没问题,同一个工程文件昨天编译时mod32还不会报毒,今天重新编译时,生成的exe突然nod32报毒. 提示: “Project1.exe Win32/Induc.A 病毒 ...
- ORA-12705问题解决过程
最近开发C#加ORACLE的程序,就有一台电脑连接的时候报错误 ORA-12705: Cannot access NLS data files or invalid environment speci ...
- 网页版视频网站可以用html5来实现吗?
当然可以用html5来实现视频网站,而且html5的诞生完全符合了百度优化,百度蜘蛛对这类的网站友好度非常高,会尽量会给高的权重,但是现在很多做 这类网站的开发还是比较习惯用websocket,这个东 ...
- linux-10 基本命令之查看内存使用情况- free,history,who,last
free 命令 显示当前系统中内存的使用量情况 格式如下:free[-m/-g] 以m为单位显示当前内存的使用情况 [root@localhost /]# free -m 内存总量 已用量 可用量 ...