Laravel 5シリーズ チュートリアル5:MVCの基本的な処理

WBOY
リリース: 2016-06-20 12:49:31
オリジナル
983 人が閲覧しました

原文: https://jellybool.com/post/programming-with-laravel-5-model-controller-view-basic-workflow

私は次の影響を受けました。この期間中は個人的な用事が多かったので、最後にlaravelのチュートリアルを書かなければなりません。

前回の記事ではデータベースと Eloquent の基本的な使い方について説明しましたが、予定通り、この記事では Laravel のモデル、コントローラー、ビューのワークフローについて説明します。

1.注册路由 ---> 2.创建控制器 ---> 3. 控制器中获取数据库数据 ---> 4.在视图中展示数据
ログイン後にコピー

英語の表現の方が適切かもしれません:

1.register routes ---> 2.make a controller ---> 3.fetch data from database ---> 4. load a view to display data
ログイン後にコピー

laravel では、ある関数を実装するとき、通常、このプロセスよりも上に進むプロセスが最も一般的です。 。たとえば、ブログ プロジェクトでは、次の関数を実装する必要があります:

1. 展示所有的文章  // blog首页2. 展示一篇文章   //文章详情页3. 创建一篇文章   // 文章发布页面4. 修改一篇文章  // 文章修改页面5. 删除一篇文章  // 后台管理
ログイン後にコピー

この記事では、最初の関数を解決することに重点を置くため、上記のプロセスに従います:

追記: 前回は、artisan tinker ツールを使用してコマンド ラインでデータベース データの CRUD を実行しました。今回は、これらを MVC に適用します。

ルートを登録します

ここでは最初から開始します。つまり、最初に app/Http/Controllers/ArticleController.php ファイルを削除します

シリーズの 2 番目の記事では、ホームページのルートを app/Http/routes.php に登録しました:

Route::get('/','ArticleController@index');
ログイン後にコピー

このルートは直接使用できるため、次のステップ。

コントローラーを作成します

ここで、Homestead を使用する場合は、最初に ssh を使用して仮想マシンにログインしてコマンドを実行し、最初にそれを削除してください。 ArticleController 前のコースで残ったものです。面倒な場合は、この手順をスキップできます

コントローラーを作成するときは、手動で作成することもできますが、やはり Artisan コマンドを使用することをお勧めしますプロジェクト ディレクトリの下にあるライン ツール、コマンド ライン実行:

php artisan make:controller ArticleController --plain
ログイン後にコピー

ここで説明する必要があるのは、--plain パラメーターは単純なコントローラーのみが必要であることを示しており、これは必要ありません。 show()、create() などの多数のメソッドを生成します。

コントローラーからデータベース データを取得します

この再作成された ArticleController.php を開きます:

class ArticleController extends Controller{    public function index()    {        $articles = Article::all();        return $articles;    }}
ログイン後にコピー

index() メソッドを作成します。これはルート内にあるためです。 .phpに登録されているルートは、ArticleControllerをロードするためのindex()メソッドを指定します。index()メソッドのArticle::all()を使用して、データベース内のarticlesテーブル内のすべてのレコードを検索し、直接返します。

ブラウザを使用してアクセスしてみましょう。次のようなものが表示されます。

はい、ご覧のとおり、検索に直接戻った場合は、データを取得するために、Laravel はデフォルトでデータを json 形式に変換します。これは、laravel が次のことを考慮するためです。 一般に、この場合に返されるのは、通常、モバイル アプリの 1 つ用に作成した API などの API 関数を作成するときです。 , json データは間違いなく良い選択です。

ところで、誰もが Baidu チームの FeHelper chrome プラグインを使用しています:

https://github.com/zxlie/FeHelper

しかしここではjson を直接返すのではなく、ビューをロードしてデータを表示することが目的です。これが次のステップです

ビューにデータを表示します

ここで最初に変更する必要があるのは、ArticleController のindex() メソッドです。

public function index(){    $articles = Article::all();    return view('articles.index',compact('articles'));}
ログイン後にコピー

コードの戻り行を変更し、view() メソッドを使用してビューをロードします。このビューは、resources/views/articles/ にあるindex.blade.php です (まだ作成していません)。最後に、compact('記事') データをビュー ファイルに渡す: このビューで変数を渡す問題については、チュートリアルの 3 番目の部分を参照してください

次に、ビュー ファイルを作成し、以下にインデックスを作成する必要があります。 resource/views/articles/.blade.php ファイル:

@extends('app')@section('content') <h1>这是index.blade.php</h1>@endsection
ログイン後にコピー

ビュー ファイルのブレード テンプレートについては、チュートリアルの 3 番目の部分を参照してください。ブラウザで:

ビュー ファイルが正しい後、ビューに渡された $articles 変数の内容を表示する必要があります:

@extends('app')@section('content')    @foreach($articles as $article)        <h1>{{ $article->title }}</h1>        <p>{{ $article->intro }}</p>        <hr>    @endforeach@endsection
ログイン後にコピー

@foreach を使用してすべての記事をループアウトすると、ブラウザーで記事が表示されます。

ここでホームページの表示は基本的に完了します。ただし、実際のブログでは記事のリンクを貼ります。各タイトル、つまり記事ごとに詳細表示ページを追加し、ユーザーが記事のリンクをクリックすると、対応する記事の詳細が表示されます。この機能を実装してみましょう

記事詳細表示

記事表示を通じて上記のプロセスを簡単に体験してみましょう:

1. ルートを登録します

app/Http/routes.php に、ルートを追加します。

Route::get('articles/{id}','ArticleController@show');
ログイン後にコピー

上記のルート記事/{id} は、ArticleController で show() メソッドをロードする必要があることを指定します。ここで注意する必要があるのは、式 {id} です。これは、id がルーティング変数であること、つまり、次の 2 つのルートにアクセスする場合を意味します:

http://blog.dev/articles/1 //id 为1http://blog.dev/articles/foo // id为foo
ログイン後にコピー

今すぐアクセスしようと急がないでください。 、まだ show() メソッドを作成していないため、これは単なる説明のためです。

在laravel中,路由变量写在{}括号中,这个id对应我们等下写的show()方法的参数。

2.编写show()

在ArticleController增加show()方法:

public function show($id){    return $id;}
ログイン後にコピー

我们在show($id)方法中,首先接受参数id,然后直接返回。现在我们可以访问上面的两个url了,看到的类似下面这个效果:

3.获取数据

然而在show()方法中,我们也是需要从数据库中加载获取数据,所以我们先修改show()方法:

public function show($id){    $article = Article::find($id);    return $article;}
ログイン後にコピー

我们通过find()方法从数据库中查找一条记录,然后直接返回,我们来看看效果:

4.加载视图

获取数据之后,我们需要加载相应地视图来展示数据,还是修改show()方法:

public function show($id){    $article = Article::find($id);    return view('articles.show',compact('article'));}
ログイン後にコピー

类似地,我们使用view()加载show.blade.php,然后compact()将变量传递过去。所以我们去创建show.blade.php视图文件吧:

@extends('app')@section('content')        <h1>{{ $article->title }}</h1>        <hr>        <p>{{ $article->content }}</p>@endsection
ログイン後にコピー

这里跟index.blade.php视图文件差不多,我们只是去掉了@foreach,在来访问一下看看:

到这里,我们的文章展示页面也可以说是完成了,然而当我们访问这个下面这个链接的时候:

http://blog.dev/articles/3
ログイン後にコピー

报错了!

这是因为我们在show()方法中使用$article = Article::find($id);来查找一篇文章,但是我们的数据库中的articles表并没有id为3的记录,也就是id为3的时候,$article变量已经是null了,这个时候我们如果还是希望在视图中使用{{ $article->title }},所以才会出现错误:

Trying to get property of non-object.... 
ログイン後にコピー

PS: 如果你想调试,看看$article到底是什么,你可以在laravel中使用dd($article)来调试

那这个要怎么解决呢?有两种方法:

第一,自己写个if条件判断:

public function show($id)   {       $article = Article::find($id);       if(is_null($article)){           abort(404);       }       return view('articles.show',compact('article'));   }
ログイン後にコピー

如果$article为空,直接abort()一个404页面。再来访问一下:

这里貌似还是会看到一堆错误,为什么呢?那是因为在.env中我们设置了APP_DEBUG=true,所以还会有下面的一堆错误,我们在实际的线上部署环境中,APP_DEBUG=false才是我们的设置。我们来体验一把将APP_DEBUG=false,见证一下我们的404页面:

这个404页面,你可以自定义:就是在resources/views/errors/文件夹下创建一个404.blade.php。

实际例子就是这样的(彩蛋):

https://jellybool.com/show404page

你也可以在我的blog地址栏随便输入一堆东西,看看找不到文章的时候是什么样的404 page 。

第二,使用findOrFail()

上面的条件判断其实很不错了,但是这里我还是推荐使用findOrFail()这个方法:

public function show($id)    {        $article = Article::findOrFail($id);               return view('articles.show',compact('article'));    }
ログイン後にコピー

findOrFail()表示首先尝试find,如果找不到就fail,抛出一个Eloquent Exception,所以我们再来访问尝试一下:

我们应该会得到一样的结果.

然后我们回到我们的index.blade.php中为每篇文章添加链接:

  @foreach($articles as $article)      <h1><a href="/articles/{{ $article->id }}">{{ $article->title }}</a></h1>      <p>{{ $article->intro }}</p>      <hr>  @endforeach
ログイン後にコピー

访问来看看:

注意我们这里直接使用了href="/articles/{{ $article->id }}"进行链接,你也可以使用action()这个方法:

 @foreach($articles as $article)        <h1><a href="{{ action('ArticleController@show',[$article->id]) }}">{{ $article->title }}</a></h1>        <p>{{ $article->intro }}</p>        <hr>    @endforeach
ログイン後にコピー

action()这个方法第一个参数表明要加载ArticleController的show()方法,跟routes一样,第二个参数用数组传入相应地参数[$article->id]。

你还有第三种选择,使用url()方法:

@foreach($articles as $article)      <h1><a href="{{ url('articles/',$article->id) }}">{{ $article->title }}</a></h1>      <p>{{ $article->intro }}</p>      <hr>  @endforeach
ログイン後にコピー

url()方法第一个参数传入url路径,第二个参数直接传入变量。

上面的三种方法,选择一种自己喜欢的就可以了。

下一节

就写到这里吧,这一节大概也就是这样的内容了,不知道这样介绍,大家对Laravel的Model Controller Views的工作流程清晰了没,不清晰的话可以评论问我。。。

下一节,我即将说说怎么实现创建一篇文章,就会顺带介绍Laravel的Forms表单。

最后,

Happy Hacking

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート