このチュートリアルのサンプル コードは、https://github.com/johnlui/Learn-Laravel-5 にあります。
どこかで行き詰まった場合は、サンプル コードにアクセスするのが最も早い方法です。
この記事では、Laravel フレームワークの最も重要な部分であるルーティング システムを赤ちゃんと一緒に学びます。
Laravel 5.0 に基づいた古いチュートリアルを読んでいる場合は、その記事で書かれている Auth システムの構築が Laravel によって解決されていることがわかります。 Laravel 4 バージョンの以前のチュートリアルでは、赤ちゃんが Laravel の操作原理をより早く感じられるように、全員が自分で難しい認証システムを構築できるようにすることで、短期的な学習曲線の傾きを実際に改善しました。しかし残念ながら、現在の認証システムはいくつかのコマンドを実行することで有効化できるため、初心者はまだ混乱しています。この欠点を補うために、私は上半身裸になり、ルーティング システムを使用して、Laravel が Web サイトの動作を制御するために MVC アーキテクチャをどのように編成するかを直接示すことにしました。
ルーティングの最初の紹介Laravel 5 以降、ルーティングは learnlaravel5/app/Http/routes.php に配置されました。まず現在のルーティングを見てみましょう。保存されたコードはわずか数行です:
Route::get('/', function () { return view('welcome');});Route::auth();Route::get('/home', 'HomeController@index');
コードの中間行 Route::auth(); は、主に、認証システムによって挿入されるルーティング設定です。コードの最初の 3 行と最後の行です。
名前空間
Laravel 4 の単純さの失敗
絶対クラス名
「絶対クラス名」は私が独自に作成したものです。名前空間が有効になっているシステムでは、サブ名前空間の下のクラスにはグローバルに直接アクセスできる名前が付けられます。この名前はクラスの完全な名前空間です。 「実用的な」PHP 言語では名前空間が非常に奇妙に見えますが、それでも PHP であり、PHP の動作原理と哲学に従っています。同様に、Laravel がどれほど強力であっても、Laravel は PHP コードで書かれています。そのため、Laravel が必要な特定の機能を提供していないことに苦しんでいる場合でも、パニックにならず、不安にならずに、単にコードを記述してください。 PHPのやり方。
psr-4 の公式英語ドキュメントはこちらです: http://www.php-fig.org/psr/psr-4/
役立つ情報
」
基本的なルーティング分析
Route::get('/', function () { return view('welcome');});
クロージャルーティングはクロージャを使用しますこれは、便利で柔軟な多くの単純な操作をクロージャで直接解決できます。たとえば、「サーバーの現在時刻を出力する」:
Route::get('now', function () { return date("Y-m-d H:i:s");});
北京時間を取得したい場合は、learnlaravel5/config/app.php の 55 行目あたりでタイムゾーンを上海に設定してください:
'timezone' => 'Asia/Shanghai',
http:// にアクセスしてください。現時点での func.io: 1024/now は次の結果を取得できます:
Controller@method routing
Route::get('/home', 'HomeController@index');
ルーティング コードのこの行の意味は、誰でも想像できると思いますが、GET メソッドで http://fuck.io:1024/home にアクセスすると、HomeController コントローラーのインデックス メソッド (関数) が呼び出されます。同様に、Route::post('/home', 'HomeController@indexPost'); を使用して POST メソッド リクエストに応答することができます。
controller@method 呼び出しの原理の簡単な分析
laravel5/app/Providers/RouteServiceProvider.php を学ぶ
全局搜索 routes.php ,我们找到了这个文件。此文件最后的 mapWebRoutes 方法,给所有的路由同意加进了一个路由组,定义了一个命名空间和一个中间件:
protected function mapWebRoutes(Router $router){ $router->group([ 'namespace' => $this->namespace, 'middleware' => 'web', ], function ($router) { require app_path('Http/routes.php'); });}
顺着这个函数往上看,你会发现命名空间定义的地方:
protected $namespace = 'App\Http\Controllers';
之后命名空间、类、方法是如何传递的呢?
learnlaravel5/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php
经过简单的追踪,我们找到了这个文件。让我们在 dispatch 方法中增加一行 var_dump($controller); ,刷新就可以看到页面上如下的输出:
这就是我们要调用的控制器类的“绝对类名”。
Laravel 使用了完整的面向对象程序架构,对控制器的调用进行了超多层封装,所以最简单地探测方式其实是手动抛出错误,这样就可以看到完整的调用栈:
在 HomeController 的 index 方法里的 return 之前增加一行 throw new \Exception("我故意的", 1); ,刷新页面,你将看到以下画面:
我们可以看到,是 learnlaravel5/vendor/laravel/framework/src/Illuminate/Routing/Controller.php 第 80 行最终驱动起了 HomeController:
public function callAction($method, $parameters){ return call_user_func_array([$this, $method], $parameters);}
具体的细节不再详解,宝宝如果感兴趣的话,把这些方法一个一个地都看一遍吧,相信对于你理解 Laravel 运行原理很有帮助。其实 PHP 跟字符串结合的紧密程度已经紧逼 js 和 JSON 了。结尾分享一个小彩蛋: 这个laravel路由怎么写?