美文网首页
Laravel入门(三)

Laravel入门(三)

作者: stutterr | 来源:发表于2017-03-02 16:03 被阅读84次

    简单博客系统规划

    基本功能:后台需要使用账号密码登录,进入后台之后,可以新增、修改、删除文章;前台显示文章列表,并在点击标题之后显示出文章全文。

    搭建前台

    修改路由

    删掉

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

    添上

    Route::get('/', 'HomeController@index');
    

    现在我们系统的首页就落到了 App\Http\Controllers\HomeController 类的 index 方法上了。

    查看 HomeController 的 index 函数

    learnlaravel5/app/Http/Controllers/HomeController.php 的 index 函数只有一行代码:return view('home');,这个很好理解,返回名字叫 home 的视图给用户。这个视图文件在哪里呢?在 learnlaravel5/resources/views/home.blade.php,blade 是 Laravel 视图系统的名字。

    blade

    打开home.blade.php

    @extends('layouts.app')
    
    @section('content')
    <div class="container">  
        <div class="row">
            <div class="col-md-10 col-md-offset-1">
                <div class="panel panel-default">
                    <div class="panel-heading">Dashboard</div>
    
                    <div class="panel-body">
                        You are logged in!
                    </div>
                </div>
            </div>
        </div>
    </div>  
    @endsection
    

    @extends('layouts.app')

    这表示此视图的基视图是learnlaravel5/resources/views/layouts/app.blade.php 。这个函数还隐含了一个小知识:在使用名称查找视图的时候,可以使用 . 来代替 / 或 \。
    也就是说layouts.app相当于layouts/app

    @section('content') ... @endsection

    这两个标识符之前的代码,会被放到基视图的 @yield('content') 中进行输出。

    如掉强制登陆

    当访问 http://域名 会看到登陆的界面

    如何去掉? 删掉 HomeController 中的构造函数即可:

    public function __construct()  
    {
        $this->middleware('auth');
    }
    
    向视图文件输出数据

    Controller - View 的架构已经运行,下一步就是引入 Model 了。Laravel 中向视图传数据非常简单:

    public function index()  
    {
        return view('home')->withArticles(\App\Article::all());
    }
    
    向视图文件输出数据

    修改视图文件 learnlaravel5/resources/views/home.blade.php 的代码为:

    <!DOCTYPE html>  
    <html lang="en">  
    <head>  
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
    
        <title>Learn Laravel 5</title>
    
        <link href="//cdn.bootcss.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
        <script src="//cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
        <script src="//cdn.bootcss.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
    </head>
    
        <div id="title" style="text-align: center;">
            <h1>Learn Laravel 5</h1>
            <div style="padding: 5px; font-size: 16px;">Learn Laravel 5</div>
        </div>
        <hr>
        <div id="content">
            <ul>
                @foreach ($articles as $article)
                <li style="margin: 50px 0;">
                    <div class="title">
                        <a href="{{ url('article/'.$article->id) }}">
                            <h4>{{ $article->title }}</h4>
                        </a>
                    </div>
                    <div class="body">
                        <p>{{ $article->body }}</p>
                    </div>
                </li>
                @endforeach
            </ul>
        </div>
    
    </body>  
    </html>  
    

    之后刷新就可以看到下面的画面

    Paste_Image.png

    此视图文件变成了一个独立视图,不再有基视图,并且将 jQuery 和 BootStrap 替换为了国内的 CDN,更快更稳定了。

    同理我们修改 Learnlaravel5/resources/views/layouts/app.blade.php 的头部

    <head>  
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
    
        <title>Laravel</title>
    
        <link href="//cdn.bootcss.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
        <script src="//cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
        <script src="//cdn.bootcss.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
    </head>  
    

    搭建后台

    生成控制器

    使用 Artisan 工具来生成控制器文件:

    php artisan make:controller Admin/HomeController

    Paste_Image.png
    增加路由

    使用路由组来将后台页面置于“需要登录才能访问”的中间件下,以保证安全,在路由文件中添加下面的路由:

    Route::group(
      ['middleware' => 'auth', 'namespace' => 'Admin', 'prefix' => 'admin'], 
        function() {  
        Route::get('/', 'HomeController@index');
    });
    

    上面的三行代码的功能简单概括就是:访问这个页面必须先登录,若已经登录,则将 http://域名/admin 指向 App\Http\Controllers\Admin\HomeController 的 index 方法。其中需要登录由 middleware 定义, /admin 由 prefix 定义,Admin 由 namespace 定义,HomeController 是实际的类名

    构建后台首页

    在Admin\HomeController中新建 index 方法

        public function index()  
    {
        return view('admin/home');
    }
    

    新建视图文件

    learnlaravel5/resources/views/ 目录下新建一个名为 admin 的文件夹,在 admin 内新建一个名为 home.blade.php 的文件,填入代码:

    @extends('layouts.app')
    
    @section('content')
    <div class="container">  
        <div class="row">
            <div class="col-md-10 col-md-offset-1">
                <div class="panel panel-default">
                    <div class="panel-heading">Dashboard</div>
    
                    <div class="panel-body">
    
                        <a href="{{ url('admin/article') }}" class="btn btn-lg btn-success col-xs-12">管理文章</a>
    
                    </div>
                </div>
            </div>
        </div>
    </div>  
    @endsection
    

    修改learnlaravel5\app\Http\Controllers\Auth\LoginController中的相应代码为:

    protected $redirectTo = 'admin';

    之后访问域名/admin会跳转倒登陆界面

    构建 Article 后台管理功能

    尝试点击管理文章,会得到一个404报错。
    404 错误是访问了系统没有监听的路由导致的。下面我们要添加针对 http://域名/admin/article的路由:

    Route::group(['middleware' => 'auth', 'namespace' => 'Admin', 'prefix' => 'admin'], function() {  
        Route::get('/', 'HomeController@index');
        Route::get('article', 'ArticleController@index');
    });
    

    再搭建控制器

    php artisan make:controller Admin/ArticleController

    在控制器中新增index()方法

    public function index()  
    {
        return view('admin/article/index')->withArticles(Article::all());
    }
    

    新建视图
    learnlaravel5/resources/views/admin 下新建 article 文件夹,在文件夹内新建一个 index.blade.php 文件,内容如下:

    @extends('layouts.app')
    
    @section('content')
    <div class="container">  
        <div class="row">
            <div class="col-md-10 col-md-offset-1">
                <div class="panel panel-default">
                    <div class="panel-heading">文章管理</div>
                    <div class="panel-body">
                        @if (count($errors) > 0)
                            <div class="alert alert-danger">
                                {!! implode('<br>', $errors->all()) !!}
                            </div>
                        @endif
    
                        <a href="{{ url('admin/article/create') }}" class="btn btn-lg btn-primary">新增</a>
    
                        @foreach ($articles as $article)
                            <hr>
                            <div class="article">
                                <h4>{{ $article->title }}</h4>
                                <div class="content">
                                    <p>
                                        {{ $article->body }}
                                    </p>
                                </div>
                            </div>
                            <a href="{{ url('admin/article/'.$article->id.'/edit') }}" class="btn btn-success">编辑</a>
                            <form action="{{ url('admin/article/'.$article->id) }}" method="POST" style="display: inline;">
                                {{ method_field('DELETE') }}
                                {{ csrf_field() }}
                                <button type="submit" class="btn btn-danger">删除</button>
                            </form>
                        @endforeach
    
                    </div>
                </div>
            </div>
        </div>
    </div>  
    @endsection
    

    刷新,得到错误:

    Paste_Image.png

    Article 类不存在?原因很简单:Article 类和当前控制器类不在一个命名空间路径下,不能直接调用。解决办法就是主动导入 \App\Article 类:

    ArticleController开头添上use App\Article;
    最终画面如下

    Paste_Image.png

    相关文章

      网友评论

          本文标题:Laravel入门(三)

          本文链接:https://www.haomeiwen.com/subject/hetkgttx.html