为了大家方便交流加Symfony技术交流群, 182983780

微信公众号:

aaarticlea/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAFYAVgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpbBpQSQDigjNfysE5NAH9U9FfysUUAf1T0V/KxRQB/VPQc1/KxQOtAH9UxbFKCSAcUYzX8rBOTQB/VPRX8rFFAH9UxYg4xSg5FfysA1/VOBigBaKKKAGlsGlBJAOKCM1/KwTk0Af1Tk4FJuJOMfjSkZr+VnNAH9UpbFKCSAcUYzX8rBOTQB/VRRRRQAUUUUAITgUgYk4xSkZr+VgmgD+qYsQcYpQciv5WAa/qnAxQAE4FIGJOMUpGa/lYJoA/qnor+ViigD+qeiv5WKKAP6p6K/lYooA/qoooooAKKKKACiiigBO9fysV/VP3r+VigD+qcnAyaAc0EZFfys546UAf1T0V/Kxn2oz7UAf1T1/Kv6V/VRX8q/pQB/VPnGK/lYIwa/qlI6Z9KVeg5/OgD+VkDJr+qcHNBBIIzSBcGgBSQOtAORSMuT17V/K1kelACAZNGMGlA56fnX9UgBJz+hoAdkAUA5FNYc/0r+Vs9elACda/qnz1obp1r+VsnPagBuK/qmBzTcd804cDrQB/KxX9U571/KxX9U5GaAP5WD1or+qcZooA/lYAya/qnznNIeQRmgDH40AfytYzmv6pgciv5Wc4zQWBPSgD+qev5V/Sv6qK/lX9KAP6p8gDmgHIpCuSOe1fytZHpQB/VPRX8rGfagEZ6UAf1TdcV/KxX9U4FfysUAf1UUUUUAFFFFABRRRQAnev5WK/qn71/KxQB/VRX8q/av6qK/lX7UAFFFFAH9VFfyr+lf1UV/Kv6UAf1TYziv5WSSa/qnHav5WKAP6p6Dmv5WKB1oA/qlLc9Pxr+VvA9a/qmwCKAMCgAIBoAxS0UANY880L0HH50pGa/lYJyaAP6p26HjNNBr+VoHBr+qfA6dqAP5WT160fjX9U9FAH8q9f1Tk4r+Viv6pz3oABmiv5WD1ooAX8aB9c1/VPSHpQB/KwaKD1ooA/qor+Vf0r+qiv5V/SgD+qcdq/lYr+qcdq/lYoAKB1ooHWgD+qcdq/lYr+qcdq/lYoA/qoooooAKKKKACiiigBO9fysV/VOTiv5WCCKAP6qKK/lY/Cj8KAP6p6K/lY/Cj8KAP6picCv5WcYxQDg9KUnP4UAf1SjtX8rFf1TZr+VkgigA61/VPnrQQSOtfytFge350ANxk0EYNf1S9+/Ffytnk9PyoA/qmJwMmjORQRkV/K1njpQAnrX9U3WmEfXiv5XCeelACAZNGCDX9UzdOv5V/K2fT0NAH9Uo7V/KxX9U2fY1/KyRigD+qiv5V/Sv6p81/KzjpQB/VNkAc0A5FNIzz7dK/lbJ56UAIBk0YPpX9UzdDzj6V/K3njHb1oAbigjBr+qU56/pX8rZHPT8qAP6p6/lY9K/qmJxX8rPSgD+qYdKWv5WD9KPwoA/qnor+Vj8KPwoA/qmJxX8rBGKdnjGKaeT0oA/qoooooAKKKKACiiigBCM0AAUtFACYoPFLSHpQA3ODjH404cjpX8rOa/qmAxQAHgdKbnJxj8acRmv5Wc0Af1SgZ60oAFA6UtACE4FfytADGa/qlIyMGjGBQB/K327V/VGOR0/Ov5WskGkJyaAP6pySBnGa/laxxTQcGlySaAF79aTHvX9Uw6UtAH8q+aXcTSUUAOXnmkI560gOK/qnAwKAP5WQOetf1SA89Kd1r+Vn0oAX3zTT1r+qbGcV/KyTmgD+qc9PWmjk4pxGa/lYJoA/qlbrjHWnAcdK/lYBr+qcDFAARmkxinUh6UAA+gox7Cv5WD1ooA/qmPAJxSBs9q/laBwa/qnxigAH0FGPYV/KwetFAH9VFFFFABRRRQAUUUUAISB1oByKRlyevav5Wsj0oASv6pz3r+VgDNf1TZoA/lZPWigjmjFAH9VFFfysZ9qXHPSgD+qXcPWgHIppHf8ASv5WyeelAH9UxOK/lZxX9Ux6elNHXP6UAOyAKAcimkc9/pX8rZ69KAP6picV/KwRX9U56elNHBzQB/K0K/qn60hBJ64r+VokelAH9UxOBRkEV/KyOvSv6pAOe9AH8rWMmgjBr+qU5zn9K/lbI56flQAlFf1TnikJyKAP5WcH0oIwadnt+tf1SL0HOfrQB/KyBk1/VODmkboefyoXg8UAL3r+Viv6pt3Nfys4oAOtf1T96G6da/laJyOlAH9UpOKAcjIr+VodOlf1SjgdfzoA/lYor+qcnHegHPegD+VgDNBGDX9UxBJzmv5WScmgD+qiiiigAooooAKKKKAE71/KxX9U/ev5WKAAdad75poOK/qmxjNACZ7Ypw5HSv5Wc1/VMBigD+Vgdf8AGv6pRnkfrX8rQODRmgBScGko60UAf1Tt0r+VrAx9e1f1SkZGDRgUANz60q9Bx+dLgdO1fysE5NAH9U7dOlfytEAU3pX9U/rQA3PPSv5WiMGjODQTk0Af1TngdK/la7V/VKcHijAoAbn1pV6Dj86MDp2r+Vk8mgD+qcjNfys56V/VPX8q/pQB/VKeMU5eg4xRjOK/lYJyaADJFf1TYr+Vmv6pz3oA/lZziv6psV/Kx61/VRQAh6etNXrjFOIzX8rBNAH9Up64xX8rZ4PX8qQHFBOTQAZIr+qcDFfysV/VP3oAO9fysV/VP3r+VigD+qiiiigAooooAKKKKAE71/KxX9U/ev5WKAP6pycV/Kziv6piMim7cc0AOz0r+VjpTweK/qjHTrQApOBk0A5obpX8rRPGMZoA/qmor+Vj8KPwoA/qmJwMmjORQeR1r+Vrt24oAT1r+qbrTdue9fytkj0oAVfve1fV/wABf+CaXxn+Pnh+11+z06x8L6Ddp5lrfeIZng+0IQrK6RojOUYNlW24Prjmv3069OtfN3xZ+KusX/iC80vSruXT9PtJGgLWzbZJnXhiXHIAORgY6flw4vGU8HT56hvRoyry5Yn0gvToadj618SnWNbDEt4g1nOen9pT/wDxdVbjW9dDHbr+t/hqc/8A8XXg/wCsNH+Rnp/2XUf2kfcZGRj1r8cD/wAEUPimf+Z58If99XX/AMZr6ZuvEniCPhfEWtH6apcf/F1jXPizxMCceJNdGOv/ABNLj/4uk+IqK+wyv7JqfzI+fx/wRQ+KYx/xXHhD67rr/wCM1+x4GAB1r807rxx4my27xXr8SjuNWuP/AIusS78eeLnz5Xi7xCuOf+Qxcj/2ep/1ko/yMr+yKv8AMj9SN1JuHPNfk1cfETxoMkeMvEg2jkDWbn/4uvXv2YP2pvE+j/EPS/DHibVbnW9E1WdbOKW+YyTW8rnEZEh5ILEAg56+1dGHz6hXqqm4tXMKuWVaUHO6dj8YT1or6v8A+CmHwF0r4DftN39poFrFYaDr9nHrVpZw4CW/mO6SIqgAIokjfao6AjtwPlCvpzyAAzX9U2c5r+VkHBp27tigBPWv6putNK5xzX8rZI9KAP6picCv5WCMUoOD0oJyOlACdq/qor+VgCv6pgc0Afysda/qnz1obp1r+VsnPagBmMmgjBr+qXv1Nfytnk9PyoA/qnooooAKKKKACiiigBrNg9O1fytYHrX9UxAPWgDAoAKK/lYooA/qlPBr+VsjnrSCv6p+lAAenrTQecYpxGa/lZzQB/VMOaMUDpS0Afyr5r+qbbzX8rNf1T96ADvX8rFf1T96/lYoA/qj3fvMe2a+PNdhH9v6yxOCdSu8f9/3r7C/5bj/AHf8K+RNfO7W9XC841G7BPp+/evk+IdKMPU9nK/4kvQxJVPmH5enc96hnULk/wAOMDjrVqWUM23dntg9qo3JwrYXcBXwLZ9OkY97tG4soIB6VkXipsbAAZuwNbl5GksZyrMc9uorBuQkcpUnK+hHOazbNkjltQtTLLgjavcNWPc2QjJKEY7mt3VZnikOcqW7MOorDu52cAoh9Dx0rNs2aOa1S3kJYoDgHjjrUfw2hd/it4KYyn5df0/5cf8ATzHXLaz8XPDFl4pXw5cX2NSZvKMZQhEbsCT3qnZ+NzpPx9+Fmk6XqVojzeKdLju7RlJm2tdxdOw4P1r1cFhK88TTTja9nr2PPxFWCpTd79Dov+C14A+PngX/ALFkf+lU9fnWwwxFf1MN/wAhFP8Arn/U1/LMTk1+unwYuPegAZ61/VPRQAzdg4x+Nfyt4HrX9U20elAGBQAY9hQfoK/lYoHWgD+qbGaUDFA6UtACHmkIwK/lZoHWgB3YnIr+qUcjp+dGMigDAwKAFooooAKKKKACiiigBCQOtAORSMuT17V/K1kelACda/qnzSHp1r+VwkGgD+qTriv5WK/qmBwa/lZxQAda/qnzQ3TrX8rZINAH9UmR17V/KwRg1/VLtzTgCABmgBaQ9K/lZz7UvQ9KAGnrRS4yaSgD+qH/AJbj/dP9K+Qdbfy9c1o8n/iZXeR/23evr7/lv/wE/wBK+OfEM6f8JHrEbsFZ9Ru9qs2C2J36CvlOIU3Shbuezlf8SXoZtwFB3FsAc1Rlu0Kt5YGe9SX0qwqzNIAo7k8Vhz65bXMebeSO4UcFomDYPcHFfBOLtex9Qmtgu7gl2LZK+grFvWjVt27K4yST0rxf44/tFat8MNbg0+Lw072juD/aFy5Mco4LBNo4OM9T+FfPnxD+Pmq65qXiLR7vUpNQ8O3hb7HLZnY8K9Y8YxuHIDA9frXpUMrrV7S2RzVMZTpO3U+ofiH8X/C3gGGP+1NQBupgWhtoF8yWQdBgD3GK8O8TftMNrGn3sfhPTn/tW03PNb6im1xGBy6gHkjuP54ryjwx4OvfHvw2OpaMs9x4m8PXZUxIcvJAx3qVHXcrBsDvz6VoReEPGnjvxjpGvad4dutC1aMKL+7uk8qGSQHBfaQD8y4yo6817VLLcJRv7R3a3u7K/p5nHPGVqnwqyexQtdM1X47eFdb1u5ltZfEGnzebAYBslKYyUIH8PHynsQat/AK9bxl+0F8KNUMhXxBa+KNKjvYm6zxrdRDzR7gcMPx9a9U0X9n228IeMrvxFDrNxbwvI0sdnbKI49p5KMecqD2x078V1/wfs/Cej/GzwUmk2lrFfXWvWMvmwx7s/wClR5w/OO/ANdVPM6UavJSXMtLWW3dehzzwk5QvU0f5+Z+yj/8AIRT/AHP6mv5ZSMHFf1Mv/wAhFeP4P6mrq8Ac19ifN7Dq/lX9K/qnJxX8rOKYH9Uw7V/KxX9U2a/lZIIoAKB1ooHWgD+qfOMV/KwRg1/VMRn8KBwAM0Afys0DrRilAIoA/qmziv5WCMU72pp60Af1UUUUUAFFFFABRRRQA1mwenav5WsD1r+qYgHrQBgUAfys/jS5z1Oa/qmpD0oA/lb7dq/qjHI6fnX8rWSDSE5NAH9U56etNHXH604jNfys5oA/qmFLSDpS0AfysAc9a/qkU5OP1NOIyKAAOlADWODj9a/lbI561/VMQD1oAwKAIDzNz0xzX5AftCXV74E+M2peLdMu5ru1m1y+K+axISZLmRZISewPYeh9qo/8ETufj546z/0LJ/8ASqCrHjnSvEPinxn8V/DkOjtd2E/ifUrq0u5FISCdbmTox4O4ZB54z714+ZJckebY7sLdyaW5xHxY8fS+I/Hmk3es3l7P4MvkjuY7aGUoFhbhuBwWVs5+nXms74ca9L8JfjUdBhvDqWh6jKlurxvuWVX5hl4OM/MOfc16F4U/Z5uZPDzab4wvIrmyjG+zgtSfNt3ON/z9AG4yORkD0rqPD/ws8F/DJDqNrYoLmEMftlyxlkXHXGemOegz1r5WpiKEIOmlfS3ke3CjWclN6HLax43X4g+M73wD4s8HzWOnzCV7O6dsswj/AOWinHoRgg8dK4/wZ+y7BoHiK9u9R1WPUtLkSSFbQQcujZwXOcKRweAeR1FeuarqralqJvbPSonv44TBHqN2NuxWOSp9uCSM/lkGuak1aW7urxJdVe7eExyvp9guHAyMHrgjk5HPGO9ciq1YR5aPuq2vU7XThJ81TV3KvhnQvBvwpae10gLFJcgLKqyGSWXHKg84/PHUetJqXjq/uraSaw09La1eISLeXjhQpJ6Ht+OTUd1ol79pcaTplrYoZBLHNdjzOMndgHO08jGB/Sq7eDIZCJNTvJNQmJO0SOSAD1T3HNcs/ZpudWXM/vNYuW0FZENlJBrckgutTF252yRwKp2qcHOD3B54xW78JdIs9M+K3gkW8Cf8h+wIzk7c3UecelVre0is7VYrZVRF42qOnt+lbvw3UR/FHwSFXDf29p+TjH/L1HXPRnevFQ0V1+ZdRWpSv2MT/gtgB/wv3wL3P/CMj/0qnr87CPev6mn51Ff+uY/mauDpX68fAgenrTRycU4jNfysE0wP6p8ZoAx2r+ViigBQoJ60EbRX9UxGRX8rBOaADNGaKKAP6pyOOlfytds8c1/VKRkYNGMCgBhP15r+VwjnrR61/VN0oAWiiigAooooAKKKKAEJA60A5FIy5PXtX8rWR6UAIBk1/VPkde1I3Q8/lSAehoAdkUA5GRX8rWe3v1r+qUHjrQB/KwBmv6ps5zX8rI604nAx6UANxk0EYNf1Sn15r+Vsjnp+VACAZNf1T5HXtQQSCM03bigB2RQDkZFfytdq/qlHA6/nQBC3Mx/3TX5weO/HVw3jTxNbaXpk120Gu3kE7Mu0JiaQkj1/MdvWviz/AIJofHvSfgL+03YXfiC6i0/Qdfs5NEu72baEt/MdHjd2YgIokjTcx6DPav1E+OPwS1zTfFN/rei6bJqul38jXEkdqu6WGRvvgqOWBPIIz1IrwM4oTq0U4Ru0z1MvqRp1GpO1z5lis9e1SxuJdYmaF42LCKybHmR7SCmMjBPY5/KuX0UXkVoi6Fp0kSzJIGvL5AXDdic445zxnOfUc+ty+HPFDSceFvEGMdBpNxz/AOOVnzeEPFmxiPCuv5xgAaRccf8AjlfG8laN1yP7j6NTp/zfiedHwjPfoV1u/e6DDabeLiMYPXHTP4duvNWItMstMgVbWBYyq7FZR82AB1PXsPyrqrzwb4uYjb4S8RZIwdukXP8A8brGu/h/4ykfjwh4kIIxn+x7n/4iuedPET05Xb0LjOjHVSRgz3EgJVgcLyMday57pZONuQORnk1u3Xw88cBmI8GeJWHQ7dHuef8AyHWXdfDLxvNICngnxOGIH/MFuuP/ABysPq1b+V/ca+2p/wAy+8yJb94w0hAUnggeorQ+Gt69z8VvA+CUH/CQadkN/wBfMdRXPwt8eSysR4J8TgN3XRbocn/tnXu37K/7KXirVfH2jeJ/E+kXGg6JpE63iRXyGOe5mQ5QCM/MAGAJJA6e9d2DwdadaKUXuuhz18RSjTl7y2P0JfnUU/65/wBTX8sp61/UlZ3a3t7JJGQ0a/IGHIOK/luI5NfqPkfECV/VP3r+VgDNf1T5+tMAJA60A5FIRk1/K1kelACAZr+qcHNfysDrTjwMYoA/qmor+Vgc9qM+1AH9UxOBX8rBGKUHB6UE7hQAlFLtJpMUAf1UUUUUAFFFFABRRRQA1mwenav5WsD1r+qYgHrQBgUAfysjr1r+qRT1Ht1pxGRRgAcUAfytDPOPWkI5PNGcZr+qYDAoA/lZA561/VGCTT+tfys+lAH9UhPPNKvQcfnS4zX8rBOTQB/VRSGlpD0oAYeDX8rhHPWj1r+qbpQB/K0Oo5r6u+Av/BS/4z/ATw/aaBa6hY+KdBtE8q1sfEMLzfZ0CqqokiOjhFC4C7sDPTGMfvuRkV/KySaAP0UX/gtf8UgP+RG8H8/7N1/8eoP/AAWx+KQP/Ii+EP8Avm6/+PV+deTX9Uf2eL/nkn/fIoA8/Pi/xSB/yD7H8Vf/AOKr8sP+H2HxT5/4oXwh/wB83X/x6vzqzX9Uf2aL/nmn/fIpWA8/Pi/xT/0D7H/vl/8A4qj/AIS/xT/z4WH/AHy//wAVXoIt4h0iT/vkUfZ4v+eaf98iiyA/G8/8FsPimQR/wgvhDP8Au3X/AMerxv4+f8FLvjP8etAu9Aur+x8K6DeR+VdWPh6F4ftCEMrI8juzlWDYZd2DjpjNfJ9GTTA/qZ0yxFnCqAcAYq9jHav5WKKAAdacRkZ9aaDiv6psYzQAm7Hav5WyB60etf1TdKAP5WQOetf1SKcmnda/lYNAH9Urdcfyr+Vo9f8ACgHFBOTQB/VPj2FIR+Ffys0UAOx3/Sv6pF6dPzr+VnJ9aCcmgD+qiiiigAooooAKKKKAEJA60A5FNYc59ulfytnr0oATrX9U+etIenWv5XCRQA31r+qev5WM5r+qegApD0r+Vn8KB16UAHrX9U3WmkV/K2Tz0oATrX9U+etIenWv5WyRQA3GTQRg1/VLt5BzX8rROTQAUDrRilxt60Af1TZxX8rBGKduHSmk5NAABk0uCDX9UxBIxnFfytFuKAP6pR0pa/lZ69Bmk/CgBOtf1T560N061/K0SDQA3GTQRg1/VLjnrX8rROTQB/VRX8q/pX9U+QK/lZxQB/VMO1fysV/VNnGK/lZIIoA/qn6V/KwaUHnpX9UijBoA/laFf1T9aa3J61/K2Tz0oA/qmJxX8rOK/qmIyKTaQc5/CgBR2r+Viv6pwMV/KxQB/VRRRRQAUUUUAFFFFADWPPNC9Bx+dKRmv5WCcmgAzS53daSgdaAHYGDzX9UoORRjIoAwMCgAx7CkP0r+VmgdaAHd+tJj3r+qYdKWgD+VgDnrSkdM1/VKRkV/KySetAH9UmSMDHav5WiMGjNBOTQB/VORx0r+VojIz05r+qUjIwaAMUAfys7RjOaQjBr+qcjNfysE5oA/qor+VjGa/qnr+Vj0oAcAK/qjHTpS46V/Kx1oA/qnPT1po5OKcRmv5WCaAP6piSD0zX8rRA9aQV/VP0oA/lZ/Gl6nk5r+qaigBhPqKVeg4/OlwOnav5WCcmgAoJJoooAcvTNf1SDkdPzr+VkEignJoA/qnor+ViigD+qYsQelfytED1pBX9U/SgBaKKKACiiigAooooAQkDrQDkUjLk9e1fytZHpQB/VPRX8rH4UfhQB/VPRX8rH4UfhQB/VPRX8rH4UvQ8jFAH9UuR17V/KwRg1/VNtzSgEADNAH8rFf1T96/lYAzX9U4P4UABOK/lYIwa/qmIyetA4AGaAP5Wa/qn71/Kxgmv6pwc0AHev5WK/qnJxX8rBBFAABk0uCDX9UrdOv5V/K2Tx9O9AH9UucCgHIyK/la46frX9Uq9KAP5WKB1r+qfPuKQmgBR2r+Viv6ps4r+VkgigD+qcnFfys4r+qY9PSmjrn9KAHDtX8rFf1Tiv5WKAP6pycDJoyKG6V/K1kY+negD+qXriv5WK/qmWv5WaAP6pycDJozkUEZFfytAjGKAGnrRSnrSYoA/qoooooAKKKKACiiigBO9fysV/VP3r+VigD+qc8DpSA5OMUpGa/lYJoA/qnx7CjHsK/lYooA/qnwDX8rOa/qnr+Vf0oA/qnHSlpB0paAP5WMe9L1PWv6pqQ9KAP5Wtue9IRg9aM1/VMBgUAI3Q8flSA+gr+VoHBr+qfGKAExnqKUDHav5WD1ooAM0oOTzSUdKAP6pgMjmlHFfysUUAL+NGPev6p6Q9KAEAyP8aUDHav5WD1ooA/qnbp0r+VsgCmdK/qnxQAi1/KzX9U/TFfysUAf1Tnmk21/KzRQB/VMSQcV/KyRg0A4oJyaAP6pySB0r+VoqB3/Om9K/qnx1oAbnnp19acOR0r+VnNf1TAYoAWiiigAooooAKKKKAE71/KxX9U/ev5WKAP6qK/lX7V/VOTiv5WSKAEooxRigD+qiv5V/Sv6qK/lX9KAP6p84xX8rBGDX9UxXOKUAgAZoACcDJoyKCeOtfyte3p3oA/qlyOvav5WCMGv6pcZpRwAM0AOopCQKAc0ABIHWgHIpGXJ69q/layPSgBAMmv6pwc0h5BGaAMHrQA6ikJxQDmgD+VgDNf1TZzmv5WhwelKeBjH50AJ61/VN1phHPev5XCeelACV/VOe9fysV/VOe9AH8rB60UHrRQAAZNf1Tg5oIJBGaQLg0AKSB1oByKaw5z7dK/lbPXpQB/VPX8q/XFf1T5r+VrGKAG4oIwa/qlOev6V/K2Rz0/KgD+qeiiigAooooAKKKKAE71/KxX9U/ev5WKAP6pzzQBiv5WKKAP6p8ewox7Cv5WKKAP6pySBnGa/lZIxg+9IDg0ZJNAH9U46UtIOlLQB/KvmlBJpKB1oAdjvmmng9a/qnxmv5WCc0AKOvWv6pFPP9acRkUYAFADSxB6V/K2QPWj1r+qbpQB/KwOT1p2O+aaDiv6p8YoA/lZ6V/VMBiv5WfWv6p6AEI46V/K12z61/VKRkYNAGKAP5WxyK/qjHTpS96/lY60ALgetf1SbsnGPxpxGRRtHpQB/K1tHX3ppGDX9U5Ar+VgnNAH9U9FfysUUAf1TMecYpQOOlfysA1/VOBigD+Vkdetf1SA896cRkUYAFACYz1pQMdq/lYPWigD+qiiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9k=" alt="" />

今天是2017年1月8号,正式接收到一个Symfony 的项目,准备全程记录遇到的问题及解决方法,之前被通知学习该框架,只是一直没有机会做项目,今天终于可以做了,希望2017把Symfony学的能会使用,能够解决基本问题,能够独立新建项目。。。。。2017开始了。。。。。。。。

-------------------------------------------------------------------------------------------------

1月8号,更新代码,由于有两三个月没有看symfony了,上来就遇到了之前的问题,幸好遇到过(以下XXX代表项目名称)哈哈

1:更新代码。。。。。

2:跑项目

问题如下:

  1. $ php bin/console server:run
  2. PHP Warning: require(D:\home\workspace\XXX\app/../vendor/autoload.php): f
  3. ailed to open stream: No such file or directory in D:\home\workspace\XXX\a
  4. pp\autoload.php on line 7
  5. PHP Fatal error: require(): Failed opening required 'D:\home\workspace\XXX
  6. \app/../vendor/autoload.php' (include_path='.;D:\php-5.5.30-nts-Win32-VC11-x64\
  7. pear') in D:\home\workspace\XXX\app\autoload.php on line 7

解释:没有安装依赖包

问题解决:执行$ php cocomposer.json  composer.lock  composer.phar

运行后如下:

  1. Loading composer repositories with package information
  2. Installing dependencies (including require-dev) from lock file
  3. Package operations: 33 installs, 0 updates, 0 removals
  4. - Installing doctrine/lexer (v1.0.1) Loading from cache
  5. - Installing doctrine/annotations (v1.2.7) Loading from cache
  6. - Installing twig/twig (v1.28.2) Downloading: 100%
  7. - Installing symfony/polyfill-util (v1.3.0) Downloading: 100%
  8. - Installing paragonie/random_compat (v2.0.4) Downloading: 100%
  9. - Installing symfony/polyfill-php70 (v1.3.0) Downloading: 100%
  10. - Installing symfony/polyfill-php56 (v1.3.0) Downloading: 100%
  11. - Installing symfony/polyfill-mbstring (v1.3.0) Downloading: 100%
  12. - Installing symfony/symfony (v3.2.1) Downloading: 100%
  13. - Installing symfony/polyfill-intl-icu (v1.3.0) Downloading: 100%
  14. - Installing psr/log (1.0.2) Loading from cache
  15. - Installing psr/cache (1.0.1) Loading from cache
  16. - Installing doctrine/inflector (v1.1.0) Loading from cache
  17. - Installing doctrine/collections (v1.3.0) Loading from cache
  18. - Installing doctrine/cache (v1.6.1) Loading from cache
  19. - Installing doctrine/common (v2.6.2) Downloading: 100%
  20. - Installing jdorn/sql-formatter (v1.2.17) Loading from cache
  21. - Installing doctrine/doctrine-cache-bundle (1.3.0) Loading from cache
  22. - Installing doctrine/dbal (v2.5.5) Loading from cache
  23. - Installing doctrine/doctrine-bundle (1.6.4) Loading from cache
  24. - Installing doctrine/instantiator (1.0.5) Loading from cache
  25. - Installing doctrine/orm (v2.5.5) Loading from cache
  26. - Installing incenteev/composer-parameter-handler (v2.1.2) Loading from cache
  27. - Installing sensiolabs/security-checker (v4.0.0) Loading from cache
  28. - Installing sensio/distribution-bundle (v5.0.15) Downloading: 100%
  29. - Installing sensio/framework-extra-bundle (v3.0.16) Loading from cache
  30. - Installing monolog/monolog (1.22.0) Downloading: 100%
  31. - Installing symfony/monolog-bundle (3.0.1) Downloading: 100%
  32. - Installing symfony/polyfill-apcu (v1.3.0) Downloading: 100%
  33. - Installing swiftmailer/swiftmailer (v5.4.4) Downloading: 100%
  34. - Installing symfony/swiftmailer-bundle (v2.4.0) Downloading: 100%
  35. - Installing sensio/generator-bundle (v3.1.2) Downloading: 100%
  36. - Installing symfony/phpunit-bridge (v3.2.1) Downloading: 100%
  37. paragonie/random_compat suggests installing ext-libsodium (Provides a modern cry
  38. pto API that can be used to generate random bytes.)
  39. doctrine/doctrine-cache-bundle suggests installing symfony/security-acl (For usi
  40. ng this bundle to cache ACLs)
  41. sensio/framework-extra-bundle suggests installing symfony/psr-http-message-bridg
  42. e (To use the PSR-7 converters)
  43. monolog/monolog suggests installing aws/aws-sdk-php (Allow sending log messages
  44. to AWS services like DynamoDB)
  45. monolog/monolog suggests installing doctrine/couchdb (Allow sending log messages
  46. to a CouchDB server)
  47. monolog/monolog suggests installing ext-amqp (Allow sending log messages to an A
  48. MQP server (1.0+ required))
  49. monolog/monolog suggests installing ext-mongo (Allow sending log messages to a M
  50. ongoDB server)
  51. monolog/monolog suggests installing graylog2/gelf-php (Allow sending log message
  52. s to a GrayLog2 server)
  53. monolog/monolog suggests installing mongodb/mongodb (Allow sending log messages
  54. to a MongoDB server via PHP Driver)
  55. monolog/monolog suggests installing php-amqplib/php-amqplib (Allow sending log m
  56. essages to an AMQP server using php-amqplib)
  57. monolog/monolog suggests installing php-console/php-console (Allow sending log m
  58. essages to Google Chrome)
  59. monolog/monolog suggests installing rollbar/rollbar (Allow sending log messages
  60. to Rollbar)
  61. monolog/monolog suggests installing ruflin/elastica (Allow sending log messages
  62. to an Elastic Search server)
  63. monolog/monolog suggests installing sentry/sentry (Allow sending log messages to
  64. a Sentry server)
  65. Generating autoload files
  66. > Incenteev\ParameterHandler\ScriptHandler::buildParameters
  67. Creating the "app/config/parameters.yml" file
  68. Some parameters are missing. Please provide them.
  69. database_host (127.0.0.1):
  70. database_port (null):
  71. database_name (symfony):
  72. database_user (root):
  73. database_password (null):
  74. mailer_transport (smtp):
  75. mailer_host (127.0.0.1):
  76. mailer_user (null):
  77. mailer_password (null):
  78. secret (ThisTokenIsNotSoSecretChangeIt):
  79. > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap
  80. > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache
  81.  
  82. // Clearing the cache for the dev environment with debug
  83. // true
  84.  
  85. [OK] Cache for the "dev" environment (debug=true) was successfully cleared.
  86.  
  87. > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installAssets
  88.  
  89. Trying to install assets as relative symbolic links.
  90.  
  91. --------- ------------- ----------------
  92. Bundle Method / Error
  93. --------- ------------- ----------------
  94. WARNING XinXiBundle copy
  95. --------- ------------- ----------------
  96.  
  97. ! [NOTE] Some assets were installed via copy. If you make changes to these
  98. ! assets you have to run this command again.
  99.  
  100. [OK] All assets were successfully installed.
  101.  
  102. > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installRequirementsFi
  103. le
  104. > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::prepareDeploymentTarg
  105. et

运行中以下部分是要输入的:但是我都默认的回车,过一会再研究

  1. Some parameters are missing. Please provide them.
  2. database_host (127.0.0.1):
  3. database_port (null):
  4. database_name (symfony):
  5. database_user (root):
  6. database_password (null):
  7. mailer_transport (smtp):
  8. mailer_host (127.0.0.1):
  9. mailer_user (null):
  10. mailer_password (null):
  11. secret (ThisTokenIsNotSoSecretChangeIt):

上面这些代码不用管,一路回车就好;

今天是1月9号

3:接下来创建数据库(我使用的是PostgreSQL,当然Mysql也行)

(官方数据库配置教程英文http://symfony.com/doc/master/doctrine.html;中文http://www.symfonychina.com/doc/current/doctrine.html)

1〉找到项目目录中的/app/config.yml

找到doctrine:将以下代码替换

  1. doctrine:
  2. dbal:
  3. driver: "%database_driver%"
  4. host: "%database_host%"
  5. port: "%database_port%"
  6. dbname: "%database_name%"
  7. user: "%database_user%"
  8. password: "%database_password%"
  9. charset: UTF8

2〉找到项目目录中的/app/config.yml

把下面代码替换进去

  1. parameters:
  2. database_driver: pdo_pgsql --驱动,如果没有需要下载,我记得还需要更改一个php的配置文件,
  3. database_host: localhost
  4. database_port: 5432
  5. database_name: 数据库名称
  6. database_user: 数据库用户名 --我还不知道怎么自动创建
  7. database_password: 数据库用户密码--我还不知道怎么自动创建
  8. mailer_transport: smtp
  9. mailer_host: localhost
  10. mailer_user: 111@wqwqww.com(随便)
  11. mailer_password: llkjjkljlk(随便)
  12. secret: ThisTokenIsNotSoSecretChangeIt

3〉好了你只需要执行一句命令就可以了如下

  1. $ php bin/console doctrine:database:create
  2. --显示成功
  3. Created database "XXXX" for connection named default

创建数据库(以上之创建了一个数据库,后来发现不怎么对)2:

(项目开发中往往会创建三个数据库dev,prod,test;我的这个项目中有个数据库创建脚本db.sql,执行psql -Upsotgres<db.sql就可以创建了,当然这只是PostgresSQL 的命令)

1>脚本如下:

  1. create user XXX with password 'XXX' ;
  2. ALTER USER XXX WITH PASSWORD 'XXX';
  3.  
  4. create database XXX_dev with encoding='utf8' ;
  5. create database XXX_prod with encoding='utf8' ;
  6. create database XXX_test with encoding='utf8' ;
  7.  
  8. grant all privileges on database XXX_dev to XXX ;
  9. grant all privileges on database XXX_test to XXX;
  10. grant all privileges on database XXX_prod to XXX;
  11.  
  12. \connect XXX_dev;
  13. create schema extensions;
  14. create extension hstore schema extensions;
  15. ALTER DATABASE XXX_dev SET search_path to "$user",public,extensions;
  16. alter database XXX_dev owner to XXX;
  17. alter schema public owner to XXX;
  18. alter schema extensions owner to XXX;
  19. GRANT USAGE ON SCHEMA public to XXX;
  20.  
  21. \connect XXX_prod;
  22. create schema extensions;
  23. create extension hstore schema extensions;
  24. ALTER DATABASE XXX_dev SET search_path to "$user",public,extensions;
  25. alter database XXX_dev owner to XXX;
  26. alter schema public owner to XXX;
  27. alter schema extensions owner to XXX;
  28. GRANT USAGE ON SCHEMA public to XXX;
  29.  
  30. \connect XXX_test;
  31. create schema extensions;
  32. create extension hstore schema extensions;
  33. ALTER DATABASE XXX_dev SET search_path to "$user",public,extensions;
  34. alter database XXX_dev owner to XXX;
  35. alter schema public owner to XXX;
  36. alter schema extensions owner to XXX;
  37. GRANT USAGE ON SCHEMA public to XXX;

2>好了,按照开发,生产,测试的方式创建吧;数据库脚本执行完后,你就发现你的Postgresql数据库了增加了三个数据库分别是XXX_dev,XXX_prod,XXX_test那么有三个文件需要配置分别是

3>config_dev,config_prod,config_test这三个文件分别配置数据库信息,分别都添加上:

  1. doctrine:
  2. dbal:
  3. driver: pdo_pgsql
  4. host: "%database_host%"
  5. port: "%database_port%"
  6. dbname: "%database_name_dev%"
  7. user: "%database_user%"
  8. password: "%database_password%"
  9. charset: UTF8

  4〉千万别忘了配置parameters.yml.dist,要不然引入第三方Bundle时会找不到database_name

  代码如下:

  1. # This file is a "template" of what your parameters.yml file should look like
  2. # Set parameters here that may be different on each deployment target of the app, e.g. development, staging, production.
  3. # http://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration
  4. parameters:
  5. database_host: 127.0.0.1
  6. database_port: ~
  7. database_name_dev: xinxi_dev
  8. database_name_test: xinxi_test
  9. database_name_prod: xinxi_prod
  10. database_user: xinxi
  11. database_password: xinxi
  12. # You should uncomment this if you want use pdo_sqlite
  13. # database_path: "%kernel.root_dir%/data.db3"
  14.  
  15. mailer_transport: smtp
  16. mailer_host: localhost
  17. mailer_user: 111@wqwqww.com
  18. mailer_password: llkjjkljlk
  19.  
  20. # A secret key that's used to generate certain security-related tokens
  21. secret: ThisTokenIsNotSoSecretChangeIt

4 。到现在为止运行项目还是正常启动,好了,现在开始创建Bundle(什么是Bundle自行官网我现在也不懂,现学现查吧),我的项目目录结构为src/项目名/Bundle名;

创建bundle的命令(我习惯命令执行,当然可以手工创建,例如别人家的博客写得http://blog.csdn.net/mieshihanyu/article/details/47104917)

  

  1. $ php bin/console generate:bundle --namespace=项目名/Bundle

我的目录结构如图'

  运行如下:其中需要提示几点(交互内容在代码中标注,可参照http://oskarcalvo.com/php-appconsole-generatebundle-en-la-versi%C3%B3n-28-de-symfony)

  1. $ php bin/console generate:bundle --namespace=XXX/CompanyBundle
  2.  
  3. Welcome to the Symfony bundle generator!
  4.  
  5. Are you planning on sharing this bundle across multiple applications? [no]: (直接回车就可以,这里还不知道具体干什么的)
  6.  
  7. Your application code must be written in bundles. This command helps
  8. you generate them easily.
  9.  
  10. Give your bundle a descriptive name, like BlogBundle.
  11. Bundle name [XXX/CompanyBundle]:(直接回车就可以,如果自己写名称的话需要注意Bundle在名称的后面且B要大写,这应该是约定吧)
  12.  
  13. In your code, a bundle is often referenced by its name. It can be the
  14. concatenation of all namespace parts but it's really up to you to come
  15. up with a unique name (a good practice is to start with the vendor name).
  16. Based on the namespace, we suggest XinCompanyBundle.
  17.  
  18. Bundle name [XXXCompanyBundle]:(直接回车就可以,默认创建一个XXXCompanyBundle,如果你要自己名命也会直接在src目录下生成Bundle,不会在XXX项目下生成Bundle)
  19.  
  20. Bundles are usually generated into the src/ directory. Unless you're doing something custom, hit enter to keep this default!
  21.  
  22. Target Directory [src/]:(直接回车就可以)
  23.  
  24. What format do you want to use for your generated configuration?
  25.  
  26. Configuration format (annotation, yml, xml, php) [annotation]:(直接回车就可以,默认就是annotation了)
  27.  
  28. Bundle generation
  29.  
  30. (以下就是生成的文件以及修改的文件)
  31. > Generating a sample bundle skeleton into D:\home\workspace\quanxinxi\app/../sr
  32. c/Xin/CompanyBundle
  33. created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/
  34. created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/XinCompanyBun
  35. dle.php
  36. created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/Controller/
  37. created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/Controller/De
  38. faultController.php
  39. created D:\home\workspace\XXXX\app/../tests/XinCompanyBundle/Controller/
  40. created D:\home\workspace\XXXX\app/../tests/XinCompanyBundle/Controller/D
  41. efaultControllerTest.php
  42. created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/Resources/vie
  43. ws/Default/
  44. created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/Resources/vie
  45. ws/Default/index.html.twig
  46. created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/Resources/con
  47. fig/
  48. created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/Resources/con
  49. fig/services.yml
  50. > Checking that the bundle is autoloaded
  51. > Enabling the bundle inside D:\home\workspace\XXXX\app\AppKernel.php
  52. updated D:\home\workspace\quanxinxi\app\AppKernel.php
  53. > Importing the bundle's routes from the D:\home\workspace\XXXX\app\config\
  54. routing.yml file
  55. updated D:\home\workspace\XXXX\app/config/routing.yml
  56. > Importing the bundle's services.yml from the D:\home\workspace\XXXX\app\config\config.yml file
  57. updated D:\home\workspace\XXXX\app/config/config.yml
  58.  
  59. Everything is OK! Now get to work :).

到现在项目还是正常启动;

那么接下来就命令创建实体什么的了;

5。 创建实体:

依旧执行命令:

  1. $ php bin/console doctrine:generate:entity

运行如下:中间会与你交互,如下注视

  1. $ php bin/console doctrine:generate:entity
  2.  
  3. Welcome to the Doctrine2 entity generator
  4.  
  5. This command helps you generate Doctrine2 entities.
  6.  
  7. First, you need to give the entity name you want to generate.
  8. You must use the shortcut notation like AcmeBlogBundle:Post.(--这里是告诉你创建一个这样的实体Bundle名字:实体名字,只以Bundle名字需要加上你的项目名字XXXBundle名字)
  9.  
  10. The Entity shortcut name: Company (这样写就不对了,我本以为就是名字呢)
  11. The entity name isn't valid ("Company" given, expecting something like AcmeBlog
  12. Bundle:Blog/Post)
  13. The Entity shortcut name: CompanyBundle:Company(让我重新输入,我以为这样写就对了呢,XXXBundle:要创建的实体名)
  14. Bundle "CompanyBundle" does not exist.
  15. The Entity shortcut name: /Xin/CompanyBundle:Company(又让我重新输入,我想上面写的不对是不是因为命名空间没写呢?于是这样写还不对)
  16. The entity name isn't valid ("/Xin/CompanyBundle:Company" given, expecting some
  17. thing like AcmeBlogBundle:Blog/Post)
  18. The Entity shortcut name: XinCompanyBundle:Company(这次终于对了,要这样写啊啊啊啊啊啊,可能是种约定吧,这样写---项目明Bundle名:实体名字)
  19.  
  20. Determine the format to use for the mapping information.
  21.  
  22. Configuration format (yml, xml, php, or annotation) [annotation]: yml(这里我用的是yml,果然到了下面步骤出错了,需要使用annotation
  23.  
  24. Instead of starting with a blank entity, you can add some fields now.
  25. Note that the primary key will be added automatically (named id).(自动给你创建了id
  26.  
  27. Available types: array, simple_array, json_array, object,
  28. boolean, integer, smallint, bigint, string, text, datetime, datetimetz,
  29. date, time, decimal, float, binary, blob, guid.
  30.  
  31. New field name (press <return> to stop adding fields): name (接下来就是要创建字段了,以下都是创建字段)
  32. Field type [string]: (字段类型)
  33. Field length [255]:  (字段长度)
  34. Is nullable [false]: (是否为空)
  35. Unique [false]:      (是否唯一)
  36. (直接回车,创建第二个字段)
  37. New field name (press <return> to stop adding fields): remark
  38. Field type [string]:
  39. Field length [255]:
  40. Is nullable [false]:
  41. Unique [false]:
  42.  
  43. New field name (press <return> to stop adding fields): status
  44. Field type [string]: boolean
  45. Is nullable [false]:
  46. Unique [false]:
  47.  
  48. New field name (press <return> to stop adding fields): enabled
  49. Field type [string]: boolean
  50. Is nullable [false]:
  51. Unique [false]:
  52.  
  53. New field name (press <return> to stop adding fields): created
  54. Field type [string]: datetimetz
  55. Is nullable [false]:
  56. Unique [false]:
  57.  
  58. New field name (press <return> to stop adding fields): modified
  59. Field type [string]: datetimetz
  60. Is nullable [false]:
  61. Unique [false]:
  62.  
  63. New field name (press <return> to stop adding fields): staff
  64. Field type [string]:
  65. Field length [255]:
  66. Is nullable [false]:
  67. Unique [false]:
  68.  
  69. New field name (press <return> to stop adding fields): address
  70. Field type [string]:
  71. Field length [255]:
  72. Is nullable [false]:
  73. Unique [false]:
  74.  
  75. New field name (press <return> to stop adding fields): phone
  76. Field type [string]:
  77. Field length [255]:
  78. Is nullable [false]:
  79. Unique [false]:
  80.  
  81. New field name (press <return> to stop adding fields): industries
  82. Field type [string]:
  83. Field length [255]:
  84. Is nullable [false]:
  85. Unique [false]:
  86.  
  87. New field name (press <return> to stop adding fields):
  88.  
  89. Entity generation
  90.  
  91.   (成功创建了以下文件)
  92. created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Entity/
  93. created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Entity/Company.php
  94. created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Resources/config/doc
  95. trine/
  96. created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Resources/config/doc
  97. trine/Company.orm.yml
  98. > Generating entity class D:\home\workspace\XXXX\src\Xin\CompanyBundle\Enti
  99. ty\Company.php: OK!
  100. > Generating repository class D:\home\workspace\XXXX\src\Xin\CompanyBundle\
  101. Repository\CompanyRepository.php: OK!
  102. > Generating mapping file D:\home\workspace\XXXX\src\Xin\CompanyBundle\Reso
  103. urces\config\doctrine\Company.orm.yml: OK!
  104.  
  105. Everything is OK! Now get to work :).

采用注解annotation生成的实体如下

  1. <?php
  2.  
  3. namespace Xin\CompanyBundle\Entity;
  4.  
  5. use Doctrine\ORM\Mapping as ORM;
  6.  
  7. /**
  8. * Company
  9. *
  10. * @ORM\Table(name="company")
  11. * @ORM\Entity(repositoryClass="Xin\CompanyBundle\Repository\CompanyRepository")
  12. */
  13. class Company
  14. {
  15. /**
  16. * @var int
  17. *
  18. * @ORM\Column(name="id", type="integer")
  19. * @ORM\Id
  20. * @ORM\GeneratedValue(strategy="AUTO")
  21. */
  22. private $id;
  23.  
  24. /**
  25. * @var string
  26. *
  27. * @ORM\Column(name="name", type="string", length=255)
  28. */
  29. private $name;
  30.  
  31. /**
  32. * @var string
  33. *
  34. * @ORM\Column(name="remark", type="string", length=255)
  35. */
  36. private $remark;
  37.  
  38. /**
  39. * @var bool
  40. *
  41. * @ORM\Column(name="status", type="boolean")
  42. */
  43. private $status;
  44.  
  45. /**
  46. * @var bool
  47. *
  48. * @ORM\Column(name="enabled", type="boolean")
  49. */
  50. private $enabled;
  51.  
  52. /**
  53. * @var \DateTime
  54. *
  55. * @ORM\Column(name="created", type="datetime")
  56. */
  57. private $created;
  58.  
  59. /**
  60. * @var string
  61. *
  62. * @ORM\Column(name="address", type="string", length=255)
  63. */
  64. private $address;
  65.  
  66. /**
  67. * @var string
  68. *
  69. * @ORM\Column(name="phone", type="string", length=255)
  70. */
  71. private $phone;
  72.  
  73. /**
  74. * @var string
  75. *
  76. * @ORM\Column(name="industries", type="string", length=255)
  77. */
  78. private $industries;
  79.  
  80. /**
  81. * @var string
  82. *
  83. * @ORM\Column(name="staff", type="string", length=255)
  84. */
  85. private $staff;
  86.  
  87. /**
  88. * Get id
  89. *
  90. * @return int
  91. */
  92. public function getId()
  93. {
  94. return $this->id;
  95. }
  96.  
  97. /**
  98. * Set name
  99. *
  100. * @param string $name
  101. *
  102. * @return Company
  103. */
  104. public function setName($name)
  105. {
  106. $this->name = $name;
  107.  
  108. return $this;
  109. }
  110.  
  111. /**
  112. * Get name
  113. *
  114. * @return string
  115. */
  116. public function getName()
  117. {
  118. return $this->name;
  119. }
  120.  
  121. /**
  122. * Set remark
  123. *
  124. * @param string $remark
  125. *
  126. * @return Company
  127. */
  128. public function setRemark($remark)
  129. {
  130. $this->remark = $remark;
  131.  
  132. return $this;
  133. }
  134.  
  135. /**
  136. * Get remark
  137. *
  138. * @return string
  139. */
  140. public function getRemark()
  141. {
  142. return $this->remark;
  143. }
  144.  
  145. /**
  146. * Set status
  147. *
  148. * @param boolean $status
  149. *
  150. * @return Company
  151. */
  152. public function setStatus($status)
  153. {
  154. $this->status = $status;
  155.  
  156. return $this;
  157. }
  158.  
  159. /**
  160. * Get status
  161. *
  162. * @return bool
  163. */
  164. public function getStatus()
  165. {
  166. return $this->status;
  167. }
  168.  
  169. /**
  170. * Set enabled
  171. *
  172. * @param boolean $enabled
  173. *
  174. * @return Company
  175. */
  176. public function setEnabled($enabled)
  177. {
  178. $this->enabled = $enabled;
  179.  
  180. return $this;
  181. }
  182.  
  183. /**
  184. * Get enabled
  185. *
  186. * @return bool
  187. */
  188. public function getEnabled()
  189. {
  190. return $this->enabled;
  191. }
  192.  
  193. /**
  194. * Set created
  195. *
  196. * @param \DateTime $created
  197. *
  198. * @return Company
  199. */
  200. public function setCreated($created)
  201. {
  202. $this->created = $created;
  203.  
  204. return $this;
  205. }
  206.  
  207. /**
  208. * Get created
  209. *
  210. * @return \DateTime
  211. */
  212. public function getCreated()
  213. {
  214. return $this->created;
  215. }
  216.  
  217. /**
  218. * Set address
  219. *
  220. * @param string $address
  221. *
  222. * @return Company
  223. */
  224. public function setAddress($address)
  225. {
  226. $this->address = $address;
  227.  
  228. return $this;
  229. }
  230.  
  231. /**
  232. * Get address
  233. *
  234. * @return string
  235. */
  236. public function getAddress()
  237. {
  238. return $this->address;
  239. }
  240.  
  241. /**
  242. * Set phone
  243. *
  244. * @param string $phone
  245. *
  246. * @return Company
  247. */
  248. public function setPhone($phone)
  249. {
  250. $this->phone = $phone;
  251.  
  252. return $this;
  253. }
  254.  
  255. /**
  256. * Get phone
  257. *
  258. * @return string
  259. */
  260. public function getPhone()
  261. {
  262. return $this->phone;
  263. }
  264.  
  265. /**
  266. * Set industries
  267. *
  268. * @param string $industries
  269. *
  270. * @return Company
  271. */
  272. public function setIndustries($industries)
  273. {
  274. $this->industries = $industries;
  275.  
  276. return $this;
  277. }
  278.  
  279. /**
  280. * Get industries
  281. *
  282. * @return string
  283. */
  284. public function getIndustries()
  285. {
  286. return $this->industries;
  287. }
  288.  
  289. /**
  290. * Set staff
  291. *
  292. * @param string $staff
  293. *
  294. * @return Company
  295. */
  296. public function setStaff($staff)
  297. {
  298. $this->staff = $staff;
  299.  
  300. return $this;
  301. }
  302.  
  303. /**
  304. * Get staff
  305. *
  306. * @return string
  307. */
  308. public function getStaff()
  309. {
  310. return $this->staff;
  311. }
  312. }

好了实体创建完了,(但是如何用命令生成带有关联关系的实体呢?我还不知道,以后再说,接下来就要写crud了吧)

创建entity之后,你应该使用以下命令来验证映射(mappings):

  1. $ php bin/console doctrine:schema:validate
  1. 运行结果:
  1. $  php bin/console doctrine:schema:validate
    [Mapping]  OK - The mapping files are correct.
    [Database] FAIL - The database schema is not in sync with the current mapping fi
    le.

6 , 接下来就要生成数据库表了:

  1. $ php bin/console doctrine:schema:update --force
    Updating database schema...
    Database schema updated successfully! "3" queries were executed

看了一下数据库果然生成了一张company表,中间的映射关系还有没有呢,还不知道怎么弄先这样;

7,这时候应该写crud了吧,试试;

(中间会有交互过程,如中文注视)

  1. $ php bin/console generate:doctrine:crud
  2.  
  3. Welcome to the Doctrine2 CRUD generator
  4.  
  5. This command helps you generate CRUD controllers and templates.
  6.  
  7. First, give the name of the existing entity for which you want to generate a CRUD
  8. (use the shortcut notation like AcmeBlogBundle:Post)(例如这样写)
  9.  
  10. The Entity shortcut name: XinCompanyBundle:Company (我的Bundle写法,这次就知道怎么写名字了,新建实体的时候已经用过了)
  11.  
  12. By default, the generator creates two actions: list and show.
  13. You can also ask it to generate "write" actions: new, update, and delete.
  14.  
  15. Do you want to generate the "write" actions [no]? yes(其实以下所有交互你都可以默认回车,这里如果选择no,那么就不会生成创建,编辑的方法了,
    如果你不需要更改的话,我选择 yes,直接全部生成出来)
  16.  
  17. Determine the format to use for the generated CRUD.
  18.  
  19. Configuration format (yml, xml, php, or annotation) [annotation]: (还是直接使用annotation注解吧)
  20.  
  21. Determine the routes prefix (all the routes will be "mounted" under this
  22. prefix: /prefix/, /prefix/new, ...).
  23.  
  24. Routes prefix [/company]:(这里要你输入路由,我默认的,其实默认就可以了,默认的还比较规范)
  25.  
  26. Summary before generation
  27.  
  28. You are going to generate a CRUD controller for "XinCompanyBundle:Company"
  29. using the "yml" format.
  30.  
  31. Do you confirm generation [yes]?(回车)
  32.  
  33. CRUD generation
  34.  
  35. (创建了这么多文件)
  36. created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Controller//CompanyController.php
  37. created D:\home\workspace\XXXX\app/Resources/views/company/
  38. created D:\home\workspace\XXXX\app/Resources/views/company/index.html.twig
  39. created D:\home\workspace\XXXX\app/Resources/views/company/show.html.twig
  40. created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Tests/Controller/
  41. created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Tests/Controller//CompanyControllerTest.php
  42. created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Resources/config/routing/
  43. created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Resources/config/routing/company.yml
  44. Generating the CRUD code: OK
  45. Updating the routing: Confirm automatic update of the Routing [yes]?
  46. Importing the CRUD routes: created D:\home\workspace\quanxinxi\src\Xin\CompanyBundle/Resources/config/routing.yml

  47. (这就报错了,一定就是我创建Bundle的时候选择了annotation 而创建实体的时候选择了yml,对就是这里出错了)
  48. [ERROR] The bundle's "Resources/config/routing.yml" file cannot be importedfrom "app/config/routing.yml" because the "XinCompanyBundle" bundle is already
    imported.
    Make sure you are not using two different configuration/routing formats in the same bundle because it won't work.
  49. OK
  50.  
  51. Everything is OK! Now get to work :).

这个错误;(需要修改系统中的php.ini)

  1. datefmt_create: no such time zone: 'utc': U_ILLEGAL_ARGUMENT_ERROR
  2. 500 Internal Server Error - InvalidOptionsException

问题解决如下

  1. [Date]
  2. ; Defines the default timezone used by the date functions
  3. ; http://php.net/date.timezone
  4. date.timezone = "PRC" 找到这一行,去掉前面的;号,然后改为="PRC

到现在为止CRUD已经生成了;不过遗憾的是views生成目录放在了app/Resources目录下了,所以需要手工改一下目录;I

移动前

如图移动后

现在运行的话,那么bug就出来了

如下:

  1. Unable to find template "company/index.html.twig" (looked into: D:\home\workspace\XXXX\app/Resources/views,
    D:\home\workspace\XXXX\vendor\symfony\symfony\src\Symfony\Bridge\Twig/Resources/views/Form).
  2. 500 Internal Server Error - InvalidArgumentException
  3. 1 linked Exception:
  4.  
  5. Twig_Error_Loader »

这个bug 是说找不到模板了,不要着急,首先找到你的controller,先看第一个方法中代码如下
(注释就是更改方法,那么show,edit,new,,,,,,方法的render都改成如下注释中的格式就ok了)

  1. /**
  2. * Lists all company entities.
  3. *
  4. * @Route("/", name="company_index")
  5. * @Method("GET")
  6. */
  7. public function indexAction()
  8. {
  9. $em = $this->getDoctrine()->getManager();
  10.  
  11. $companies = $em->getRepository('XinCompanyBundle:Company')->findAll();
  12.  
  13. return $this->render('company/index.html.twig',//就是这里你改成 XXXBundle:实体名:index.html.twig(我的XinCompanyBundle:Company:index.html.twig
                                                                  其中Xin是你的项目名)
           array(
  14. 'companies' => $companies,
  15. ));
  16. }

好了CRUD也写好了,那么我又给我的Bundle添加了一个布局模板,如下:

代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>{% block title %}企业管理{% endblock %}</title>
  6. {% block stylesheets %}{% endblock %}
  7. <link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
  8. {% block header %}{% endblock %}
  9. </head>
  10. <body>
  11. {% block body %}{% endblock %}
  12. {% block javascripts %}{% endblock %}
  13. {% block footer %}{% endblock %}
  14. </body>
  15. </html>

这样的话在CRUD的页面就可以继承这个页面了

代码如下(如index.html.twig):

  1. {% extends 'XinCompanyBundle::company.layout.html.twig' %}    --继承 bundle名称::模板名称
  2.  
  3. {% block body %}
  4. <h1>Companies list</h1>
  5.  
  6. <table>
  7. <thead>
  8. <tr>
  9. <th>Id</th>
  10. <th>Name</th>
  11. <th>Phone</th>
  12. <th>Address</th>
  13. <th>Industries</th>
  14. <th>Member</th>
  15. <th>Remark</th>
  16. <th>Status</th>
  17. <th>Enabled</th>
  18. <th>Created</th>
  19. <th>Modified</th>
  20. <th>Actions</th>
  21. </tr>
  22. </thead>
  23. <tbody>
  24. {% for company in companies %}
  25. <tr>
  26. <td><a href="{{ path('company_show', { 'id': company.id }) }}">{{ company.id }}</a></td>
  27. <td>{{ company.name }}</td>
  28. <td>{{ company.phone }}</td>
  29. <td>{{ company.address }}</td>
  30. <td>{{ company.industries }}</td>
  31. <td>{{ company.member }}</td>
  32. <td>{{ company.remark }}</td>
  33. <td>{% if company.status %}Yes{% else %}No{% endif %}</td>
  34. <td>{% if company.enabled %}Yes{% else %}No{% endif %}</td>
  35. <td>{% if company.created %}{{ company.created|date('Y-m-d H:i:s') }}{% endif %}</td>
  36. <td>{% if company.modified %}{{ company.modified|date('Y-m-d H:i:s') }}{% endif %}</td>
  37. <td>
  38. <ul>
  39. <li>
  40. <a href="{{ path('company_show', { 'id': company.id }) }}">show</a>
  41. </li>
  42. <li>
  43. <a href="{{ path('company_edit', { 'id': company.id }) }}">edit</a>
  44. </li>
  45. </ul>
  46. </td>
  47. </tr>
  48. {% endfor %}
  49. </tbody>
  50. </table>
  51.  
  52. <ul>
  53. <li>
  54. <a href="{{ path('company_new') }}">Create a new company</a>
  55. </li>
  56. </ul>
  57. {% endblock %}

ok 今天就写到这里,明天继续做任务

-------------------------------------------------------------------------------------------------------------------〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉

今天1月11号

今天登陆系统发现主页不见了;好吧路有出错了,把/company加到app/config/routing.yml中;ok可以了。

今天目标就是把包结构整理好,到现在为止前面的设计,代码等觉得都不是规整,既然做项目就要规范一些,

1:调整代码结构,2:把用户,权限,登陆都写好;

开始:我现在写用户,因为这里比较急用;

1〉我先要安装一个Bundle(至于为什么,现在我也不知道)

命令如下:

composer require friendsofsymfony/user-bundle "~2.0@dev"

总是给我报这个错!!!!!!!!!!!!!!!!!!

  1. Loading composer repositories with package information
  2. Updating dependencies (including require-dev)
  3. Nothing to install or update
  4. Generating autoload files
  5. > Incenteev\ParameterHandler\ScriptHandler::buildParameters
  6. Updating the "app/config/parameters.yml" file
  7. Some parameters are missing. Please provide them.
  8. database_name (symfony): 总是要我输入,最后终于找到哪里没有配置了,  parameters.yml.dist,这个文件我竟然没有配置数据库信息;

当然你还有不时地清理一下缓存,命令如下

  1. $ php bin/console cache:clear # 清除缓存

最终安装上User那个Bundle

运行如下:

  1. $ composer require friendsofsymfony/user-bundle "~2.0@dev"
  2. ./composer.json has been updated
  3. Loading composer repositories with package information
  4. Updating dependencies (including require-dev)
  5. - Removing twig/twig (v1.30.0)
  6. - Installing twig/twig (v1.28.2)
  7. Loading from cache
  8.  
  9. - Removing doctrine/orm (v2.5.6)
  10. - Installing doctrine/orm (v2.5.5)
  11. Loading from cache
  12.  
  13. - Removing doctrine/doctrine-bundle (1.6.6)
  14. - Installing doctrine/doctrine-bundle (1.6.4)
  15. Loading from cache
  16.  
  17. - Removing swiftmailer/swiftmailer (v5.4.5)
  18. - Installing swiftmailer/swiftmailer (v5.4.4)
  19. Loading from cache
  20.  
  21. - Removing symfony/swiftmailer-bundle (v2.4.2)
  22. - Installing symfony/swiftmailer-bundle (v2.4.0)
  23. Loading from cache
  24.  
  25. - Removing symfony/monolog-bundle (v3.0.3)
  26. - Installing symfony/monolog-bundle (3.0.1)
  27. Loading from cache
  28.  
  29. - Removing sensio/distribution-bundle (v5.0.18)
  30. - Installing sensio/distribution-bundle (v5.0.15)
  31. Loading from cache
  32.  
  33. - Removing sensio/framework-extra-bundle (v3.0.19)
  34. - Installing sensio/framework-extra-bundle (v3.0.16)
  35. Loading from cache
  36.  
  37. - Installing friendsofsymfony/user-bundle (dev-master e889095)
  38. Cloning e889095060584db187784d4b6e2d1efcff2de242
  39. Failed to download friendsofsymfony/user-bundle from source: Failed to clone
  40. https://github.com/FriendsOfSymfony/FOSUserBundle.git via https, ssh protocols,
  41. aborting.
  42.  
  43. - https://github.com/FriendsOfSymfony/FOSUserBundle.git
  44. Cloning into 'D:\home\workspace\XXXX\vendor\friendsofsymfony\user-bundle'
  45. ...
  46. fatal: unable to access 'https://github.com/FriendsOfSymfony/FOSUserBundle.git
  47. /': Failed to connect to github.com port 443: Timed out
  48.  
  49. - git@github.com:FriendsOfSymfony/FOSUserBundle.git
  50. Cloning into 'D:\home\workspace\XXXX\vendor\friendsofsymfony\user-bundle'
  51. ...
  52. ssh: connect to host github.com port 22: Bad file number
  53. fatal: Could not read from remote repository.
  54.  
  55. Please make sure you have the correct access rights
  56. and the repository exists.
  57.  
  58. Now trying to download from dist
  59. - Installing friendsofsymfony/user-bundle (dev-master e889095)
  60. Loading from cache
  61.  
  62. Writing lock file
  63. Generating autoload files
  64. > Incenteev\ParameterHandler\ScriptHandler::buildParameters
  65. Updating the "app/config/parameters.yml" file
  66. > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap
  67. > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache
  68.  
  69. // Clearing the cache for the dev environment with debug
  70. // true
  71.  
  72. [OK] Cache for the "dev" environment (debug=true) was successfully cleared.
  73.  
  74. > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installAssets
  75.  
  76. Trying to install assets as relative symbolic links.
  77.  
  78. --------- ------------- ----------------
  79. Bundle Method / Error
  80. --------- ------------- ----------------
  81. WARNING XinXiBundle copy
  82. --------- ------------- ----------------
  83.  
  84. ! [NOTE] Some assets were installed via copy. If you make changes to these
  85. ! assets you have to run this command again.
  86.  
  87. [OK] All assets were successfully installed.
  88.  
  89. > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installRequirementsFi
  90. le
  91. > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::prepareDeploymentTarg
  92. et

以上只是下载了UserBundle 接下来就要使用它了;一系列的添加配置,如下:。。。。。。。。。

先分享一下别人的博客里的关于Symfony包目录结构把http://www.cnblogs.com/szuyuan/p/4015402.html

2 〉注册Bundle,

这个的话就在app/AppKernel.php里面添加 new 。。。。。
如下:

public function registerBundles()
{
    $bundles = array(
        // ...
        new FOS\UserBundle\FOSUserBundle(),
    );
}
3〉配置config.yml文件添加
 
如果报错如下那么就应该,配置config.yml文件添加
  1. [Symfony\Component\Config\Definition\Exception\InvalidConfigurationException]
  2.  
  3. The child node "db_driver" at path "fos_user" must be configured.
  1. 配置如下: 添加上就可以了
  2.  
  3. fos_user:
    db_driver: orm
    firewall_name: main
  4.  
  5. 如果在报这个错误如下
  1. [Symfony\Component\Config\Definition\Exception\InvalidConfigurationException]
  2.  
  3. The child node "user_class" at path "fos_user" must be configured.

那就再添加上user_class

  1.  

4〉FOSUserBundle 要求我们创建一个继承自 FOS\UserBundle\Model\User 的用户类;

今天是1月13号,以上添加Bundle的过程,我打算重新来一遍,记录的先留着吧,下面我开始重新添加;

一边记录过程一边上传代码https://github.com/TuringTD/Symfony

如果感兴趣可以加入我Symfony群进行交流182983780,里面技术大牛可以帮你解决问题 的

1:

  1.  

php_Symfony_项目实战全过程记录的更多相关文章

  1. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  2. Eclipse 导入项目与 svn 插件关联全过程记录

    文章摘自:http://www.cnblogs.com/xmmcn/archive/2013/03/01/2938365.html 感谢博友分享! Eclipse 导入项目与 svn 插件关联全过程记 ...

  3. vue项目实战, webpack 配置流程记录

    vue项目实战记录,地址在这 购物车单界面 npm install npm run dev 跑起来可以看到界面效果 这里简单记录一下webpack的编译流程 入口 package.json " ...

  4. 第24月第30天 scrapy《TensorFlow机器学习项目实战》项目记录

    1.Scrapy https://www.imooc.com/learn/1017 https://github.com/pythonsite/spider/tree/master/jobboleSp ...

  5. Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  6. Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  7. Asp.Net Core 项目实战之权限管理系统(5) 用户登录

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  8. 【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 很长时间没有来更新博客了,一是,最近有些忙,二是,Core也是一直在摸索中,其实已经完成了一个框架了,并且正在准备在生产环境中 ...

  9. 【无私分享:ASP.NET CORE 项目实战(第五章)】Repository仓储 UnitofWork

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来创建仓储类Repository 并且引入 UnitOfWork 我对UnitOfWork的一些理解  UnitOfW ...

随机推荐

  1. redmine的邮件配置

    redmine的邮件配置 2012-01-04 18:09:21|  分类: 默认分类|举报|字号 订阅     redmine里要用到邮件通知,本来以为很是简单,网上也有许多教程,谁知忙活了一下午, ...

  2. asp.net mvc使用validate.js验证 若name属性包含特殊字符则加上双引号即可

    rules: {                    "Can.CName": {                        required: true,          ...

  3. SpringMVC中Controller

    详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] 目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodR ...

  4. Javascript技巧实例精选(5)—显示当前的日期和时间

    用Javascript实现在屏幕中打印当前的日期和时间 >>点击这里下载完整html源码<< 这是显示的效果 目前的日期/时间是:Wed Sep 25 2013 23:40:0 ...

  5. Fiddler工具

    Fiddler初探 我们知道监视Http和Https请求的工具有多种,例如:HttpWatch,FireBug等.但是今天接触到一种新的工具Fiddler.Fiddler能记录所有客户端和服务器的ht ...

  6. Robots惊恐记

    昨天发现在百度上搜索不到网站krely.cn的关键词(季小鱼),我记得之前的排名是第四位.到底是哪里的错误导致这个问题呢. 百度排名丢失,那么360会不会也出现同样的错误呢. 可以看到,360提示是我 ...

  7. TFS二次开发的数据统计以PBI、Bug、Sprint等为例(一)

    TFS二次开发的数据统计以PBI.Bug.Sprint等为例(一) 在TFS二次开发中,我们可能会根据某一些情况对各个项目的PBI.BUG等工作项进行统计.在本文中将大略讲解如果进行这些数据统计. 一 ...

  8. Task.WhileAll扩展方法

    TPL实现Task.WhileAll扩展方法 文章翻译整理自 Nikola Malovic 两篇博文: Task.WhileAll Awaitable task progress reporting ...

  9. IOS学习之路(代码实现自动布局)

    1.将一个试图放置在其父视图的中央位置,使用限制条件. 2.创建两个限制条件:一个是将目标视图的 center.x 位置排列在其父视图的 center.x 位置,并且另外一个是将目标视图的 cente ...

  10. 基于“泵”的TCP通讯(接上篇)

    基于“泵”的TCP通讯(接上篇) 上一篇博客中说了基于“泵”的UDP通讯,附上了一个Demo,模拟飞鸽传书的功能,功能不太完善,主要是为了说明“泵”在编程中的应用.本篇文章我再附上一个关于TCP通讯的 ...