搭建lamp環(huán)境
安裝ubuntu14.04 LTS版本
搭建lamp環(huán)境:
切換到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已經(jīng)下載的擴展
cd /etc/php5/apache2/conf.d/ #這個目錄是php已經(jīng)加載的擴展(都是軟連接)
我們只需要建立個軟連接就可以了:
ln -s /etc/php5/mods-available/mcrypt.ini ./
ls #查看文件,軟連接建立成功,擴展就可以用了
重啟apache:
apachectl restart
建立phpinfo文件:
cd /var/www/html/ #這是apache的網(wǎng)站根目錄
vim info.php
<?php
phpinfo();
?>
查看服務(wù)器IP
ifconfig (假設(shè)為192.168.1.50)
瀏覽器訪問192.168.1.50/info.php
可以看到mcrypt已經(jīng)加載進去了
安裝一些常用的工具:
apt-get install wget #下載工具
apt-get install curl #模擬瀏覽器
apt-get install openssl
連接遠程服務(wù)器
mac電腦用ssh連接:
ssh laravel@192.168.1.50
windowx電腦使用xshell,或者putty連接
composer的安裝
下載composer.phar包:
下載地址
上傳composer.phar包到服務(wù)器:
使用上傳工具:
FileZilla
或者mac 終端使用 scp
windows下使用xhsell, 使用rz命令
添加可執(zhí)行權(quán)限:
chmod +x ./composer.phar
每次都要在這個使用很麻煩,添加成全局的就方便了:
mv composer.phar /bin/composer
驗證:
composer -v
安裝laravel
全局安裝(適用于一個服務(wù)器多個laravel項目):
composer global require "laravel/installer"
配置全局環(huán)境變量:
cd
vim .profile
最后面寫入:
export PATH=$PATH:/root/.config/composer/vendor/bin/
生成laravel項目:
laravel new blog
局部安裝(適用于服務(wù)器只有一個laravel項目):
composer create-project --prefer-dist laravel/laravel blog
ps:注意虛擬機內(nèi)存一定要大于1G,不然會報內(nèi)存不足的錯誤
修改文件權(quán)限:
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
打開服務(wù)器名字配置:
ServerName laravel.demo
建立軟連接:
ln -s /etc/apache2/sites-available/laravel.demo.conf ../sites-enabled/
重啟服務(wù)就可以了:
apachectl restart
git倉庫建立與git服務(wù)器的搭建
安裝git:
apt-get install git
設(shè)置你的倉庫用戶名:
git config --global user.name 'lwt'
git config --global user.email '13521760670@163.com'
初始化git倉庫:
cd /var/www/demo
git init
搭建git服務(wù)器:
添加用戶:
adduser git
克隆裸倉庫:
git clone --bare demo demo.git
移動位置:
mv demo.git/ /home/git/
修改權(quán)限:
chown -R git:git demo.git/
另一個服務(wù)器操作:
生成密鑰對(生成位置在當(dāng)前用戶的家目錄的.ssh文件里)
ssh-keygen -t rsa
上傳公鑰到git服務(wù)器,這樣可以免密碼克隆和提交:
cd
cd .ssh
找到
id_rsa.pub
想辦法把這個文件里面的內(nèi)容弄到git服務(wù)器,git用戶家目錄里面的
.ssh文件夾里面的authorized_keys里面(沒有就手動創(chuàng)建,可能會有權(quán)限的問題)
這樣做完之后,這個服務(wù)器就可以免密碼克隆git服務(wù)器的內(nèi)容了:
git clone git@git服務(wù)器IP:test.git(這個空倉庫是在git服務(wù)器的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調(diào)試工具
安裝:
composer require barryvdh/laravel-debugbar
全格式打印:
dd();
如果沒有新的文件,git快捷提交:
git commit -a -m "show"
設(shè)置服務(wù)提供者:
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');
環(huán)境配置和數(shù)據(jù)庫連接
連接:
1. 安裝Navicat Premium
2. 然后新建一個mysql連接
3. 然后配置ssh
4. 輸入遠程服務(wù)器的ip和用戶名密碼
5. 然后配置常規(guī)
6. 這里面是以ssh的遠程服務(wù)器為基礎(chǔ)的,所以ip地址就寫localhost(代表遠程服務(wù)器)
7. 輸入數(shù)據(jù)庫的用戶名和密碼
8. 連接成功
配置:
配置文件都在根目錄的config文件夾下,找到database.php
可以看到里面的mysql配置,使用了一個env函數(shù)
這個函數(shù)可以動態(tài)加載根目錄下得.env里面的全局變量
所以我們只需要修改.env里面的配置就可以了
數(shù)據(jù)遷移
生成信息記錄表:
根目錄下:
php artisan migrate
在根目錄下 database/migrations 里面存放了動態(tài)建表文件
利用laravel命令建立表,有利于數(shù)據(jù)庫遷移:
根目錄下:
php artisan make:migration crteate_news_table
會在根目錄下的database/migrations文件里夾里生成對應(yīng)的文件,可以在這個文件里定義表結(jié)構(gòu)
靜態(tài)資源管理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
打開文件中的注釋,導(dǎo)入bootstrap
測試驅(qū)動開發(fā)
項目根目錄下有一個tests文件夾,在這個里面寫測試用例:
cd tests
其中TestCase.php是系統(tǒng)封裝的測試,我們自己寫的驅(qū)動都要集成這個類
ExampleTest.php就是一個列子
我們自己寫的測試用例,命名一定要按照規(guī)范,即xxxTest.php
測試:
項目根目錄下:
./vendor/bin/phpunit
顯示綠色的就是測試通過,紅色的的就是沒有測試通過
ps:我們在實際的項目開發(fā)中,先根據(jù)用戶需求,寫出測試用例,執(zhí)行測試,肯定都是
紅色的呀,然后我們就一個模塊一個模塊的去完成,讓紅色慢慢的都變綠,項目也就做完啦
laravel項目生命周期
laravel運行流程
1.public/index.php
項目入口文件
2.bootstrap/cache
框架的啟動文件夾
cache是項目編譯后的所有需要的類和資源
contract容器,幫助我們創(chuàng)建我們需要的對象
3.配置文件
provider:服務(wù)提供者
命名空間加類,寫在這里面的類,系統(tǒng)會自動幫我們創(chuàng)建對象
aliases:別名
給對象起個別名,方便我們使用
app/console:命令行相關(guān)
kenel.php 命令行要使用的東西在這里
app/events:注冊事件
app/http:網(wǎng)頁請求走這里
app/jobs:消息
-
加載app/http/內(nèi)核 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')
我們只繼承那些不變的內(nèi)容,動態(tài)的內(nèi)容我們要留空,在被繼承的模板文件中用這個占位:
@yield('content')
在繼承它的頁面中去實現(xiàn)這個占位的內(nèi)容
接著在繼承頁面中這樣寫:
@section('content')
要實現(xiàn)的代碼內(nèi)容...
@endsection
控制器與resfulApi的使用
控制器方法約定(resfulApi):
GET index 列表
GET create 創(chuàng)建
POST index 添加一個
GET id 查看
GET edit 修改
創(chuàng)建控制器:
項目目錄中使用命令:
php artisan make:controller HomeController --resource
會在app/Http/Controller/下面生成對應(yīng)的控制器
路由設(shè)置
在路由文件中配置:
基本路由:
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']]);
不生效的方法設(shè)置:
Route::resource('/','HomeController',['except'=>['index','create']]);
服務(wù)容器和工廠模式
方便擴展的核心架構(gòu)就是容器: Service Container
index入口文件中,包含了核心框架應(yīng)用程序?qū)ο?
$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就是一個容器對象,利用各種機制來幫助我們創(chuàng)建對象
Application對象給我們一個這樣的方法:
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class, //訪問這個類名
App\Exceptions\Handler::class //放入這個類
);
在服務(wù)提供者中,我們可以方便的注冊類或接口:
$this->app->bind('A', function ($app) {
return new HelpSpot\API($app['HttpClient']); //返回一個對象或者類名稱 new \App\User();
});
$u->$this->app->make('A');
在app.php文件中綁定:
//相當(dāng)于給這個類做一個標(biāo)記,名字是A
$app->bind('A', function ($app) {
return new HelpSpot\API($app['HttpClient']); //返回一個對象或者類名稱 new \App\User();
});
//這里通過標(biāo)記,告訴Application工廠給我生產(chǎn)一個對象:
$u->$this->app->make('A');
那么如果是已經(jīng)new好的對象我們怎么放到容器中進行統(tǒng)一管理呢?
$u = new User();
$this->app-instance('u',$u);
優(yōu)點:如果我們這個類是需要替換成其他的類的話,我們不用做太多的改動,只需要修改個返回的類的就行了,標(biāo)記在其他地方都是通用的
根據(jù)不同需求生產(chǎn)不同的對象
單例模式:
//這樣綁定
$app->singleton('A', function ($app) {
return new HelpSpot\API($app['HttpClient']); //返回一個對象或者類名稱 new \App\User();
});
//這樣生成
$this->app->make('A');
簡介寫法:
$this->app['A'];
還可以把我們實例化好的對象放到APP里面統(tǒng)一管理:
$fooBar = new FooBar(new SomethingElse);
$this->app->instance('FooBar', $fooBar);
依賴注入和ioc控制反轉(zhuǎn)
控制反轉(zhuǎn)就是在我們需要一個對象的時候,根據(jù)參數(shù)的類型,把我們需要的函數(shù)注冊進來,比如:
class Tb{
private $ta;
public function __constauct(\App\Ta $a){
$this->ta = $a;
}
}
說明:在我們需要使用Tb這個對象的時候,工廠的方法在創(chuàng)建Tb對象的時候,會同時把我們需要的
參數(shù)也創(chuàng)建好,并且填充進來,這樣在我們開發(fā)程序的時候就會方便很多
要想使用依賴注入和控制反轉(zhuǎn),就必須先注冊類:
$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 //具體實現(xiàn)接口的一個類
);
并不是在bootstrap/app.php里面注冊,后面會說道
服務(wù)提供者和laravel低耦合架構(gòu)
在入口index.php文件中make 了一個內(nèi)核:
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
內(nèi)核繼承了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了一個數(shù)組,其中:
這個提供了服務(wù)提供者的路徑:
'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中會根據(jù)這個路徑注冊服務(wù)提供者,生成對應(yīng)的對象
在Providers文件夾下,有各種注冊的服務(wù)提供者:
AppServiceProvider.php中繼承了Serviceprovider,Serviceprovider中傳了一個$app對象:
public function __construct($app)
{
$this->app = $app;
}
在AppServiceProvider.php中,有兩個函數(shù):
public function boot() //啟動函數(shù),先執(zhí)行這個,可以進行一些前提配置
{
//
$a = 111;
}
public function register() //注冊綁定類
{
//
$this->app->bind('\App\Ta::class',\App\Ta:class);
$this->app->bind('\App\Tb::class',\App\Tb:class);
}
總結(jié)一下
laravel是怎么運行的
最大就是容器對象:Application
管理laravel框架里面的所有內(nèi)容
要想使用這些功能,我們要先注冊
什么是服務(wù):
把解決某一個相關(guān)功能一系列相關(guān)的類打包封裝,就是一個服務(wù)
服務(wù)提供者做什么的:
服務(wù)提供者就是擴展我們功能的地方
Application根據(jù)配置文件幫我們把服務(wù)注冊,而所有我們需要的服務(wù)功能都是在
服務(wù)提供者文件中進行注冊的(/app/Providers/AppServiceProvider.php)
這樣在多人開發(fā)的時候,每個人把要注冊的類寫在自己的服務(wù)提供者中
Providers/的文件中(自己建立)的register的方法里面
Facades的使用
為了在每次使用類的使用不在生成重復(fù)的對象,或者夸文件使用一個對象,我們需要這樣使用對象:
User::getName();
這樣來配置我們自己的類:
namespace App\Http;
class Z extends \Illuminate\Support\Facades\Facade
{
protected static function getFacadeAccessor()
{
return '\App\TA';
}
}
Z繼承Facade,返回一個類名,這樣我們在使用Z類的時候,會自動調(diào)用TA類的方法
使用: \App\Http\Z::getTitle() 調(diào)用的就是TA類臉的getTitle()方法
注意:必須用單列模式注冊TA類
我們來做個簡化,在用的時候不帶命名空間:
在配置文件中,我們給\App\Http\Z起個別名就好了:
'Z' => \App\Http\Z::class,
中間件
為了不把大量的代碼都寫在controler里面,我們把某一些特定的服務(wù)提取出來,當(dāng)做中間件
各種驗證什么的就由中間件來做
創(chuàng)建中間件
項目更目錄下:
php artisan make:middleware testMiddleware
然后注冊中間件:
配置文件/app/Http/Kernel.php
protected $middlewareGroups = [ ]
全局中間件,無論如何都是會執(zhí)行的
protected $routeMiddleware = [ ]
自定義別名中間件,我們一般把中間件注冊在這里
調(diào)用中間件:
單個:
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
在路由里配置中間件很適合很多個方法都使用同一個中間件
一般用于生產(chǎn)驗證和權(quán)限驗證
只對一個控制器生效的中間件:
在控制器的構(gòu)造函數(shù)中這樣寫:
public function __construct()
{
$this->middleware('test');
}
這樣在使用控制器的時候,優(yōu)先加載中間件
Request
laravel默認(rèn)幫我們開啟了csrf驗證,這樣我們在本地提交表單是提交不過去的,我們?yōu)榱藴y試,先關(guān)閉:
在app/Http/Kernel.php文件中,注釋掉這個:
// \App\Http\Middleware\VerifyCsrfToken::class,
這個csrf認(rèn)證可以驗證非法請求或者表單的重復(fù)提交,后面會說道
測試request
在方法里這樣用:
public function store(Request $request)
{
//提交到數(shù)據(jù)庫
dd($request);
}
打印可以看出,里面包含了關(guān)于一次請求的所有信息
取值:
$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 目錄下。讓我們將一些驗證規(guī)則加入到 rules 方法中:
public function rules()
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}
在控制器的方法中這樣使用:
public function store(StoreBlogPostRequest $request)
{
// 傳入的請求是有效的...
}
開啟csrf認(rèn)證
打開我們之前關(guān)閉的中間件:
\App\Http\Middleware\VerifyCsrfToken::class,
然后呢,我們需要在表單中加入一個隱藏域,用來傳遞服務(wù)器傳來的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模型
就是把數(shù)據(jù)表的結(jié)構(gòu)跟我們的一個類對應(yīng)上了
創(chuàng)建模型
數(shù)據(jù)模型建立(生成文件在app文件夾下):
普通建立:
php artisan make:model Test
建立的同時生成數(shù)據(jù)庫遷移:
php artisan make:model Test --migration
之后我們就可以在控制其中很方便的使用模型對象了:
$test = new Test(); //要現(xiàn)在開始引入命名空間
$test->name = $request['name'];
$test->email = $request['email'];
$test->save();
// $test->where('id',1)->delete();
dd($test->all());
利用郵件服務(wù)將表單推送到手機
為了方便將提示信息推送給用戶,我們使用郵箱服務(wù):
首先安裝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', '測試發(fā)送郵件');
$m->to('975974740@qq.com',$data['name'])->subject('laravel練習(xí)使用郵件');
});
模板中這樣設(shè)置信息:
<p>
用戶:{{$name}} email:{{$email}}
正在練習(xí)使用laravel
</p>
利用laravel認(rèn)證模板完成用戶注冊登錄
主要是利用框架自帶的Auth模塊
未完待續(xù)...