搭建lamp环境
安装ubuntu14.04 LTS版本
搭建lamp环境:
切换到root:
sudo su
更新源:
apt-get update
安装apache2:
apt-get install apache2
安装php5.5.9:
apt-get install php5
安装mysql:
apt-get install mysql-server mysql-client
安装php对myslq的扩展:
apt-get install php5-mysql
安装laravel需要的加密算法库:
apt-get install mcrypt
安装php加密库:
apt-get install php5-mcrypt
php5的这个加密扩展需要手动修改配置文件才可以使用:
cd /etc/php5/mods-available/ #这个目录是php已经下载的扩展
cd /etc/php5/apache2/conf.d/ #这个目录是php已经加载的扩展(都是软连接)
我们只需要建立个软连接就可以了:
ln -s /etc/php5/mods-available/mcrypt.ini ./
ls #查看文件,软连接建立成功,扩展就可以用了
重启apache:
apachectl restart
建立phpinfo文件:
cd /var/www/html/ #这是apache的网站根目录
vim info.php
<?php
phpinfo();
?>
查看服务器IP
ifconfig (假设为192.168.1.50)
浏览器访问192.168.1.50/info.php
可以看到mcrypt已经加载进去了
安装一些常用的工具:
apt-get install wget #下载工具
apt-get install curl #模拟浏览器
apt-get install openssl
连接远程服务器
mac电脑用ssh连接:
ssh laravel@192.168.1.50
windowx电脑使用xshell,或者putty连接
composer的安装
下载composer.phar包:
下载地址
上传composer.phar包到服务器:
使用上传工具:
FileZilla
或者mac 终端使用 scp
windows下使用xhsell, 使用rz命令
添加可执行权限:
chmod +x ./composer.phar
每次都要在这个使用很麻烦,添加成全局的就方便了:
mv composer.phar /bin/composer
验证:
composer -v
安装laravel
全局安装(适用于一个服务器多个laravel项目):
composer global require "laravel/installer"
配置全局环境变量:
cd
vim .profile
最后面写入:
export PATH=$PATH:/root/.config/composer/vendor/bin/
生成laravel项目:
laravel new blog
局部安装(适用于服务器只有一个laravel项目):
composer create-project --prefer-dist laravel/laravel blog
ps:注意虚拟机内存一定要大于1G,不然会报内存不足的错误
修改文件权限:
cd blog
chmod -R 777 storage
本地域名解析和apache虚拟主机配置
修改hosts文件:
mac 在 /etc/hosts
windows 在C:\Windows\System32\drivers\etc\hosts
加入:
192.168.1.50 laravel.demo
配置虚拟主机:
cd /etc/apache2/sites-available
cp 000-default.conf laravel.demo.conf
vim laravel.demo
打开服务器名字配置:
ServerName laravel.demo
建立软连接:
ln -s /etc/apache2/sites-available/laravel.demo.conf ../sites-enabled/
重启服务就可以了:
apachectl restart
git仓库建立与git服务器的搭建
安装git:
apt-get install git
设置你的仓库用户名:
git config --global user.name 'lwt'
git config --global user.email '13521760670@163.com'
初始化git仓库:
cd /var/www/demo
git init
搭建git服务器:
添加用户:
adduser git
克隆裸仓库:
git clone --bare demo demo.git
移动位置:
mv demo.git/ /home/git/
修改权限:
chown -R git:git demo.git/
另一个服务器操作:
生成密钥对(生成位置在当前用户的家目录的.ssh文件里)
ssh-keygen -t rsa
上传公钥到git服务器,这样可以免密码克隆和提交:
cd
cd .ssh
找到
id_rsa.pub
想办法把这个文件里面的内容弄到git服务器,git用户家目录里面的
.ssh文件夹里面的authorized_keys里面(没有就手动创建,可能会有权限的问题)
这样做完之后,这个服务器就可以免密码克隆git服务器的内容了:
git clone git@git服务器IP:test.git(这个空仓库是在git服务器的git家目录里面的)
apache2重定向(隐藏index文件)
加载重定向模块:
ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/
修改配置文件:
vim /etc/apache2/apache2.conf
找到:
Directory /var/www/
把 AllowOverride Node
改为:
AllowOverride all
保存退出,重启apache:
:wq
apachectl restart
安装laravel调试工具
安装:
composer require barryvdh/laravel-debugbar
全格式打印:
dd();
如果没有新的文件,git快捷提交:
git commit -a -m "show"
设置服务提供者:
vi /var/www/demo/config/app.php
找到:
Application Service Providers...
在里面写入:
Barryvdh\Debugbar\ServiceProvider::class,
起个别名,找到:
Class Aliases
写入:
'Debugbar' => Barryvdh\Debugbar\Facade::class,
生成配置文件:
cd /var/www/demo/
php artisan vendor:publish
手动输出错误日志:
php文件中写:
/Debugbar::error('Something is definitely goding wrong');
环境配置和数据库连接
连接:
1. 安装Navicat Premium
2. 然后新建一个mysql连接
3. 然后配置ssh
4. 输入远程服务器的ip和用户名密码
5. 然后配置常规
6. 这里面是以ssh的远程服务器为基础的,所以ip地址就写localhost(代表远程服务器)
7. 输入数据库的用户名和密码
8. 连接成功
配置:
配置文件都在根目录的config文件夹下,找到database.php
可以看到里面的mysql配置,使用了一个env函数
这个函数可以动态加载根目录下得.env里面的全局变量
所以我们只需要修改.env里面的配置就可以了
数据迁移
生成信息记录表:
根目录下:
php artisan migrate
在根目录下 database/migrations 里面存放了动态建表文件
利用laravel命令建立表,有利于数据库迁移:
根目录下:
php artisan make:migration crteate_news_table
会在根目录下的database/migrations文件里夹里生成对应的文件,可以在这个文件里定义表结构
静态资源管理elixir工具
安装nodejs:
wget https://nodejs.org/dist/v4.4.4/node-v4.4.4.tar.gz
tar -zxvf node-v4.4.4.tar.gz
cd node-v4.4.4
./configure
make && make install
安装gulp:
npm install --global gulp
npm install
配置文件在:
根目录下:
gulpfile.js
测试合成文件:
合并多个css文件:
vi gulpfile.js
注释:
min.sass('app.scss');
添加:
mix.styles(['a.css','b.css'],'public/assets/css');
注意:a.css,b.css都在项目根目录下resources下assets的css目录(没有自己建立个)
注意:合成输出的目录在public/assets/css下(没有自己建立)
编译合成:
gulp
查看效果:
cat public/assets/css/all.css
测试编译sass:
vim resources/assets/sass/app.scss
打开文件中的注释,导入bootstrap
测试驱动开发
项目根目录下有一个tests文件夹,在这个里面写测试用例:
cd tests
其中TestCase.php是系统封装的测试,我们自己写的驱动都要集成这个类
ExampleTest.php就是一个列子
我们自己写的测试用例,命名一定要按照规范,即xxxTest.php
测试:
项目根目录下:
./vendor/bin/phpunit
显示绿色的就是测试通过,红色的的就是没有测试通过
ps:我们在实际的项目开发中,先根据用户需求,写出测试用例,执行测试,肯定都是
红色的呀,然后我们就一个模块一个模块的去完成,让红色慢慢的都变绿,项目也就做完啦
laravel项目生命周期
laravel运行流程
1.public/index.php
项目入口文件
2.bootstrap/cache
框架的启动文件夹
cache是项目编译后的所有需要的类和资源
contract容器,帮助我们创建我们需要的对象
3.配置文件
provider:服务提供者
命名空间加类,写在这里面的类,系统会自动帮我们创建对象
aliases:别名
给对象起个别名,方便我们使用
app/console:命令行相关
kenel.php 命令行要使用的东西在这里
app/events:注册事件
app/http:网页请求走这里
app/jobs:消息
-
加载app/http/内核 kenel.php
先走里面的中间件,中间件分全局中间件,和路由中间件
app/http/route路由文件,是整个web项目最开始的地方了
模板使用
路由文件位置:
app/Http/routes.php
加载模板
模板位置在:
resources/views/
模板名字:
name.blade.php
加载模板用:
return view('name');
加载views/dir/下的模板:
return view('dir.name');
模板包含
在要页面中这样写:
@include('inc.name')
模板继承
在要继承的页面中这样写:
@extends('layout.app')
我们只继承那些不变的内容,动态的内容我们要留空,在被继承的模板文件中用这个占位:
@yield('content')
在继承它的页面中去实现这个占位的内容
接着在继承页面中这样写:
@section('content')
要实现的代码内容...
@endsection
控制器与resfulApi的使用
控制器方法约定(resfulApi):
GET index 列表
GET create 创建
POST index 添加一个
GET id 查看
GET edit 修改
创建控制器:
项目目录中使用命令:
php artisan make:controller HomeController --resource
会在app/Http/Controller/下面生成对应的控制器
路由设置
在路由文件中配置:
基本路由:
Route::get('/','HomeController@index');
resful路由:
Route::resource('/home/','HomeController');
Route::resource('/home/create','HomeController');
Route::resource('/home/edit','HomeController');
注意:顶级目录好像不支持get方式
对控制器的控制:
生效的方法:
Route::resource('/','HomeController',['only'=>['index','create']]);
不生效的方法设置:
Route::resource('/','HomeController',['except'=>['index','create']]);
服务容器和工厂模式
方便扩展的核心架构就是容器: Service Container
index入口文件中,包含了核心框架应用程序对象:
$app = require_once __DIR__.'/../bootstrap/app.php';
app.php是一个Application对象:
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
);
Application继承Container对象:
class Application extends Container implements ApplicationContract, HttpKernelInterface
Container就是一个容器对象,利用各种机制来帮助我们创建对象
Application对象给我们一个这样的方法:
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class, //访问这个类名
App\Exceptions\Handler::class //放入这个类
);
在服务提供者中,我们可以方便的注册类或接口:
$this->app->bind('A', function ($app) {
return new HelpSpot\API($app['HttpClient']); //返回一个对象或者类名称 new \App\User();
});
$u->$this->app->make('A');
在app.php文件中绑定:
//相当于给这个类做一个标记,名字是A
$app->bind('A', function ($app) {
return new HelpSpot\API($app['HttpClient']); //返回一个对象或者类名称 new \App\User();
});
//这里通过标记,告诉Application工厂给我生产一个对象:
$u->$this->app->make('A');
那么如果是已经new好的对象我们怎么放到容器中进行统一管理呢?
$u = new User();
$this->app-instance('u',$u);
优点:如果我们这个类是需要替换成其他的类的话,我们不用做太多的改动,只需要修改个返回的类的就行了,标记在其他地方都是通用的
根据不同需求生产不同的对象
单例模式:
//这样绑定
$app->singleton('A', function ($app) {
return new HelpSpot\API($app['HttpClient']); //返回一个对象或者类名称 new \App\User();
});
//这样生成
$this->app->make('A');
简介写法:
$this->app['A'];
还可以把我们实例化好的对象放到APP里面统一管理:
$fooBar = new FooBar(new SomethingElse);
$this->app->instance('FooBar', $fooBar);
依赖注入和ioc控制反转
控制反转就是在我们需要一个对象的时候,根据参数的类型,把我们需要的函数注册进来,比如:
class Tb{
private $ta;
public function __constauct(\App\Ta $a){
$this->ta = $a;
}
}
说明:在我们需要使用Tb这个对象的时候,工厂的方法在创建Tb对象的时候,会同时把我们需要的
参数也创建好,并且填充进来,这样在我们开发程序的时候就会方便很多
要想使用依赖注入和控制反转,就必须先注册类:
$app->bind(\App\Ta::class, \App\Ta::class); $app->bind(\App\Tb::class, \App\Tb::class);
//为什么我们的绑定和官方源码不一样呢,来看看
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class, //其实就是一个接口
App\Exceptions\Handler::class //具体实现接口的一个类
);
并不是在bootstrap/app.php里面注册,后面会说道
服务提供者和laravel低耦合架构
在入口index.php文件中make 了一个内核:
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
内核继承了HttpKernel,在httpKernel中:
//启动配置
protected $bootstrappers = [
'Illuminate\Foundation\Bootstrap\DetectEnvironment',
'Illuminate\Foundation\Bootstrap\LoadConfiguration',
'Illuminate\Foundation\Bootstrap\ConfigureLogging',
'Illuminate\Foundation\Bootstrap\HandleExceptions',
'Illuminate\Foundation\Bootstrap\RegisterFacades',
'Illuminate\Foundation\Bootstrap\RegisterProviders',
'Illuminate\Foundation\Bootstrap\BootProviders',
];
//启动了LoadConfiguration配置文件
在config/app.php中,return了一个数组,其中:
这个提供了服务提供者的路径:
'providers' => [
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
]
httpKernel中会根据这个路径注册服务提供者,生成对应的对象
在Providers文件夹下,有各种注册的服务提供者:
AppServiceProvider.php中继承了Serviceprovider,Serviceprovider中传了一个$app对象:
public function __construct($app)
{
$this->app = $app;
}
在AppServiceProvider.php中,有两个函数:
public function boot() //启动函数,先执行这个,可以进行一些前提配置
{
//
$a = 111;
}
public function register() //注册绑定类
{
//
$this->app->bind('\App\Ta::class',\App\Ta:class);
$this->app->bind('\App\Tb::class',\App\Tb:class);
}
总结一下
laravel是怎么运行的
最大就是容器对象:Application
管理laravel框架里面的所有内容
要想使用这些功能,我们要先注册
什么是服务:
把解决某一个相关功能一系列相关的类打包封装,就是一个服务
服务提供者做什么的:
服务提供者就是扩展我们功能的地方
Application根据配置文件帮我们把服务注册,而所有我们需要的服务功能都是在
服务提供者文件中进行注册的(/app/Providers/AppServiceProvider.php)
这样在多人开发的时候,每个人把要注册的类写在自己的服务提供者中
Providers/的文件中(自己建立)的register的方法里面
Facades的使用
为了在每次使用类的使用不在生成重复的对象,或者夸文件使用一个对象,我们需要这样使用对象:
User::getName();
这样来配置我们自己的类:
namespace App\Http;
class Z extends \Illuminate\Support\Facades\Facade
{
protected static function getFacadeAccessor()
{
return '\App\TA';
}
}
Z继承Facade,返回一个类名,这样我们在使用Z类的时候,会自动调用TA类的方法
使用: \App\Http\Z::getTitle() 调用的就是TA类脸的getTitle()方法
注意:必须用单列模式注册TA类
我们来做个简化,在用的时候不带命名空间:
在配置文件中,我们给\App\Http\Z起个别名就好了:
'Z' => \App\Http\Z::class,
中间件
为了不把大量的代码都写在controler里面,我们把某一些特定的服务提取出来,当做中间件
各种验证什么的就由中间件来做
创建中间件
项目更目录下:
php artisan make:middleware testMiddleware
然后注册中间件:
配置文件/app/Http/Kernel.php
protected $middlewareGroups = [ ]
全局中间件,无论如何都是会执行的
protected $routeMiddleware = [ ]
自定义别名中间件,我们一般把中间件注册在这里
调用中间件:
单个:
Route::get('/mid', ['middleware'=>'test',function () {
return redirect('/facades');
}]);
多个:
Route::get('/mid', ['middleware'=>['test','test2'],function () {
return redirect('/facades');
}]);
路由组使用中间件:
Route::group(['middleware' => 'auth'], function () {
Route::get('/', function () {
// 使用 Auth 中间件
});
Route::get('user/profile', function () {
// 使用 Auth 中间件
});
});
路由组共用中间件 auth
在路由里配置中间件很适合很多个方法都使用同一个中间件
一般用于生产验证和权限验证
只对一个控制器生效的中间件:
在控制器的构造函数中这样写:
public function __construct()
{
$this->middleware('test');
}
这样在使用控制器的时候,优先加载中间件
Request
laravel默认帮我们开启了csrf验证,这样我们在本地提交表单是提交不过去的,我们为了测试,先关闭:
在app/Http/Kernel.php文件中,注释掉这个:
// \App\Http\Middleware\VerifyCsrfToken::class,
这个csrf认证可以验证非法请求或者表单的重复提交,后面会说道
测试request
在方法里这样用:
public function store(Request $request)
{
//提交到数据库
dd($request);
}
打印可以看出,里面包含了关于一次请求的所有信息
取值:
$requset['name'];
validate验证
在stroe方法中这样写:
$this->validate($request, [
'name' => 'required',
'email' => 'required|email',
]);
开启错误提示:
在模板引擎中这样写:
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
但是呢,验证都放在方法中,代码就不会那么纯洁了,我们需要一个单独表单请求验证文件:
php artisan make:request StoreBlogPostRequest
新生成的类文件会被放在 app/Http/Requests 目录下。让我们将一些验证规则加入到 rules 方法中:
public function rules()
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}
在控制器的方法中这样使用:
public function store(StoreBlogPostRequest $request)
{
// 传入的请求是有效的...
}
开启csrf认证
打开我们之前关闭的中间件:
\App\Http\Middleware\VerifyCsrfToken::class,
然后呢,我们需要在表单中加入一个隐藏域,用来传递服务器传来的token:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
表单助手插件:
安装:
composer require laravelcollective/html
配置,在config/app.php中:
Collective\Html\HtmlServiceProvider::class
别名:
'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class,
模板中这样用:
{!! Form::open(array('route'=>'test.store','class'=>'form','novalidate'=>'novalidate')) !!}
{!! Form::label('your name') !!}
{!! Form::text('name',null,
array('required',
'class'=>'form-control',
'placeholder'=>'your name')) !!}
{!! Form::label('your email') !!}
{!! Form::text('email',null,
array('required',
'class'=>'form-control',
'placeholder'=>'your email address')) !!}
{!! Form::submit('添加') !!}
在用户填写错误的时候,会保留用户的填写信息
orm模型
就是把数据表的结构跟我们的一个类对应上了
创建模型
数据模型建立(生成文件在app文件夹下):
普通建立:
php artisan make:model Test
建立的同时生成数据库迁移:
php artisan make:model Test --migration
之后我们就可以在控制其中很方便的使用模型对象了:
$test = new Test(); //要现在开始引入命名空间
$test->name = $request['name'];
$test->email = $request['email'];
$test->save();
// $test->where('id',1)->delete();
dd($test->all());
利用邮件服务将表单推送到手机
为了方便将提示信息推送给用户,我们使用邮箱服务:
首先安装email扩展:
composer require guzzlehttp/guzzle
然后修改配置文件,根目录下得.env文件,这样改:
MAIL_DRIVER=smtp
MAIL_HOST=smtp.163.com
MAIL_PORT=25
MAIL_USERNAME=n13521760670@163.com
MAIL_PASSWORD=******
MAIL_ENCRYPTION=null
config/mail.php也要修改:
'from' => ['address' => 'n13521760670@163.com', 'name' => 'n13521760670@163.com'],
在控制器中这样使用:
$data = [
'name' => $request->get('name'),
'email' => $request->get('email')
];
\Mail::send('email', $data, function ($m) use ($data) {
$m->from('n13521760670@163.com', '测试发送邮件');
$m->to('975974740@qq.com',$data['name'])->subject('laravel练习使用邮件');
});
模板中这样设置信息:
<p>
用户:{{$name}} email:{{$email}}
正在练习使用laravel
</p>
利用laravel认证模板完成用户注册登录
主要是利用框架自带的Auth模块
未完待续...
网友评论