《PHP教程:Laravel 4 初級(jí)教程之視圖、命名空間、路由》要點(diǎn):
本文介紹了PHP教程:Laravel 4 初級(jí)教程之視圖、命名空間、路由,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
1. 視圖分離與嵌套PHP教程
在 learnlaravel 文件夾下運(yùn)行命令:PHP教程
php artisan generate:view admin._layouts.default
這時(shí)候generator插件幫我們創(chuàng)建了app/views/admin/_layouts/default.blade.php 文件,將內(nèi)容修改為:PHP教程
<!doctype html>
<html>
<head>
? <meta charset="utf-8">
? <title>Learn Laravel 4</title>
? @include('admin._partials.assets')
</head>
<body>
<div class="container">
? <div class="navbar navbar-inverse navbar-fixed-top">
? <div class="navbar-inner">
??? <div class="container">
????? <a class="brand" href="{{ URL::route('admin.pages.index') }}">Learn Laravel 4</a>
????? @include('admin._partials.navigation')
??? </div>
? </div>
</div>
<hr>
? @yield('main')
</div>
</body>
</html>
這就是視圖文件,MVC中的V.視圖需要仔細(xì)講一下.PHP教程
views文件夾為視圖文件夾,視圖文件夾可以嵌套,就像我上面一樣創(chuàng)建了admin/_layout嵌套文件夾,在里面創(chuàng)建了一個(gè)叫default.blade.php的文件,那么以后我們?cè)贚aravel內(nèi)任何地方要用到這個(gè)視圖的時(shí)候,他就叫admin._layouts.default.PHP教程
我們看到,上面代碼的第七行是“@include('admin._partials.assets')”,根據(jù)上面我們剛剛了解的知識(shí),這表示載入了另外一個(gè)文件.blade是Laravel的模板引擎,此處的 @include 表示直接把那個(gè)文件的所有代碼帶入進(jìn)來(lái)放到這里,變成當(dāng)前視圖的一部分.PHP教程
注意看第25行“@yield('main')”,這表示什么呢?這個(gè)有點(diǎn)復(fù)雜,我們稍后再講.
PHP教程
2. 權(quán)限驗(yàn)證PHP教程
Laravel支持標(biāo)準(zhǔn)HTTP認(rèn)證,但是在此處我們需要構(gòu)建blog系統(tǒng),所以我們將編寫(xiě)完善的管理員登陸系統(tǒng),從頁(yè)面登錄.PHP教程
用命令行創(chuàng)建app/views/admin/auth/login.blade.php文件,代碼如下:PHP教程
@extends('admin._layouts.default')
@section('main')
? <div id="login" class="login">
??? {{ Form::open() }}
????? @if ($errors->has('login'))
??????? <div class="alert alert-error">{{ $errors->first('login', ':message') }}</div>
????? @endif
????? <div class="control-group">
??????? {{ Form::label('email', 'Email') }}
??????? <div class="controls">
????????? {{ Form::text('email') }}
??????? </div>
????? </div>
????? <div class="control-group">
??????? {{ Form::label('password', 'Password') }}
??????? <div class="controls">
????????? {{ Form::password('password') }}
??????? </div>
????? </div>
????? <div class="form-actions">
??????? {{ Form::submit('Login', array('class' => 'btn btn-inverse btn-login')) }}
????? </div>
??? {{ Form::close() }}
? </div>
@stop
大家應(yīng)該注意到了前兩行:PHP教程
@extends('admin._layouts.default')@section('main')
這代表什么?實(shí)際上,以后我們會(huì)了解到,在controller中調(diào)用view的時(shí)候,調(diào)用的只是這個(gè)login.blade.php文件,第一行表示,此視圖是admin._layouts.default的子視圖,這時(shí)blade引擎會(huì)把這個(gè)視圖也載入進(jìn)來(lái),怎么組裝呢?這時(shí)候下面那個(gè)@section('main')就該出場(chǎng)了,被它包裹的代碼將會(huì)直接放到admin._layouts.default中的@yield('main')中.section和yield可以任意搭配,只要兩個(gè)視圖之間有調(diào)用關(guān)系,他們就可以這樣用,非常靈活.PHP教程
寫(xiě)到這里大家可能有個(gè)疑問(wèn),為什么示例代碼里空行那么多?這一點(diǎn)就是個(gè)人經(jīng)驗(yàn)了.blade引擎的所有標(biāo)簽都會(huì)在視圖編譯時(shí)用正則處理,引擎本身有一個(gè)問(wèn)題,算不上bug,就是換行符會(huì)被處理掉,導(dǎo)致前后行和這一行都緊緊地?cái)D在一起,在前端瀏覽器中“查看源代碼”時(shí),比較不清晰,前后加上空行可以解決這個(gè)問(wèn)題.當(dāng)然這可能是一個(gè)自動(dòng)的“壓縮”特性,不再深入討論.PHP教程
增加控制器文件app/controllers/admin/AuthController.php,這時(shí)候有人就說(shuō)了,這我知道,哈哈,運(yùn)行PHP教程
“php artisan generate:controller admin.AuthController”PHP教程
這個(gè)想法是對(duì)的,但你運(yùn)行一下試試?會(huì)直接在app/controllers目錄下創(chuàng)建一個(gè)“admin.AuthController.php”文件,有人又說(shuō),那我用“admin/AuthController”總行了吧,你試一下?也不行.所以我們要先在app/controllers 下手動(dòng)創(chuàng)建 admin 文件夾,這時(shí)候,再命令行輸入:PHP教程
php artisan generate:controller admin/AuthController
這樣就可以了.接下來(lái)改寫(xiě)AuthController.php 的內(nèi)容為:PHP教程
<?php
namespace App\Controllers\Admin;
use Auth, BaseController, Form, Input, Redirect, Sentry, View;
class AuthController extends BaseController {
? /**
?? * 顯示登錄頁(yè)面
?? * @return View
?? */
? public function getLogin()
? {
??? return View::make('admin.auth.login');
? }
? /**
?? * POST 登錄驗(yàn)證
?? * @return Redirect
?? */
? public function postLogin()
? {
??? $credentials = array(
????? 'email'??? => Input::get('email'),
????? 'password' => Input::get('password')
??? );
??? try
??? {
????? $user = Sentry::authenticate($credentials, false);
????? if ($user)
????? {
??????? return Redirect::route('admin.pages.index');
????? }
??? }
??? catch(\Exception $e)
??? {
????? return Redirect::route('admin.login')->withErrors(array('login' => $e->getMessage()));
??? }
? }
? /**
?? * 注銷
?? * @return Redirect
?? */
? public function getLogout()
? {
??? Sentry::logout();
??? return Redirect::route('admin.login');
? }
}
這就是我們登錄、注銷的控制器,MVC中的C.接下來(lái)我將講解命名空間,這是Laravel的基礎(chǔ),或者說(shuō)是composer的基礎(chǔ),是整個(gè)Laravel教程中的重點(diǎn)、難點(diǎn),希望大家錙銖必較,任何不懂都不要放過(guò).可以到phphub論壇或者golaravel論壇相應(yīng)帖子下面提問(wèn),或者直接發(fā)帖提問(wèn).PHP教程
我們首先觀察這個(gè)文件的位置,它位于 app/controllers/admin 目錄下,這有什么不同呢?在其他框架如 CI 中,子文件夾直接加上文件夾名就可以直接調(diào)用到了,雖然最多只能有一層.而Laravel沒(méi)有這么簡(jiǎn)單,涉及到了PHP的命名空間.PHP教程
1. composer 支持 PSR-0 及 PSR-4 標(biāo)準(zhǔn),標(biāo)準(zhǔn)規(guī)定 PHP 包以命名空間為區(qū)分,向外提供服務(wù),所有暴露出來(lái)的類都應(yīng)該在 \作者名\包名 命名空間下,例如 \lui\MFFC\Mail 類.這樣,哪怕是名稱一樣的包只要是不同作者也可以在https://packagist.org/上共存,供大家使用.PHP教程
2. 命名空間可以類比成 Linux 系統(tǒng)中的 目錄,在任何目錄下都可以直接使用文件名打開(kāi)當(dāng)前目錄下的所有文件和可執(zhí)行程序,如果需要打開(kāi)其他目錄下的文件,就需要使用絕對(duì)路徑或者相對(duì)路徑.PHP教程
3. 大家可能在許多其他教程中見(jiàn)到過(guò)controller頭部沒(méi)有 namesapce 申明,更沒(méi)有那一堆的 use xxx,像這個(gè)文件https://github.com/cecoo/laravel4demo/blob/master/app/controllers /BlogController.php.這個(gè)文件在第8行直接使用了 Blog 這個(gè)類,這是為什么呢?PHP教程
因?yàn)樗麄兌家呀?jīng)在 learnlaravel 這個(gè) composer 應(yīng)用的配置文件中聲明為自動(dòng)加載了,而他們沒(méi)有在頂部聲明他們所在的命名空間,這樣就會(huì)被自動(dòng)加為頂級(jí)命名空間.這個(gè)配置文件是 composer.json,對(duì)象配置項(xiàng)為autoload 下的classmap 項(xiàng).這個(gè)聲明會(huì)讓 Composer 在生成自動(dòng)載入文件的時(shí)候,自動(dòng)掃描該文件下所有的類以及所有子文件夾中的類,只要沒(méi)有聲明特定的命名空間,將會(huì)被自動(dòng)加載為頂級(jí)空間.【之前表述有誤,特此更正!】PHP教程
關(guān)于命名空間更多詳情,可以參考 【PHP 命名空間 入門(mén)】.PHP教程
OK,到目前為止我們的MVC三元素已經(jīng)集齊了,那接下來(lái)該做什么了呢?配置路由.這里的路由并不是家里用的無(wú)線路由 :-D,而是 用戶哀求的URL到控制器某個(gè)方法的轉(zhuǎn)換,function是PHP中代碼段的最小單位,所以用戶哀求的一個(gè)路徑,如 http://ooxx.com/fuck/me ,這條URL打給路由之后,路由就會(huì)去解析,應(yīng)該調(diào)用哪個(gè)function,最終返回結(jié)果給用戶.PHP教程
Laravel的路由采用閉包的方式返回結(jié)果,在app/routes.php 中增加下列內(nèi)容:PHP教程
Route::get('admin/logout', array('as' => 'admin.logout', 'uses' => 'App\Controllers\Admin\AuthController@getLogout'));
Route::get('admin/login', array('as' => 'admin.login', 'uses' => 'App\Controllers\Admin\AuthController@getLogin'));
Route::post('admin/login', array('as' => 'admin.login.post', 'uses' => 'App\Controllers\Admin\AuthController@postLogin'));
Route::group(array('prefix' => 'admin', 'before' => 'auth.admin'), function()
{
??? Route::any('/', 'App\Controllers\Admin\PagesController@index');
??? Route::resource('articles', 'App\Controllers\Admin\ArticlesController');
??? Route::resource('pages', 'App\Controllers\Admin\PagesController');
});
前三條的意思是hold住兩個(gè)get哀求和一個(gè)post哀求,下面是一個(gè)路由組,規(guī)定了一個(gè)前綴admin,增加了一個(gè)過(guò)濾器,auth.admin,內(nèi)部有一個(gè)能同時(shí)適應(yīng)get和post哀求的‘/'路徑,其完整路徑是 http://ooxx.com/admin/.剩下的兩個(gè)資源控制器本質(zhì)上只是一種簡(jiǎn)寫(xiě),URL和控制器類中的方法名的對(duì)應(yīng)表見(jiàn) 資源控制器.PHP教程
上面說(shuō)的那個(gè)過(guò)濾器 auth.admin,是Laravel提供的一個(gè)哀求過(guò)濾器,這個(gè)文件就在路由文件的旁邊,app/filters.php,在文件末尾增加:PHP教程
Route::filter('auth.admin', function()
{
?if ( ! Sentry::check()) {
??return Redirect::route('admin.login');
?}
});
這樣我們的權(quán)限驗(yàn)證就完成了.上面的代碼意思是,在進(jìn)入這個(gè)路由組中的任何一條路由之前,會(huì)先過(guò)一遍 auth.admin這個(gè)filter,這個(gè)filter會(huì)調(diào)用Sentry::check(),如果為false,將會(huì)進(jìn)入if代碼塊,將用戶的哀求跳轉(zhuǎn)到 命名路由‘a(chǎn)dmin.login',命名路由文檔.從這個(gè)命名路由的名稱大家也能看出來(lái),就是跟訪客說(shuō):傻逼,干啥呢,登錄去~PHP教程
這里的“命名路由”功能是為了模仿 Ruby On Rails 的 “l(fā)ink_to”到對(duì)象 的路由綁定功能,無(wú)奈PHP上傳即部署無(wú)守護(hù)進(jìn)程的特性,使得我們沒(méi)法維護(hù)一個(gè)全量代碼的路由表,沒(méi)法像Rails那樣實(shí)現(xiàn) 資源路由-資源對(duì)象-路由調(diào)用 三者綁定的功能,只能搞出一個(gè)半成品命名路由,人為地解決了當(dāng)調(diào)整 /people 到 /human 時(shí),要求名稱改變而功能不變,同時(shí)要求代碼自適應(yīng)的需求.PHP教程
這時(shí)候,我們就可以嘗試訪問(wèn)我們的項(xiàng)目了.推薦配置Apache將一個(gè)端口指向learnlaravel這個(gè)項(xiàng)目的public目錄下,即項(xiàng)目通過(guò) http://127.0.0.1:8080 這樣的地址訪問(wèn),十分不建議從子文件夾訪問(wèn).如果你不會(huì),可以運(yùn)行PHP教程
php artisan serve
啟動(dòng)PHP5.4的內(nèi)建HTTP服務(wù)器.地址將會(huì)是http://localhost:8000,注意此處 127.0.0.1 不可以訪問(wèn).PHP教程
下面,我們?cè)跒g覽器中訪問(wèn) /admin,注意URL會(huì)自動(dòng)跳轉(zhuǎn)到 /admin/login,這說(shuō)明我們的filter起作用了,但你可能得到以下頁(yè)面PHP教程
PHP教程
這說(shuō)明代碼出錯(cuò)了.接下來(lái)我們修改 app/config/app.php 第一項(xiàng)為:PHP教程
'debug' => true,
刷新頁(yè)面,錯(cuò)誤提示出來(lái)了!有沒(méi)有感覺(jué)Laravel4.2的錯(cuò)誤提示很好看啊,確實(shí)不錯(cuò),但我覺(jué)得沒(méi)有4.1之前的好看 :-D.我得到了如下錯(cuò)誤:PHP教程
PHP教程
說(shuō)“App\Controllers\Admin\AuthController”這個(gè)類未找到,這是為什么呢?這個(gè)文件明明有啊.PHP教程
這就涉及到了另一個(gè)問(wèn)題,Laravel中的autoload問(wèn)題.Laravel基于命名空間,它只會(huì)自動(dòng)加載所有頂級(jí)命名空間的類,就是說(shuō)我們新增的這個(gè)控制器類不是在頂級(jí)命名空間下,所以就需要告訴Laravel,我這個(gè)類是存在的,怎么告訴它呢?運(yùn)行PHP教程
composer dump-autoload
可以了,刷新頁(yè)面,他告訴我PHP教程
View [admin._partials.assets] not found. PHP教程
這個(gè)確實(shí)是,我們還沒(méi)建立這個(gè)文件呢.建立一個(gè)空文件即可,如果是用generator建的話,別忘了把里面默認(rèn)的內(nèi)容刪掉哦.再刷新頁(yè)面,如果還有問(wèn)題,我相信這個(gè)問(wèn)題你可以自己解決.PHP教程
OK,一個(gè)丑的一逼的頁(yè)面出現(xiàn)了,為什么它這么丑?(鴿子為什么這么大?)因?yàn)槲覀儧](méi)有引入任何css和js文件,甚至連導(dǎo)航欄的html都不完整.這不要緊,來(lái),依照我github上的代碼,自己復(fù)制到相應(yīng)文件中吧.另外,非常重要的一點(diǎn),把我的項(xiàng)目中的public文件下的 js 和 css 兩個(gè)文件夾完全復(fù)制到你們的public文件夾中.PHP教程
歡迎參與《PHP教程:Laravel 4 初級(jí)教程之視圖、命名空間、路由》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/14377.html