Project-Flyer-10-Preparing-the-Flyer-Page

跟随 Jeffrey Way 的视频学习,脑子不好,一些细节容易忘记,这里记录下来。相关视频在 laracasts.com
课程名称:Build “ProjectFlyer” With Me(10)

随便添加一条信息,应该可以显示成功模态框提示,然后我们进入后台看看数据,在虚拟机网站根目录下运行:

php artisan tinker

App\Flyer::first();

可以看到我们刚才添加的那条信息。下面我们做下信息在页面的显示。

添加路由:

Route::get('{zip}/{street}', 'FlyersController@show');

修改 FlyerController 控制里自动生成的 show() 方法,根据 zip 和 street 来查询指定的数据:

public function show($zip, $street)
{
    return Flyer::where(compact($zip, $street))->first();
}

测试下,试试在浏览器域名的后面跟上刚才输入数据,zip 和 street,在浏览器输入类似的地址:
http://flyer.dev/12345678/StreetA
应该能以数组的形式显示改行数据。由于空格在地址列表里是%20,这样一点也不友好,我们选择用-来替代空格,所以在 return 返回语句前加一行替换方法:

$street = str_replace('-', ' ', $street);

这样,在地址栏里的地址如果有空格,我们就用-替代。
修改下行:

return Flyer::where(compact($zip, $street))->first();

为:

return Flyer::locatedAt($zip, $street)->first();

刷新刚才的页面,报错了。修正它,打开 app\Flyer.php,添加下面的方法:

/**
 * Scope query to these located at a given address.
 * @param  Builder $query  
 * @param  string $zip    
 * @param  string $street 
 * @return Builder         
 */
public function scopeLocatedAt($query, $zip, $street)
{
    $street = str_replace('-', ' ', $street);
    return $query->where(compact('zip', 'street'));
}

修改 FlyerController 控制器的 show() 方法为:

public function show($zip, $street)
{
    $flyer = Flyer::locatedAt($zip, $street)->first();
    return view('flyers.show', compact('flyer'));
    // return Flyer::where(compact($zip, $street))->first();
}

我们注意到,return 里调用的页面是不存在的,我们创建它:
resource/views/flyers/show.blade.php

@extends('layouts.master')

@section('content')
<h1>{{ $flyer->street }}</h1>
@stop

刷新页面可以看到 street 的值。同理,我们还可以调取 $flyer 对象的其他属性,比如我们调取 description和 price:

@extends('layouts.master')

@section('content')
<h1>{{ $flyer->street }}</h1>
<h2>${!! number_format($flyer->price) !!}</h2>
<hr>
<div>{!! nl2br($flyer->description) !!}</div>
@stop

nl2br是将字符串的换行转换成 html 里的换行<br>,将字符串格式化放这里不太合适,我们打开 app\Flyer.php,在 scopeLocatedAt() 方法下面再添加一个方法:

public function getPriceAttribute($price)
{
    return '$' . number_format($price);
}

然后把:

<h2>${!! number_format($flyer->price) !!}</h2>

替换为:

<h2>{!! $flyer->price !!}</h2>

此时,刷新下,看数据能够正确显示,但是从首页点击按钮不能跳转了,报错:

Trying to get property of non-object (View: /home/vagrant/Code/flyer.dev/resources/views/flyers/show.blade.php)

是路由出了问题,该下顺序即可:

Route::resource('flyers', 'FlyersController');
Route::get('{zip}/{street}', 'FlyersController@show');

为什么会这样呢?下面我们写个 Flyer 控制器测试类,新建文件:
tests/controllers/FlyersControllerTest.php
将 tests/ExampleTest.php 的内容复制到新建的文件里,修改为:

<?php

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class FlyersControllerTest extends TestCase
{
    /** @test **/
    public function it_shows_the_form_to_create_a_new_flyer()
    {
        $this->visit('flyers/create');
    }
}

注意,/** @test **/不能少,缺了这行执行phpunit是会报错误找不到测试方法。
删除 tests/ExampleTest.php 文件。
颠倒这 router.php 里这两个路由的顺序:

Route::resource('flyers', 'FlyersController');
Route::get('{zip}/{street}', 'FlyersController@show');

在 Homestead 虚拟机里的网站根目录下运行phpunit,此时会报错,你可以看到错在哪里了,再颠倒一下再运行phpunit,显示测试通过。

0%