使用laravel實現一個最簡單的動態頁面,牽涉到laravel的路由注冊方式, 控制器書寫方式,以及blade靜態模板的使用。雖然功能很小,卻是一個精簡版的hello world。
下面開始我們的編程之旅。
首先我們通過命令行安裝laravel應用。為了方便創建,先全局安裝 laravel installer, 在命令行中運行下面的指令:
composer global require laravel/installer
安裝成功后,laravel 二進制文件就會注冊到環境變量,在命令行中查看安裝是否成功:
laravel -V
安裝成功,輸出類似下面這樣:
Laravel Installer 3.1.0
要運行 laravel 5.5 + 版本,需要我們安裝 PHP 7+ 版本及以上。創建一個項目目錄, 比如名字叫 ~/code,然后使用下面的命令創建laravel項目:
laravel new hackerpair
正常的創建流程,省略中間包的創建和拉取,大致如下:
現在創建一個靜態網頁,我們先不填充任何動態的變量數據。在 resources/views/ 目錄下, 新建一個html文件 welcome.blade.php ,使用任意順手的編輯器,寫入以下內容:
在本文件內,我們今聲明了一個最簡單的html結構,使用H1標簽輸出一行內容。
為了讓web可以訪問這個頁面,我們首先需要一個路由地址,也就是開放一個資源地址給用戶, 讓用戶可以訪問我們提供的數據。
在文件 routes/web.php 文件內追加注冊如下路由地址:
Route::get('/', function () {
return view('welcome');
});
此處我們使用根目錄直接訪問,且路由的方法使用閉包函數返回。返回體調用系統助手函數 view 返回一個視圖文件。 此處也就是指向了 resources/views/welcome.blade.php 文件,這是系統的默認配置項,也就是約定項。
如果web服務器配置成功,比如使用nignx,我們在網頁端就可以通過 localhost 直接訪問到該網頁了。
同樣地,如果是想要路由到某個 hello.blade.php 視圖文件,那么只需要在調用助手函數時,明確指定即可:
return view('hello');
如果我們的視圖文件目錄地址在 resources/views/welcome/index.blade.php,那么在助手函數中, 就需要這樣指定:
Route::get('/', function () {
return view('welcome.index');
});
至于問為什么這樣寫?因為這是約定。使用點操作符,按照層級索引。
在路由注冊中,如果你的網頁是純靜態的,不需要經由控制器,處理數據,組裝數據進行渲染, 那么可以直接在路由中調用視圖文件進行返回。
Route::view('/', 'welcome');
為了讓網頁數據更加地動態化,達到寫一次頂上一百次的高效,我們使用控制器, 獲取用戶提交的數據,根據路由地址獲取參數,然后在控制器內處理參數,組裝數據。
首先創建一個控制器,使用artisan腳手架命令:
php artisan make:controller WelcomeController
這會創建文件 app/Http/Controllers/WelcomeController.php 文件,原始內容是框架自帶的, 開發者可以任意發揮:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class WelcomeController extends Controller
{}
我們首先創建一個方法,調用視圖函數,把靜態文件返回:
function index()
{
return view('welcome.index');
}
有了此方法之后,需要我們在路由文件中調用此方法,就會完成從路由到視圖渲染的銜接:
Route::get('/', 'WelcomeController@index');
本文通過講解如何通過路由注冊,并返回一個靜態的視圖文件,為大家演示了laravel應用中 一般的web頁面的創建方式。特別是引入控制器之后,動態數據會如約而至,下一章我們詳細介紹。
Happy coding :-)
我是@程序員小助手,持續分享編程知識,歡迎關注。
于Laravel的新的Vue服務器端渲染功能的教程。該教程主要集中在Laravel環境中設置SSR,所以我只有時間來演示一個簡單的“Hello World”應用程序,沒有顯著的功能。
現在我想要構建上一個教程,并演示如何使用Vue Router呈現包含多個頁面的Vue應用程序,因為大多數Laravel項目都有多個頁面。
安裝
本教程將擴展在前一篇文章中使用Laravel&Vue.js 2.5進行服務器端渲染的應用程序。確保你熟悉它的工作原理,并設置適當的開發環境,例如安裝php-v8js擴展。
如果您沒有該代碼,請克隆并設置它:
$ git clone https://github.com/anthonygore/vue-js-laravel-ssr
$ cd vue-js-laravel-ssr
$ cp .env.example .env
$ composer install
$ npm i
然后安裝Vue路由器:
$ npm i --save-dev vue-router
路由器模塊
我們將首先為我們的路由器配置創建一個文件,導出用于應用程序的路由器實例。
我已經制作了一些示例路線,每個示例都顯示了從該方法生成的組件pageComponent。這個工廠方法返回一個簡單的組件,只不過是顯示頁面的名字。這就是我們需要證明的SSR路由工作。
resources/assets/js/router.js
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router);
function PageComponent(name) {
return {
render: h=> h('h3', `Hello from the ${name} page`)
};
}
export default new Router({
mode: 'history',
routes: [
{ path: '/', component: PageComponent('Home'), name: 'home' },
{ path: '/about', component: PageComponent('About'), name: 'about' },
{ path: '/contact', component: PageComponent('Contact'), name: 'contact' }
]
});
在主應用程序文件中,我們現在將導入路由器模塊并將其添加到應用程序,就像在任何Vue項目中一樣。然后將應用程序實例導出,以便在客戶端和服務器條目文件中使用。
resources/assets/js/app.js
import App from './components/App.vue';
import Vue from 'vue';
import router from './router'
export default new Vue({
router,
render: h=> h(App)
});
Laravel路線
請注意,我們的Vue路由器實例處于歷史模式,因此當從導航欄刷新或加載子頁面時,路由將回退到服務器。
這意味著我們在前端應用程序中創建的任何路線也需要在服務器端創建。他們都可以指向相同的控制器方法get:
routes/web.php
<?php
Route::get('/', 'AppController@get');
Route::get('/about', 'AppController@get');
Route::get('/contact', 'AppController@get');
調節器
現在我們需要在控制器中設置多頁SSR。這是對基本應用程序邏輯的修改,所以請確保您熟悉如何工作。
對于SSR多頁面應用程序,我們需要告訴Vue服務器應用程序(在entry-server.js中定義)當前所請求的URL是什么。這將確保當應用程序在沙箱中加載時,它顯示正確的頁面組件。
要做到這一點,我們通過網址,即$request->path()通過該render方法的get方法。然后,我們將URL存儲在全局JavaScript變量中url,當它在沙箱中運行時,將從Vue服務器應用程序訪問該變量。
app/Http/Controllers/AppController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\File;
use Illuminate\Routing\Route;
class AppController extends Controller
{
private function render($path) {
$renderer_source=File::get(base_path('node_modules/vue-server-renderer/basic.js'));
$app_source=File::get(public_path('js/entry-server.js'));
$v8=new \V8Js();
ob_start();
$js=
<<<EOT
var process={ env: { VUE_ENV: "server", NODE_ENV: "production" } };
this.global={ process: process };
var url="$path";
EOT;
$v8->executeString($js);
$v8->executeString($renderer_source);
$v8->executeString($app_source);
return ob_get_clean();
}
public function get(Request $request) {
$ssr=$this->render($request->path());
return view('app', ['ssr'=> $ssr]);
}
}
Vue服務器應用程序
最后一個主要步驟是修改Vue服務器應用程序,以便我們可以以編程方式設置URL,而不是等待用戶執行此操作。
這樣做的邏輯是在Promise回調函數中。以下是它的作用:
通過推送全局變量將路由器設置為正確的URL url
當路由器準備就緒時,我們看到是否有任何頁面組件正在被這個推送的結果顯示,告訴我們路由是有效的。如果不是的話,我們就扔404。如果是這樣,我們返回應用實例。
使用Promise是因為路由器異步加載。一旦這個Promise解決了,我們可以使用服務器渲染器方法renderVueComponentToString來SSR實例,并最終使用print返回到我們的Laravel環境的輸出。
resources/assets/js/entry-server.js
import app from './app'
import router from './router';
new Promise((resolve, reject)=> {
router.push(url);
router.onReady(()=> {
const matchedComponents=router.getMatchedComponents();
if (!matchedComponents.length) {
return reject({ code: 404 });
}
resolve(app);
}, reject);
})
.then(app=> {
renderVueComponentToString(app, (err, res)=> {
print(res);
});
})
.catch((err)=> {
print(err);
});
應用文件
多頁面應用程序的SSR邏輯已經完成。讓我們在頁面中創建一些路由器鏈接,以便我們可以在瀏覽器中測試應用程序:
resources/asset/js/components/App.vue
<template>
<div id="app">
<h1></h1>
<router-view></router-view>
<router-link :to="{ name: 'about' }">About</router-link>
<router-link :to="{ name: 'contact' }">Contact</router-link>
</div>
</template>
<script>
export default {
data() {
return {
title: 'Welcome To My Site'
}
}
}
</script>
加載主頁看起來像這樣:
真正的測試是訪問導航欄中的路由,以便服務器路由處理請求,并希望SSR的應用程序。為此,請訪問http://localhost:9000/about并檢查源標記。正如你所看到的,它包括在正確的URL提供的應用程序:
本文固定鏈接: http://www.i7758.com/archives/2897.html
.請自我介紹一下?
答:我叫xxx,來自北京,20xx年畢業于xx大學計算機xx系,畢業后在武漢從事了x年的php開發工作,公司是一個外包公司,主要做微信開發,公眾號推廣,商城,論壇的開發
2.你在公司負責那些項目?
答:由于我們公司是一個外包公司,不可能只做一個項目,公司的項目都是交叉進行的,論壇,微信,商城我都做過?
3.你為什么來深圳?
答:因為我哥在這邊,父母也希望兄弟間有個照應,而且深圳是一線城市,技術也比廣西前沿一些
4.武漢使用什么前端框架和后端框架?
答:根據自己的區域回答
5.你做過那些模塊?
答:登陸注冊,商品管理,購物車模塊,訂單管理
6.你們公司是使用什么框架?
答:我們公司采用的是TP框架,運用的mysql+apache+php進行開發,因為TP框架是一個免費開源的,輕量級的php開發框架,而且是我們中國人自己開發的,也是國內用的比較多的,各種資料也比較齊全
7.mvc是什么?相互間有什么關系?
答:mvc是一種開發模式,主要分為三部分:m(model),也就是模型,負責數據的操作;v(view),也就是視圖,負責前后臺的顯示;c(controller),也就是控制器,負責業務邏輯
客戶端請求項目的控制器,如果執行過程中需要用到數據,控制器就會到模型中獲取數據,再將獲取到的數據通過視圖顯示出來
8.oop是什么?
答:oop是面向對象編程,面向對象編程是一種計算機編程架構,OOP 的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或對象組合而成。
1
OOP具有三大特點
1、封裝性:也稱為信息隱藏,就是將一個類的使用和實現分開,只保留部分接口和方法與外部聯系,或者說只公開了一些供開發人員使用的方法。于是開發人員只 需要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合作,也能有效避免程序間相互依賴,實現代碼模塊間松藕合。
2、繼承性:就是子類自動繼承其父級類中的屬性和方法,并可以添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增加了代碼的可重用性。PHP只支持單繼承,也就是說一個子類只能有一個父類。
3、多態性:子類繼承了來自父級類中的屬性和方法,并對其中部分方法進行重寫。于是多個子類中雖然都具有同一個方法,但是這些子類實例化的對象調用這些相同的方法后卻可以獲得完全不同的結果,這種技術就是多態性。多態性增強了軟件的靈活性。
1、易維護
采用面向對象思想設計的結構,可讀性高,由于繼承的存在,即使改變需求,那么維護也只是在局部模塊,所以維護起來是非常方便和較低成本的。
2、質量高
在設計時,可重用現有的,在以前的項目的領域中已被測試過的類使系統滿足業務需求并具有較高的質量。
3、效率高
在軟件開發時,根據設計的需要對現實世界的事物進行抽象,產生類。使用這樣的方法解決問題,接近于日常生活和自然的思考方式,勢必提高軟件開發的效率和質量。
4、易擴展
由于繼承、封裝、多態的特性,自然設計出高內聚、低耦合的系統結構,使得系統更靈活、更容易擴展,而且成本較低。
9.smarty是什么,有什么作用?
回答一:smarty是用php寫出來的模板引擎,也是目前業界最著名的php模板引擎之一
它分離了邏輯代碼和外在的顯示,提供了一種易于管理和使用的方法,用來將混雜的php邏輯代碼與html代碼進行分離
回答二:smarty是php中最著名的引擎框架之一,我們公司使用的是TP框架,已經封裝好了smarty模板,所以沒有單獨使用過
回答三: smarty是個模板引擎,最顯著的地方就是有可以把模板緩存起來。一般模板來說,都是做一個靜態頁面,然后在里面把一些動態的部分用一切分隔符切開,然后在PHP里打開這個模板文件,把分隔符里面的值替換掉,然后輸出來,你可以看下PHPLib里面的template部分。
而smarty設定了緩存參數以后,第一次運行時候會把模板打開,在php替換里面值的時候把讀取的html和php部分重新生成一個臨時的php文件,這樣就省去了每次打開都重新讀取html了。如果修改了模板,只要重新刷下就行了。
10.TP框架有哪些優點?
答:TP框架是我們中國人自己開發的框架,各種資料比較齊全,國內用的比較多,比較簡單和方便,而且是免費開源的
11.TP的特性有哪些?
1.多表查詢非常方便,在model中幾句代碼就可以完成對多表的關聯操作 2.融合了smarty模板,使前后臺分離 3.支持多種緩存技術,尤其對memcache技術支持非常好 4.命名規范,模型,視圖,控制器嚴格遵循命名規則,通過命名一一對應 5.支持多種url模式 6.內置ajax返回方法,包括xml,json,html等 7.支持應用擴展,類庫擴展,驅動擴展等
12.TP框架中的大字母函數?
U:對url的組裝 A:內部實例化控制器 S:緩存處理 R:調用某個控制器的操作方法 D:實例化自定義模型類 M:實例化基礎模型類 I:獲取參數 L:設置或者獲取當前語言 C:設置或獲取,保存配置
13.請介紹一下laravel框架?
答: laravel框架的設計思想比較先進,非常適合應用各種開發模式,作為一個框架,它為你準備好了一切,composer是php的未來,沒有composer,php肯定要走向沒落
laravel框架最大的特點和優秀之處就是集合了php比較新的特點,以及各種各樣的設計模式,Ioc模式,依賴注入等
14.laravel有那些特點?
回答一:
1.強大的rest router:用簡單的回調函數就可以調用,快速綁定controller和router 2.artisan:命令行工具,很多手動的工作都自動化 3.可繼承的模板,簡化view的開發和管理 4.blade模板:渲染速度更快 5.ORM操作數據庫 6.migration:管理數據庫和版本控制 7.測試功能也很強大 8.composer也是亮點
回答二: laravel框架引入了門面,依賴注入,Ioc模式,以及各種各樣的設計模式等
15.請簡述一下數據庫的優化?
答:數據庫的優化可以從四個方面來優化:
1.從結構層: web服務器采用負載均衡服務器,mysql服務器采用主從復制,讀寫分離
2.從儲存層: 采用合適的存儲引擎,采用三范式
3.從設計層: 采用分區分表,索引,表的字段采用合適的字段屬性,適當的采用逆范式,開啟mysql緩存
4.sql語句層:結果一樣的情況下,采用效率高,速度快節省資源的sql語句執行
16.如何解決異常處理?
答: 拋出異常:使用try…catch,異常的代碼放在try代碼塊內,如果沒有觸發異常,則代碼繼續執行,如果異常被觸發,就會 拋出一個異常。Catch代碼塊捕獲異常,并創建一個包含異常信息的對象。$e->getMessage(),輸出異常的錯誤信息。
解決異常:使用set_error_handler函數獲取異常(也可以使用try()和catch()函數),然后使用set_exception_handler()函數設置默認的異常處理程序,register_shutdown_function()函數來執行,執行機制是,php要把調入的函數調入到內存,當頁面所有的php語句都執行完成時,再調用此函數
17.前端?
答:我在工作中處理前端的功能,一般就是用ajax向后臺請求數據,然后返回數據在前臺頁面中顯示出來。我從來沒有獨立的完整的將html和css樣式都一個人完成,如果公司實在有這樣的需求的話,我可能會找一些前臺的模板或者說是前端的框架,比如說h—ui等等
18.權限管理(RBAC)的實現?
1.首先創建一張用戶表:id name auto(保存格式為:控制器-方法)
2.然后在后臺中創建一個基類控制器,控制器里封裝一個構造方法,當用戶登陸成功后,使用TP框架中封裝好的session函數獲取保存在服務器中的session id,然后實例化模型,通過用戶id獲取保存在數據表中的auth數據,使用explode函數分割獲取到的數據,并使用一個數組保存起來,然后使用TP框架中封裝好的常量獲取當前控制器和方法,然后把他們組裝成字符串,使用in_array函數進行判斷該數組中是否含有當前獲取到的控制器和方法,如果沒有,就提示該用戶沒有權限,如果有就進行下一步操作
19.支付功能的實現?
答:
20.怎么保證促銷商品不會超賣?
答:這個問題是我們當時開發時遇到的一個難點,超賣的原因主要是下的訂單的數目和我們要促銷的商品的數目不一致導致的,每次總是訂單的數比我們的促銷商品的數目要多,當時我們的小組討論了好久,給出了好幾個方案來實現:
第一種方案:在每次下訂單前我們判斷促銷商品的數量夠不夠,不夠不允許下訂單,更改庫存量時加上一個條件,只更改商品庫存大于0的商品的庫存,當時我們使用ab進行壓力測試,當并發超過500,訪問量超過2000時,還是會出現超賣現象。所以被我們否定了。
第二種方案:使用mysql的事務加排他鎖來解決,首先我們選擇數據庫的存儲引擎為innoDB,使用的是排他鎖實現的,剛開始的時候我們測試了下共享鎖,發現還是會出現超賣的現象。有個問題是,當我們進行高并發測試時,對數據庫的性能影響很大,導致數據庫的壓力很大,最終也被我們否定了。
第三種方案:使用文件鎖實現。當用戶搶到一件促銷商品后先觸發文件鎖,防止其他用戶進入,該用戶搶到促銷品后再解開文件鎖,放其他用戶進行操作。這樣可以解決超賣的問題,但是會導致文件得I/O開銷很大。
最后我們使用了redis的隊列來實現。將要促銷的商品數量以隊列的方式存入redis中,每當用戶搶到一件促銷商品則從隊列中刪除一個數據,確保商品不會超賣。這個操作起來很方便,而且效率極高,最終我們采取這種方式來實現
*請認真填寫需求信息,我們會在24小時內與您取得聯系。