這次實作使用ubuntu當作業系統。
因為ubuntu的套件管理工具穩定版提供到7.0
所以這次使用7.0使用的最新版laravel。
安裝過程照著官網文件。
https://laravel.com/docs/5.5/installation
首先check是否所有的php套件都已經成功安裝。
(ubuntu底下可以使用apt-cache search php-
來查找套件。通常都可以使用apt-get install
來安裝。
接著,可以開始創建專案。
透過composer安裝laravel/installeer,並使用laravel旨令建立專案。
composer global require " laravel/installer"
記得修改環境變數$path:
在檔案中加入此行
PATH=" $PATH :$HOME /.config/composer/vendor/bin"
之後執行旨令:
實作後發現,使用這個方式,資料夾中少了vendor資料夾,猜測是跟composer的環境設定有關。
因此認為使用下面的方式應該是比較簡單,也比較易於管理的方式(每一個網站app都有獨立的composer.json管理套件,
符合一般使用情形。
2. 從composer中建立專案。
執行以下指令:
composer create-project --prefer-dist laravel/laravel blog " 5.5.*"
可使用artisan來測試是否有建成功:
依經驗法則,應該是會遇到一堆權限相關的問題…
// in header
<meta name="csrf-token " content="{{ csrf_token() }}">
// in javascript
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name= "csrf-token"]').attr('content' )
}
});
用來應付bootstrap資料夾不可寫的error
composer update
composer dump-autoload
php artisan clear:route
php artisan clear:config
php artisan optimize
設定test資料庫 以及 test 資料庫 migration
因為有一個test資料庫,test使用,不去動到正式資料庫。
因此,必須先設定config。
在app/config/database.php
中,加入以下:
return [
// .....
// .....
'connections' => [
// ...
// ...
'mysql_test' => [
'driver' => 'mysql' ,
'host' => env('DB_HOST' , '127.0.0.1' ),
'port' => env('DB_PORT' , '3306' ),
'database' => env('DB_DATABASE2' , 'epa_test' ),
'username' => env('DB_USERNAME' , 'forge' ),
'password' => env('DB_PASSWORD' , '' ),
'unix_socket' => env('DB_SOCKET' , '' ),
'charset' => 'utf8mb4' ,
'collation' => 'utf8mb4_unicode_ci' ,
'prefix' => '' ,
'strict' => true ,
'engine' => null ,
],
// ...
]
//..
];
之後,去修改.env
,加入DB_DATABASE2
的值
artisan 指令:
php artisan migrate --database=mysql_test
可以使用指令快速增加controller:
php artisan make:controller PhotoController --resource
--resource為定義此controller為一增刪修型的資源controller。
migration是laravel中用來管理資料庫版本的方式,它可以確保開發中的每一個人都使用最新版本的資料庫。
並且其中還有提供資料填充的功能,方便測式。
可以使用 artisan
來建立migration:
php artisan migrate:make create_users_table
在執行migration時,會照著時間戳記裡執行。
php artisan migrate:make add_votes_to_user_table --table=users
php artisan migrate:make create_users_table --create=users
table: 用來指定資料表名稱
create: 指定建立新的資料表。
執行所有migration
php artisan migrate
php artisan migrate --package=vendor/package
package可以用來指定持定套件的migration
提示: 如果在執行遷移時發生「class not found」錯誤,試著先執行 composer dump-autoload 命令後再進行一次。
回復功能:
php artisan migrate:rollback
php artisan migrate:reset
php artisan migrate:refresh
rollback: 回復上一版
reset 全部回復
refresh 全部回復後重新執行
用來產生測試資料。
php artisan db:seed
php artisan db:seed --class=UserTableSeeder
可以使用class來指定單獨執行的類別。
也可以使用migrate:refresh:
php artisan migrate:refresh --seed
php artisan make:seeder UsersTableSeeder
想要一頭栽進自動化測試,所以學習記錄一下……
test-driven development,或稱TDD,是軟體工程中一種開發軟體的方法。它的主要概念很簡單,再開發功能的時候,都從測試開始寫起。
如此的好處有以下幾點:
當你寫完,你可以很輕易的使用unit test工具驗証你寫的程式有沒有問題
當你在還未開發前就有辦法寫測試,代表對功能有非常具體的了解。
未來再加上新功能後,常常會有從前寫的code東爆西爆的狀況。若從開始就有好好的寫test,則可以非常輕易的就抓到在哪個環節出了問題。
然而,unit test的世界,包含思維要改變(每次在開發的時候,要從測試開始想起)、更花時間(如果不寫測試的話,直接一頭幹下去,速度應該是會快很多的;test的好處,在專案大到一定的程度,才會慢慢的顯現出來)、以及unit-test的工具有一定的學習門檻(太多不同的工具可以使用),其實之前一直想要學習這種開發模式,但總是忘而卻步。
這次學laravel,laravel框架剛好提供非常完整的測試環境及工具,以及有幸之前找到前人寫的不錯的測試教學。於是把自己所學的也記錄下來,除了給自己備忘,也 希望能幫助到其它人。
其實任何的TDD開發流程應該都差不多。在laravel中,使用phpunit
當做測試工具,所以當要開發一個新功能,流程都是一樣的:先寫測試→run測試→紅燈→寫code→run測試→紅燈→不斷修改直到正確→綠燈。
我是使用composer來安裝以管理laravel的,所以要使用php unit,指另如下:
這樣做會測試tests
資料夾底下的所有測試。也可以指定資料夾或者是檔案執行。
laravel的框架會把所有該loading 以及 mapping的檔案準備好。若在執行測試的時候產生測試以外的error,可以嘗試重新執行dump-autoload
:
eloquent是laravel提供的一個非常方便的控製資料庫的類別。在laravel中,每一個資料庫操作都對應一個model,這個model操做及為eloquent所提供的功能。
要建立一個model,可以使用以下指令:
php artisan make:model Flight
如果要順便產生migration檔案,可以加入參數 -m
。
產生出來的檔案(model)Flight.php
如下:
<?php
namespace App ;
use Illuminate \Database \Eloquent \Model ;
class Flight extends Model
{
//
}
這裡有幾個規則:
table的名稱會是你的model的復數型。以例子來說,table名稱為flights
。
可以在model中定義table名稱:
<?php
namespace App ;
use Illuminate \Database \Eloquent \Model ;
class Flight extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $ table = 'my_flights' ;
}
primary key:Eloquent 會預設primarykey為 id
欄位,如果要修改primarykey,可以新增一個$primaryKey
變數:
class Flight extends Model
{
// ......
protected $ primarykey = "id2 ";
//......
}
<?php
namespace App ;
use Illuminate \Database \Eloquent \Model ;
class Flight extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $ timestamps = false ;
}
<?php
namespace App ;
use Illuminate \Database \Eloquent \Model ;
class Flight extends Model
{
/**
* The storage format of the model's date columns.
*
* @var string
*/
protected $ dateFormat = 'U' ;
}
<?php
class Flight extends Model
{
const CREATED_AT = 'creation_date' ;
const UPDATED_AT = 'last_update' ;
}
convensions在軟體工程中,是很重要的一塊。當限定了規則後,共同開發的大家使用相同的規則,管理起來比較方便。
既然都使用了這個框架,我的建議是,如果沒有特別必要的話,就不要自定義這些規則了,一方面使用方便,一方面也比較容易統一規格。
做系統的工程師,最一開始會碰到的問題,應該就是資料庫要怎麼測試了吧。
然後因為要新增、assert、然後為了不污染現有資料庫,要刪除;
如果測試完全不想要跟真實資料庫有互動,就必須使用其它的套件來產生「假的」資料表物件。
剛開始要測試時,又希望資料庫中有些測試資料,才做功能測試…
感覺太麻煩了,最後干脆手動測試,然後就放棄TDD了。我是這樣啦…
laravel中提供了許多方便的功能,讓測試資料庫變的比較方便。
laravel提供兩個方法來產生測試資料:seed以及 factory。
正確的來說,seed是提供 migrate時產生假資料的實例;而factory是可以快速產生假資料的方法。
你可以在seed中使用factory。你也可以選擇不用factory,而使用model產生假資料。
技巧-測試的時候使用sqlLite:memory測試
當你的程式已經是正式的資料庫時(當然,實務上來說不可能會使用正式資料庫來做開發),
會不希望碰觸到資料庫中真實的資料,但又要簡單確認資料庫邏輯正不正確。
這時,可以使用這個技巧,把測試的database換成sqlite::memory對做測試。
說穿了其實就是在setUp時修改database的config檔。
use Illuminate \Support \Facades \Artisan ;
class TestCase extends Illuminate \Foundation \Testing \TestCase {
// ...
// 每個 test case 都會重新初始化資料庫
protected function initDatabase ()
{
// 在測試時動態修改 config
// 使其連接 sqlite
config([
'database.default' => 'sqlite' ,
'database.connections.sqlite' => [
'driver' => 'sqlite' ,
'database' => ':memory:' ,
'prefix' => '' ,
],
]);
// 呼叫 php artisan migrate
// 及 php artisan db:seed
Artisan ::call ('migrate' );
Artisan ::call ('db:seed' );
}
// 重置資料庫
// 讓下次測試不會被舊資料干擾
protected function resetDatabase ()
{
// 呼叫 php artisan migrate:reset
// 這樣會把所有的 migration 清除
Artisan ::call ('migrate:reset' );
}
error "No application encryption key has been specified."
今天遇到這個問題,上網查了一下,跟沒有密鑰有關。密鑰應該是跟安全有關。
從5.4開始,要先手動產生密鑰:
"Before using Laravel's encrypter, you must set a key option in your config/app.php configuration file. You should use the php artisan key:generate command to generate this key"
因此,解決這問題,應該使用指令:php artisan key:generate
即可解決。
但是使用這個指令時,又遇到另一個問題:產生 no .env file
error。
搜尋了一下,大部份的人遇到這個問題都是因為沒有把.env.example
範例檔修改為.env
,
但我目前實作的資料夾連.env
檔都沒有。
現在嘗試刪掉專案重新建立…
重新建立後,問題已修正,猜測是上一個專案為了建立git,開新git repostory後,將程式碼cp過去,可能沒有cp到.env檔。
How to fix Error: laravel.log could not be opened?
quote by https://stackoverflow.com/questions/23411520/how-to-fix-error-laravel-log-could-not-be-opened
Sometimes we need to do more, because
Means
7 - Owner can write
7 - Group can write
5 - Others cannot write!
If your webserver is not running as Vagrant, it will not be able to write to it, so you have 2 options:
or change the group to your webserver user, supposing it's www-data:
chown -R vagrant:www-data storage
can't not read filestream error
起因是因為權限的問題。laravel中會把一些需要I/O的檔案,
如log檔,存放在storage資料夾底下,但是因為apache執行的使用者不為擁有者。
(如:apache以homestead執行I/O,但資料夾雍有讀寫權限的擁有者為howard。)
會造成沒有辦法寫檔而產生error
原本想要找找看把apache的執行身份與資料夾使用者一致,但好像有點麻煩,
所以使用網路上通用的解:調整storage權限。
另外 這篇可能可以參考(改執行身份)
https://plus.google.com/101151239666088731701/posts/C8BRPWN2TZ3
Specified key was too long error
在新版的lavavel當中,使用全新的編碼方式(utf8mb4),這種編碼將顏文字也編入編碼中。
但舊版的mysql以及mariadb並不支援。
解決方法:把defaultStringLength調回舊版。
appServiceProvider.php
:
use Illuminate \Support \Facades \Schema ;
public function boot ()
{
Schema ::defaultStringLength (191 );
}
剛剛想要把SASS的環境也灌進去,使用num init
才發現laravel專案裡面早就包含了package.json
了。
npm install
後,試著想要執行
結果一直跑出error,
上網查了一下,
原來是因為laravel的package.json
預設裝了cross-env
套件,這個套件只有windows需要
因為環境在 linux上,所以找不到這個套件,造成錯誤。
現在就把package.json
中的cross-env都刪掉,重新npm install
一次
更新
找了一天,發現上面的問題其實只出現在mac電腦
ubuntu可以使用預設的package.json檔就ok了…
會發生這個問題,其實跟它的error message一樣,
真的是nodejs的版本太舊(可惡的apt-get)
所以就用最簡單的方法升級就好~
上網搜尋以後,我決定用n
來控管node版本。
sudo npm cache clean -f
sudo npm install -g n
sudo n stable
記得重新開terminal。
然後
使用ubuntu 18
,run 原生的run install
會有錯誤
ubuntu 的npm的安裝方式,不小心解決就直接關掉了。不過應該很好找。
npm install
會有error,主要原因是少了兩個dependency:
sudo apt install libpng-dev
sudo npm install cross-env -g
cross-env會安裝在global環境中。
之後,可以刪除專案資料夾底下的node_modules
資料夾
sudo rm -rf node_modules
npm cache clear --force
rm package-lock.json yarn.lock
npm install
npm install --save-dev
--save-dev
會安裝在dev裡面的套件。
另外,在網站上線以後,如果要更動內容,必須打開apache2的rewrite套件:
最近發生的問題。似乎是laravel passport的相依套件更新沒有跟舊版的merge好。
any,解法如下:
composer require paragonie/random_compat:2.*
composer require laravel/passport
webpack的設定檔,resolve.alias
別名的路徑,他不認識上一層(
../
),經過我好多次的實驗,應該是這樣 = =它可以指定當前目錄(
./
),但沒辦法返回上一層