原文: 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