Skip to content

控制器渲染

通过之前的五篇文章,我们已经可以使用 Laravel 自带的视图组件可以搭建起网站的 Layout 框架。虽然 Laravel 是 MVC 框架,因为其强大视图组件功能。我们可以轻松搭建一个小小的网站。但是这还只能搭建一些静态页面,我们还需要一些动态数据,或者说我们需要渲染更多的数据在视图上。这个时候就该到控制器出场了。

了解控制器

所谓控制器,实际就是 PHP 类。在 Laravel(特指 Laravel11 版本) 中,通常在 app/Http/Controllers 目录,其命名空间规定为 App\Http\Controllers。一般情况下,我们只需要在该目录创建使用的控制器即可。控制器在框架的作用一般是如下几个

  • 接受数据
  • 处理数据
  • 返回数据

迁移

我们现在所有的数据都是写在 routes/web.php 路由中。如上所说控制器的一个作用就是返回数据,看下下面的代码,实际上这也是返回数据,view 函数实际就是将模板数据解析后返回给浏览器

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

所以我们现在需要创建一个控制器,讲这一块逻辑迁移到控制器,我们使用 Laravel 自带的命令来创建一个控制器

shell
 php artisan make:controller HomeController

使用该命令之后,会自动创建控制器文件 app/Http/Controllers/HomeController.php, 内容如下

php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
    //
}

控制器创建完成,我们将路由那一块逻辑迁移到 HomeController 中来

php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
    //
    public function index()  
    {                        
        return view('home'); 
    }                        
}

除了迁移到控制器中,还要修改下 routes/web.php 逻辑

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


Route::get('/', [\App\Http\Controllers\HomeController::class, 'index']); 

再回到浏览器,访问首页,可以正常访问。我们以同样的方法,分别创建个人资料和联系方式的控制器

shell
php artisan make:controller ProfileController

php artisan make:controller ContactController

添加页面对应的方法进行页面数据渲染

php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProfileController extends Controller
{
    //
    public function index() 
    {
        return view('profile'); 
    } 
}
php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ContactController extends Controller
{
    //
    public function index() 
    {
        return view('contact');  
    } 
}

记住还需要修改 routes/web.php

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

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


Route::get('/profile', [\App\Http\Controllers\ProfileController::class, 'index']); 
Route::get('/contact', [\App\Http\Controllers\ContactController::class, 'index']); 

渲染数据

目前控制器显示的都是我们写在 Blade 模板的静态数据,我们现在需要通过控制器渲染一些动态数据那该怎么办呢。下面我们通过个人资料页面在演示下

html
<x-layout>
  <x-slot:header>个人资料</x-slot:header>
  <h1>这是个人信息页面</h1>
</x-layout>

我们现在切换到 ProfileController 文件,找到 index 方法,在这里使用 PHP 数组数据作为演示,来看下处理

php
public function index()
{
    return view('profile'); 

    $profiles = [ 
        [
            'id' => 1,
            'name' => '张三',
            'age' => 18,
            'address' => '北京',
            'info' => '张三个人简介'
        ],

        [
            'id' => 2,
            'name' => '李四',
            'age' => 18,
            'address' => '南京',
            'info' => '李四个人简介'
        ],
    ];

    // 在这里,通过数组 key => value 形式将 $profiles 渲染到模版上
    return view('profile',[
        'profiles' => $profiles
    ]);
}

来看下模板是如何处理的,在模版中使用 @foreach 模板指令循环数据,然后使用{ { $profiles } }这样的双括号包裹变量来将数据渲染到模板中,这些都是 blade 模板基本指令,可以通过blade 指令文档详细了解下

html
<x-layout>
  <x-slot:header>个人资料</x-slot:header>
  <h1>这是个人信息页面</h1>

  <div class="text-xl">个人信息列表</div>

  <ul>
    @foreach($profiles as $profile)
    <li class="mt-2">{{ $profile['name']}}</li>
    @endforeach
  </ul>
</x-layout>

最后的页面展示效果如下 控制器数据渲染-laravel入门教程 这里只显示在个人信息的姓名,如果这个时候我们需要了解这个人的详细信息,该如何办呢?那么此时就需要一个什么个人信息详情页面。那么这里个人资料就需要两个模板。那么我们创建一个 resources/views/profile 文件夹,创建之后呢,将 profile.balde.php 移动到 profile 文件夹,然后将profile.balde.php修改成 index.blade.php。 这个回到浏览器,再去访问个人资料的页面的时候就会报错如下 控制器数据渲染-laravel入门教程 为了解决这个错误呢,回到 ProfileController 控制器中的 index 方法,修改 view方法渲染 `

php
return view('profile.index',[
    'profiles' => $profiles
]);

这种嵌套文件的情况下,需要使用.来访问模板文件。上如上面的 profile/index.blade.php, 则使用 profile.index命名方式去渲染对应的模板文件。到这里我们再去创建详情 profile/detail.blade.php。先不用填充内容,再回到ProfileController控制器,添加一个 detail 方法

php
public function detail($id)
{
    $profiles = [
        [
            'id' => 1,
            'name' => '张三',
            'age' => 18,
            'address' => '北京',
            'info' => '张三个人简介'
        ],

        [
            'id' => 2,
            'name' => '李四',
            'age' => 18,
            'address' => '南京',
            'info' => '李四个人简介'
        ],
    ];

    // 这里我们通过 id 来查找对应的用户信息
    $profile = null;
    foreach ($profiles as $value) {
        if ($value['id'] == $id) {
            $profile = $value;
            break;
        }
    }

    return view('profile.detail',[
        'profile' => $profile
    ]);
}

需要访问详情页面,那么需要使用 Laravel 框架路由参数,在设定之后,路由参数会自动绑定到对应的方法参数中。好的,还需要加上一条访问详情页面的路由。来到routes/web.php 文件

php
Route::get('/profile/detail/{id}', [\App\Http\Controllers\ProfileController::class, 'detail']); 

然后回到个人资料列表resources/views/profile/index.blade.php页面,添加详情链接

html
<x-layout>
  <x-slot:header>个人资料</x-slot:header>
  <h1>这是个人信息页面</h1>

  <div class="text-xl">个人信息列表</div>
  <ul>
    @foreach($profiles as $profile)
    <li class="mt-2">
      {{ $profile['name']}}
      <a class="ml-10 text-indigo-600" href="/profile/detail/{{$profile['id']}}">详情</a>
    </li>
    @endforeach
  </ul>
</x-layout>

控制器数据渲染-laravel入门教程 这是个时候点击详情,就是一个空白页面。因为模版上面还没有个人信息嘛。现在要把对应的人的信息展示到模版上面,代码如下

html
<x-layout>
  <x-slot:header>个人资料</x-slot:header>
  <h1>这是个人信息详情页面</h1>

  <div class="text-xl">详情</div>
  <ul>
    <li class="mt-2">姓名: {{ $profile['name']}}</li>
    <li class="mt-2">年龄:{{ $profile['age']}}</li>
    <li class="mt-2">地址:{{ $profile['address']}}</li>
    <li class="mt-2">个人简介:{{ $profile['info']}}</li>
  </ul>
</x-layout>

这个时候回到浏览器,点击不同的详情,来显示不同的用户个人资料了。效果如下 控制器数据渲染-laravel入门教程

ok,这样就很完美了。我们成功的将业务逻辑从原始的路由控制迁移到了控制器之中。然后也实现了模板数据的渲染,还有动态数据的切换。但是这里还有一个问题,就是类似个人资料这种数据目前写死在代码中的,每次添加修改都需要去该代码。那么有没有一种方法可以动态的去修改呢?答案是肯定的。在下面几个小节中,将会详细介绍 Laravel 数据库相关内容。我们要实现网站的动态化,那就必须学习数据库相关知识。