一、框架概述
課程概述
- laravel 4天(之前TP框架還是很大的區別)(國外框架)
- 在線教育平臺 6天(laravel熟悉+插件+開發模式)
- dedecms 二次開發
- CI框架
1、什么是框架?
框架是許多代碼的集合,為項目開發提供了很多基礎性的代碼。例如常見的參數過濾,DB類的封裝、文件上傳類,圖片處理類,驗證碼類等等。程序員只需要將重心放置到業務邏輯的實現,加快開發的速度。
一個項目 = 功能性代碼(框架提供) + 業務邏輯(自己編寫)
什么是MVC的開發思想?
M 是 Model的簡寫,負責業務數據處理。
V 是 View的簡寫,負責顯示數據和收集數據。
C 是Controller的簡寫,負責協調(調度)左右。
問題:
在MVC設計思想里面,哪一個是最重要的?
答:M最重要,數據的處理。(MVC 首當其沖是M)在MVC設計思想里面,和用戶直接產生關聯的是哪一個?
答:C 控制器,地址欄 url地址----》模塊下控制器下方法
http://local.mvc.com/index.php/Home/View/login 方法(邏輯判斷 1. 載入視圖 get 2. 實例化模型post)在MVC里面如果沒有V視圖層的參數,是否可以正常顯示數據?
答:MCT開發思想。(T template模板)可以html 可以直接 echo "html標簽"; $html = <<<HTML
html代碼
HTML;
為什么要使用MVC開發思想?
現在更多的是個人開發為主,但是實際工作開發肯定是團隊合作為主。必然溝通的問題,協調的問題。主要是為了團隊的協作。統一的規范進行開發,后期容易整合。最后的維護是容易。
2、為什么要使用框架?(面試)
代碼重用,很多通用的代碼可以復用,例如做參數過濾,可以封裝成一個函數 I('get.id', 0, 'intval')
開發者只需要關注業務代碼,不需要關注框架底層代碼實現,例如數據庫的操作
原生:insert into sh_goods values(xx..x...) mysql mysqli pdo....
框架:D("Goods")->add(I('post.'))代碼量變少了,開發速度快,開發周期短(40-60%)
開發規范比較統一,例如函數和類的命名,方便團隊協作
原生:user.php aaaa.php bbbbb.php afsdaf.php
框架:UserController.class.php后期的維護更加方便,同時功能模塊的擴展也變得容易
弊端:使用框架劣勢?
答:凡事都有兩面性。
- 限制人的思維(必須按照框架的規則來做事)條條框框多(學習成本)(排斥新東西)
- 兼容性(新版本升級)(TP3.2經典 php7新特性,TP5里面寫的寫法,PHP7里面的特性全部發揮)(TP5使用很多)(TP5里面的大部分的單字母函數全部廢棄 I( ) C())(面試:問題 會TP5?)
- 框架本身有性能消耗(為了解決開放性的問題,不得已要做很多的兼容性的處理)(開發優先、性能優先)laravel開發優先(運維:很少在程序上面出現性能問題、IO操作:mysql數據庫---》memcache內存緩存、Redis....) laravel運行效率低(所有PHP框架里面允許效率最低)
- .......
3、PHP中的主流框架
Zend Framework(俗稱zf框架)
php語言公司官方(zend公司)開發的框架,重量級框架;因為官方開發,所以需要考慮的方面很全面,導致框架整體很臃腫。
YII(個人產品)
中文叫做易框架,重量級框架,美籍華人薛強進行開發的框架。最大的特點就是組件化、代碼復用。(不太適合新手進行使用,里面的設計模式、OOP概念理解很深、外貿電商使用的比較多)不建議:HTML代碼,建議HTML代碼全部使用PHP的類庫進行輸出。$form = new FormActive(); $form->open('post', 'url'....)很前端jQuery很緊密。
最先在YII里面提出代碼的復用性的體現,為了減少重復性代碼的開發。研發了一個叫做GII的模塊,也叫作代碼生成器、也叫作腳手架,主要是做輔助性的開發,用戶只需要輸入一下表名,即可生成對應curd相關的代碼文件。這個東西太好用了,所以很多框架爭相模仿,我們今天學習laravel也提供了類似的工具,叫做 artisan命令工具,有了它可以非常快速的生成一些基礎性的代碼,例如控制器的生成、模型的生成等等......
php artisan make:controller UserController
php artisan make:model User
基本上所有的開發:
商品模塊、會員模塊.....
- 控制器(curd操作)
- 模型(自動驗證、自動完成....)
- 三個靜態頁(add\edt\lst)
處理:
輸入:sh_admin;
生成:五個文件....
Symfony2(企業使用較多,大企業使用的偏多)
重量級框架,國外框架。由于symfony框架開發的思想太超前了,以至于在很早之前引入很多新的好的特性。后面很多的其他的產品都借鑒了該框架的特性,出來了很多的衍生產品,例如我們今天學習 laravel框架,就是symfony的兒子(IOC容器);同時還有YII框架里面也借鑒了symfony里面的特性(事件模型編程、javascript事件編程)。
最后還有一點需要注意,symfony框架是很早之前就和composer進行默契的配合。同時symfony框架的底層的模板引擎使用的是 twig 模板引擎。
Laravel(重點)
目前是一個非常火的非常火的重路由的框架。需要注意該框架是基于Symfony框架的(Symfony 底層使用composer這個類庫管理軟件)。在學習laravel之前還要學習一下composer這個軟件。
Codelgniter (小型)
CI框架,輕量級框架,國外框架(個人開發的產品,全國使用量,很多人喜歡將該框架作為基礎性的框架,然后在該框架上加入自己的代碼進行封裝),市場上有一定的應用。顯著的特點:按需加載。
ThinkPHP
ThinkPHP是一個叫做劉晨的中國人開發的國產框架。有中文官網、中文幫助文檔、中文社區,以及豐富的百度搜索資源。所以ThinkPHP很適合作為入門級的開發框架(學習成本是最低)。
下面的介紹的框架都是C語言編寫的框架,是說這個框架本身是用C語言進行編寫,但是編寫完成之后,將它進行編譯成一個 dll(Windows動態鏈接庫文件)(php_yaf.dll),然后在php.ini文件進行引入。
yaf框架
Yaf,全稱 Yet Another Framework,是由鳥哥(惠新宸)使用C語言進行開發的一個高性能的可以作為PHP擴展出現的框架。(Yaf_Abstarct)
除了原生PHP的寫法 yaf框架的性能是最好的。
phalcon框架(國外)
Phalcon 是開源、全功能棧、使用 C 擴展編寫、針對高性能優化的 PHP 5 框架。 開發者不需要學習和使用 C 語言的功能, 因為所有的功能都以 PHP 類的方式暴露出來,可以直接使用。 Phalcon 也是松耦合的,可以根據項目的需要任意使用其他對象。Phalcon是一套實現MVC架構的高性能PHP應用程序框架。(文檔很少)性能是僅此于yaf。
php框架性能:
php原生開發(目前很多公司)> yaf框架(PHP的擴展出現,常駐內存)>Phalcon> CI框架 > TP|YII > laravel > zf|symfony...
思考:
laravel為什么會在國內流行?
- 出現的時機是最合適的。
- 代碼相對來說寫起來簡潔,用很少的代碼可以完全多一些。
- laravel設計思想就很超前,其他的框架沒有及時去運用PHP最新的特性。并且laravel借鑒了很多其他的編程語言的特性,例如Java、ruby。
- 擴展性很好(設計模式)。
- 和composer有很好的配合,互利共贏。(百度:composer里面提供的類庫大部分是支持laravel)
- 最后laravel對前端款框架支持也非常友好 laravel + vuejs
- .....
4、ORM機制
什么是ORM機制?
object relationship model 對象關系模型。由于現在開發的主流的思想是面向對象實現(OOP),面向對象的主體是對象。既然面向對象可以很好的去解決現實的問題。
是否可以使用該思想來去操作數據庫。數據庫的操作習慣使用結構化的查詢語句 (SQL 第四代編程語言 select * from user where id = 1)(AI:程序員不值錢,電腦編程 美國:機器人炒股)。
是否可以使用面向對象方式去操作數據庫?可以、映射關系
模型類(UserModel) 表(sh_user) [行和列]
對象($userModel = new UserModel()) 表中記錄[一行]
屬性($userModel->username) 表中字段(username、password)
方法 ($userModel->select()|find()|upate()|add()) 記錄的操作(curd)
5、ORM的實現
既然ORM是一種思想,是一種解決問題的方式。屬于一種抽象的行為。那么應該想辦法去實現該思想。實現的方式有很多種:
AR模式(Active Record TP里面使用該方式實現)
$userModel = D('User'); // 模型類 sh_user;
$userModel->username = 'andy';
$userModel->password = md5('admin88');
$userModel->add();eloquentORM機制(laravel里面的實現)
medoo機制(yaf框架里面有教,yaf框架里面是沒有模型層,模型自己實現 pdo功能已經足夠強大)..............
http://medoo.lvtao.net
了解:面向過程、OOP編程、AOP編程【面向切面編程】、面向組件編程....
二、laravel框架
1、laravel簡介
laravel是目前一個比較主流的框架,現在很多互聯網的公司基本都在使用該框架。該框架是基于symfony【國外一款非常流行的框架:由于國內手冊不是很齊全,沒有多少公司使用】的一個國外的MVC框架。
國內訪問地址:http://www.golaravel.com/
中文社區網站:https://laravel-china.org/
2、開發環境要求
laravel框架有運行對環境是有嚴格要求的。(在Windows下建議使用集成開發環境phpstudy這個產品,目前還支持php7,并且可以非常方便的做版本切換。)
注意:如果要使用PHPstudy,則必須先關閉之前的wamp環境(例如Apache、MySQL服務)
注意:安裝的過程中出現vc庫找不到,使用下面的方式進行處理
3、laravel安裝方式簡介
- 使用專業的軟件 composer 軟件,可以幫我們自動去互聯網下載開發過程中所需要的類庫文件和Linux下包管理器yum比較類似,和node.js里面npm ,也和前端里面bower相似。
簡介:http://docs.phpcomposer.com/00-intro.html
國內鏡像:https://pkg.phpcomposer.com/
很多其他的語言都有對應的包管理器,但是唯獨PHP里面開啟是沒有的,這個時候就有人提出一種思想,把所有的PHP常見的類庫(上傳、圖片處理、分頁類)統一放在一個PHP應用商店。然后使用一定的工具進行管理,例如下載、更新..... 而這這樣的管理工具就是要學習的composer管理工具。
- 使用手工安裝,需要自己去下載laravel的框架的源碼。
http://laravelacademy.org/resources-download
4、composer安裝laravel
- 在安裝之前,先配置一下composer使用國內的鏡像源(只要使用一次即可)
composer config -g repo.packagist composer https://packagist.phpcomposer.com
- 命令行執行如下的命令
composer create-project laravel/laravel=5.1.* local.laravel51.com --prefer-dist
安裝后的界面:
5、啟動laravel項目
laravel官方提供一個叫做artisan的腳本,可以幫我們快速的完成一些事情,例如啟動項目,生成控制器文件,模型文件..........
可以執行如下命名的時候,必須是在laravel項目的根目錄
php artisan serve
瀏覽器效果:
6、手工安裝laravel
http://laravelacademy.org/resources-download
- 將下載的文件復制到虛擬主機目錄
- 在Apache的配置文件配置一個虛擬主機【注意,需要指向 public目錄下】
<VirtualHost *:80>
DocumentRoot "C:\phpStudy\WWW\laravel.dev\public"
ServerName laravel51.dev
ServerAlias phpStudy.net
<Directory "C:\phpStudy\WWW\laravel.dev\public">
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>
- 配置hosts文件
127.0.0.1 laravel51.dev
- 瀏覽器訪問效果
7、laravel目錄結構分析
整體目錄
app目錄
http目錄
config目錄
config目錄:主要是存放配置文件信息,laravel的配置信息是分文件保存的。
database目錄
database目錄:數據遷移和種子文件。
例如某個數據遷移文件:在項目開發和測試階段使用的較多,上線之后基本不用。
public目錄
public目錄:單入口和系統的靜態資源(css、img、js、uploads)
resource目錄
resources目錄:存放視圖文件。
storage目錄
storage目錄:主要是存放緩存文件和日志文件,需要注意:如果是在Linux環境下,該目錄需要有可寫的權限
vendor目錄
vendor目錄:主要是存放第三方的類庫文件,laravel思想主要是共同的開發,不要重復的造輪子(例如:里面可能存在驗證碼類、上傳類、郵件類),還需要注意該目錄還存放laravel框架的源碼。注意:如果使用的composer軟件管理的,composer下載的類庫都是存放在該目錄下的。
.env文件
.env文件:主要是設置一些系統相關的環境配置文件信息。config目錄里面的文件配置內容一般都是讀取該文件里面的配置信息(config里面的配置項的值基本都是來自.env文件)。
三、laravel入門使用
1、路由簡介
因為laravel是一個重路由的框架。
什么是路由?
答:路由就是用戶在地址欄里面輸入一個url地址后,交給后端的那個控制器下的那個方法進行處理的規則。一般我們需要在專門的路由文件里面,進行定義好。
為什么要使用路由?
答:laravel里面路由。最新的 TP5里面也是存在路由。
好處:
- url地址變得非常的美觀。(以前沒有路由都是通過偽靜態處理)
- 隱藏網站的目錄結構(t.cn/goods/index.php ?)(index.php?m=Home&c=User&a=lst)
- 防范網絡攻擊.....
路由文件在哪里,以及規則如何編寫?
2、路由入門使用
// laravel內置了一個Route類,提供了很多方法 一般是根據http的請求來命名
// 例如: 1. get 2. post 3. any 4. match .....
// get方法是處理 get請求 第一個參數:代表是請求的url地址的uri部分
// 第二個參數:1. 匿名函數 2. 字符串(控制器下的某個方法)
// 1. 匿名函數 返回值作為http的響應返回給瀏覽器
// 2. 控制器里面的方法執行作為響應
// url:http://local.laravel51.com/
Route::get('/', function () {
return 'hello';
// return view('welcome');
});
// url:http://local.laravel51.com/about
Route::get('/about', function () {
return 'about';
// return view('welcome');
});
3、視圖使用
視圖載入
學習:
- 視圖寫在哪里?
- 視圖文件如何命名?
- 視圖里面的內容和編寫?
- 視圖是否可以分目錄管理?
- 視圖如何被載入?
- 如何視圖賦值?
效果:
4、blade模板引擎
截圖
- 在routes.php里面定義一個/user/login路由
- 建立 login.blade.php視圖文件
- 在routes.php里面定義一個/blade路由
- 建立 show.blade.php視圖文件
- 注意:laravel模板引擎和 vuejs的沖突解決
代碼
routes.php路由文件
<?php
/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/
// laravel內置了一個Route類,提供了很多方法 一般是根據http的請求來命名 例如: 1. get 2. post 3. any 4. match .....
// get方法是處理 get請求 第一個參數:代表是請求的url地址的uri部分 第二個參數: 1. 匿名函數 2. 字符串(控制器下的某個方法)
// url:http://local.laravel51.com/
// 1. 匿名函數 返回值作為http的響應返回給瀏覽器
// 2. 控制器里面的方法執行
Route::get('/', function () {
return 'hello';
// return view('welcome');
});
// url:http://local.laravel51.com/about
Route::get('/about', function () {
return 'about';
// return view('welcome');
});
// 1. 視圖寫哪里? 2. 視圖文件名如何命名 3. 視圖里面內容 4. 視圖是否可以分目錄管理 5. 視圖如何被載入 6. 如何視圖賦值
// url:http://local.laravel51.com/user/login
Route::get('/user/login', function () {
// view() 函數是用于載入視圖的 視圖寫在哪里? 如何命名?
// /resources/views/視圖文件名稱.blade.php 文件的后綴 .blade.php必須這樣,因為laravel內部使用的一個模板:blade
$info = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quod consequatur nisi excepturi debitis mollitia autem quis dolores error nulla, ea cumque vero quas beatae eveniet molestias expedita cupiditate. Itaque, culpa!'; // 賦值
$title = 'Lorem ipsum dolor sit amet, consectetur.';
// 兩種方式:
// with 第一個參數是視圖調用名稱 第二個參數變量信息
// 第二種: 直接給view函數傳遞第二個參數,關聯數組,key視圖調用名稱 value變量信息
$key = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Officiis alias assumenda dolorum vel animi quo mollitia possimus neque quod illum!';
$age = 12;
// 復合數據類型 [] 數組 php5.4語法
$userData = [
['id' => 1, 'username' => 'Lorem ipsum dolor sit amet, consectetur adipisicing.'],
['id' => 2, 'username' => 'Lorem ipsum dolor sit.'],
['id' => 3, 'username' => 'ruby'],
];
// 通過賦值操作可以在視圖里面顯示數據信息,但是通過第二種方式寫起來還是很麻煩。 key value key value
/* return view('home.user.login', ['key' => $key, 'age' => $age, 'userData' => $userData])
->with('info', $info)
->with('title', $title);
*/ // 文件夾的分隔符使用的 / laravel建議使用 .
// 賦值簡化操作
// compact('info', 'title', 'key', 'age', 'userData') 可以將數據轉換為 關鍵數組 參數:是變量名
return view('home.user.login', compact('info', 'title', 'key', 'age', 'userData'));
});
// 視圖里面的模板引擎 blade 1. 基本數據輸出 2. 復合數據類型輸出 3. 邏輯判斷
Route::get('/blade', function ()
{
$title = '模板引擎';
$userData = [
['id' => 1, 'username' => 'Lorem ipsum dolor sit amet, consectetur adipisicing.'],
['id' => 2, 'username' => 'Lorem ipsum dolor sit.'],
['id' => 3, 'username' => 'ruby'],
];
$isBoolean = false;
$info = '這個是真的!';
return view('show', compact('title', 'userData', 'info', 'isBoolean'));
});
show.blade.php視圖文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet">
<script src="https://cdn.bootcss.com/jquery/2.0.1/jquery.js"></script>
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.js"></script>
<title>blade模板引擎</title>
</head>
<body>
<div class="container">
<h2>原生PHP</h2>
<hr>
<p><?php echo $title;?></p>
<hr>
{{-- 短標記語法PHP --}}
<p><?= $title;?></p>
<hr>
<h2>blade模板引擎</h2>
{{-- 這兩個大括號被叫做 插值表達式,計算內部的表達式,最終的結果放置在這里 --}}
{{-- vuejs 也是使用的插值表達式 --}}
<p>{{ $title }}</p>
<p>{{ 1 + 1 }}</p>
<p>{{ 3 * 8 }}</p>
<h2>邏輯運算</h2>
<p>{{ !false }}</p>
{{-- 三目運算 --}}
<p>{{ 1 > 2 ? '假的' : '真的' }}</p>
<hr>
<h1>復合數據類型輸出</h1>
@foreach ($userData as $v)
<li>序號: {{ $v['id'] }} 姓名: {{ $v['username'] }}</li>
<hr>
@endforeach
<hr>
@if ( $isBoolean )
{{ $info }}
@endif
<hr>
@if ( $isBoolean )
這個是真的...........
@else
假的的...........
@endif
</div>
{{-- 問題: laravel和 vue 相遇了 --}}
<div class="container">
<div id="box">
{{-- 不想讓 laravel進行解析,前端vuejs 在瀏覽器里面解析 --}}
{{-- vuejs 前端MVVM框架 --}}
<p>@{{ msg }}</p>
</div>
</div>
</body>
<script src="https://cdn.bootcss.com/vue/1.0.23/vue.js"></script>
<script type="text/javascript">
new Vue({
el: '#box',
data: {
'msg' : 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sint, distinctio doloremque assumenda dicta veritatis repellendus maxime ut commodi ipsum necessitatibus ullam nihil! Saepe ab labore aliquam facilis placeat id incidunt.'
}
});
</script>
</html>
login.blade.php視圖文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet">
<script src="https://cdn.bootcss.com/jquery/2.0.1/jquery.js"></script>
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.js"></script>
<title>user-login頁面</title>
</head>
<body>
<div class="container">
<h1 class="page-header">user-login頁面</h1>
<hr>
<h2>原生PHP</h2>
<?php echo date('Y-m-d H:i:s');?>
<hr>
<h2>blade模板引擎</h2>
<p>{{ time() }}</p>
<hr>
<p><?php echo $info;?></p>
<hr>
<p class="well"><?php echo $title;?></p>
<hr>
<p class="well"><?php echo $key;?></p>
<hr>
<p><?php echo $age;?></p>
<hr>
<h2>復合數據類型: 數據遍歷操作</h2>
<ul>
<?php foreach ($userData as $v): ?>
<li>序號: <?php echo $v['id'];?> 姓名: <?php echo $v['username'];?></li>
<hr>
<?php endforeach ?>
</ul>
</div>
<div class="container">
<form action="" method="POST">
<div class="form-group">
<label for="username">用戶名:</label>
<input type="text" name="username" id="username" class="form-control" value="">
</div>
<div class="form-group">
<label for="password">密碼:</label>
<input type="password" name="password" id="password" class="form-control" value="">
</div>
<div class="form-group">
<input type="submit" value="提交" class="btn btn-success">
<input type="reset" value="清空" class="btn btn-danger">
</div>
</form>
</div>
</body>
</html>
4、控制器使用
通過上面的操作,我們發現基本將代碼都寫在routes.php路由文件,這樣不利于后期的開發和維護。一般會將用戶的請求交給控制器下的某個方法來處理。在方法里面完成業務邏輯。
思考:
- 控制器寫在哪里?
- 控制器文件名如何命名?
- 控制器里面的內容如何編寫?
- 控制器里面如何載入視圖?
- 控制器里面如何賦值?
- 控制器里面的方法如何被調用?
- 如何在控制器里面實例化模型?
- 如何通過模型獲取數據?
5、artisan命令-控制器
使用 artisan 命令生成控制器的默認行為
效果:
代碼內容:
使用 artisan 命令生成控制器的不要帶方法
代碼內容:
使用 artisan 命令生成控制器的分目錄管理
代碼內容:
常見錯誤
加密密鑰生成
解決:
404錯誤
如果沒有在路由文件里面定義路由規則,直接請求,會提示如下的信息: