class="am-u-md-8">@foreach($articlesas$a" />
最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

Laravel大型项目系列教程(四)

来源:动视网 责编:小OO 时间:2025-09-30 22:14:39
文档

Laravel大型项目系列教程(四)

Laravel大型项目系列教程(四)一、前言上节教程中实现了发布文章的功能,本节教程中将大概实现在首页和用户主页分页显示文章和标签列表、用户能够修改删除文章。二、Let'sgo1.首页显示文章和标签列表我们需要在首页显示文章和标签列表,修改views/index.blade.php:@extends('_layouts.default')@section('main')class="am-gam-g-fixed">class="am-u-md-8">@foreach($articlesas$a
推荐度:
导读Laravel大型项目系列教程(四)一、前言上节教程中实现了发布文章的功能,本节教程中将大概实现在首页和用户主页分页显示文章和标签列表、用户能够修改删除文章。二、Let'sgo1.首页显示文章和标签列表我们需要在首页显示文章和标签列表,修改views/index.blade.php:@extends('_layouts.default')@section('main')class="am-gam-g-fixed">class="am-u-md-8">@foreach($articlesas$a
Laravel大型项目系列教程(四)

一、前言

上节教程中实现了发布文章的功能,本节教程中将大概实现在首页和用户主页分页显示文章和标签列表、用户能够修改删除文章。

二、Let's go

1.首页显示文章和标签列表

我们需要在首页显示文章和标签列表,修改views/index.blade.php:

@extends('_layouts.default')@section('main')class="am-g am-g-fixed"> class="am-u-md-8"> @foreach ($articles as $article)

@endforeach class="am-u-md-4 blog-sidebar">
class="am-panel-group">
class="am-panel-hd">class="am-icon-tags"> Tags
@stop

在custom.css中增加:

@media only screen and (min-width: 1px) {  .blog-sidebar {    font-size: 1.4rem;  }}.blog-main {  padding: 20px 0;}.blog-title {  margin: 10px 0 20px 0;}.blog-meta {  font-size: 14px;  margin: 10px 0 20px 0;  color: #222;}.blog-meta a {  color: #27ae60;}

修改routes.php:

Route::get('/', function(){ $articles = Article::with('user', 'tags')->orderBy('created_at', 'desc')->paginate(10); $tags = Tag::where('count', '>', '0')->orderBy('count', 'desc')->orderBy('updated_at', 'desc')->take(10)->get(); return View::make('index')->with('articles', $articles)->with('tags', $tags);});

上面Article::with()使用了预加载,可以减少查询次数。

发布几篇文章然后访问首页:

2.实现用户主页

我们在发表文章后应该能在用户主页看到文章列表,并能对文章进行操作,先在导航栏nav.blade.php的@else上面添加一个按钮My Articles:

My Articles

修改home.blade.php:

@extends('_layouts.default')@section('main')

@if ($user->id == Auth::id()) @endif @foreach ($articles as $article) @if ($user->id == Auth::id()) @endif @endforeach
Title TagsManagment
{{{ $article->title }}} @foreach ($article->tags as $tag){{ $tag->name }} @endforeach Edit {{ Form::open(array('url' => 'article/' . $article->id, 'method' => 'DELETE', 'style' => 'display: inline;')) }} {{ Form::close() }}
NoYes @stop

先添加一个UserController:

$ php artisan generate:controller UserController

在UserController.php中增加:

public function articles(User $user){ return View::make('home')->with('user', $user)->with('articles', Article::with('tags')->where('user_id', '=', $user->id)->orderBy('created_at', 'desc')->get());}

在routes.php中增加:

Route::get('user/{user}/articles', 'UserController@articles');

并修改原来的Route::get('home'):

Route::get('home', array('before' => 'auth', function(){ return View::make('home')->with('user', Auth::user())->with('articles', Article::with('tags')->where('user_id', '=', Auth::id())->orderBy('created_at', 'desc')->get());}));

现在当用户登录或点击My Articles按钮后会跳转到用户主页显示文章列表,并且点击标题时能跳转到显示文章内容页面:

用户主页完成了,另外当在首页和文章内容页面点击作者时也能跳转到相应用户的主页,但是如果不是本用户是没有操作权限的,给views/index.blade.php中的作者增加链接地址:

{{{ $article->user->nickname }}}

给articles/show.blade.php中的作者增加链接地址:

{{{ $article->user->nickname }}}

现在点击这两个超链接的时候就能跳转到相应用户的主页了,但是没有操作权限:

3.首页分页显示文章

当文章很多时,我们就要分页显示了,Laravel已经为我们实现好了分页逻辑,但它默认的是Bootstrap的样式,由于我们使用AmazeUI,所以需要自定义表示器。先在app目录创建一个名为Blog的文件夹,这个文件夹中主要放置我们自己写的扩展类,在其中新建一个名为PaginationPresenter.php的文件,修改:

class PaginationPresenter extends Illuminate\\Pagination\\Presenter { public function getActivePageWrapper($text) { return '

  • '.$text.'
  • '; } public function getDisabledTextWrapper($text) { return '
  • '.$text.'
  • '; } public function getPageLinkWrapper($url, $page, $rel = null) { return '
  • '.$page.'
  • '; }}

    完成之后这个类还不能被找到,需要在composer.josn中的autoload classmap中增加"app/Blog",然后执行:

    $ composer dump-autoload

    这样这个类就能被找到了,现在创建分页链接的视图:

    $ php artisan generate:view pagination

    修改pagination.blade.php:

      {{ with(new PaginationPresenter($paginator))->render() }}

    完成后修改app/config/view.php中的pagination的值为pagination,在routes.php中Route::get('/')内paginate()的参数就是指定每页显示的数量,由于我文章比较少,暂时把它设为2,最后在views/index.blade.php中文章显示之后添加{{ $articles->links() }},现在访问首页就会看到如下分页链接了:

    4.修改文章的视图

    这步要实现在用户主页能够修改文章了,自己的文章只能自己或者管理员修改,在ArticleController.php中增加一个过滤器:

    public function canOperation($route, $request){ if (!(Auth::user()->is_admin or Auth::id() == Article::find(Route::input('article'))->user_id)) { return Redirect::to('/'); }}

    上面的Route::input('article')可以获得路由参数,这里就是文章的id值,然后在构造函数中添加使用过滤器,再添加一个csrf过滤器:

    $this->beforeFilter('csrf', array('only' => array('store', 'update', 'destroy')));$this->beforeFilter('@canOperation', array('only' => array('edit', 'update', 'destroy')));

    创建修改文章的视图:

    $ php artisan generate:view articles.edit

    修改articles/edit.blade.php:

    @extends('_layouts.default')@section('main')

    Edit Article


    @if ($errors->has())

    {{ $errors->first() }}

    @endif {{ Form::model($article, array('url' => URL::route('article.update', $article->id), 'method' => 'PUT', 'class' => "am-form")) }} {{ Form::label('title', 'Title') }} {{ Form::text('title', Input::old('title')) }} {{ Form::label('content', 'Content') }} {{ Form::textarea('content', Input::old('content'), array('rows' => '20')) }}

    {{ Form::label('tags', 'Tags') }} {{ Form::text('tags', Input::old('tags')) }}

    Separate multiple tags with a comma

    在routes.php中增加:

    Route::post('article/{id}/preview', array('before' => 'auth', 'uses' => 'ArticleController@preview'));

    这是为了修改文章时能够预览文章。

    在ArticleController.php中修改:

    public function edit($id){ $article = Article::with('tags')->find($id); $tags = ''; for ($i = 0, $len = count($article->tags); $i < $len; $i++) { $tags .= $article->tags[$i]->name . ($i == $len - 1 ? '' : ','); } $article->tags = $tags; return View::make('articles.edit')->with('article', $article);}

    现在在用户主页点击修改文章时会跳转到修改页面:

    5.修改文章

    在ArticleController.php添加修改文章的业务逻辑:

    public function update($id){ $rules = [ 'title' => 'required|max:100', 'content' => 'required', 'tags' => array('required', 'regex:/^\\w+$|^(\\w+,)+\\w+$/'), ]; $validator = Validator::make(Input::all(), $rules); if ($validator->passes()) { $article = Article::with('tags')->find($id); $article->update(Input::only('title', 'content')); $resolved_content = Markdown::parse(Input::get('content')); $article->resolved_content = $resolved_content; $tags = array_unique(explode(',', Input::get('tags'))); if (str_contains($resolved_content, '

    ')) { $start = strpos($resolved_content, '

    '); $length = strpos($resolved_content, '

    ') - $start - 3; $article->summary = substr($resolved_content, $start + 3, $length); } elseif (str_contains($resolved_content, 'summary = substr($resolved_content, $start + 4, $length); } $article->save(); foreach ($article->tags as $tag) { if (($index = array_search($tag->name, $tags)) !== false) { unset($tags[$index]); } else { $tag->count--; $tag->save(); $article->tags()->detach($tag->id); } } foreach ($tags as $tagName) { $tag = Tag::whereName($tagName)->first(); if (!$tag) { $tag = Tag::create(array('name' => $tagName)); } $tag->count++; $article->tags()->save($tag); } return Redirect::route('article.show', $article->id); } else { return Redirect::route('article.edit', $id)->withInput()->withErrors($validator); }}

    这部分较难的是对Tag的处理,可能我的方法不是最好的。

    这样就能真正的实现修改了:

    6.删除文章

    在ArticleController.php中增加:

    public function destroy($id){ $article = Article::find($id); foreach ($article->tags as $tag) { $tag->count--; $tag->save(); $article->tags()->detach($tag->id); } $article->delete(); return Redirect::to('home');}

    我们这里删除文章其实是软删除,它在数据库中还是存在的。

    当点击Yes后会发现文章被删除了。

    7.小结

    本节教程完成了在首页和用户主页显示文章和标签列表,用户能够管理自己的文章,但只在首页实现了分页显示文章,你可以自己实现在用户主页也分页显示,在删除文章确认提示的时候,你可以加上要删除文章的标题,这样用户体验会更好,你完全可以按你的想法进行实现。这节就到此结束了,我们已经实现了管理员用户管理,下节就将完善管理员模块,实现文章和标签管理。

    别忘记还有最后的代码下载:

    $ git clone https://github.com/shiyanlou/laravel-blog-4.git

    本文详细出处:http://www.shiyanlou.com/courses/123

    文档

    Laravel大型项目系列教程(四)

    Laravel大型项目系列教程(四)一、前言上节教程中实现了发布文章的功能,本节教程中将大概实现在首页和用户主页分页显示文章和标签列表、用户能够修改删除文章。二、Let'sgo1.首页显示文章和标签列表我们需要在首页显示文章和标签列表,修改views/index.blade.php:@extends('_layouts.default')@section('main')class="am-gam-g-fixed">class="am-u-md-8">@foreach($articlesas$a
    推荐度:
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top