本文主要和大家分享Laraval之文件結(jié)構(gòu)、路由、控制器詳解,我們的文章路線是一、 文件結(jié)構(gòu)二、 編寫(xiě)第一行代碼三、 初始強(qiáng)大的 Artisan四、 路由五、 控制器。
一、文件結(jié)構(gòu)
打開(kāi)項(xiàng)目代碼之后,我們就可以在 Sublime的左側(cè)邊欄里清楚的看到 Laravel源碼的結(jié)構(gòu):
下面簡(jiǎn)單介紹一下 Laravel源碼里每個(gè)文件夾都是用來(lái)做什么的,了解結(jié)構(gòu)才能更好地進(jìn)行后續(xù)的開(kāi)發(fā)。
文件夾
介紹
app
網(wǎng)站的業(yè)務(wù)邏輯代碼,例如:控制器/模型/路由等
bootstrap
框架啟動(dòng)與自動(dòng)加載設(shè)置相關(guān)的文件
config
網(wǎng)站的各種配置文件
database
數(shù)據(jù)庫(kù)操作相關(guān)的文件
public
網(wǎng)站的對(duì)外文件夾,入口文件和靜態(tài)資源(CSS,JS,圖片等)
resources
前端視圖文件和原始資源(CSS,JS,圖片等)
storage
編譯后的視圖、基于會(huì)話、文件緩存和其它框架生成的文件
tests
自動(dòng)化測(cè)試文件
vendor
Composer 依賴文件
app/Http/Controllers
存放控制器
app/Http/Middleware
存放中間件
resources/views
視圖路徑 blade視圖
除了上述文件夾,根目錄下有些文件也比較常用:
文件
介紹
.env
環(huán)境配置文件
.env.example
.env 文件的一個(gè)示例
.gitignore
git 的設(shè)置文件,制定哪些文件會(huì)被 git忽略,不納入文件管理
composer.json
網(wǎng)站所需的 composer擴(kuò)展包
composer.lock
擴(kuò)展包列表,確保這個(gè)網(wǎng)站的副本使用相同版本的擴(kuò)展包
gulpfile.js
GULP 配置文件( GULP 后邊會(huì)學(xué)到)
package.json
網(wǎng)站所需的 npm包
readme.md
網(wǎng)站代碼說(shuō)明文件
app/Http/routes.php
網(wǎng)站的大多數(shù)路由都定義在該文件中,該文件將會(huì)被 App\Providers\RouteServiceProvider類加載。
有個(gè)簡(jiǎn)單的了解就好,在后續(xù)開(kāi)發(fā)過(guò)程中會(huì)通過(guò)實(shí)踐對(duì) Laravel 的結(jié)構(gòu)進(jìn)行更深的理解。
二、編寫(xiě)第一行代碼
下面就讓我們編寫(xiě)第一行代碼,Hello World!
首先我們需要定位到我們之前看到過(guò)的歡迎頁(yè)面,這個(gè)頁(yè)面的位置是:resources/views/welcome.blade.php。
打開(kāi)這個(gè)文件,按 ctrl+f 搜索 Laravel 5 可以定位到代碼具體位置
修改為 Hello world 然后記得 ctrl+s 保存。
.
.
.
<body>
<pclass="container">
<pclass="content">
<pclass="title">My first Demo</p>
</p>
</p>
</body>
.
.
.
現(xiàn)在打開(kāi)瀏覽器,在地址欄輸入 localhost 可以看到如下效果:
很簡(jiǎn)單,我們的第一行代碼就完成了:)
三、初始強(qiáng)大的 Artisan
(一) 什么是Artisan呢?
熟悉 linux 的朋友都知道,我們平時(shí)的創(chuàng)建/刪除文件等常用操作都可以在命令行里來(lái)完成,Artisan 就相當(dāng)于 Laravel 為我們獨(dú)家定制的一個(gè)命令行工具,提供了很多實(shí)用的命令,可以用來(lái)快速生成 Laravel 開(kāi)發(fā)中常用的一些文件并完成相關(guān)的配置。
(二) 常用 Artisan 命令
使用命令行進(jìn)入我們的代碼根目錄:
cd ~/Code/myweb
然后,執(zhí)行 php artisan list 可以查看常用 artisan 命令:
php artisanlist
如下圖,可以看到顯示出了很多的 artisan 命令:
下面列出最常用的一些命令,使用方法就像上面的php artisan list一樣,先有個(gè)簡(jiǎn)單了解就好,我們?cè)诤竺娴拈_(kāi)發(fā)中會(huì)多次使用到這些命令:
命令
說(shuō)明
php artisan key:generate
生成 App Key
php artisan make:controller
生成控制器
php artisan make:model
生成模型
php artisan make:policy
生成授權(quán)策略
php artisan make:seeder
生成 Seeder文件
php artisan migrate
執(zhí)行遷移
php artisan migrate:rollback
回滾遷移
php artisan migrate:refresh
重置數(shù)據(jù)庫(kù)
php artisan db:seed
填充數(shù)據(jù)庫(kù)
php artisan tinker
進(jìn)入 tinker環(huán)境
php artisan route:list
查看路由列表
在開(kāi)發(fā)過(guò)程中,應(yīng)該盡量使用 artisan 命令,這樣不僅可以提高開(kāi)發(fā)效率,還可以減少bug。
在后續(xù)的實(shí)驗(yàn)中,我們也會(huì)多次使用 artisan 命令。
四、路由
我們學(xué)習(xí) Laravel 基礎(chǔ)功能之一:路由。
(一) 什么是路由呢?
在瀏覽器中輸入http://blog.csdn.net/u014665013我們可以訪問(wèn)實(shí)驗(yàn)樓網(wǎng)站的首頁(yè),如果我們輸入http://blog.csdn.net/u014665013/article/details/77588281呢?我們會(huì)來(lái)到博客的文章頁(yè)面。
這就是路由了,即路由系統(tǒng)會(huì)對(duì)用戶輸入的 URL 地址 進(jìn)行解析,然后分配不同的工作,有點(diǎn)像路由器。
路由不僅可以美化 URL,還可以便于用戶記憶等。
那么 Laravel 是怎么處理 url 的呢?
首先,我們打開(kāi)項(xiàng)目代碼,找到路由設(shè)置文件,文件位置:app/Http/routes.php。
我們可以看到,當(dāng)前 routes.php 文件中只有如下幾行代碼,這幾行代碼都實(shí)現(xiàn)了哪些功能呢?
Route::get('/', function(){
return view('welcome');
});
這幾行代碼表示,當(dāng)我們輸入的 url為 網(wǎng)址 + ‘/’,也就是localhost/ 時(shí),為我們返回 歡迎頁(yè),也就是之前我們寫(xiě) Hello World 的頁(yè)面。
注意:在輸入網(wǎng)址的時(shí)候,localhost和 localhost/是一樣的。
我們可以嘗試將這段代碼修改一下:
Route::get('welcome', function(){
return view('welcome');
});
然后我們打開(kāi)瀏覽器,再輸入localhost,我們會(huì)發(fā)現(xiàn),報(bào)錯(cuò)了!
這個(gè)錯(cuò)誤的大概意思是,沒(méi)有找到處理該 url 的辦法,因?yàn)槲覀儧](méi)有定義 '/' 這條路由。
現(xiàn)在我們輸入 localhost/welcome 并刷新頁(yè)面,我們看到了熟悉的頁(yè)面原來(lái)的征程welcome界面
通過(guò)上面的嘗試,你是否對(duì)路由有了一個(gè)簡(jiǎn)單的認(rèn)識(shí)?
下面我們來(lái)系統(tǒng)的學(xué)習(xí)一下 Laravel 的路由。
(二) 基本路由
網(wǎng)站的大多數(shù)路由都定義在 app/Http/routes.php 文件中,該文件將會(huì)被 App\Providers\RouteServiceProvider 類加載。最基本的 Laravel 路由僅接受 URI 和一個(gè)閉包,下面我們?cè)俣x兩條路由。
app/Http/routes.php
<?php
Route::get('welcome', function(){
return view('welcome');
});
Route::get('/', function(){
return'Index Page';
});
Route::get('/help', function(){
return'Help Page';
});
然后我們分別訪問(wèn) localhost 和 localhost/help 可以看到返回了對(duì)應(yīng)的信息:
(三) 路由動(dòng)作
我們知道,一個(gè)url請(qǐng)求可能有多種類型,除了常用的GET,還可能有 POST、PUT、DELETE 等類型的請(qǐng)求。
對(duì)應(yīng)的處理方法如下:
Route::post('/foo', function(){
//該路由將匹配 post方法的 '/foo' url
});
Route::put('/foo', function(){
//該路由將匹配 put方法的 '/foo' url
});
除此之外,還可以用 match 來(lái)同時(shí)處理多種類型的請(qǐng)求:
Route::match(['get', 'post'],'/foo', function(){
// 該路由將匹配 get 和 post 方法的 'foo' url
});
甚至,還可以使用 any 來(lái)同時(shí)處理所有類型的請(qǐng)求:
Route::any('/foo', function(){
// 該路由將匹配所有類型的 'foo' url
});
(四) 路由參數(shù)
1.基礎(chǔ)的路由參數(shù)
有時(shí)候你可能需要從 URL 中獲取一些參數(shù),比如姓名、年齡等。
下面打開(kāi) routes.php,加入一個(gè)帶參路由。
app/Http/routes.php
<?php
Route::get('name/{name}', function($name){
return'I`m '.$name;
});
然后我們?nèi)绻L問(wèn) localhost/name/Tom 我們可以看到網(wǎng)頁(yè)返回了對(duì)應(yīng)的信息:
如果試圖訪問(wèn) localhost/name 將會(huì)出現(xiàn)錯(cuò)誤:
我們也可以定義多個(gè)參數(shù):
app/Http/routes.php
<?php
Route::get('name/{name}/age/{age}', function($name, $age){
return'I`m '.$name.' ,and I`m '.$age;
});
然后我們?nèi)绻L問(wèn) localhost/name/Tom/age/28 我們可以看到網(wǎng)頁(yè)返回了對(duì)應(yīng)的信息:
2.可選的路由參數(shù)
有時(shí)你需要指定可選的路由參數(shù),可以通過(guò)在參數(shù)后面加上 ?來(lái)實(shí)現(xiàn)。
app/Http/routes.php
<?php
Route::get('hello/{name?}', function($name = null){
return'Hello! '.$name;
});
這時(shí)你訪問(wèn) localhost/hello 將不會(huì)報(bào)錯(cuò),只是參數(shù)是空值。
你可以為該可選參數(shù)設(shè)定一個(gè)默認(rèn)值,當(dāng) url 未傳參時(shí),將顯示默認(rèn)值。
app/Http/routes.php
<?php
Route::get('hello/{name?}', function($name = 'Tom'){
return'Hello! '.$name;
});
這時(shí)訪問(wèn) localhost/hello 將返回默認(rèn)的信息,如下圖:
如果訪問(wèn)localhost/hello/John 將會(huì)顯示參數(shù),如下圖:
(五) 命名路由
所謂命名路由,就是給路由起個(gè)名字,這樣我們就可以通過(guò)這個(gè)名字獲取到該條路由的相關(guān)信息,也更利于后期維護(hù)。
建議在開(kāi)發(fā)過(guò)程中給每個(gè)路由命名,使用下面兩種方式都可以為一個(gè)路由命名。
Route::get('foo', ['as' => 'foo', function(){
//方法一
}]);
Route::get('foo', function(){
//方法二
})->name('foo');
(六) 路由群組
路由群組允許你共用路由屬性,例如:中間件、命名空間等,你可以利用路由群組統(tǒng)一為多個(gè)路由設(shè)置共同屬性,而不需在每個(gè)路由上都設(shè)置一次。共用屬性被指定為數(shù)組格式,當(dāng)作Route::group方法的第一個(gè)參數(shù)。
下面通過(guò)幾個(gè)常用樣例來(lái)熟悉這些特性。
1.為路由群組添加共用的中間件
至于什么是中間件,在后面的實(shí)驗(yàn)中會(huì)專門的學(xué)習(xí)。
Route::group(['middleware' => 'auth'], function(){
Route::get('/', function() {
// 該路由將使用 Auth 中間件
});
Route::get('name', function(){
// 該路由也將使用 Auth 中間件
});
});
2.為路由群組添加共用的命名空間
什么是命名空間?從廣義上來(lái)說(shuō),命名空間是一種封裝事物的方法。在很多地方都可以見(jiàn)到這種抽象概念。例如,在操作系統(tǒng)中目錄用來(lái)將相關(guān)文件分組,對(duì)于目錄中的文件來(lái)說(shuō),它就扮演了命名空間的角色。具體舉個(gè)例子,文件 foo.txt 可以同時(shí)在目錄/home/greg 和 /home/other 中存在,但在同一個(gè)目錄中不能存在兩個(gè) foo.txt 文件。另外,在目錄 /home/greg 外訪問(wèn) foo.txt 文件時(shí),我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。這個(gè)原理應(yīng)用到程序設(shè)計(jì)領(lǐng)域就是命名空間的概念。
你可以簡(jiǎn)單的把命名空間理解為,當(dāng)前文件所在的位置。
Route::group(['namespace' => 'Admin'], function()
{
// 控制器在「App\Http\Controllers\Admin」命名空間
Route::group(['namespace' => 'User'], function()
{
// 控制器在「App\Http\Controllers\Admin\User」命名空間
});
});
3.為路由群組添加共用的前綴
你可能有一系列路由都具有一個(gè)相同的前綴,比如:
Route::get('user/name', function(){
//
});
Route::get('user/age', function(){
//
});
Route::get('user/introduction', function(){
//
});
這時(shí)你就可以用路由群組來(lái)簡(jiǎn)化代碼:
Route::group(['prefix' => 'user'], function(){
Route::get('name', function() {
//
});
Route::get('age', function() {
//
});
Route::get('introduction', function() {
//
});
});
路由群組也可以添加參數(shù):
Route::group(['prefix' => 'user/{id}'], function(){
Route::get('name', function($id) {
// 符合 'user/{id}/name' URL
});
Route::get('age', function($id) {
// 符合 'user/{id}/age' URL
});
});
(七) 查看路由
我們可以使用url('foo')函數(shù)來(lái)生成完整的 URL,例如,我們這樣修改一下代碼:
app/Http/routes.php
<?php
Route::get('/help', function(){
return url('/help');
});
然后,訪問(wèn)localhost/help,我們可以看到返回了完整的 URL 信息:
我們還可以使用命名路由函數(shù)route('foo')來(lái)生成完整的 URL 信息。
app/Http/routes.php
<?php
Route::get('/help', function(){
return route('foo');
});
Route::get('/foo', function(){
//
})->name('foo');
然后,訪問(wèn) localhost/help,我們可以看到返回了 foo 路由的完整 URL 信息:
(八) 正則表達(dá)式限制路由
你可以使用 where 方法來(lái)限制參數(shù)的格式。where 方法接受參數(shù)的名稱和正則表達(dá)式。
app/Http/routes.php
<?php
Route::get('hello/{name?}', function($name = 'Tom'){
return'Hello! '.$name;
})->where('name','[A-Za-z]+');
然后如果訪問(wèn) localhost/hello/John 這樣的 url 就會(huì)正確顯示。
如果訪問(wèn) localhost/hello/55 這樣的 url 將會(huì)報(bào)錯(cuò),如下圖:
同樣,也可對(duì)多個(gè)參數(shù)都設(shè)置正則驗(yàn)證:
app/Http/routes.php
<?php
Route::get('name/{name}/age/{age}', function($name, $age){
return'I`m '.$name.' ,and I`m '.$age;
})->where(['name' => '[A-Za-z]+', 'age' => '[0-9]+']);
如果你想對(duì)所有的路由參數(shù)都加上某種限制,需要在RouteServiceProvider 的 boot 方法里定義這些限制。
publicfunctionboot(Router $router)
{
$router->pattern('id', '[0-9]+');
parent::boot($router);
}
五、控制器
本次實(shí)驗(yàn)我們學(xué)習(xí)控制器(Controller)。
(一) 準(zhǔn)備工作
首先,我們先創(chuàng)建一個(gè)路由,順便再練習(xí)一下上次試驗(yàn)的內(nèi)容,打開(kāi)routes.php文件。
app/Http/routes.php
<?php
Route::get('/', function(){
return view('welcome');
});
Route::get('user/name', function(){
return'Name Page';
});
當(dāng)我們?cè)L問(wèn)網(wǎng)站地址 localhost/user/name 時(shí),會(huì)返回 'NamePage':
但是我們知道,實(shí)際的網(wǎng)站功能不可能這么單調(diào),我們需要更多的返回信息和操作,顯然把大量的處理代碼寫(xiě)在這里是不合適的,這時(shí)候就要用到Controller。
現(xiàn)在我們對(duì)上面的代碼進(jìn)行更改:
<?php
Route::get('/', function(){
return view('welcome');
});
Route::get('/user/name', 'UserController@name');
這段代碼的意思就是,當(dāng)用戶訪問(wèn) 'localhost/user/name' 這個(gè) URL 的時(shí)候,調(diào)用 UserController 這個(gè)控制器的 name 方法來(lái)處理請(qǐng)求。也就是說(shuō),將原來(lái)的閉包函數(shù)放到了一個(gè)單獨(dú)的文件中。
我們可以將有共同特征的路由處理函數(shù)放到一個(gè)共同的控制器中,例如下面這種方式:
Route::get('/user/name', 'UserController@name');
Route::get('/user/age', 'UserController@age');
Route::get('/user/introduction', 'UserController@introduction');
三條不同的路由的處理函數(shù)放在了同一個(gè)控制器(用戶控制器)的三個(gè)不同的方法內(nèi)。
下面我們通過(guò)幾個(gè)簡(jiǎn)單的例子來(lái)體會(huì)一下 Controller是怎么工作的。
(二) 基礎(chǔ)控制器
控制器一般存放在 app/Http/Controllers 目錄下,下面是一個(gè)基礎(chǔ)控制器的例子,先來(lái)簡(jiǎn)單感受一下控制器文件的結(jié)構(gòu):
<?php
namespaceApp\Http\Controllers;
useApp\User;
useApp\Http\Controllers\Controller;
classUserControllerextendsController
{
publicfunctionshow($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
所有 Laravel 控制器都應(yīng)繼承基礎(chǔ)控制器類,它包含在Laravel 的默認(rèn)安裝中。該基礎(chǔ)類提供了一些便捷的方法,例如 middleware 方法(middleware 是中間件 后邊會(huì)講解),該方法可以用來(lái)將中間件附加在控制器行為上。
然后你就可以通過(guò)一個(gè)路由把請(qǐng)求引入到這個(gè)控制器文件來(lái),像下面這樣:
Route::get('user/{id}', 'UserController@show');
現(xiàn)在,當(dāng)請(qǐng)求和此特定路由的 URI 相匹配時(shí),UserController 類的 show 方法就會(huì)被運(yùn)行。當(dāng)然,路由的參數(shù)也會(huì)被傳遞至該方法。
現(xiàn)在,讓我們動(dòng)手實(shí)踐來(lái)感受一下控制器。
首先用 artisan 命令創(chuàng)建一個(gè)新的控制器,打開(kāi)命令行,進(jìn)入代碼根目錄:
cd ~/Code/myweb
然后運(yùn)行 artisan命令生成控制器:
phpartisanmake:controllerUserController
然后轉(zhuǎn)到 app/Http/Controllers目錄下,可以看到剛剛創(chuàng)建的 UserController.php。打開(kāi)這個(gè)文件:
<?php
namespaceApp\Http\Controllers;
useIlluminate\Http\Request;
useApp\Http\Requests;
useApp\Http\Controllers\Controller;
classUserControllerextendsController
{
publicfunctionindex()
{
//
}
publicfunctioncreate()
{
//
}
publicfunctionstore(Request $request)
{
//
}
publicfunctionshow($id)
{
//
}
publicfunctionedit($id)
{
//
}
publicfunctionupdate(Request $request, $id)
{
//
}
publicfunctiondestroy($id)
{
//
}
}
我們可以看到,Laravel 為我們生成了一些默認(rèn)的代碼,仔細(xì)觀察可以發(fā)現(xiàn)是 7 個(gè)空方法,分別是
index()、create()、store()、show()、edit、update、destroy
其中index()通常用來(lái)顯示引導(dǎo)頁(yè)/首頁(yè),其他的六個(gè)通常用來(lái)對(duì)數(shù)據(jù)的創(chuàng)建/讀取/更新/刪除操作,簡(jiǎn)稱 CRUD (Create Retrieve Update Delete)。
現(xiàn)在我們先刪除這些空操作,然后創(chuàng)建一個(gè)新方法:
<?php
namespaceApp\Http\Controllers;
useIlluminate\Http\Request;
useApp\Http\Requests;
useApp\Http\Controllers\Controller;
classUserControllerextendsController
{
publicfunctionname(){
return'Name Page';
}
}
對(duì)應(yīng)之前創(chuàng)建過(guò)的路由:
Route::get('/user/name', 'UserController@name');
現(xiàn)在我們可以訪問(wèn)一下localhost/user/name看下效果:
可以看到,實(shí)現(xiàn)了跟以前一樣的效果,但是我們應(yīng)用了 Controller ,一個(gè)很簡(jiǎn)單的例子。
(三) 控制器的命名空間
可能你會(huì)注意到控制器文件中有這么一行代碼:
namespaceApp\Http\Controllers;
這行代碼就是說(shuō)明了此控制器的命名空間。
這個(gè)目錄也是控制器的默認(rèn)目錄,所以我們?cè)?routes.php 文件中引入的時(shí)候可以直接使用:
Route::get('/user/name', 'UserController@name');
有一點(diǎn)非常重要,那就是我們?cè)诙x控制器路由時(shí),不需要指定完整的控制器命名空間。我們只需要定義「根」命名空間 App\Http\Controllers 之后的部分類名稱即可。默認(rèn) RouteServiceProvider 會(huì)使用路由群組,把 routes.php 文件里所有路由規(guī)則都配置了根控制器命名空間。
現(xiàn)在假如你在 App\Http\Controller 目錄下新建了一個(gè) User 文件夾來(lái)存放 UserControllser.php。
你的 routes.php 文件中就需要這么寫(xiě):
Route::get('/user/name', 'User\UserController@name');
相應(yīng)的,控制器中的命名空間也要改變:
namespaceApp\Http\Controllers\User;
現(xiàn)在讓我們來(lái)刪掉剛才的控制器,重新生成一個(gè)新的控制器,打開(kāi)命令行:
rm app/Http/Controllers/UserController.php
然后重新生成一個(gè) UserController ,這次我們單獨(dú)創(chuàng)建一個(gè) User 文件夾來(lái)存放這個(gè) Controller 。
php artisan make:controller User/UserController
然后打開(kāi)工程文件,我們可以看到,在 app\http\Controllers 文件夾下新建了一個(gè) User 文件夾,里邊有我們剛剛創(chuàng)建的 UserController.php 文件,打開(kāi)這個(gè)文件:
<?php
namespaceApp\Http\Controllers\User;
useIlluminate\Http\Request;
useApp\Http\Requests;
useApp\Http\Controllers\Controller;
classUserControllerextendsController
{
publicfunctionindex()
{
//
}
.
.
.
}
注意看命名空間,可以看到,默認(rèn)生成的命名空間就是App\Http\Controller\User 這就是 artisan 命令為我們做的。
修改為我們自己的方法:
<?php
namespaceApp\Http\Controllers\User;
useIlluminate\Http\Request;
useApp\Http\Requests;
useApp\Http\Controllers\Controller;
classUserControllerextendsController
{
publicfunctionname(){
return'Name Page';
}
}
然后對(duì)應(yīng)更改 routes.php 文件:
Route::get('/user/name', 'User\UserController@name');
然后訪問(wèn) localhost/user/name 可以看到實(shí)現(xiàn)了正確的跳轉(zhuǎn)!
(四) 控制器的依賴注入
細(xì)心的你肯定發(fā)現(xiàn),控制器中還有幾行神奇的代碼:
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
這幾行代碼說(shuō)明了該控制器的依賴注入,簡(jiǎn)單來(lái)說(shuō),依賴注入就是將該控制器用到的依賴添加進(jìn)來(lái)。
比如,所有的 Controller 都依賴 基礎(chǔ) Controller.php ,所以需要:
use App\Http\Controllers\Controller;
比如,當(dāng)我們處理請(qǐng)求的時(shí)候,我們引入 Request 類,才可以使用很多 Laravel 提供的方法:
use Illuminate\Http\Request;
在后邊的實(shí)驗(yàn)中你會(huì)慢慢體會(huì)到依賴注入的強(qiáng)大之處。
相關(guān)推薦:
.net轉(zhuǎn)php laraval框架學(xué)習(xí)系列,.netlaraval_PHP教程
以上就是Laraval之文件結(jié)構(gòu)、路由、控制器詳解的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!