Laravel-5-基础教程系列-基本工作流程

上一节我们讲解了:Laravel 5 的安装,相信大家看过之后一定会有所收获,本节教程我们主要讲Laravel的route(路由)--controller(控制器)--view(视图)工作流程和Laravel的目录认识

 

# Laravel 如何加载视图,把信息反馈给浏览器,最后让我们看到漂亮的HTML页面

# 通过 php artisan 启动服务,当然如果你配置了虚拟机的话可以直接访问你的虚拟主机地址。

xiaolong@xiaolong:~/www/Laravel5$ php artisan serve
Laravel development server started on http://localhost:8000/

访问  http://localhost:8000/

 

#接下来我们看看 Laravel 是怎么将 Welcome page 展示给我们的,我们每一次访问 Laravel 的每一个页面,我们都是会被引导到routes.php 这个文件当中,我们可以在 /app/Http 目录下找到这个文件 routes.php,我们可以认为Http这个文件夹是Laravel专门用来处理http请求的,比如说 get 请求或者 post 请求。

 

我们看到如图上所示routes.php 文件 L 14~16 3行代码定义了路由,引导我们在访问根的时候去加载welcome试图文件, 具体路由定义可参考:http://www.golaravel.com/laravel/docs/5.0/routing/

 

修改 routes.php 文件,分别访问 http://localhost:8000/  和  http://localhost:8000/about 页面看看有什么变化

Route::get('/', function () {
//    return view('welcome');
    return "Hello World!";
});

Route::get('/about', function () {
    return "About page";
});

我们重新定义的两个路由都是简单返回了字符串,通常情况下都是用户访问一个url地址,我们返回一个静态的HTML 页面,这里其实 view 方法就做了这件事,参数当然就是视图文件的标识符。

在 Laravel 中默认的视图文件是存放在 /resources/views 文件夹中,比如 “welcome.blade.php” 就是我们 routes.php  中的 view('welcome') 视图文件,鉴于Laravel 的便捷性,我们在view的参数中只需要写 welcome 就可以了,不需要写全路径及文件后缀。

还原 routes.php 文件定义的路由

 

Route::get('/', function () {
    return view('welcome');
});

Route::get('/about', function () {
    return "About page";
});

 

 

修改一下 "www/Laravel5/resources/views/welcome.blade.php" 文件. 如下:

访问 http://localhost:8000/ 你应该可以看到 我们刚刚修改的 Hello World, 现在我们可以大概了解 Laravel 是怎样加载视图的。

......
<div class="container">
    <div class="content">
        <div class="title">Hello World</div>
    </div>
</div>
......

  

#但是如果为每一个路由都写一个匿名函数的话,这是非常不明智的,而且这也不是我们常用的方法。通常我们会将某个路由交给指定的控制器的某个方法来处理,一旦是交给控制器的方法处理的话,其实就相当与我们把这个匿名函数直接搬到了控制器的方法里面去。

#接下来我们就创建一个控制器一探究竟:

 

打开命令行窗口,我们使用 php artisan 这个工具来创建一个控制器

 

xiaolong@xiaolong:~/www/Laravel5$ php artisan

 

 

xiaolong@xiaolong:~/www/Laravel5$ php artisan make:controller SitesController
Controller created successfully.

回到我们的代码编辑器,其实刚刚创建的 Controller 文件就在这里 www/Laravel5/app/Http/Controllers/SitesController.php 如下图所示:

 

这里我们可以看到 Laravel 为我们生产了一堆常用的方法,比如 index、create、store、show、edit、update、destory 等等。

我们尝试在 index 方法里加入一行代码如:

    public function index()
    {
        return view('welcome');
    }

 

接下来我们修改路由文件(routes.php) 来控制当用户访问根目录的时候,让其去加载SiteController中的index方法 - Route::get('/', 'SitesController@index'); 这就相当与我们将访问首页的匿名函数移到了SitesController 的index方法当中,最终由控制器里的index方法来处理。

// 注释掉原来的匿名函数
/*Route::get('/', function () {
    return view('welcome');
});*/

Route::get('/', 'SitesController@index');

 

  

#基本路由

您将在 app/Http/routes.php 中定义应用中的大多数路由,这个文件加载了App\Providers\RouteServiceProvider 类。 大多数基本的 Laravel 路由都只接受一个 URI 和 一个 闭包(Closure) 参数:

基本 GET 路由

Route::get('/', function()
{
    return 'Hello World';
});

其他基础路由

Route::post('foo/bar', function()
{
    return 'Hello World';
});

Route::put('foo/bar', function()
{
    //
});

Route::delete('foo/bar', function()
{
    //
});

为多种请求注册路由

Route::match(['get', 'post'], '/', function()
{
    return 'Hello World';
});

注册路由响应所有 HTTP 请求

Route::any('foo', function()
{
    return 'Hello World';
});

通常情况下,您将会需要为您的路由产生 URL,您可以使用 url 辅助函数来操作:

$url = url('foo');

  

 

#路由参数

当然,您可以获取请求路由的 URI 区段。

 

基础路由参数

Route::get('user/{id}', function($id)
{
    return 'User '.$id;
});

注意: 路由参数不能包含 - 字符。使用下划线替代 (_)。

 

可选择的路由参数

Route::get('user/{name?}', function($name = null)
{
    return $name;
});

带默认值的路由参数

Route::get('user/{name?}', function($name = 'John')
{
    return $name;
});

使用正则表达式限制参数

Route::get('user/{name}', function($name)
{
    //
})
->where('name', '[A-Za-z]+');

Route::get('user/{id}', function($id)
{
    //
})
->where('id', '[0-9]+');

使用条件限制数组

Route::get('user/{id}/{name}', function($id, $name)
{
    //
})
->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

定义全局模式

如果你想让特定路由参数总是遵询特定的正则表达式,可以使用 pattern 方法。在RouteServiceProvider 的 boot 方法里定义模式:

$router->pattern('id', '[0-9]+');

定义模式之后,会作用在所有使用这个特定参数的路由上:

Route::get('user/{id}', function($id)
{
    // 只有 {id} 是数字才被调用。
});

取得路由参数

如果需要在路由外部取得其参数,使用 input 方法:

if ($route->input('id') == 1)
{
    //
}

你也可以使用 Illuminate\Http\Request 实体取得路由参数。当前请求的实例可以通过Request facade 取得,或透过类型提示 Illuminate\Http\Request 注入依赖:

use Illuminate\Http\Request;

Route::get('user/{id}', function(Request $request, $id)
{
    if ($request->route('id'))
    {
        //
    }
});

  

 

#命名路由

命名路由让你更方便于产生 URL 与重定向特定路由。您可以用 as 的数组键值指定名称给路由:

Route::get('user/profile', ['as' => 'profile', function()
{
    //
}]);

也可以为控制器Action指定路由名称:

Route::get('user/profile', [
    'as' => 'profile', 'uses' => 'UserController@showProfile'
]);

现在你可以使用路由名称产生 URL 或进行重定向:

$url = route('profile');

$redirect = redirect()->route('profile');

currentRouteName 方法会返回目前请求的路由名称:

$name = Route::currentRouteName();

 

 

#路由群组

有时候你的许多路由会有公用的需求,例如 URL 区段 (segments)、中间件、命名空间等等。你可以利用路由群组套用这些属性到多个路由,而不用每个路由都设置一次。

将共享属性作为一个数组当做 Route::group 第一个参数。

Middleware

在群组共享属性数组的 middleware 参数定义中间件列表,这些中间件就会应用到群组内的所有路由上。中间件将会按在列表内指定的顺序执行:

Route::group(['middleware' => ['foo', 'bar']], function()
{
    Route::get('/', function()
    {
        // Has Foo And Bar Middleware
    });

    Route::get('user/profile', function()
    {
        // Has Foo And Bar Middleware
    });

});

Namespaces

您一样可以在 group 属性数组中使用 namespace 参数,指定在这群组中控制器的命名空间:

Route::group(['namespace' => 'Admin'], function()
{
    // Controllers Within The "App\Http\Controllers\Admin" Namespace

    Route::group(['namespace' => 'User'], function()
    {
        // Controllers Within The "App\Http\Controllers\Admin\User" Namespace
    });
});

注意: 在默认情况下,RouteServiceProvider 包含内置您命名空间群组的 routes.php文件,让您不须使用完整的 App\Http\Controllers 命名空间前缀就可以注册控制器路由。

 

子域名路由

Laravel 路由一样可以处理通配符的子域名,并且从域名中传递您的通配符参数:

注册子域名路由

Route::group(['domain' => '{account}.myapp.com'], function()
{

    Route::get('user/{id}', function($account, $id)
    {
        //
    });

});

路由前缀

群组路由可以通过群组的描述数组中使用 prefix 选项,将群组内的路由加上前缀:

Route::group(['prefix' => 'admin'], function()
{
    Route::get('users', function()
    {
        // Matches The "/admin/users" URL
    });
});

你也可以利用 prefix 参数将常用的参数传递给你的路由:

注册一个 URL 参数到路由前缀

Route::group(['prefix' => 'accounts/{account_id}'], function()
{
    Route::get('detail', function($account_id)
    {
        //
    });
});

你甚至可以在前缀中为已命名的参数定义限制:

Route::group([
    'prefix' => 'accounts/{account_id}',
    'where' => ['account_id' => '[0-9]+'],
], function() {

    // Define Routes Here
});

  

 

#路由模型绑定

Laravel 模型绑定提供方便的方式将模型实体注入到您的路由中。例如,比起注入 User ID ,你可以选择注入符合给定 ID 的 User 类实体。

首先,使用路由的 model 方法指定特定参数要对应的类,您应该在RouteServiceProvider::boot 方法定义您的模型绑定:

绑定参数至模型

public function boot(Router $router)
{
    parent::boot($router);

    $router->model('user', 'App\User');
}

然后定义一个有 {user} 参数的路由:

Route::get('profile/{user}', function(App\User $user)
{
    //
});

因为我们已经将 {user} 参数绑定到 App\User 模型,所以 User 实体将被注入到路由。所以举例来说,请求至 profile/1 将注入 ID 为 1 的 User 实体。

注意: 如果在数据库中找不到匹配的模型实体,将引发 404 错误。

如果您想要自定「没有找到」的行为,将闭包作为第三个参数传入 model 方法:

Route::model('user', 'User', function()
{
    throw new NotFoundHttpException;
});

如果您想要使用您自己决定的逻辑,您应该使用 Route::bind方法。闭包通过 bind 方法将传递 URI 区段数值,并应该返回您想要被注入路由的类实体

Route::bind('user', function($value)
{
    return User::where('name', $value)->first();
});

  

 

#抛出 404 错误

这里有两种方法从路由手动触发 404 错误。首先,您可以使用 abort 辅助函数:

abort(404);

abort 辅助函数只是简单抛出带有特定状态代码的Symfony\Component\HttpKernel\Exception\HttpException 。

第二,您可以手动抛出 Symfony\Component\HttpKernel\Exception\NotFoundHttpException 的实体。

有关如何处理 404 异常状况和自定响应的更多信息,可以参考错误章节内的文档。

 

下一节我们继续讲解:Laravel视图的变量传递

posted @ 2016-02-24 17:20  Richard2014  阅读(1557)  评论(0)    收藏  举报